A Day in the Life

Kaggleコンペ初参加でチームに恵まれ金メダル(8位)だった

今日(2022/06/21)の朝9時がKaggleのコンペ終了の時間。結果は即座に表示されるので、チームメンバーと見守る。結果はPublic LB(サンプルで抽出されたスコア)順位と変わらずの1975チーム中8位で金メダル。Kaggleコンペ初参加でチームに恵まれた幸運の結果であった。

8位記念

チームの解法は英語では公開されていて、日本語でも別途公開されると思うので、ここでは解法ではなく主に初参加の感想を。40日ぐらい前に特許と自然言語処理処理コンペであるU.S. Patent Phrase to Phrase Matchingをやらない?とAota氏に誘ってもらい始める。Kaggleは初学者用の本を読んで練習用タイタニックコンペをやった程度の知識だったので、より具体的な進め方やチームで大切にする時の考え方を教えてもらう。

ツールとしては情報共有にNotion(主にboardでkanban)を使い、作った実装はgithubで共有する。スコアはスプレッドシートにて実装連番ファイルと一緒に記載してく。実装はベタにcpして実装を分岐させていく。はじめはcolabのようなnotebook+保存時差分管理のほうが良いのでは、と思ったのだけど実際やってみるとこちらのほうがファイル単体として比較がしやすく、たくさんの亜種がうまれるので(最終的に100個以上の学習用実装ができた)のでコピペ実装の使い勝手が良い。diffもファイル単位で取れるしね。

スコア管理表

非同期なフロー情報共有はチャットで、同期的なディスカッションは週一の定例ミーティングで行い、その時コンセンサスがとれた手法でベースラインの実装をアップデートしていく。ベースラインは基本Aota氏が良いものを成長させてくれた。最初の方に最良のCVのsplit方法考え確定できたこともデータが積み重なれば積み重なるほどきいてくる。またベースラインを実行すると、スコアだけでなく、そのスコアを算出されるのに必要なメタデータ(例えば前処理後のデータなど)も一緒に保存され、なぜそのスコアが導出されたのかのデータ調査がし易い。

そんな感じでコンペへの取り組みが開始し、それからは今まではゲームなどに費やしていた時間をほぼKaggleに費やす。Kaggleも取り組んでみるとゲームのような中毒性が有り、高得点をとるために何度も何度もあの手この手を試したくなる。初めて取り組んだということもあり、その過程で得る知識も多大で知的好奇心が満ちていく感じで楽しかった。

ただ、初心者がCodeDiscussionで読んで得た知識の真似事で高得点を出せるほど甘い世界ではなく、手元のCVが改善したなとLBで評価するとむしろ逆相関、みたいな状態が中盤発生し少々モチベーションが下がる中、チームでやっているとみんなで進めてる感があるので最低限のモチベーションは発生し、コンペ途中離脱にならずにすんでよかった。少なくとも私の場合、自分ひとりでやってたら途中から取り組まなくなっていただろうなぁ。以下は、完全に逆相関時代のスコア。

逆相関

コンペ締め切り10日前、別のチームでコンペに参加していたRaiii氏Masuda氏と合流し、お互いの手法やアイディアを共有し、その時の最良である無難な形の学習モデルを作り最終提出に向けてアンサンブルを作り始める。その時Raiii氏がもしかしたらうまくいくかもと、締め切り3日前に実装した天才的なアイディアの学習手法で単体モデルスコアでもいきなり30位台に入り込み、それでアンサンブルを作ったらその時点で一気にLB4位へと登り上がる。なおこのアイディアは最初はグラフネットワークでの解法を検討したが、そもそももっと単純な1:Nな問題として考えられるのでシーケンスに突っ込めば良い感じに学習できるんじゃない?とのことで、確かに言われてみれば行けるのかもしれないが、そもそも発想が思いつかない&非常に短時間で実装していたスキルに脱帽である。

LB4位記念

この辺から面白くなりすぎて締め切り間際の土日はほぼずっとKaggleコンペへの取り組みを行い、新しい学習手法で様々なアンサンブルを作ったり、加重アンサンブルの最適結合比率の重みを自動で出す(線形結合なので一意な最適解が求めらられる)ものを取り入れたり(私が貢献したわずかながらの箇所はこれぐらいであろう)、出たスコアのデータ分析をしまくる、という感じでお祭り騒ぎで怒涛の3日感を過ごす。最終的にはCVとLBはほぼ相関するようなスコアが出るようになってきて、最高のCVを信じて提出するデータを決める。締切日の朝はみんなでKPT+雑談しながら結果を見守る、という感じでチームでの連帯感と達成感も得ることが出来た。

最後の方のスコア

最終結果としては冒頭の通り8位で金メダル取得が出来たのだけど、いやー面白かった。良いチームメンバーに恵まれ、様々な知識を増やすことが出来、エキサイティングな状況にも出会えて幸運だった、としか言いようがない。今回は自然言語処理コンペで、使ったTransformersはチュートリアル~初学者向けコースも一通りさらえて、ざっくりとした理解が出来たことも実務で使える実用知識がだいぶ上がったと感じる。他にも様々なジャンルのコンペがあり、未知のジャンルではどれもが新鮮で学べるものしか無い、という感じがする。

Kaggleコンペ初参加はチームに恵まれたこともあって、本当に良かったな~チームメンバーに感謝。ただ真面目に取り組むと1コンペに付き50時間ぐらいの消費は最低でも見込まれるので、時間を捻出出来ない場合コンペ参加は厳しいかもしれない。今回は40日合計80~100時間ぐらいの時間は使ったと思う。逆に時間があれば、取り組んで得られるものは前述の通り多いと感じた。ふつうにゲームと考えても楽しいしね。次も興味がある議題のコンペに参加したいが、個人的にはソロだと途中で挫折してしまいそうなので、継続性とモチベーションのためにもペア以上のチームを組んで参加できたらなーと思う。

関連するかもエントリー

加重アンサンブルの最適な重み付けを制約付き線形最小二乗法で求める
先日、Kaggle参加したコンペU.S. Patent Phrase to Phrase Matchinでは、最終局面ではアンサンブル用のモデルをpretrain済みの多様なモデルと複数の最適と思われるパラメータで20個ぐらい作成し、どのモデルをどれぐらいの配合で混ぜると良いのか...
先日、Kaggle参加したコンペU.S. Patent Phrase to Phrase Matchinでは、最終局面ではアンサンブル用のモ...