👋

Kaggle Grandmasterへの軌跡

2022/01/22に公開

Kaggle Grandmasterへの軌跡

はじめに

嗚呼、憧れの。
Kaggle Grandmasterに……

……というわけで、なってしまったので、Kaggleとの出会いを含めて記念にポエムにしようと思いました。

Kaggleをはじめる前

Topcoder Marathon Matchesという、中長期ヒューリスティクスプログラミングコンテストの分野で、なぜか初参加から2位、1位、1位とよく分からない順位をつけ、最初の2試合だけでRedcoderになったりしつつ、TCO(Top Coder Open)という毎年1回だけ現地開催される大会決勝に大会側に渡航費用を出してもらって計3度決勝に進出しているうちに、当時全盛期だったTopcoderは衰退期を迎えもはや参加の価値が薄れつつあり、すれ違いでコンテストでもっと勝つために再入学した大学院の博士後期課程が原因でTopcoderをはじめとしたコンテスト全般のプレイ時間を失って……いるうちに、今日に至ります。

Kaggleはその途中で、なぜヒューリスティクス系は勝てるのに機械学習系は勝てないのか……の謎を解き明かすべく、Grandmasterになるまで取り組むことになりました。

イニシャルcは動かない ... 17位

なんかKaggleってチーム組めるらしいじゃん。Marathon Matchesではチーム組めないから楽しそうじゃんねーということで、AtCoder社長のchokudaiさんとペアを組んで参加してみたのがKaggleとの出会いでした。

Flight Quest 2: Flight Optimization, Milestone Phase
https://www.kaggle.com/c/flight2-milestone

どうやらchokudaiさんの方はこの試合の前に1コンペだけ別のコンペに参加していた様ですが、おそらくモチベが一切なかったからなのか、実質2人ともKaggle初心者です。右も左も分かりません。
この頃はDiscussionだとかKernel(現在のCode共有)だとかがあることも知らないし、そもそも2人とも英語が読めません。

僕: (どうせ、つよつよchokudaiさんが1位取ってくれるだろう)
chokudaiさん: (どうせ、つよつよcolunさんが1位取ってくれるだろう)

想いは一致していました!!(ダメな方向に)

結果、お互いに何もしないままコンペ終了。箸にも棒にもかからない17位で惨敗。
教訓として、チームメイトがむちゃくちゃ強くても、そのことにあぐらをかいていたらコンペはあっという間に終わるということを学びました。

Santa コンペ 2014 ... 2位 [gold]

Kaggleは通常機械学習コンペばかり開催されていますが、毎年1回だけ、長期ヒューリスティクスプログラミングコンテストを開催しています。それがSantaコンペと言われるものです。
他のTopcoder Marathon Matches勢がKaggle Santaコンペに参加しているらしいという噂が流れてきて、特にKaggleをやるためではなく、いつものMarathon Matchesメンバーで、いつもと違うKaggleというプラットフォーム上で競う感覚で参加したのが、この年のKaggle Santaコンペでした。

Helping Santa's Helpers
https://www.kaggle.com/c/helping-santas-helpers

当時の順位をあまり覚えていませんが、おそらく7位付近とかで、全然箸にも棒にもかからない順位だったので半ば諦めようと思っていたそのとき、Top Coder Openで顔馴染みになっていたainu7さんに誘われチームを組んで2位を取りました。
1位に届かなかったわけですが……1位を見てみると、Marek Cyganさんで、いつものTopcoder Marathon Matchesの顔ぶれでした。

なお、チーム組まなくてもgoldぐらいは楽勝そうでしたが、そもそもgoldというシステムがあることを知らなかったので、当時の価値観的に3位以内ぐらいに入れないコンテストは無価値なので完全に投げ出して投了(以降一切サブミットしない)していてもおかしくなかったので、そうなると終了時にもgold圏に残れていたかどうかは不明です。拾われて正解でした。

Santa コンペ 2015 ... 1位 [gold]

前回のSanta コンペ 2014では、ainu7さんは、ずっと上位だった僕の順位を超えたタイミングでチームマージを提案してきました。
今年は一人でやりたい!! そう思った僕は、一生懸命頑張ってainu7さんに抜かれない様に順位をキープし続けたのですが……ダメでした。抜かれました。さすがTop Coder Open Marathon部門の優勝経験者。抜かれた瞬間にチームマージに誘われました。僕をチームに誘うためにainu7さんが頑張って無理やり抜いたのが伝わってきたので、チームマージを断れませんでした。
どういう経緯だったかあまり覚えていませんが、Komakiさんも含めて3人でチームを組むことになりました。

