Kaggle コンペ Feedback Prize - English Language Learning でチーム参加15位金メダル取得で、Kaggle Master へ
Kaggle のコンペティション、Feedback Prize - English Language Learningが終わり、約2650チーム中15位で金メダル取得となった。これで合計金メダル2つ、銀メダル1つを取得し、Kaggle Competitions Master の条件を満たし、コンペを始めた当初目指していた Master の称号を年内にとることができた。自分一人ではこの結果にはならなかったと思うので、チームメンバーの@masakiaota氏、@olivineryo氏に感謝だ。
Public LBではコンペ終了時に8位/2700チームの成績で金メダル圏内だったが、Public LB がLB全体の26%のデータでのスコア。スコア表示も小数点以下第二位まででLBのスコア表示がざっくりとしており、かつ我々のCVではかなり悪いスコアがPublic LB上ではやたら上位になったりとCV・LB相関が観測できないため Public LB が信頼できず、最終的な Private LB の結果は大幅なshake(結果のランキングが乱高下する)が起きると予想していた。
そのため、最終提出にはCV最高の物、LB最高のもの、また疑似ラベルを使わないCV最高のもの(疑似ラベルを使うとCVが圧倒的に良くなるが、CV最適化しすぎやリークの疑念があった)、3つを提出した。本コンペは別のPrizeもあるため、3つの提出枠があったのでこの3つを選択したが、2つの提出だったら非常に悩ましい選択になったであろう。
結果としては、Public LB では8位だったが、Private LB ではランクが下がってしまい17位となり、残念ながら金メダル(今回は15位以上)を逃してしまった。あと2位上なら金メダルが採れたのでめちゃくちゃ悔しいけど、数十~数百位順位を落としたチームもあるので、それに比べると9位ダウンですんで良かったぐらいだ(Public LB 1位の人は175位も落ちてしまった)。金を取るのは難しいと再確認した結果であった。
追記: 不正ユーザが居なくなった結果の順位確定で、繰り上がり15位で金メダルとなった。めちゃ嬉しい!!1
コンペ課題
本コンペは、学生の書いた英語を評価する Feedback Prize(以下FP)シリーズの3コンペ目。課題は学生の書いた文章を「文法」「単語」「構文」等、6つのカラム軸で1.0~5.0まで0.5ポイント刻みで評価したものを推論するというもの。評価指標はMSRMSE(mean columnwise root mean squared error なので、カラムごとのRMSEの平均)。以前のFP1,FP2過去コンペのデータがあるので疑似ラベルとして使えそうだとか、6つのカラムごとの評価軸をどう最適化するのか、といったことを考えながら試行錯誤していった。
解法
以下に書いてある解法を組み合わせたアンサンブルモデルを3つ提出。一番 Private LB が良かったのは、疑似ラベルを使わなかった11モデル組み合わせのアンサンブルであった。
backbone モデル選択
backbone モデルに現時点の最高汎化性能を持つモデル deverta v3-large を使うよりも、Public LB では deverta v3-base のほうがスコアが良いという結果で、この結果を自分は鵜呑みにして学習や最適化をしていった。複雑な重み(24 layers)を持つ v3-large より、半分の重み(12 layers)の v3-base のほうが本コンペにおいては良いスコアが出るのではないだろうか、複雑な文章を書かない学生の文章の場合、シンプルな方が良いのかもしれない、と考えた。
ただ、最終的な Private LB では v3-large がやはり強かったので、LBはあてにせず、CVを信じ v3-large を中心に戦略を組み立てていくべきだった。
- deberta v3-base
- 本コンペ Public LB では圧倒的に強い
- deberta v1-large
- CV, LB共にある程度効果的
- deberta v3-large
- CVには効果的だが、Public LBではむしろ混ぜるとかなり下がる
- Private LB ではそんなことなかった
自分たちチーム独自の解法
Discussion で話されていなかったもの、もしくは誰かが話していたかもしれないが効果的だから取り入れよう!とはなっていなかった物。なお本独自解放の大半はチームメンバー発案で私はあまり貢献していなかったりする…、優秀なチームメンバーに感謝。
- 6 columns を個別に AttentionPooling
- MeanPoolingよりもだいぶスコアが上がる
- Poolingしたものに LayerNorm をかける
- これもだいぶスコアが上がる
- maxlen: 640
- 長い maxlen より、640 切り詰めることでスコアが上がった
- ただし devarta v3-large のみ、もっと長い maxlen を指定し、Sliding Window Attention で分割して学習したほうがスコアが良かった
- 疑似ラベル(Pseudo Labeling)
- CV にとても効いたが、LBにはあまり効果がなかった
- 情報リークした疑似ラベルを使うと、CVが更に良くなる。そのため注意を払って情報リークは取り除いた(つもり)
- 疑似ラベルデータには過去コンペのFP1, FP2のデータを利用
- 疑似ラベルのスコアリングには、学習したモデルが出したスコアをアンサンブルして利用
- シングルモデルの疑似ラベルではすぐに学習しきってしまうが、アンサンブルした疑似ラベルを使うことでCVを上げ続けることができた
- なお疑似ラベルで学習したシングルモデルで、CV最強ではないが程よく増加した物が Private LB では最高。これを最終subに選択しなかったのが痛手…
- PostProcess
- 1.0以下は1.0に、5.0以上は5.0に丸め込む。スコア微増。
- アンサンブルするときに、6カラムごとそれぞれに最適なウェイト考え、CVスコアを最小化する最適化問題として求める。例えば4アンサンブルなら、4x6 = 24 のウェイトを求めて適用する。スコア微増。
- なお最適化問題として定義して解くのに、scipy.optimize.minimizeを利用した。scipy で解けると知らなかった、かんたんにつかえて便利。
Discussion で話されていた物
- Layer re-initialize
- もともと学習してあるレイヤーの最終n層を初期化する。最終1層のみ初期化がベストだった。
- だいぶ効く
- LLRD ( Layer-wise Learning Rate Decay )
- layer ごとに徐々に学習率を下げていくテクニック
- large系が0.8, base系が0.7225ずつLRを減衰させていった
- だいぶ効く
- layer ごとに徐々に学習率を下げていくテクニック
- Layer Freeze
- 初期n層では学習しない。LLRDを適用するとlargeモデル(24 layers)の初期層はそもそも学習されないので、largeモデルでは初期12層をfreezeすることで学習の高速化につながった。
- AWP
- チームメンバーの青田氏によるわかりやすい解説
- だいぶ効く
- Multi Sample Dropouts
- スコアはほぼ変わらないが、学習が安定したので入れた
- 0.2 * 5 の dropout を追加
- スコアはほぼ変わらないが、学習が安定したので入れた
スコアには効かなかったが、知れてよかった事
RAPIDS SVR。RAPIDS SVR の手法では、NNでは学習させずに特徴表現となるembeddingsを取り出す用途のみに使い、それらをcuMLを使ってcuda上でSVR(Support Vector Regression)で学習させて解くというもの。SVRの学習自体は(GPUにもよるだろうが)一瞬〜数秒で終わる。え、こんな方法で?と思ったのだけど、初期に作ったbaselineよりは良いぐらいのスコアを出すことができた。ただ、上位解法ではRAPIDS SVR を取り入れた解法もあるようなので、自分が性能向上にうまく活かせなかっただけな可能性も高い。
SVRは素早くなかなか良いスコアが出ることも良いのだが、NNのバックボーンモデルの性能評価として、ある程度SVRで学習したものと相関が出せたのも便利だった。SVRでスコアが振るわないNNのモデルは、結果きちんとNNで学習させてもスコアが振るわないことがほとんどだったので、バックボーンモデルの検討(とりわけ最後のアンサンブルで何のモデルを使うべきかたくさん検討するタイミング)の指針として役に立った。
また、NVIDIA が作っているライブラリcuML自体を知らなかったので、それを知れたのも良かった。cuML はいわゆる scikit-learning にあるようなベーシックな機械学習アルゴリズムを cuda で動かすことができ、ものによっては超高速に動く。またインターフェイスがたいてい sklearn 互換なので理解しやすい。今後はCPUでやると数分〜かかるような機械学習の場合、cuMLの利用も検討していきたい。
本コンペを終えて
本コンペを終え、念願の kaggle competition master になることができそうだ。メダルが出るコンペに初参加から3連続で金or銀メダルが取れたのは、ソロ参加コンペ以外は当たり前だがどちらのコンペもチームメンバーの貢献が非常に大きい。とりわけ、kaggle コンペに誘ってくれた青田氏には感謝が尽きない。
ただ前回ソロ参加したときも感じたことだし、本コンペでも改めて思い知ったのだが、自分が金メダルを取れるアイディアを出せたかというとそうでないので、ソロ参加金メダル(kaggle competition gradmasterになるために必要)を取るには現時点では実力不足で、大きな高い壁が見えている。ソロ銀メダルならその課題ドメインに対するアプローチ方法を知っていれば、何回か挑戦すれば取れる気がするが、金は今の所取れる気がしない。ソロ金メダルをとった方々はほんと凄いな〜と思う。
また、毎度自然言語処理のTransformer + Encoder 課題で解けるものばかりやってきたので、次に参加するなら同じような課題を解いてメダル取得を優先するよりも、スコアは振るわない可能性が高いが別の知見が得られる課題をやっていきたい。まだまだ初学者なので、大抵の機械学習アルゴリズムや課題解決アプローチは知的好奇心が刺激されるものばかり、引き続き楽しみながら知識を広げていけたらと思う。