Kaggle GrandMaster 振り返り

Jun Koda
12 min readSep 2, 2023

Kaggle GrandMaster になったら振り返りを書くという風習があるらしい。検索するとたくさん出てきてどれも面白い (yu4u さんの振り返り, and references therein.) 機械学習で競う Kaggler と一口に言ってもテーブルデータに強い人、画像に強い人、なんでも強い人、AtCoder も強くてアルゴリズムと実装に強い人などいろいろいる。私は物理に強い(そしてそれ以外はそんなにできない)人というちょっとマイナーな GrandMaster になった。

テキサス大学で宇宙物理の数値計算で PhD をとり、3年任期のポスドクとして世界を転々として、2019年はローマにいた。研究が冴えないので、大きなプロジェクトでコードを書いて支援するという仕事をしていたけどよくある職ではないので機械学習をオンライン講座で学んだりしていた。自分で実際に使ってみないと身につかないと思い Kaggle をみたら、とっつきやすそうなものがちょうど始まっていた。

LANL Earthquake Prediction 2位🥇(2019年1–6月)

実験室内の実験で、振動データから地震までの時間を予測する。ここで初めて Gradient boosting を知り、物理的な意味が有るのか無いのかわからない統計量を片っ端から突っ込んでいく文化は新鮮だった。それでも遠い未来の地震はいつ来るかわからず、しかし評価指標への影響はそこが一番大きい。ところがなんと、その分かるはずのない実験開始から地震までの時間は主催者の論文のグラフに載っているらしいというのが discussion で囁かれていた。それに気づけば金メダル、2位になって賞金ももらった。

VSB Power Line Fault Detection 7位🥇 (- 2019年5月)

電圧の時間変化から問題のある電線を判定するコンペ。地震コンペとは時期が重なっていてどちらも半年くらいあった。個人的にはこちらがふたつ目で3月くらいから締め切りまでやったと思う。地震コンペで会得した Gradient boosting を使ったコードを公開してみたりもした。予測が不安定でスコアが安定しない。結果はなぜか7位。4年たった今でも金メダリストが novice, expert ばかりなので宝くじという他ない。

でも、宝くじだったことを除けば独自の謎の手作りモデルは LSTM よりも安定していたし、主催者の論文をがんばって読んで特徴量を入れたりしたので、私の中では真っ当にやったコンペであった。Kaggle 経験がないのでこのスコアの不安定さ異常なのかも分からず、何が改善になっているのか真剣に楽しく考えた。経験を積んでしまった今となってはこんな不安定なことに2–3ヶ月も費やせないと思う。金メダルをとる大変さを知らなかったので、唯一金メダルの solution を書いていない。この頃は GPU を持っていなかったので LSTM を CPU で訓練していたはず。そんな時代。

Recursion Cellular Image Classification 129位 (- 2019年9月)

地震コンペでもらった賞金で GPU RTX 2080Ti を買い、画像に初挑戦した。Kaggle 依存の悪循環の図。銅メダルにすら届かなかった敗因はずっと 256×256 の画像サイズでやっていたことだと思う。大きい画像サイズは正義。後に RTX 3090 (24G) にしてからだいぶ楽になった気がする。当然、経験も知識も全然足りなかった。分子生物学コンペには再挑戦してメダルを取りたい。

Halite by Two Sigma 96位🥉(- 2020年9月)

資源回収を競い、資源を奪う敵の宇宙船は体当たりして潰す対戦ゲーム。結果として使えなかったけれども、強化学習と AlphaGo を学べたので満足。1位の Tom さんは敵の動きに探りを入れており、「彼(敵)を知り己を知れば百戦あやうからず」という孫子の兵法はやはり真理だったと感銘をうけた。

G2Net Gravitational Wave Detection 42位🥈(-2021年9月)

1回目の binary blackhole merger のほう。ノイズの中に連星ブラックホール合体の信号が含まれているか探る。私が参加したコンペの中からベストを選ぶならこれ。どうせ大きな pretrained 画像モデルが最強なんでしょ?と思っていたら、1D CNN をうまく作ったチーム達が金メダルを取った。私は平凡に 2D CNN が主力だったので銀メダル。

押さえておくべき基本的な式が存在する。信号を S, ノイズの大きさを σ として、N個のデータを足し上げる時、元の波をうまく足すことができれば SN比 は √N S/σ で伸びる。比して spectrogram のように自乗して波の位相を消すと足すことは簡単になるけど SN比は √NS²/σ² になる。つまり、信号が弱ければ弱いほど (S σ)、波を直接足すことが圧倒的有利。

これをわかっていれば、自分で強い 1D CNN を作ることができたかどうかは別として、結果を見る前にその有望さをわかっていたかもしれないがそうはならなかった。モデルの魔改造は良い結果を産まないと自制していた時期で、1D CNNは公開されたものをそのまま使っただけだった。過ぎたるはなお及ばざるが如し、でも、及ばないも及ばないということです。

Google Ventilator Pressure Prediction 4位🥇 (- 2021年11月)

人工呼吸器を人工の肺につないだ実験で圧力を予測するコンペ。コンペ初期に PyTorch LSTM の初期化を Keras と同じようにすることでスコアがとても良くなるというコードを公開して貢献できたものの、その後拡大の一途をたどるモデル、10-fold mean という趨勢についていけなくなる。

しかし、予測精度が良すぎる。特に実験開始時の t=0 なんてその日の気圧・気温に依存してわかりようの無いものだろうに。残り1週間、メダルは無理だけどなんでこんなに精度が良いかだけは理解しようと試行錯誤して、主催者の論文を読んだら入力がPID制御という単純な関係でそれまでの出力に依存していた。つまり、入力が出力にどう影響を与えるかいう流体力学の問題ではなく、出力に依存した入力を与えられて、出力を逆算するという謎のゲームだった。しかもデータが離散的だったために多くの予想値を誤差ゼロにできた。この離散性を酷使することは、締め切り前日にコロナワクチンを打ちに行く電車の中で思いついた。そして、夜に副作用の熱を恐れながらC++を書いて金圏に入った。こんな酷い Kaggle 締め切り前夜はもう来ないと思う。