Santa's Stolen Sleigh
https://www.kaggle.com/c/santas-stolen-sleigh

結果として1位を取りました。このときの僕の貢献はほぼほぼ0で、Kaggleでキャリーされ続ける人生の始まりを予感させるものでした。
この時点でKaggle上での3試合が終わり、gold2つとsilver1つで、条件を満たしているので、このタイミングでKaggle Masterに昇格したものと思われます。
実際には、Kaggle Masterという称号があることを知って、既に自分がそれになっていることを知るのは、このずっとずっと後のことになります。

Santa (nder) コンペ 2016 ... 10位 [solo gold]

2014年も2015年もSantaコンペは散々な結果でしたので、今年こそは頑張るぞと思ってスケジュールを空けていました。
しかし、なかなか始まらないSanta コンペ 2016……おかしいな……スケジュールせっかく空けているのになぁ……何もしないのはもったいないぞ。あれ、なんだこのSantanderって……? Santa...nder...サンタ、、、Santaコンペじゃん! 今年のSantaコンペはSantanderっていう海外の銀行がやるのか、なるほどなぁ……ということで、半ばこじつけでSantanderに参加しました。

Santander Product Recommendation
https://www.kaggle.com/c/santander-product-recommendation

当然ながら、SantanderはSantaコンペではなく、普通の機械学習系コンペです。賞金もあります。(まあ、賞金はSantaコンペにもあるし、実際この時点で賞金受け取り済みなわけですが…)
当時、中長期ヒューリスティクスプログラミングコンテストにはある程度の得意意識がありましたが、機械学習に関してはてんでダメでした。
Santanderの1〜2年ぐらい前に師匠に組合せ最適化と機械学習の本質的な違いって何なんすかねー、、、と聞いてみるも、本質的な違いはないはずだとの回答が返ってきていたため、持たざるスキルセットが何であるのかを探していた時期でした。

fugusukiさんから、「Kaggle機械学習コンペは、データをExcelで表示して眺めつつ、機械学習モデルをライブラリから自作するのではなく、xgboostなどの既存の機械学習モデルに丸投げしてれば勝てる」と聞き、そんな自分で書いたコードでもないもので学習しても、内部でどんな動作してるのか分からんのに勝てるはずがないじゃん……勾配ブースティングは既に自分で実装したものがあるし、そっち使う方が高速だし痒い所に手が届いて良いんじゃないか、、、と思いつつ、でも敗北から学ぶことは何もなく、人は勝利からしか学ぶことができないわけだから、とりあえず一度言われる通りにやってみて惨敗してみてから考えよう……というわけで、愚直にExcelを眺めながらxgboostに丸投げするということを実践しました。結果として10位を取りました。初めてチームを組まずに最後まで終えることができたので、solo goldを獲得しました。

なお、この年のKaggle Santa コンペ 2016は、かなり遅いタイミングでスタートしました。とりあえず登録だけはしましたが、Santanderで忙しく、ほとんど参加時間が取れなかったので33位に終わりました。

New York City Taxi Trip Duration ... 28位

Grandmasterというものが存在することを知った時点で4試合しか参加してないのにgold 3つ入手済みだった僕は、適当に参加してればGrandmasterぐらいすぐなれると思っていました。博士後期課程に再入学を果たしていた時期であり、仕事で一家4人を食わせつつなので、とにかく時間がなく、この頃からとりあえず参加はするけれどもほとんどプレイすることなくの期間満了が増えていきます。
Kaggleコンペに限らず、やるやる詐欺が常体化したのがこの頃で、これ以降は成果の出ないコンペが連発しますので、それらについてはポエムでは触れません。

Santanderの結果は、それなりの成功体験ではありました。自作のモデルだと、おそらく無意識のオーバーフィッティングが全然取り除けていなかったりなどが、それまでの機械学習コンペでの敗因だったのだろうと思います。
しかしながら、とは言え10位で納得できるはずもありませんでした。
圧倒的に勝てる方法論を模索したかった。

この後、時代は深層学習へと突入していくため、振り返ってみるとほとんど無駄な構想でしたが、唯一まともに中長期ヒューリスティクスプログラミングコンテストに対して取り組んでいることを機械学習コンペでも実践しようと試みたのが、このコンペでした。

New York City Taxi Trip Duration
https://www.kaggle.com/c/nyc-taxi-trip-duration

