製造業でデータサイエンティストをしているtk2と申します。今回は2024年4月〜7月に開催されたkaggleのエッセイ採点コンペ Automated Essay Scoring 2.0の上位解法を自分用の備忘録としてまとめておきたいと思います。
私自身はまだkaggleを始めたばかりの初心者であるため、手法の解釈違いや英語の読み取り違いなどがあるかもしれませんが、ご容赦頂ければ幸いです。コンペのdiscussionやsolutionのリンクも載せていますので、正確な情報を知りたい方はそちらをご覧ください。
コンペ概要
このコンペはタイトル通り、学生が書いたエッセイのスコアを自動採点するという非常にシンプルなタスクから構成されています。与えられたデータセットもessay idとエッセイのfull textのみで、初心者でも取り組みやすいシンプルなコンペだったと思います。
エッセイにはそれぞれ1点から6点までのスコアが付与されており、スコアが高いほど良いエッセイであることを意味します。なおエッセイの採点基準はこちらにあります。
評価指標はQuadratic Weighted Kappa:QWKで、順序付き変数の合致度を測る指標です。この指標は挙動が少し分かりづらいのですが、詳細についてはKaggle GrandmasterのJackさんが書かれたこちらの記事をお読み頂くのが良いと思います。
訓練データ数は約17,000件、テストデータは約7,000件で、public LBは30%のテストデータで計算されます。
コンペのポイント
私自身もこのコンペに1〜2ヶ月程度参加していましたが、このコンペの攻略ポイントは主に以下の3点にあったと思います。
1. 外部データの情報の利用
2. CV/LB相関を取る方法の獲得
3. ハイスコアの公開notebook
コンペ初期のdiscussionにおいて、このコンペの訓練データセットの多くがオープンデータであるPersuade2.0 corpusと一致していることが指摘されていました。
実際に訓練データの7割以上がPersuade 2.0にそのまま含まれていることが確認されています。Persuade 2.0のcorpusには、full textだけでなくprompt name(エッセイ課題の名前)などが含まれており、これらの情報の取り扱いがコンペの一つのポイントになっていました。
またもう一つはCV/LBの相関です。これはどのコンペでも往々にしてあることですが、本コンペに関しても単純にkfold splitを行うとCVとLBの乖離が大きく、相関が取れないケースが序盤から指摘されていました。CV/LBの改善はこのコンペの最大のポイントだったと思います。
また最後に公開notebookです。コンペ中盤に公開されたnotebookのスコアが非常に高く、コンペ終盤まで多くの参加者が公開notebookのスコアに勝てないという現象が起こっていました。コンペ終盤まで公開notebookを上回れば即金メダル圏という状況でしたので、この強い公開notebookをどのように考えてどう扱うかも大きなポイントとなりました。
最終的な結果としてはやはり予想通りshakeが大きく、Public金圏の参加者が何人もメダル圏外となっていました。Kaggle GrandmasterのChris Deotte氏も、金メダル圏から大きなshake downを食らっています。
一方でPublic/Private共に金メダル圏に残り続けた参加者もいました。このようにshakeの激しいコンペにおいても上位に残り続けた参加者の解法は、非常に気になるところです。
上位解法の共通点
次に上位解法についてまとめていきます。個別のsolutionのまとめに入る前に、まずは多くの上位解法に共通していたポイントを個人的な観点で以下にまとめてみました。
1. Kaggle Data(後述)に合わせた2stepの訓練
2. 分類ではなく回帰予測を使用
3. QWKのthresholdを最適化
少なくとも私が見る限りでは、本コンペはこれまでの一般的なNLPコンペに見られるようなモデルの細かな工夫はそれほど重要ではなく、CVの切り方とモデルの訓練のさせ方にポイントがあったように見えました。
実際採用されていたモデルはほとんどがお馴染みのDebertaで、特徴的な手法でモデルを学習させていたケースはあまり多くありませんでした。
上位入賞のカギを握る最も大きなポイントがPersuade2.0に含まれないデータの扱いでした。
先に述べた通り、本コンペの訓練データにはPersuade2.0と全く同じデータが約7割含まれており(これを以降Persuade Dataと呼びます)、逆にPersuade2.0に含まれないデータが約3割含まれていました(これを以降Kaggle Dataと呼びます)。
上位入賞者のほとんどがKaggle Dataをメインに用いてモデルを訓練させており、これによってLBのスコアやCV/LBの相関が良くなったと述べられていました。
実はPersuade2.0 corpusに含まれないKaggle Dataをvalidationに用いる点については、コンペ中盤のdiscussionでも議論されていました。
恐らくテストデータがKaggle Dataに近いことが要因であり、Persuade DataとKaggle Dataの質の違いに気付いてCVの切り方やモデルの訓練方法を決められたかどうかが勝敗を分けたコンペだったように思います。
具体的な解法としては、上記の考え方に基づいて2stepの学習を取っている解法が目立ちました。
まずPersuade Dataに対する学習によってモデルのweightを獲得し、次に得られたweightをロードしてKaggle Dataに対してfine-tuningを行うという解法です。上位入賞者のほとんどがこのような形式の学習を行っていたと思います。
その他のポイントとして、評価指標であるQWKのthresholdも注目すべき点でした。
QWKはカテゴリ変数に対する評価指標であるため、回帰予測を用いる場合には特定のthresholdで予測値を整数値に丸め込む必要があります。本コンペでは分類モデルよりも回帰モデルの方が精度が良い傾向にあったため、多くの参加者が回帰モデルの予測値に対するQWKのthresholdを検討していました。
コンペ開始当初は単純なroundで丸めているコードが多かったですが、thresholdをモデルに合わせて適切に最適化することで精度改善が見込めたようです。
1st Place Solution
それでは上位解法の紹介に入っていきます。まずはflgさんの解法です。
publicメダル圏外から600位以上のshake upでsolo 1st placeを獲得され、このコンペでGrandmasterになられました。解法のポイントは以下の通りです。
CV/validation戦略
- prompt nameとスコアをラベルとした5fold Stratified KFold
Modeling戦略
- Deberta base, largeのRegressionを採用
- Persuade Dataでpretrainした後、Kaggle Dataでfine-tuning
- 構築したモデルでPersuade Dataのpseudo-labelingを行う
- 修正したscoreを用いて再度モデリング
- 全てのモデルについて3seedを平均する
- モデルごとにQWKのthresholdをPowell法によって最適化する
- 構築したモデルをensemble
どのようなpretrainを行ったのか書かれていなかったのですが(恐らくMLM?)、まずPersuade Dataでpretrainを行いそのモデルを用いてKaggle Dataでfine-tuningを行っています。
7/27追記
MLBearさんの解法まとめ記事によると、どうやらこの”pretrain”は2段階の学習の1段階目を指しているようでした。
これはEDAやLBのprobeなどから確認した”テストデータはKaggle Dataに近い”という考察に基づいています。Persuade DataとKaggle Dataは、採点時期や基準が異なるのではないかと推定されていました。
構築したモデルを用いてPersuade DataのPseudo Label(連続値)を得て、この”修正スコア”をもとに再度Debertaによるモデリングを行っています。solutionにはこの過程を2round繰り返したと記載されていましたが、2round目のモデルはLB精度が低下したため最終モデルにはあまり取り入れなかったようです。
Kaggle Dataは4,500件程度しかデータが無いため、fine-tuningの際にはseedによる予測精度のばらつきが大きかったようです。そこで全てのモデルについて3seedを作成して予測値を平均化することで、予測の安定性を担保していました。
またコンペのポイントとなっていたQWKのthresholdについても、同じモデルにおいてもseedによって最適値が異なったそうです。そこでモデルごとにthresholdを最適化して予測の安定性を担保したとのことです。thresholdの最適化は、scipy.minimizeのmethod="Powell"を使ったそうです。
このようにして作成した多様なモデルを、最終的にはsimple averageing, Nelder-Mead, Hill-Climbming法(詳細はこちら)の3パターンでensembleしています。emsembleについてもoverfitを避けるために、QWKのthresholdと合わせてweightの最適化を行なっています。
結果としてはsimple averagingがprivateのscoreが最も良かったようです。これについてはKaggle Dataの数が少なく、weightの最適化がoverfitを引き起こしていた可能性が言及されていました。
Debertaの学習についてはGeM poolingを取り入れたり異なるtoken lengthで学習させたりと、一般的な工夫が取り入れられており、そこまで特徴的な工夫というのは無かったように思います。それよりもseed averagingの効果の方が大きかったようです。
最終的に1位を獲得したモデルはPublic 619位で、TrustCVが重要だったとのことでした。特にPesudo Labelによる再学習を用いた解法は、1st place solitionの特徴だったと思います。
2nd Place Solution
続いてsolo 2nd placeのyaoさんの解法です。Public/Privateともに2位で、このshakeの大きいコンペの中でも安定して精度を上げられている点が凄いです。
2nd placeの解法も、大枠の考え方は1st place solutionと似ています。
CV/validation戦略
- スコアに基づく4foldのStratified Kfold
- validationにはPersuade DataとKaggle Dataの両方を使用
Modeling戦略
- Regressionを採用
- 全トレーニングデータでDeberta largeをMLM pretrain
- Persuade Dataでfine-tuning(step1)
- 1st stepの重みをロードしてKaggle Dataで再fine tuning(step2)
- oridnal predictionに合わせたlossを設計
- hard votingによるensemble
まず全てのトレーニングデータでMLMによるpre-trainingを行ったのち、このモデルをbackboneとしてPersuade Dataによる1st stepのfine-tuningを行い、1st stepの重みをロードしてKaggle Dataによる2nd stepのfine-tuningを行っています。
このような2stepのfine-tuningによる学習は、本コンペの上位解法に多く見られました。
QWKのthreshold searchについても検討を行っており、過去コンペのPetFinderのsearching methodを利用してthresholdを最適化しています。当初はKaggle Dataのみでsearchしていたようですが、CVは改善したもののLBは悪化したため、最終的には全トレーニングデータでsearchしたそうです。
この理由については、テストデータのテキスト自体はKaggle Dataに近いものだと考えられましたが、スコア分布は全データに近いものだったのではないかと考察されています。そのためKaggle Dataだけでなく、Persuade Dataによるthreshold searchやvalidationも取り入れたようです。
そのほか独自のoridinal regressionを設計したり(詳細はsolutionをご確認ください)、スコアを0~1に標準化してBinaryCrossEntropyで最適化する、attention poolingを取り入れるなどの工夫が見られました。
最終的には構築した5つのモデルでhard votingを行い、予測値を決定したとのことです。
QWKのthreshold searchは本コンペにおいて基本的に有効に働いていましたが、訓練データにoverfitしたthresholdだとLBでは大きく精度が低下するケースもありました(これは実際に私も体験しました)。
真のテストデータが何であったかは分かりませんが、テストデータの分布を適切に推測しoverfitを回避したthresholdが見つけられたかどうかも勝敗を分けるポイントの一つだったように思います。
3rd Place Solution
続いては日本人でsolo 3rd placeに入賞されたHOさんの解法です。HOさんもPublic1位、Private3位で安定した高順位をキープされています。
3rd place solutionについても、1st, 2nd placeと解法の考え方は似ています。
CV/validation戦略
- prompt nameとスコアに基づくMultilabel Stratified Kfold
- Persuade DataとKaggle Dataに分けてsplit
Modeling戦略
- Deberta base, largeのRegressionを採用
- MLMによるpretrainとlayer freezingを行う
- まず全データで学習し、Kaggle Dataの評価に基づいてモデルを保存(step1)
- step1モデルのweightをロードしKaggle Dataで再学習、Persuade Dataで評価(step2)
- Nelder-Meadによりensemble
HOさんもPersuade DataとKaggle Dataに分けた際のモデルの精度差の分析から、Kaggle Dataに焦点を置いた訓練によって精度向上に繋げられています。CVにはprompt nameとスコアに基づくMultilabel Stratified KFoldを採用されています。
一方でKaggle Dataへのoverfitを避けるため、step2の学習ではPersuade Dataをvalidationとしたモデリングも行なっています。この点は2nd place solutionとも同様ですが、ただ単にKaggle Dataに合わせて訓練すれば良いというわけでも無かったようです。
backboneはお馴染みのDebertaで、MLMによるpre-trainingとlayer freezingを行った上で学習させています。最適なfreeze層数はdeberta baseで9層、deberta largeでは6層だったそうです。またdeberta baseの方が安定したCV/LB精度を得たとのことです。
モデルのheadには、LSTMやmean pooling, attention poolingなどが採用されています。そのほか異なるmax token lengthを採用した種々のDebertaモデルが構築されています。
最終的にはこれらのモデルをNelder-MeadによりWeigted Ensembleしてsubmitしたとのことです。
その他の解法
4th place, 5th placeくらいまでは詳しくまとめようと思ったのですが、このあたりで力尽きてしまったので詳細は以下のdiscussionをご覧ください。
基本的にはいずれも、Kaggle Dataについて予測精度が高くなるような学習が行われている点が主に共通しています。Kaggle Dataの取り扱いは、本コンペ最大のポイントだったと思います。以降ではごく簡単に解法をまとめておきます。
まず4th placeのtascjさんの解法では、わずか6回のsubmitで1200位以上のshake upによって金メダルを獲得しています。これは流石としか言いようがありませんね。
Persuade DataとKaggle Dataが異なる性質を持つデータであることに気づき、これらのデータを区別するためのtag([A], [B])をデータに付与して、スコアの予測とデータソースの分類を同時に解くモデルを構築しています。
またdebertaの訓練においてメモリ使用量を削減し学習を高速化できるtipsもこちらのnotebookで公開されています。
5th placeのhengさんチームの解法も基本的にはこれまで紹介した解法とほとんど同じで、Persuade DataとKaggle Dataの2段階のfine-tuningを行っています。構築したモデルを、最終的にはPublic LBハイスコアのnotebookとweighted ensembleしてsubmitしたとのことでした。
その他の上位のsolutionに関しても、基本的には似たような解法が多かったように思います。
その他コンペ雑感
冒頭で公開notebookが強かったと述べましたが、実はこのコンペは公開notebookをそのままsubmitすれば銀メダルが獲得できていました(実際に私自身のsubmitで確認しました)。
実はこのハイスコアの公開notebookはリークを起こしている可能性が高く、コンペ期間中も議論になっていました(参考)。しかし結果としてはこの公開notebookがprivate LBでも強く、そのままsubmitするだけで銀メダル圏内に入っていました。
私自身もこの公開notebookを超えるべく様々なモデルの改変を行っていましたが、結局最後まで公開notebookのスコアを超えることはできませんでした。discussionでも議論されていましたが、このnotebookが偶然にもhot spotにハマり高い予測精度が出たのでは無いかと考えられます。
このようなこともあるので、次回のコンペからは公開notebookの扱いについても慎重に行う必要があるなと感じました。上位の解法でもありましたが、1つのsubmitを公開notebookとのensembleにするなどは検討したいと思います。
またコンペ中にもう一つ議論になったポイントとして、Persuade2.0データの利用可否がありました。コンペのルール上、予測に使用するデータやモデルは商用利用可能なライセンスである必要があります。
今回の訓練データは先述の通りPersuade2.0 corpusの一部となっており、データの増強のためPersuade2.0の他のデータを訓練に用いるケースがコンペ序盤から散見されました。
しかしコンペ終盤になって、Persuade2.0は商用利用不可のライセンスであることがdiscussionで指摘されました。ただそもそも訓練データがPersuade2.0を含んでいるため、使っても問題無いんじゃない?みたいな議論もありました。
これに関してホストにPersuade2.0データの使用可否を尋ねる投稿もありましたが、結局ホストからPersuade2.0データを使って良いかどうかの回答はありませんでした。
discussionが立てられた段階ではPersuade2.0データを使ってモデルを訓練している人も多く、またその方が精度が良い傾向にあったことから、外部データの利用可否は重要なポイントでした。しかしこの点が解消されずにdeadlineとなったため、困惑した参加者も多かったと思います。
外部データが使えるにしろ使えないにしろ、明確に方針を示してもらえると参加者としては助かったのですが、この点は少し残念なポイントだったと思います。
まとめ
ということで、本記事ではAutomated Essay Scoring 2.0の上位解法をまとめてみました。タスクとしては非常にシンプルで取り組みやすかったですが、かなりshakeも大きくモデルのトレーニング方法に工夫が必要なコンペでした。
やはりデータをよく見て性質を理解することの重要性を改めて感じましたので、次のコンペではこの反省点を活かしてメダル獲得に向けて取り組みたいと思います。解法の解釈違いなどあるかもしれませんので、誤りを見つけた際は適宜ご指摘頂ければ幸いです。