Kaggle Feedback 3 コンペ反省
自分用のなぐり書きメモです。
前回初めて出たKaggleコンペでなんと優勝してしまったので、今回NLP入門していい順位取れたらなあと思って出たら全然そんなに甘くはなかった。優勝した方書かずにこっちだけ書くの謎ですが、ブログで供養…
総括
コンペ: https://www.kaggle.com/competitions/feedback-prize-english-language-learning/overview
Public 202位 → Private 609位 (2741 teams)。終わった直後は笑うしかなかった…
Public LBのデータ数が少なくて不安定なためshakeの激しいコンペだった。 結果的にはナイーブなCVとPrivate LBはかなり相関していたっぽいのでTrust CVが重要だった。 Discussionでも指摘されていたが、Public LBが特定の小さいモデルでのスコアが異常に高い現象があった。そのためたまたま最初にベースラインとして出したCVそこまで高くないモデルのスコアがずっと一番高く、その原因究明のためにCVの切り方の検証などに時間をかけすぎたのと、結局よくわからなくて疑心暗鬼になって最後本気出しきれなかったのが敗因。
やったこと
- dropout無くす(regressionだと入れないほうがいいことも多いっぽい)
- layer-wise learning rate, headのlr大きく
- freeze embedding layer
- AWP (adversarial weight perturbation)
- pooling前にlinear
- Average pooling, GeM pooling
- Optunaでハイパラ探索(手間削減にはなったかもしれないが差別化要因にはならなかったっぽい)
- token regression + separate head
- 出力層に中間層concat
- max_lengthアンサンブル
- ensembleの重みをscipy.optimize.nnlsでcolumnごとに決定。そのままだと過学習するのでCV切って一様と混ぜる割合調整
- clip(1.0, 5.0)
- deberta-v3-large > deberta-v3-base > electra-large > funnel-transformer-large
- pooling後にlayernormがbaseのみ効いた
やったけど効かなかったこと
- essay topic予測してgroup kfold
- last layer reinit
- 1D conv pooling
- cutmixっぽいこと
- longformer
- mask augmentation
- pseudo label by fb1
- attention pooling
- LSTM head
- MultiLabelStratifiedKFoldの使い方直す
やればよかったかもしれないこと
- Trust CV!!!
- 複数seedでCV検証
- metricごとにattention pooling
- max_length小さめの方がいいことに最後の方まで気づかなかったのでモデル足りなかった
- SVR
- back translation
- 各アイディアの検証でCVをensembleでも検証
- アンサンブルでnelder-mead, ridge, bayesian ridge regression, netflix method(!?)
- embeddingだけじゃなくてencoder layerもいくつかfreeze
その他
- AWPは界隈で一番使われてそうなほぼ各パラメータの勾配の正負しかみてなさそうな謎実装のやつ使ったけど謎
- Trust CVについてはこれまでのKaggle経験を元にしたKaggle運営への信頼度・テストデータ量・評価指標…などをもとに総合的に判断すると思うのである程度仕方ない部分もあったかな…(?)強い気持ち、大事。
- NLPはCVに比べてシングルモデルの精度追求よりもアンサンブルのやり方・多様性も大事そうな印象(?)
- 僅かな精度を競うことで最先端のtransformerのfinetuneテク色々知って勉強になった。問題意識: 全文見ないほうが精度上がる謎・data augmentation手法少ない・finetuningがハイパラに繊細すぎる