gold 3つ、solo goldも持っている状態でしたが、私はKaggleのルールをそもそも知りませんでした。なんか最高位のKaggle Grandmasterとやらになるためには、あとgoldを2つ取らなきゃならないらしいということは理解したのですが、どのコンペならgoldが貰えて、どのコンペだとgoldが貰えないのかということを当時まだ分かっていませんでした。
どうやらgoldが貰えないコンペがあるらしいということは知っていたのですが、見分けが付かず、賞金があるコンペではgoldが貰えて、賞金がないコンペではgoldが貰えないのかなーと、思っていました。

そこで参加したのが賞金表示のあるこのコンペでした。あっという間に暫定3位ぐらいまで躍り出て、そこからやってみたかったテクニックを駆使して暫定1位へと上り詰めます。ようやく技術的にまともなことを駆使できたので、満足感がありました。
上り詰めた後で……あれ、これ、gold貰えないコンペじゃん。ということに気付き、動機を完全に失って途中退場(投了)しました。

Instant Gratification ... 11位 [gold]

長らく個人事業主として生計を立ててきた僕でしたが、博士号を取り終える直前ぐらいのタイミングで株式会社THIRDという会社にChief Scientific Officer(CSO)という役職で誘われました。
それまで、口頭でCTOになってくれないか系のお誘い(リップサービス?)は3社ぐらいから提案を受けていましたが、CTOって、あれもこれもそれもやらなきゃならないことを知っていたので、とにかくそんな役職にはなりたいと思えずお断りしてきました。
(アーキテクト含むフルスタックで生計立ててきたので、スキルセット的にマネジメント系を除いてだいたい網羅しており、尚のことそれらはやりたくなかった)

CSOは和訳すると最高科学責任者とかになり、日本では聞き慣れない役職ですが海外では珍しくない様です。

Chief scientific officer - Wikipedia
https://en.wikipedia.org/wiki/Chief_scientific_officer

A CSO almost always has a pure science background and an advanced degree,
whereas a CTO often has a background in engineering or business development.

博士号は趣味のコンテストのために取得したものなので、純粋な科学的背景かどうか怪しいものですが、それでも適材適所で研究開発以外のことはCTOにお任せして、自分は好きな研究方面ばかり担当していれば良いというご提案は大変魅力的なものであり、お受けすることにしました。

もちろん、相応の役職に就くからには会社のこと(そこで働く従業員のこと)を第一に考えて、やりたいことばかりやっているわけにもいかないのでしょうが、最初からやりたくないことのために役職に就きたいとは思えないわけで、こういった魅力的な夢のある提案はとても大切だと思います。

実際、入社からだいぶ経ちますが、諸々尊重し続けてもらえており、最近ではプログラミングコンテストを会社として主催することまで出来ました。

THIRD プログラミングコンテスト 2021 (AHC007)
https://atcoder.jp/contests/ahc007

ともかく、こうして新しい会社で働き始めたのですが、AtCoderってTopcoderってKaggleって何なのっていう理解を社内でもう少し得られたらなぁと考える様になります。
百聞は一見にしかず。コンテストをやってもらうのが一番手っ取り早いだろうということで、チームが組めない他のプラットフォームではなく、チームが組めるKaggleを一緒にやることを思いつきます。
こういった場合にタイタニックが適切だと考える人は一定数いるかと思いますが、タイタニックはスコアボードが面白くないことになっており、改善のプロセスを回した時に実際にスコアが上がって順位表を駆け上っていくという一番面白い要素を体験してもらうことができません。
現在進行系のコンテストが望ましいということで、プロダクトマネージャのFさんとチームを組んでこのコンペに参加しました。

Instant Gratification
https://www.kaggle.com/c/instant-gratification

チームを組むと同時に、機械学習ってなんじゃらほいなFさんに山の様にKaggle文化と機械学習および、今回のコンペ固有の事情について怒涛の勢いで説明を続けたので、思考がめちゃくちゃ整理された結果として、順調過ぎる勢いで順位を伸ばしていきました。

goldを獲るために必要なのは、実は強いチームメイトではなく僕自身のモチベーションをどうやったら高めることができるのかというその一点の方がむしろ最重要だと、このときのことを教訓に思います。
また、Fさんはメンタースキルが高いからなのか質問が多く的確で、中級者以上だったらどうでも良さそうな所にも質問が発生して、その質問に正しく答えるためにちゃんと調べることが、問題に対しての理解をより掘り下げる上でのモチベーションになります。
正直、チーム組んでなかったらgold取れていた可能性はかなり低そうです。

