u++の備忘録

Kaggle「CommonLit Readability Prize」コンペ25位の振り返りと上位解法まとめ

8月2日に終了したKaggle「CommonLit Readability Prize」コンペにチームで参加し、25位でした。 3682チーム参加で、17位までが金メダル圏内で、もう一歩という結果でした。

f:id:upura:20210808150010p:plain

コンペ概要

英語の文章の「読みやすさ」の値を-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しました。

  • Roberta-largeなどの言語モデルを18個学習させ、各モデルから得られた予測値
  • Sentence Transformers*7で生成した文書ベクトルを次元縮約

コンペで利用していたGitHubリポジトリを公開しました。 チームメイトのshigeriaさんも、日本語のブログ記事を書いています。

github.com

note.com

上位解法

discussionに公開された上位解法と簡単なメモを以下にまとめておきます。

順位 URL
1 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/257844
2 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258328
3 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258095
4 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258148
5 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/259729
6 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258554
9 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/259982
12 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/260325
13 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/257629
14 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258209
https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258312
15 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/260800
16 https://www.kaggle.com/c/commonlitreadabilityprize/discussion/258149

全体共通の傾向

  • 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位

  • 外部データを利用
    • sentence bert*9を用いて、学習用データセットの各サンプルについて、最も類似している外部データ5件を追加データとして利用。roberta-baseとroberta-largeのアンサンブルで擬似ラベルを付与。
  • モデルは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個のモデルと、第2段階のガウス過程回帰*10
  • url_legal列から「CC BY」「CC BY-SA」ライセンスのデータをスクレイピングし擬似ラベルを付与

9位

  • データ数が少ないので、交差検証の分割数を増やすと良いという仮説を立て、実験結果もその通りだった
    • (K=5,10,15,25) を試し、最終的には25を利用
  • deberta-largeが良い性能を示した
  • 一部のモデルでは、クロスエントロピーを最適化するような問題に変換

12位

  • 外部データを使ってpretrainし、コンペデータでfinetuning
  • 13モデルを利用
    • nine microsoft/deberta-large, two albert-xxlarge-v2, and one for google/electra-large-discriminator and roberta-large

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