TECH BLOG
Automated Essay Scoring 2.0コンペ参加記
はじめに
ARISE analytics kaggle部の森智之です。
2024年4月〜7月に開催されたLearning Agency Lab - Automated Essay Scoring2.0に同じくkaggle部の徳元拓哉、今井省吾と参加し、銀メダル(108位/2708チーム)を獲得することができました。そこで今回は、今コンペの取り組み内容、上位解法の解説を行いと思います。
コンペ概要
コンペの目的
まずは今回のコンペの概要について説明します。
本コンペは、生徒が執筆したエッセイを自動で評価する自動ライティング評価(AWE)システムの開発を目的としており、教師の負荷削減と生徒への定期的かつタイムリーなフィードバックの実現をねらいとしています。12年前に行われた第1回のコンペからの進歩を図るという意味合いで実施されたコンペとのことでした。
データセット
次に与えられたデータセットについて説明します。
訓練データとして17,307のエッセイとそれに紐づいたscore(目的変数)が与えられました。
下が訓練データの1部です。これを訓練データとして、scoreがついていないテストデータのエッセイに対してscoreを予測するというものでした。
データセットの説明図
訓練データには2種類のソースがあり、Persuade 2.0コーパスというオープンデータと同一のものが7割程度、残りはコンペオリジナルのデータであることが、後のディスカッションで明らかになりました。この2つのデータソースはスコアの付け方の基準が異なるため、似て非なるスコアでした。また、非公開のテストデータがコンペオリジナルデータに寄っている可能性が高く、CV-LBの相関が取りずらいということもキーポイントの1つでした。つまり、全ての訓練データを同一に扱うのではなく、テストデータの分布に近いであろうコンペオリジナルデータでフィッティングした方がLBのスコアが上がるのではということです。
評価方法
精度評価にはQuadratic weighted kappaの指標が指定されました。
詳しい説明は除きますが、多クラス分類の評価指標の1つで、混同行列に重みを付けて評価する指標です。今回のようなクラス間に順序関係があるような場合に使用されます。具体的な評価式は以下です。
QuadraticWeightedKappa = 1 - ( Σᵢⱼ wᵢⱼ ⋅ Oᵢⱼ ) / ( Σᵢⱼ wᵢⱼ ⋅ Eᵢⱼ )
i:真値、j:予測値、O:混同行列のレコード数、E:混同行列の期待値、W:ペナルティ
0~1の値を取り、精度が高いほど大きな値となります。
上位解法の共通点
上位解法者の解法を紹介します。
上位解法者の共通点から下記が本コンペのポイントのようでした。
・訓練データの偏りに合わせた学習設計
・Debertaモデルでの回帰予測
・評価指標QWK閾値の最適化
NLPコンペの取り組み内容をイメージしていただくため、今回は1位の解法を丁寧に説明していきます。
1st Place Solution
DeBERTaモデルによる2段階学習
今回の学習は、ざっくり言うと2ステップに分けるのがポイントでした。まずはPersuade 2.0コーパスデータでモデルを学習し(Pretrain)、そのあとにコンペオリジナルデータだけを使って微調整(Fine-tuning)をかけています。
Pretrain(ファインチューニング前の学習)
・Persuade 2.0コーパスのようなオープンデータを中心に学習し、スコアリングの“土台”となる重みを用意します。
・この段階では、細かいスコア一致を追うというよりは「作文をベクトル表現としてどう扱うか」を学ばせるのがメインになります。
Fine-tuning(微調整)
・その後、今度はコンペオリジナルデータだけを使い、改めてモデルを調整します。
・ここで、コンペ独特の採点基準をしっかり覚えさせることが重要です。
・ただ、オリジナルデータは4,500件ほどと量が少ないので、5-foldやStratified KFoldを使ってなるべく安定した交差検証を行っています。
・この2段階の流れをとることで、まずはPersuade 2.0の情報を使いながら、最終的にはコンペに合わせた採点基準にモデルを馴染ませることができ、CVやLBのスコアを底上げしていました。
Pseudo Labeling(擬似ラベリング)
次に、Pseudo Labelingというテクニックも使われています。簡単に言うと、モデルの推論結果を“仮の正解ラベル”として使って学習データを増強する方法です。
ここでカギになるのは、Persuade 2.0コーパスのラベルをコンペオリジナルデータっぽく塗り替えること。イメージとしては、
1.コンペオリジナルデータでファインチューニングしたモデルを用意する
2.そのモデルにPersuade 2.0コーパスを入れて推論(floatスコア)を出す
3.推論結果を“新しいラベル”としてPersuade 2.0コーパスにつけ直す
という流れです。
予測スコア(float)からの閾値調整(Thresholding)
エッセイのスコアは離散値(0~6など)ですが、モデルの予測は連続値(float)になるため、どこで区切って整数にするかはQWKの最適化でとても大事になります。
・例として、1~2の境目を1.67にしたり、5~6の境目を4.9にするなど、カスタム閾値でスコアが大きく改善するケースが多々あります。
・ただし、学習データ自体のスコア分布に偏りがあると、単純な回帰ロス最適化だけでは不十分なので、Kappa自体を最適化するような仕組みが必要になることがあります。
具体的には、
1.モデルのOOF予測をそのままfloatで出す
2.それに対してscikit-optimizeのminimize
関数を使い、「1 - QWK」が最小になるような閾値を探す
3.見つけた閾値で改めて予測スコアを整数化
という手順です。ただ、特にコンペオリジナルデータ側はサンプルが少ないので、複数シードやいろんなハイパーパラメータを使ったアンサンブルで安定化を図るという工夫がされています。
アンサンブル戦略(過学習を防ぐ工夫)
モデルバリエーション
・DeBERTa large / base の切り替え
・プーリング手法(CLSプーリングやGeMプーリングなど)の違い
・ロス関数(MSE、BinaryCrossEntropyなど)の切り替え
・コンテキスト長(最大トークン数)を1024にするか短くするか
・学習率やドロップアウトの微妙な調整
こういった差分を作ったモデルを何個も学習し、さらにシードを変えて(時には3回ずつ)学習した上でアンサンブルする形を取っています。
アンサンブル時の工夫
・単純平均を基本とする
・Nelder-MeadやHill-Climbingなどでモデルの重みを最適化
ただし、最終的には閾値の調整やPseudo Labelingも絡んでくるので、重みの最適化をやりすぎると過学習のリスクが高まる点に注意が必要です。著者は、
・それぞれのモデルに対して先に閾値を決めておく
・アンサンブル時は単純平均か、あるいは重みが大きくマイナスにならないように制限
・3シード分の平均を取って乱数シード由来のブレを抑える
など、なるべく堅実な範囲でアンサンブルしながらスコアを伸ばしていました。一部では「負の重み」を使って調整する手法もあるようですが、そのぶん過学習リスクも高くなるため要注意みたいです。
自チームの取り組み
自チームでは、公開されているノートブックを取り入れながら、リークを考慮したモデル設計を行っていました。CV相関は取れるようになったものの、そもそもPersuade 2.0コーパスのみで事前学習する等データの出所を考慮した戦略が建てられなかったところが反省点です。また、上位解法では、DeBERTaモデルの出力を最終的な予測に直接使っていましたが、自チームではLightGBMの特徴量として、スタッキングする手法を取っていました。このあたりの良し悪しも実験回数が不足していて評価しきれなかったので、次のコンペに活かせたらと思います。
最後に
いかがだったでしょうか。アンサンブルや閾値調整、疑似ラベリングなどコンペティションならではのテクニカルな内容はあるものの、利用するデータの内容やその分布から立てた戦略を丁寧に実行されている大変学びのある解法だったかと思います。