また、Kaggle人生の中で初めて、Discussionで共有される問題固有情報を活用した試合でした。
というのも、メンターが納得する様に質問に答えるためには、自分の調査結果だけでは不足があり、英語であっても、他人の見解を調べる必要が生じました。
(役職上は僕のほうが上ではあるんでしょうけれども、数少ない先輩社員であり、プロダクト開発に関わっているタイミングにおいてはプロダクトマネージャはクライアントの様な関係性と考えているため、尚のこと説明には熱が入ります)
(その証拠として、非常に悪いことに、その後の別コンペではやはりDiscussionをほとんど見ずにプレイを続けており、なかなかgoldが取れません。分かっていても、Discussionをわざわざ見るモチベが生まれません。持つべきものはプロダクトマネージャですね)

終盤、そこそこの順位にはいましたが、まだこの時点では元々オリエンテーションのための参加であり、魂に火が灯っていませんでした。
終盤に差し掛かった時、火が灯るきっかけがありました。それがKaggle Tokyo Meetup #6の発表でした。
Kaggle Tokyo Meetupというのは、当時の私にとって唯一の機械学習のノウハウを得る機会でした。なにしろ、Discussion読みたくない勢(森の中で数枚しかない葉っぱを探す様な行為なので嫌い)ですから、唯一の成長の機会です。一年分の収穫がそこにあるというのに、指を咥えて見ているだけなんて出来るはずがありません。
Kaggle Tokyo Meetup #6は、膨大な参加希望者に対して、1年以内にgoldを取った人に優先参加権を与えるというとんでもないことを言い出しました。前回はKaggle Masterでさえあれば優先参加権が貰えたので、随分とシビアな条件になったものです。前回gold取ったSantanderは1年よりも昔のことだし、Kaggle Tokyo Meetupに参加するためには、オリエンテーションのつもりで参加しているこのコンペでgoldを獲る絶対的な必要性が突然発生しました。
完全に魂に火が灯った僕は、仕事はほどほどにKaggleに専念する宣言をして、確か有給休暇も急遽1日だけ取った気がしますが、ともかく全力でKaggleに打ち込みます。
このとき幸いなことに、Fさんに説明するために集めていたDiscussion情報がとても役に立ちました。Discussionで今どんなトピックが話し合われているのかについて、このコンペの時だけ唯一把握できていました。他のKaggleコンペでは考えられないほどに、僕の元には情報が集まっていました。

最終的に福引コンペ(潜在的gold圏が50〜100チームぐらいいた)と揶揄される本コンペですが、僕はそうは思っていません。むしろ、最後の5サブミットの中にprivate1位を塗り替えるサブミットが2つあり、1位が取れない3サブミット側から2つを最終サブミットに選んでしまったことで11位の結果となってしまいました。
もし最後の5サブミットから最終サブミットを選ぶ前提なら、10通り中7通りが、1位になれていました。同じような状況にあるチームが他に存在できる確率を考えると、それは50チームなんかよりはずっとずっと少ないと思うわけです。
1位になれるサブミットを選べなかったのは僕の力不足ですが、福引コンペだったということにしたい運任せな方々については、(※ちゃんとCV取ってないので根拠なしですが)この場で否定しておきたいと思います。(某gold取った側のGMがCV取って根拠ありで福引コンペと言っている話は知っていますが、以下略)
Kaggle Tokyo Meetupへの参加権がかかっているのに、運なんかに身を委ねられるはずもありません。

ともかく、無事goldを獲ることが出来たので、Kaggle Tokyo Meetupに参加することができました。

Predicting Molecular Properties ... 29位

Shun_PIさん入社までの間、コンペでもしながら機械学習教育の簡単な研修を行おうと思ってお誘いしたところ、一緒に参加することになりました。

Predicting Molecular Properties
https://www.kaggle.com/c/champs-scalar-coupling

研修のつもりなので、僕はほとんど見ているだけで、Discussionでの調査およびコーディングもほぼほぼすべてShun_PIさんが行いました。

よく分からぬままキャリーされて、気付けばそれなりの順位にいまして、先日GMになられたnyanpさんやpaoさんのチームとのチームマージの話が持ち上がりまして、僕のKaggle人生の中で初めて、まともな機械学習のバックグラウンドを持つ方々とチームを組むことができました。このときのチーム経験は、とても勉強になりました。この場を借りて御礼申し上げます。

さて、ほとんど初めてのまともなKaggle参加で僕をキャリーしてみせたShun_PIさんですが、このあと僕の手なんか借りなくてもgoldを獲ってくるまでに成長していきます。
やはり物事というのは、勝ち方を知っている人から学ぶのが一番の近道だと思います。
一度体験させてあげることができたなら、優秀な人は次からは補助輪なしで走り始めます。
この方法であれば、自分より優秀な人でも育てることができます。(つまり、育てていませんね。ごめんなさい)

