Kaggle「CommonLit Readability Prize」コンペ25位の振り返りと上位解法まとめ
8月2日に終了したKaggle「CommonLit Readability Prize」コンペにチームで参加し、25位でした。 3682チーム参加で、17位までが金メダル圏内で、もう一歩という結果でした。
コンペ概要
英語の文章の「読みやすさ」の値を-3から3程度の範囲(大きいほど読みやすい)*1で予測する問題でした。 正解の値は、2つの文章の比較結果を利用する「Bradley–Terry model」*2で付けられていたそうです*3。 推論時は文章単体に対してスコアを予測する必要がありました。 データセットのサイズは小さく、学習用データセットが約3000で、評価用データセットが2000*4以下でした。
与えられたデータセットのカラムは、以下の通りです。 基本的には、文章の列のみを利用するチームが多かったです。
- id: インデックス番号
- url_legal: URL(学習用データセットのみ)、欠損あり
- license: ライセンス(学習用データセットのみ)、欠損あり
- excerpt: 文章
- target: 目的変数
- standard_error: 複数人の評価によって得られた分散(学習用データセットのみ)
値を予測する回帰問題で、評価指標はRMSE*5でした。 推論部分のコードを notebook に記述して提出する形式で、制限時間は3時間でした。
チームでの取り組み
4人チームで取り組んだ内容については、discussion*6に投稿しています。
簡単に概要を述べると、次の2種類の第1段階モデルの結果を、2種類の線形回帰モデルでstackingしました。
コンペで利用していたGitHubリポジトリを公開しました。 チームメイトのshigeriaさんも、日本語のブログ記事を書いています。
上位解法
discussionに公開された上位解法と簡単なメモを以下にまとめておきます。
全体共通の傾向
- roberta-largeなどの言語モデルを複数利用しアンサンブル
- dropoutを除外することで性能が向上したという報告が目立った
- 直近で日本では「回帰問題でニューラルネットワークを使う場合にdropoutは避けるべき」という記事が話題になっていた*8
hidden_dropout_prob
なども含めて消していた事例も
config.update({"output_hidden_states":True, "hidden_dropout_prob": 0.0, "layer_norm_eps": 1e-7})
1位
- 外部データを利用
- モデルはalbert-xxlarge, deberta-large, roberta-large, electra-largeで、ridgeでstacking
2位
- 19個のモデルの重み付き平均
- roberta-base -> svr, roberta-base -> ridge, oberta-base, roberta-large, muppet-roberta-large, bart-large, electra-large, funnel-large-base, deberta-large, deberta-v2-xlarge, mpnet-base, deberta-v2-xxlarge, funnel-large, gpt2-medium, albert-v2-xxlarge, electra-base, bert-base-uncased, t5-large, distilbart-cnn-12-6
- マイナスの重みも存在
- 定数倍の後処理でスコアが0.001 ~ 0.002上がった
- ※ 25位チームのモデルで検証したが、スコアは悪化した
3位
- foldを切りながら、外部データに擬似ラベルを付与
- deberta-largeで大幅にprivate lbが伸びた
4位
- 大量のモデルを作成し、線形回帰でstacking
- 2位寄りの解法
5位
- 学習用データセットは文章のテーマに沿って並んでいたので、シャッフルしないKFoldを意図的に使って、ジャンルの異なる記事への汎用性を確認した
6位
9位
- データ数が少ないので、交差検証の分割数を増やすと良いという仮説を立て、実験結果もその通りだった
- (K=5,10,15,25) を試し、最終的には25を利用
- deberta-largeが良い性能を示した
- 一部のモデルでは、クロスエントロピーを最適化するような問題に変換
12位
- 外部データを使ってpretrainし、コンペデータでfinetuning
- 13モデルを利用
13位
- roberta-large, xlnet-large, electra-large, deberta-large
- pseudo labeling
14位
- xlnet largeがシングルベスト
- pseudo label, multi-level stacking, custom loss
15位
16位
- roberta-large, deberta_large, electra_large
- pseudo labeling