わかってしまえば一体何がやりたかったのかということになるが、賢い人ばかりの Google でこんなことを論文にまでしてしまうのだから、世の中にはもっとたくさんあるという教訓と受け取るべきかと思う。

Santa 2021 13位🥈 (-2022年1月)

Permutation (置換)を舞台とした最適化問題で巡回セールスマン問題に帰着させることもできる。しかし結果的にはコンピュータで傾向を掴んだあとは紙と鉛筆の数学パズルになり、だいぶ熱中した。今でも不思議に思うのはスコア 2430 の後は 2428 に進む方がシンプルで自然なのに多くの人がそれから遠い 2429 を先に見つけていること。私も 2429 を経由した。無印良品のラクガキ帳に1から7までの数字を書いて、数の列を切ったり繋げたりして丸々1冊使い切った。短い期間だったけど少年に戻ったような楽しいひとときであった。

Google Smartphone Decimeter Challenge 2022 (-2022年7月)

日常なくてはならない技術になったGPS. スマートフォンの位置の精度を競う。信号が衛星からの端末に到達する時間だけではなく、ドップラー効果、電波の位相と複数の方法で精度を上げることができる。基礎が膨大にあって必須の外部データを自分で集めてきて使わないといけない。それを学んでいるだけで締め切りが来てしまった。現代文明の粋を学べて満足ではあるけど、結果が全く出ないと終了時に虚しさがあるので、順位のためではなく学習のためとは言っても銀メダルを目指すのが良いと思う。今年3度目があると期待したけど無かった。今後あるなら再挑戦したい。

G2Net Continuous Gravitational Waves 1位 🥇 (-2023年1月)

パルサーの重力波信号を見つける第2回目。2秒だった前回と違い、120日間地球が回るので信号が複雑になってる。1D CNN を追求できなかった前回の反省を踏まえ、なんとか波を足そうとするも挫折。位相を諦めて絶対値自乗を大量の信号パターンに沿って足しあげたら意外にも3位に躍り出た。宇宙大規模構造の観測家と一緒に働いていた頃、データというものは weight を掛けてから足すものだと習っていたので、紙に式を書いて手計算で微分をゼロにするという大学の教科書にでてくるような weight をかけることで1位になった。SN比が1.5倍になるので流石に強い。

締め切りが1/4で正月は一日中コードを書いていた。私はストレスにさらされると吐き気と咳が出る佐藤康光タイプなのだけど、この1位のスコアが出たときは羽生さんのように手が震えた。これまでの前科からは尤もなことに、2位3位チームからは leak があると思われたようで(しかも本当に leak があった!)、急速にスコアを上げられ、締め切りほんの少し前に逆転されて背筋が凍った。しかし、データの巡り合わせの偶然により1位。私は無罪です。

Identify Contrails to Reduce Global Warming 1位 🥇(-2023年8月)

より自信と力強さをもって空で。

飛行機雲のセグメンテーション問題。複数の周波数と時間を使うのが面白そう。振り返りは省いたけれども、NBME Clinical Notes や Benetech Graph で銀メダルをとって、ディープラーニングでももう少し慣れて手際よくできれば金メダルもあるかもしれないと手応えを感じていて、Benetech でちょうど U-Net を使ったところだった。

唐突ながら皆さんには Kaggle でつらい時に唱えるマントラはありますか?村上春樹が走る本の中でマラソン選手が自分を叱咤激励するために何を唱えているかというインタビュー記事の話が出てくる。Pain is inevitable. Suffering is optional. だとかなんとか。私も毎回なんでこんなことを好き好んでやっているのかと思うけれど、チャーチルの演説を聞いたりぶつぶつひとりで言ったりしてる; we shall never surrender.

このコンペは回転 augmentation が効かず、0.5 ピクセルずらすことで回転対称性を回復することが大事だったわけだけど、それに気づいた人は意外に少なかった。私は何故できたのか考えてみると、たぶん長い大学院時代の訓練の賜物だと思う(週20時間みっちり Teaching Assistant で高校教師のようなことをやって給料をもらいながらとはいえ7年もかかった。)研究では新しい結果が正しいのかわからないので、ソフトウェア工学のテストには限界がある。そこで共同研究者とおかしいところは無いか、結果が理解できるかを延々議論する。そうやっておかしいと思ったところを追求するようになった。大抵自分のミスやバグだけれど、たまに10人以下の人しか気づいていない問題が金メダルに直結することもある。

こうして300人目くらいの Kaggle Competition GradMaster になった。同期は H2O に勤めているらしい Ryan Chesler さん。

これから

私は序盤から常に金圏に入れるタイプではなくて、何かに気づいた時に色々偶然うまくいって金メダルを取るので5枚揃う日は永遠に来ないことも十分にあると思っていた。なので、今後金メダルが増えるかどうかはわからないけど、Kaggle Master なら銀メダル8枚くらいあってもよかろうと思っていたので、GrandMaster としての金メダルの前にそれらをコツコツと取りたい。分子生物学を教養として Kaggle をやりながら学びたい。学術研究はもうできないけれど、一般向けの本では物足りないところが Kaggle だと程よい。論文を読んだりするきっかけになる。金メダルを目指す闘いは厳しいけど Kaggle がなくては退屈する。生成AI、LLMなど時流に乗ったコンペも難しそうだけど面白そうでもある。

--

--