NFL Big Data Bowl ... 31位

やはりShun_PIさんに終始キャリーされて何もしない僕でした。
あまりにキャリーされ具合がひどかったため、このあとしばらくチームを組んでもらえなくなります。

NFL Big Data Bowl
https://www.kaggle.com/c/nfl-big-data-bowl-2020

MoA ... 29位

序盤に1桁順位が取れたので、珍しく息巻いて僕主導でチーム集めて参加しました。

Mechanisms of Action (MoA) Prediction
https://www.kaggle.com/c/lish-moa

チームメイトの方々のおかげで暫定1位まで上り詰めたのですが、shake downで29位転落しました。

問題固有の状況はおそらく他のどのチームよりもかなり正確に把握していたのですが、他チームがどういった状態でそのスコアを出しているのかという点に関して、僕が大きくミスリードをしてしまっていたために、努力の方向を誤り、残念な結果に終わりました。無念。
パブリックでものすごく有利になるマジックがあって、それはプライベートでも有利になるのですが、プライベートでの有利になり方というのがパブリックでの有利になり方の5分の1ぐらいでした。この5分の1というのも試合中から分かっていたことでしたが、他のチームも当然ながらそのマジックに気付いた上での競争だと思っていましたが、どうやらマジックに気付いているチームは少数で、軒並みshake downした様です。
プライベートに切り替わるタイミングで、実はそのマジックのパラメータを5分の1に変更する必要があることにも気付いていました。中途半端にマジックに気付いていただろう他の暫定上位チームは半端じゃないshake downをしています。

Santa コンペ 2021 [gold]

コロナ禍でKaggle Tokyo Meetupが永く開かれていませんでした。
この間の僕の思考は、今goldを獲ったとしてもあまり意味が無いの一点に尽きるものでした。

この間、そろそろgold獲らなきゃなーと言ってはKaggleコンペの参加登録を行って、1サブミットもしなかったり、あるいはモチベを上げるために1サブミットしてみるが、やはり時間は確保できないなどの、コンテストやるやる詐欺が横行しました。
このやるやる詐欺は、Kaggleに限ったものではなく、中長期ヒューリスティクスプログラミングコンテストでも似たような状態にあります。

実際問題、小4長女の中学受験勉強を見始めたら、一機械学習エンジニアとして人間の学習も興味の対象にありますので、その奥深さにハマってしまい、仕事以外の時間をほとんど丸々そちらに投入している現状があったりします。

ともかく、そんな中、ある事件が起きました。11月7日に競プロ忘年会の開催が発表されました。
コロナ禍はまだ続くのでしょうが、競プロ忘年会が開かれた様に、Kaggle Tokyo Meetupがいつ開催されてもおかしくない状態になりました。
これは、gold取っておかないと非常にまずいことになる……!!
そう思っていたところ、11月17日にSanta コンペ 2021が開始。

Santa 2021 - The Merry Movie Montage
https://www.kaggle.com/c/santa-2021

11月18日にTHIRD プログラミングコンテスト 2021(弊社プロコン)が発表され、広報に追われる中、Santaコンペに着手しようと思うも……お布団の温かみには勝てない……というのが繰り返されてとりあえず平日は無理で、11月20日21日の土日で方針は出すもコードは全く書かないまま月曜日を迎えました。
11月22日にShun_PIさんからチームに誘われチームを組んでお互いの考察の意見交換を行いました。すると……おやぁ……僕は何もしてないのにShun_PIさんにすごい勢いでキャリーされまくって、あっという間に9位まで連れて行かれました。

11月22日のキャリーされる前の時点でrian_tkbさんも誘うことが決まっていたので、翌23日にrianさんとのチームマージも済ませました。
その直後、今度はrianさんにキャリーされ始めます。というか、Shun_PIさんとrianさんの2人が頑張って、僕だけがキャリーされているというか……当初、サンタのソリに引きずられるコルンの図を思い描いていましたが、なんというかこれはもう、海の底を底引き網で引きずられている……トロール漁業とか言われるあれじゃないですか。えっ? ネットゲーム用語のトロールはTrollで、トロール漁業はTrawlだって? うんごめん、英語分かんないや。

rianさんの立てた方針で、ワイルドカードなし2440へと到達したため、この時点で弊チームのMVPが僕の中でrianさんに確定しました。あとはパズルを解くだけです。

