【Kaggleコンペふりかえり】Google QUEST Q&A

こんにちわ
AIチームの戸田です

先日終了したKaggleのコンペ、Google QUEST Q&Aに参加し、26位の銀メダルをとることができました
今回はそのふりかえりをしたいと思います

コンペ概要

human_computable_dimensions_1.png (153.5 kB)

質問と回答のペアから、そのペアに対する評価値を予測する問題となっています。
予測に使用できるデータとしてタイトル・質問・回答の文章に加え、質問者の名前、回答者の名前、質問が行われたサイトのURL、SCIENCEなどの質問のカテゴリーが与えられていました。

予測する評価値は30種類あり、スピアマン順位相関係数によるランクの類似度で評価します。

詳細はコンペのページを参照ください。

計算環境

基本Google Colaboratory & Kaggle Notebookで、モデルが決まったあとのパラメーター探索だけvast.aiを使いました

解法

モデル

Headerをいじった、BERT-base-cased、BERT-base-uncased、XLNet-base-casedの3つのモデルのアンサンブルです。

予測値の1つ、question_type_spellingのみTF-IDFとLGBMを使ったモデルで予測しました。(後述します)
Local CVからBERT-base-cased × 0.2、BERT-base-uncased × 0.4、XLNet-base-case × 0.4で Weighted Averageしました

パラメータ
  • 10 fold GroupKFold
  • epoch数: 3
  • Batch Size: 8
  • Optimizer: AdamW
  • OneCycleLR, max_lr=5e-5
    • 手前の層に行くにつれて×0.9で減衰
  • Loss Function: BCE + MSE
    • MSEはラベルの頻度で重み付け(BCEの方は重み付けすると下がってしまった)
CustomHead

以前参加したJigsaw Unintended Bias in Toxicity Classificationというコンペの1st solutionがBERTの最終4層の[CLS] tokenの出力をconcat→2層MLPという形をとっていたのでこちらを参考にしました。

QuestModel.png (61.1 kB)

最終何層まで使うかは1〜6層まで試しましたが4層が一番Local CVが良かったので、そのままの形を取らせていただきました。

最終4層を使うことに関してはAditya SoniさんのディスカッションBERTの論文でも述べられているので、BERT族は最終4層に文章の特徴が出やすいということかもしれません(どなたか詳しい方にご教授いただきたいです…)

Token

こちらのstarter notebookにのように、スタンダートにいくなら下記のようなトークナイズになります

[CLS] question_title [SEP] question_body [SEP] ansewr [SEP]

私はそれに加えてcategoryのspecialトークンを追加して下記のようなトークナイズにしました

[CLS] [CATEGORY_TOKEN] question_title [SEP] question_body [SEP] ansewr [SEP]

これにより0.05ほどLocal CVが上昇しました

後処理

Khoi NguyenさんのディスカッションCoreyLevinsonさんのディスカッションで言及されていたように、正解データが離散しており1.0, 0.66666, 0.3333のように共通分母を持っていそうな値だったので、複数人の評価者が0/1で判断した評価の平均値であることが予測されていました。またCPMPさんのコメントによると、その評価者の人数もターゲットによって異なるとのようでした。

これらの情報から後処理として、各正解ラベルの共通の分母にあわせてビニング処理します
ビニングのしきい値はPetFinder.my Adoption Predictionで使われていたOptimizedRounderを改変したものを使って最適化しました

question_type_spellingの予測

Nick Sarrisさんのコメントにあるとおり、予測値の一つ、question_type_spellingが評価されているのはカテゴリーがCULTUREの英語学習のstackexchangeの質問に関してのみのようだったので、データを絞って専用のモデルを学習することにしました。
BERT族やLSTMも試しましたが、TF-IDF+LGBMの組み合わせが最もLocal CVスコアがよくなったのでこちらを利用しました。

試したけどうまくいかなかったこと

下記に試したけどスコアが上がらなかった(むしろ下がる場合もあった)取り組みをまとめます

  • ターゲットごとにSpecal Tokenを追加してその出力で予測
  • pseudo label
  • MultiSample Dropout
  • SWA
  • AdaBound
  • FocalLoss
  • RoBERTa, ALBERT

組み合わせやパラメータが悪かったということも考えられるので、現在続々と公開されているsolutionを参考にしっかり復習したいと思います。

おわりに

金メダルは取れませんでしたが、ソロで2枚目の銀メダルをとれたのでめちゃめちゃうれしかったです。
年内Masterを目標にこれからも頑張ります

最後まで読んでいただきありがとうございました

参考