元生技データサイエンティストのメモ帳

勉強したことの備忘録とか雑記とか

ギリギリ銅メダルを取れたKaggle Feedback Prizeを振り返る

こんにちは。sue124です。

まだ順位は確定してませんがPublic Scoreでギリギリ銅メダル圏内に入れたので、やったことを振り返ってみたいと思います。

Kaggle Feedback Prizeとは

Feedback Prizeのタスクは自然言語処理NLP)の中でも固有表現抽出(NER)と呼ばれるものです。

具体的にいうと、学生が書いたレポートの中から以下に該当する部分を抽出できる機械学習モデルを作るタスクです。

  • Lead (赤)
  • Position (緑)
  • Evidence (黄)
  • Claim (青)
  • Concluding Statement (マゼンタ)
  • Counterclaim (シアン)
  • Rebuttal (灰)
  • None (無色)

学習データとして与えられている文章にわかりやすく色づけすると、以下のようになります。

f:id:sue124:20220317171112p:plain

学習データから作成した機械学習モデルでテストデータの文章のどこが何に該当するかを予測し、正解と比較した際のmacro F1 scoreで順位が決まります。

評価方法の詳細は以下のリンク先の通りです。

www.kaggle.com

コンペ内でやってみたこと

今回コンペの中でやったことは以下の通りです。

  • Base Lineモデルの改造
  • Threshold微調整
  • R-BERTによるラベル再判定

Base Lineモデルの改良

今回のコンペは1月半ばに当時4位だった方公開したコードがコンペ終了までBase Lineとなっていました。

学習済みモデルの重みも公開されており「Forkしてそのままsubmitすれば同じスコアになる」状態であったため、多くの方がこの方と同じスコアになりました。

このコードのスコア自体が既に高かったですがそのままでメダルが取れるほど甘くはないので、githubで公開されていた学習用のコード(下記リンク)の改造をしました。

github.com

Base LineのモデルはLongfomerの出力層を全結合層に入れている形だったので、過去のコンぺの解法を参考にしながらLongfomerの出力層と全結合層との間にCNNやLSTMを追加したモデルを作りました。

www.ai-shift.co.jp

たったこれだけのことですが他の2つのアプローチがあまり効かなかったのでスコアへの貢献度は高かったです(ほぼこれだけでメダルが取れたと言っても過言ではない)。

後処理の閾値微調整

こちらのdiscussionでBase Lineのコードの後処理の閾値に改良の余地があるらしいことを知りました。

www.kaggle.com

これを見て、自分のモデルのCVの出力結果のnumpy.arrayを保存して後処理の閾値を微妙に変えながらCVのF1 scoreが良くなる閾値を探しました。

ただこれは自分で作ったコードで探索した閾値だとPublic scoreがあまり良くならなかったので、結局以下のコードで紹介されている閾値を使用しました。

[0.690]😄!try better parameters! | Kaggle

R-BERTによるラベル再判定

これはやってみましたがscoreが全く良くならなかったので、不採用とした案です。

きっかけとしては、単語単位での混合行列(下表)を見て「CounterclaimやRebuttalと予測すべきものを相当数Evidenceと誤判定している」という点に気づいたことがきっかけでした。

f:id:sue124:20220318142648p:plain

そこで「Counterclaim、RebuttalとEvidenceは同じような書き方をしているので、その文章の筆者がどういう立場かを考慮しないと判別が難しい」という仮説を立ててみました。 「Evidenceと判定した文章が筆者のPositionと合致するするかどうか」を以下の論文のR-BERTというモデルを使ってみることにしました。

arxiv.org

モデルのアーキテクチャーは下図の通りで、[CLS]と2つのspecial token ($, #) で囲まれた範囲のBERTの出力をAverage Poolingと全結合層で繋いで、2つのspecial tokenで囲まれた単語の関係性を予測するというものです。このモデルで SemEval2010 task 8 relational datasetのタスクでSoTAを達成したとのことです。

f:id:sue124:20220322070647p:plain
R-BERT モデルアーキテクチャ

このR-BERTを参考にして、1つ目のspecial tokenを文章中の「Position」につけて2つ目のspecial tokenを「Evidence」と判定した文章のうちの1文につけて「2つの文章が同じ立場かどうか」を判定するモデルを作成しました。

ただこの節の冒頭に記載した通り、このモデルはうまく機能しませんでした。

「Evidence」と「CounterclaimやRebuttal」の割合が1:1の時はまだいいのですが、実際の問題は上記の混合行列のようにこの割合がだいたい50:1ぐらいです。 このような偏ったデータで分類すると、偽陽性が大量発生してスコアが落ちてしまいました。

もう少し時間があればこのモデルを改良して「Positionを考慮して各単語を再分類する」ようなモデルもできたかもしれませんが、そこまでたどり着くことはできませんでした。

まとめ

今回はKaggle Feedback Prizeでやったことをまとめてみました。

銅メダルは取れましたが今回のコンペはBase Lineのレベルが高くて、自分のアプローチではあまりスコアが伸びなかったのが悔やまれるところです。 上位の方が公開してくれている解法を見て、さらにレベルアップしていきたいと思います。

お読みいただきありがとうございました。