この少し前に、僕は言いました。
「コード書く時間が取れない……土日(27日と28日)にはコードを書いてチームに貢献する!!」
これが僕のKaggle人生の中で最大のやるやる詐欺になりました。
なぜなら、26日(金曜)の夜には2429点をマークし、コンテストが終わったかに見えました。
僕がコードを一行も書くことなく、我がチームは2429点をマークしたのです。
いえ、もはや、何もしていない僕が「我がチーム」などと言っていいのかどうかすら、、、

サンタさん、クリスマスプレゼントありがとう!!

そう叫ばずにはいられません。メリークリスマス!!

結局、2429が厳密解なのか、それとももっと短いスコアが存在するのか、このときは分かっていませんでしたし、それは1位から32位まで2428点で横並びのまま終了した現在でも、本当に2428が厳密解なのか分かっていません。
ともかく、2428の解よりも2429の解の方がとてもとても美しい解で、そのあまりの美しさから確証はないけれどもこれで終わりだと当時の僕は思ってしまいました。

どう美しかったかというと、2430解から更に1ワイルドカードあたり1文字短くする方法が、5ワイルドカード周期で現れます。5ワイルドカード使わなければ、この周期は解消できません。すなわち、6つのうち1つ余ったワイルドカードは2430解の様な使い方をするしかなく、3つの劇場は2428, 2428, 2429となり、1つだけ余りが出るのです。各劇場2個のワイルドカードに対しての奇数点のスコア改善の裏に、こんな美しい事情があるなんてと、心から感動しました。

そして土曜日ですが、もはや終わってしまったコンテストに対してかける時間はなく、僕はせっかく空けていたスケジュールを、別のコンテスト用の準備に費やします。やるやる詐欺……だってコンテストは終わったんだもの。そう思い込んでいました。

ところが皆さんご存知の通り、2429は理論値ではありませんでした。日曜日の朝に起きてみると、2428が出されており、4位まで既に2428で埋まっていました。脳内で警告音が鳴ります。
2428解を考えますが、なかなかに思いつきません。

2人は探すのを辞めてしまったかのように静かです。
この状態に、僕は既視感がありました。

僕(つよつよShun_PIさんとつよつよrianさんが2428解を見つけ出してくれる)
Shun_PIさん(つよつよrianさんとつよつよcolunさんが2428解を見つけ出してくれる)
rianさん(つよつよShun_PIさんとつよつよcolunさんが2428解を見つけ出してくれる)

はっ、、、これは!!! chokudaiさんとのFlight Quest 2で起こったことが、今まさにもう一度繰り返されている!!

最初のチームが2428を出して数時間で他のチームも2428に気付いていっている……難しいはずがないんだ。たった数時間頑張れば必ず答えは出るはずだ。同じ点数の場合は先着順だから、来週だとgold圏に入れないかもしれない。頑張るなら今しかない。

しかしその数時間頑張ることに関して、3すくみでお互いに誰かがなんとかしてくれると信じ切っている。なまじまぐれで2430解と2429解を僕が見つけ出してしまったために、本当は2人ともこんな解なんて簡単に探し出せるはずなのに、答えの探し方に関して盲点にはまっているんじゃないか……僕が2430解と2429解を見つけなければ、2人のどちらかが両方とも……そして2428解も見つけ出していたに違いない。ここで僕が頑張らなくてどうする、ただキャリーされ続けるだけじゃなく、最後に足を引っ張ってMoAのときみたいに敗因を作ってどうする。3人分のgoldがかかっているんだ。何より、既に2428解を見つけ出している他のチームに出来ることが、TCO決勝に3度呼ばれた僕に出来ないはずがない。一刻を争う、他のチームが2428を見つけ出す前に、僕らのチームがそれを見つけるんだ。

仕方がないので、網羅的に情報を整理していきます。何しろ僕は探索と推論のプロです。これが見つけられないはずがない。
実は2428解は2429解よりも簡単な2周期の解なのですが、2429解を見つける前の状態ではそういう周期解が存在することに気が付いていないため、目の前にあってもそれが2428解であることが認識できません。
最終的に情報を一から整理した状態で人力全探索を行い2428解を見つけたのですが、Shun_PIさんとrianさんがCodeforcesに出ていて、これをコードに落とし込む人がいません。
こうしている間にも他チームが2428解に気付いて順位表が埋まるかもしれない……大変です。……よし、やるやる詐欺じゃないところを見せてやる、コーディングするぞ!! そう思い、rianさんの2429のコードを数行書き換えたところで、Codeforcesが終了……僕のつたない説明を噛み砕いてくれるShun_PIさん、そして一瞬で2428のコードを実装するrianさん。最後もキャリーしてくれる2人。キャリーされ続ける僕。かくして、僕の数行書き換え中のコードはお蔵入りになり、僕が書いたコードは1行も動くことなく、つまり僕は実質1行もコードを書いていないと見做せる状態で、Santa コンペ 2021が本当の終わりを告げたのでした。

