Kaggle Grandmasterになったので参加したコンペを振り返る
これはKaggle Advent Calendar 2023の4日目の記事として書かれました。
研究や業務で機械学習を扱う上で、どこまでも精度追求ができてしまうという性質上自分のアウトプットに自信が持てないという漠然とした悩みを抱えており、一度精度を競技的に追求するKaggleでその限界を見ておきたいと思っていました。まずは典型的な画像タスクを扱ってみたいと思っており、Colab ProでMNISTのチュートリアルを動かしたあと、タスクもシンプルで良さそうなコンペを見つけて始めることにしました。
Happywhale - Whale and Dolphin Identification
序盤は画像処理のプラクティス・PyTorch LightningやWandBといったツール・Metric Learningの手法など基本的なことを学んでパイプラインを作り、中盤はひたすらCVの改善に取り組んでいました。改善には勘所がなかったので考えられるあらゆる手法を試しました。
コンペ終了2週間前に試しにシングルモデルで初提出してみたところ銀圏上位で、アンサンブルして金圏はいけるかなーくらいに思っていたところ一瞬で会社のGMのcharmqさんからDMを頂き、その日のうちにチームを組ませていただくことになりました。初めてのコンペだったため自分の手法に半信半疑なところもあったのですが、採用した手法を伝えて1つ1つ追試してもらうとちゃんとcharmqさんのパイプラインのスコアも上がっていくのが面白かったです。
順位表に世界ランク上位のメンバーが集まる非常に競争の激しいコンペでしたが、その後も協力していくつかポイントを見つけ、結果はなんと優勝できました…!
Kaggleで深層学習のチューニングにハイパラ調整ツールを使うことは比較的少ないと思いますが、重要なハイパラを限定して画像サイズやモデルを小さくするという工夫でうまくワークさせて差別化要因にできたのは良かったです。業務の方でたまたまこのコンペが終わったタイミングでOptuna開発にも関わることになっており、開発チームにKaggleコンペでの優勝解法での使用事例という手土産を持っていくことができました。
Solution: 1st Place Solution, Source Code
Feedback Prize - English Language Learning
前回のコンペに参加した際は、結果の他にも、Kaggleに参加することの学習効率の高さに驚いていました(何しろ画像処理初心者の状態から特定のタスクでは世界トップまでいけてしまったので…)。なので初回に優勝という結果に引きづられて参加のハードルを上げずに、気軽にコンペ参加するようにしようと意識しており、興味のあったNLPのコンペに参加することにしました。
結果はこちらのブログに書いた通りめちゃくちゃshake down。ただ学んだことは大きく、Transformerを用いたNLPタスクの基本的な手法・finetuneテクニックなどの他に、PsiさんのSolutionからはデータが限られた状態でロバストなvalidationを行う汎用的な考え方を学び、のちのコンペにも大きく活かされました。
G2Net Detecting Continuous Gravitational Waves
2022年の年末の12月にすでにコンペに参加していたcharmqさんとyiemonさんに誘われて参加。連続重力波の検出という全く親しみのないドメインだったので大丈夫かなと思っていたのですが、物理学者であるcharmqさんから問題の数学的な定式化を聞き、自分はmatched filterという古典的な手法を深ぼることになりました。アルゴリズムの高速化などには競プロで培っていた肌感覚が役立つことに。結果的にはこれがハマり、これまで機械学習で出していたスコアを大きく上回り上位に入ることができました。
年末年始をKaggleに捧げ、public 1位になったり抜かされたりで2位で迎えたコンペ終了9時間前にcharmqさんがleakを発見します。 その後3人で夜通し実装し、コンペ終了5分前に1位になるという漫画のような展開。
結局privateは2位で、最終日の盛り上がりは何だったんだという絶望感(leak見つけなくても2位だった)はすごかったですが、それも含めて人生でなかなか味わえない体験でした。 1位のKoda Junさんはleakを使っていると思いきや全く使っておらず、まともな解法部分の洗練度合いが違ったので納得の結果でした。
Solution: 2nd Place Solution: GPU-Accelerated Random Search, Source Code
金メダル2つ目でKaggle Expertになりました!
Kaggle Expertになりました! pic.twitter.com/8aF07xAmEa
— けんしん (@knshnb) January 4, 2023
Stable Diffusion - Image to Prompts
Stable Diffusionで生成された画像からプロンプトを予測するコンペ。技術革新のあった拡散モデルにキャッチアップしたいという気持ちと、様々な手法が取れそうな面白そうなコンペだったのでこちらもcharmqさん・yiemonさんと参加しました。
Diffusersでデータを生成してベースラインを学習した後は、メンバーで手分けをして様々な試行錯誤を行いました。自分はStable Diffusionのアーキテクチャやweightを活用した試行錯誤・knnなどを行っていましたが、結局うまく行かず大量データで巨大モデルを学習する方針に。締め切り直前に、画像を2x2のpatch4つ(+全体の1つ)に分割してbatch方向に積んで入力する形で無理やり解像度を上げる方法に成功し、チームメンバーとのアンサンブルパズルもこなしてなんとか金メダルに滑り込む形になりました。
始める前はもっと様々な解法が取れそうと思っていましたが、蓋を開けてみると多様で質の高いデータを大量に生成し、巨大な学習済みモデルで殴るというある意味王道コンペでした。様々な手法の調査や試行錯誤・プロンプトと画像の生成・巨大モデルの訓練などやることが多いかつ計算資源も必要なコンペでしたが上位はソロ勢も多く、ソロ優勝を決めたbestfittingはさすがでした。
Solution: 11th Place Solution
金メダル3つ目でKaggle Masterになりました!
Kaggle Masterになりました! pic.twitter.com/6JoZu3q6bl
— けんしん (@knshnb) May 16, 2023
Google Research - Identify Contrails to Reduce Global Warming
飛行機雲コンペ。扱ったことのなかったセグメンテーションタスクの学習のため、またもやcharmqさんとyiemonさんと一緒に参加。このメンバーで組むのも3回目ともなると、作業の進め方やアンサンブルのやり方などでの暗黙の合意も積み上げられ、効率的にコンペに取り組めるようになってきました。
コンペはオーソドックスなセマンティックセグメンテーションかつ、時系列方向の画像が複数あるという工夫要素のある面白い内容でした。複数時系列を使った2.5DのU-Netアーキテクチャがなかなかうまく行かないながらも、この方針でうまく行かないはずがないという信念だけで試行錯誤を繰り返し、なんとか成功させ上位に入ることができました。
結果は2→3位で、privateではラベルの0.5ピクセルずれに気づいたKoda Junさんにまくられ、またしても分からされる形になりました。
Solution: 3rd Place Solution: 2.5D U-Net, Source Code
Google - Fast or Slow? Predict AI Model Runtime
深層学習モデルの計算グラフのTPU上での実行時間を予測するコンペ。これまでのコンペで使ったことのないグラフニューラルネットワークの実践的な技術を学べそうだったのと、タスク自体が非常に面白そうだったので始めました。
これまでで金メダルを4つ獲得しており、Grandmasterを目指してソロ金チャレンジに挑戦。なかなかDiscussionでも情報も共有されないコンペだったため、コンペ中は常に自分がなにか重要なポイントを見落としたりしていないかということが心配でした。
基本的にはCVを見ながらGNNのパイプラインを改善する日々。終了2週間前に初subしようとしたときに初めてNotebookコンペではなくcsvコンペであることに気づく・最後の学習が間に合っていれば優勝だったというハプニングなどもありましたが、まあ入賞してGMになれたのでヨシということで!
Solution: 5th Place Solution: GNN with Invariant Dimension Features, Source Code
実はGNNは学部の研究の際に初めてまともに触ったニューラルネットワークだったので、Kaggleでそれを用いてGrandmasterを決めることができたのは感慨深かったです。
Kaggle Grandmasterになりました…!!! pic.twitter.com/H9RvEWQiG9
— けんしん (@knshnb) November 21, 2023
終わりに
参加した6コンペのうち5つで金メダル・4つで入賞・1つで優勝という結果を残すことができました。特に入賞した4つについてはどれも優勝も狙えるものであったため悔しい気持ちもありますが、逆に優勝は運に恵まれた要素もあり全体的に非常に幸運だったとも思います。チームメンバーにも非常に恵まれ、お互いの強み・弱みを補完し合いながらシナジーを生み出して結果を残すことができました。
Kaggleはコンペ中やコンペ後に質の高い情報が積極的に共有され、スコアという絶対的な指標があるおかげでデータ分析を学ぶ上で非常に学習効率の良いプラットフォームだと思います。自分がこれまでに参加したコンペはディープラーニングや計算資源を必要とするものが多く、お金の心配をせずに計算機を使用できる環境でなければスタートラインに立つこともできなかったため、そのような環境を用意してくださったPreferred Networksには非常に感謝しています。
参考文献
Grandmasterの先輩方の記事です。(ほとんどyu4uさんの記事から見つけてきたんですが、抜けなどあったら教えてください)