こんにちわ
AIチームの戸田です
先日終了したKaggleのコンペ、Google QUEST Q&Aに参加し、26位の銀メダルをとることができました
今回はそのふりかえりをしたいと思います
コンペ概要
質問と回答のペアから、そのペアに対する評価値を予測する問題となっています。
予測に使用できるデータとしてタイトル・質問・回答の文章に加え、質問者の名前、回答者の名前、質問が行われたサイトの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という形をとっていたのでこちらを参考にしました。
最終何層まで使うかは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を目標にこれからも頑張ります
最後まで読んでいただきありがとうございました
参考
- 26 place solution Discussion: https://www.kaggle.com/c/google-quest-challenge/discussion/130076
- 26 place solution Notebook: https://www.kaggle.com/takamichitoda/26th-place-solution?scriptVersionId=28524791
- 学習コード: https://github.com/trtd56/KaggleQuest