……やるやる詐欺すみません、本当に反省しています。

いやぁ……たぶん実質1行もコードを書くことなく、キャリーされるだけでGrandmasterになった情けない男は、後にも先にも僕だけになるんじゃないかなぁと、心から思います。

いやむしろ、1行もコードを書くことなくキャリーされるだけでgoldメダル獲ってしまうのは、普通にsolo gold獲るより難しいんじゃ……そんな偉業を成し遂げて……いや、偉業? 何もしてないぞ……情けない!!! 混乱し様々な想いが心の中で湧き上がっていきますが、最終的にチーム全員がgoldを獲れた喜びが最も強い。

サンタさん、最高のクリスマスプレゼントをありがとうございます!! メリークリスマス! メリークリスマス!!!!!

……いや、なんも出来なくて本当にごめんなさい。

なお、後日threecourseさんから、「キャリーされるだけで少しも貢献せずにgold獲ったんだったら、それは本来の意義的には、Kaggle Tokyo Meetupの優先参加資格は無いよ」と言われました。
「いやぁ、まったくもってその通りだとは思いますが、システム上1年以内のgoldで優先参加権という取り決めになるんだったら、一応申請自体はしますよ」と、臆面もなく言い切る僕がいました。厚顔無恥とはこのことか。

ということで、はやくコロナが収束して1年以内にKaggle Tokyo Meetupが開催されることを切に願っております。いえ、まあ実際には、Kaggle Tokyo Meetupなんかどうでもよいので、コロナが1日でも早く収束することを願っています。それが1年以内であり、今回のgoldが無駄にならずにKaggle Tokyo Meetupが間に合うのであれば、それはコロナ収束のついでにはなりますが、僕にとってはとても素晴らしいことです。

なお、Instant Gratificationのときのことがあったので、Santa コンペ 2021のときも同じぐらい、Kaggle Tokyo Meetupの優先参加権のために頑張らねばと思ってしまったのですが、よくよく考えるとInstant Gratificationの時にはKaggle Tokyo Meetupぐらいしか機械学習の勉強手段が存在しなかった僕ですが、そこから株式会社THIRDに入って、Shun_PIさんをはじめとしたAI開発チームが成長していく中で、毎週ローテーションで開かれる勉強会をとってもそうなりますが、もはや機械学習の勉強手段が社内に存在しており、以前ほどにKaggle Tokyo Meetupにこだわる必要がなくなっていることに気付く次第です。

というか、みんな本当に勉強家ですよね。優勝記事に類するものは拙い英語で何度か書いたことありますが、他人の優勝記事はほとんど読んだことないや。読んでも頭悪いので、分からん。英語だし。でも勉強会で噛み砕かれていたら、理解できる。素晴らしい。

今後のKaggle参加について

まだテーブルコンペばかりだった頃、機械学習には夢がありました。それは、中長期ヒューリスティクスプログラミングコンテストと同じように、能力さえあればお金がなくても勝てるということです。
昔は、スタッキングしまくってマシンパワー使いまくらないと勝てないんじゃないかと言う僕に、エクセル眺めていれば勝てるよと教えてくれるfugusukiさんがいました。そこにノウハウなんて必要なくて、初めてKaggleの機械学習コンペに参加してもgoldが獲れるほどに手軽でした。
今また、Deep Learning全盛期となり、GPUをがんがん回さなければならない状況になっています。
それは画像コンペなどに顕著だとは思いますが、テーブルコンペ向けのDeep Learningモデルも台頭してきており、すべてのコンペでDeep Learningと無縁ではいられません。
特徴量エンジニアリングは、その一部をDeep Learningが自動的に代替してくれる様になりました。申し訳程度に、自動特徴量エンジニアリングをDeep Learning側がやりやすくなる様にモデルを組む様になりました。ターゲットエンジニアリングだとか、Mixupをはじめとしたデータ増強、TTA、疑似ラベルなど、問題固有領域を自力で掘り下げることよりも、抽象的なナレッジが試される方向にシフトしたんじゃないかなと思っているところです。
これらの技術は分かるのですが、同時に試行錯誤にとてもマシンパワーが必要になる様に感じられます。また、やることの抽象度が上がると、毎回似たようなことを繰り返すだけのコンペになってしまいます。コンペごとの工夫よりも、蓄積ノウハウや単に計算資源の多いことがより有利になる様なコンペです。蓄積ノウハウはもっと見習うべきと思いますが、ノウハウなくても初見で勝てなきゃコンテストのモチベ維持が難しくなります。
GPUがんがん回さなくても、エクセル眺めていれば勝てるよと僕に言ってくれる人は、もういません。僕の夢は終わりました。

