🌟

【Kaggle】 FB3を振り返る

2022/12/06に公開

Feedback Prize - English Language Learning

公立はこだて未来大学 Advent Calendar 2022,12月6日の記事です.
FB3こと,Feedback Prize - English Language Learningに参加したので振り返りとしてやらかしを記録していきます.

コンペ概要

FB3は英作文から点数を推論する回帰問題を解くコンペです.
訓練データが3,000ほどと非常に小さいのが特徴だと思います.

環境

ノートパソコンしか持っておらず,KaggleNoteBookのP100を使っていました.

やらかし1 出場時期

締め切り一ヶ月前に出場しました.これが非常に良くなかったです.KaggleNoteBookは週30時間しか使えないので,一ヶ月間で計150時間しかGPUを使えませんでした.一回あたりの実験で最低3時間,最高11時間は使うので試行回数を増やせません,ColabやAmazonSageMakerLabを使って試行回数を増やそうと思いましたが,小型モデル(Deberta-small)を使っても1エポック20分はかかるため戦力外でした.

やらかし2 フレームワークの選定

今回は高校から使っていたTensorFlowを選択しました.しかし,HuggingFaceのライブラリを使う上でこの選択は非常に良くなかったです.HuggingFaceではJax,PyTorch向けにGradient_checkpointingを提供していますが,TensorFlowではサポートされていません.Gradient_checkpointingを使うことで大型モデルでもGPUのメモリを節約し,OOMエラーを吐かずに学習できるのですが,TensorFlowを選んでしまったので中型のモデル(deberta-base)を扱った学習しかできませんでした.(Jaxが対応してるならTFも対応しろや)

やらかし3 Foldごとの分布を確かめなかった

MultilabelStratifiedKFoldをすべての正解データに対象にして,5Fold分割をしました.
正解データは連続値です.
しかし,MultilabelStratifiedKFoldはバイナリに対してはFoldごとの分布を均一に保ちますが実数データはその限りではありません.よって私を含めて多くの参加者が偏った分布をもつFoldを利用し,CVスコアを算出していました😇
PrivateLBと均一にしたあとのCVは,均一でなかったCVより大幅に近かったので,最大のやらかしです.
これがわかったのは,締切3日前のディスカッションへの投稿がきっかけです...CVとLBの乖離からもっと早くに気づくべきでした.MostVotesのCodeに対しても疑い分布を確認することが重要です.
https://www.kaggle.com/competitions/feedback-prize-english-language-learning/discussion/368437

やらかし4 PublicLBに過信する

LBはかなり序盤から好成績をとれていました.結果としてLBで好成績をとれたモデルの改良にこだわりすぎて,多様なモデルを作ることができませんでした.

CVは非常に悪かったのですが,LBに対しては好成績を収めていたため,このまま,好成績だったモデルのCVを改善する方針に決定し,モデルの改良を行いました.実際CVとPublicLBとの相関は取れていたのですが,PrivateLBを見ると全然でした.PrivateLBでは順位は1,000位近く落下し目も当てられません.

対して,PublicLB,CVの悪いモデルも含めて様々なモデルをアンサンブルした提出はPrivateLBで好成績を収めていました.
もっと多くのモデルを作成しアンサンブルするべきでした.

やらかし5 最終週にGPUを使い切る

最終週にGPUを使い切りました.私はGPUを使い切ったことがなかったのでわからなかったのですが,GPU利用時間が0になるとノートブックのGPUをオンにして提出することができません.これは知らなかったので驚きました.結果としてチームメンバーに提出をお願いせざる負えなくなり,最終日にチームメンバーが提出を忘れて実行が間に合わず本来なら60位を取れたはずが1000位になってしまいました.
これに関しては本当に絶望しました.

まとめ

これ以上は脳が破壊されそうなのでやめておきます.
しかし,今回のコンペは多くの学びがあったと思います(やらかしを含めて).レイヤごとに最適化関数を適応する方法や,Gradient_checkpointingについて,SAM,ASAM,Radam,LookingAHeadなどの多様な最適化関数,Mish,Swish,Geluなどの多様な活性化関数,知識の蒸留や,疑似ラベル,MeanPoolingやAttentionPoolingによるBertを使った回帰問題への推論.カーネル制限を利用したWeightedMean.勾配累積,LayerNormalization,etc...
これらはこれからのコンペに役立つと思います.
特にLayerNormalizationや勾配累積,Gradient_checkpointingは計算資源のない私にとってはありがたいテクニックです.
以上がFB3の振り返りです.
次回のコンペでは勝てるよう精進を続けます.

明日は三人も記事を投稿してくれるようです.楽しみですね.

Discussion