実務経験として2週間で100万円ぐらいなら機械学習用のマシンリソース使用料として1人で溶かしたこともあった気がしますが、ともかく、こんなものを趣味で溶かすのは馬鹿げています。このあいだ1ヶ月だけCoLab Pro+を契約してみましたが、諸々ショボいので、結局最終的にマシンリソースをがんがん溶かせるお金持ちが有利なんじゃないかなと思ってしまいます。そんな悪夢が拭えません。実際には僕と同じように他の皆もほとんどKaggle内のnotebookリソースだけで戦っているのかもしれないですが、しかし大規模な外部リソースを使うことができたなら有利だという事実が、ソシャゲを無課金で遊ぶ時の様な感覚をもたらします。ガチャ課金のソシャゲよりも、買い切りのコンシューマーゲームが好きです。ガチャ課金のあるソシャゲのランカーには個人的に権威を感じません。チーム組まなくてもお金を積まずとも知恵だけで勝てる世界に行きたい。その肝心要の知恵が僕には欠落しているのが少し残念ですが。

ともかく、こうした僕の思想もあり、活動の方向としてKaggleは適切ではない様に最近感じています。読書をする様なお金のかからない、単に知的探究心を満たすための趣味として、コンテストはあまりに僕の身近にありました。
コンテストを読書と並べて書くのは何かおかしいでしょうか? いえいえ、コンテストにはそれぞれ問題固有領域があり、そこを掘り下げ理解していくことは小説を読むことによく似ています。
成果は出せませんでしたが、MoAは最も楽しめたKaggleコンペの1つでした。

最近は短時間のヒューリスティクスプログラミングコンテストが流行っています。最初の土俵としてはとても良いと思いますし、僕自身もどんどん短時間で戦える様になっていきたいと思っています。でもなんというか、問題固有領域というものは、もっとゆっくりと時間をかけて楽しむものだと思っています。

組合せ最適化しか分からず、機械学習で何が出来るのかを分かっていなかった頃には、機械学習に夢がありました。結局師匠が言うように、どちらも道具であることに変わりはなく、車の両輪の様にどちらも必要です。どちらもある程度は使える様になった今となっては、仕事で役に立つからとあえて趣味まで機械学習にこだわる意義も薄れつつあります。

今回Grandmasterに昇格したことで、Kaggleをプレイする動機がほぼなくなったのは事実です。TCO決勝で果たせなかったゲームクリアというやつを、Kaggleでは達成したことになると思います。
Grandmaster程度とTCO決勝で1位になることとは程度が違い過ぎて同列には扱えないのでしょう(Kaggle Days Championshipでの優勝と同列に扱うべきでしょうねぇ……Kaggle Days Championshipは多少興味ありますが)が、ここまでは果たしておきたいと自分で思ったところまでがゲームクリアという意味で同列に並べられると思っています。

しばらくゆっくりしたいと思っています。
博士号を取ったときに、同じようなことを言っていましたが、すぐにもっと忙しくなりました。
しばらくゆっくりしたいと思っています。
小4長女の中学受験というマラソンマッチが終わるには、あと2年間を待たねばならないのでしょうか? 小4長女は既に自発的に勉強をして成績を伸ばしていけるフェーズに入ろうとしています。僕が手を貸すのは最小限で済むようになっていっている途中です。
しばらくゆっくりしたいと思っています。
TCO決勝に行っていた頃に、コンテストに時間を溶かしまくっていたのでしょうか…? そんなことはなく、当時もそんなには時間を使っていませんでした。
ただ今よりも時間的余裕があり、ゆっくりと何もしない時間をコンテスト時間とは別に取れていたことが、高パフォーマンスに繋がっていたのではないかと、そう思います。
しばらくゆっくりしたいと思っています。
そうして、攻略したいと一度でも思ってしまったTCO Marathon 決勝とかいうやつに、もう一度心から取り組む日がいつか訪れて欲しいと、切に願っています。
(というか、だいたいやりたいと思ったことは達成してきているので、5年以上達成できずまだ残っている可能そうな目標としては最後にMarathonだけが残っている)

Discussion