🐱

Kaggle Grandmaster振り返り

2024/07/02に公開

はじめに

kaggleコンペに参加し始めて2年半、1つ大きな目標だったGrandmasterになることができました。
https://x.com/yume_neko92/status/1800483992984248332
ちょうど良いタイミングなので振り返り記事でも書いてみようかなと思います。
技術的な内容はほとんどないと思うので悪しからず。

kaggle遍歴

コンペ チーム 分野 順位 メダル
PetFinder.my - Pawpularity Contest ソロ 画像 141/3537 🥈
TensorFlow - Help Protect the Great Barrier Reef ソロ 画像 350/2025
Happywhale - Whale and Dolphin Identification ソロ 画像 72/1588 🥈
Image Matching Challenge 2022 チーム 画像 1/642 🥇
Feedback Prize - Predicting Effective Arguments チーム NLP 12/1557 🥇
Feedback Prize - English Language Learning ソロ NLP 21/2654 🥈
Benetech - Making Graphs Accessible ソロ 画像 1/608 🥇
Google Research - Identify Contrails to Reduce Global Warming チーム 画像 31/954 🥈
Kaggle - LLM Science Exam チーム NLP 7/2664 🥇
SenNet + HOA - Hacking the Human Vasculature in 3D ソロ 画像 14/1149 🥈
Image Matching Challenge 2024 - Hexathlon チーム 画像 1/929 🥇
  • 画像系に参加することが比較的多いですが、NLP系も嗜む程度にやったりしてます
  • 参加スタイルはソロで始めてそこそこの順位になったあたりで声かけてもらった方とチームを組むパターンが多いです

kaggleとの出会い

コンペに興味を持ったきっかけは、kaggleについて紹介しているweb記事をたまたま見かけたことでした。

もともと新卒入社した会社でDeepLearning関連のプロジェクトをやっていたのですが、社内にあまりノウハウが確立されておらず手探りで案件を進める日々を送っていました。自分なりに技術書を読んだり、webにある情報をかき集めたりしながら何とかやっていたものの、我流でやり続けることに漠然とした不安を感じていました。

そんな中、しばらくして転職活動をしてる際にたまたまkaggle取り組みについて紹介している記事を見かけます。kaggle自体は知っていて5年くらい前にアカウントだけ作って放置していたのですが、記事を読んでコンペというものに興味を持ち始めました。ここに参加すれば世界中のデータサイエンティストのタスクへの向き合い方や自分の実力を客観的に知ることができるかなと思い、とりあえず参加してみたのが始まりです。

初参加~Expert

PetFinder.my - Pawpularity Contest 🥈(Public463位/Private141位)

犬や猫の画像から可愛さを表すPawpularityという独自指標を推定するコンペ。
GTと予測値の相関がまったく得られない理解不能な指標でしたが、初めてのkaggleは非常に楽しくて毎日夢中でハイパラ調整したり乱数ガチャを回しては一喜一憂していました。
大したことは何もできないまま終了しましたが、ビギナーズラックで銀メダルを獲得。改めて思い返すとオーバーフィットしやすいコンペだったので、大したことをしなかったのが功を奏したのかなと思います。

TensorFlow - Help Protect the Great Barrier Reef (Public215位/Private350位)

海底を撮影した映像からオニヒトデを検出する物体検出コンペ。通称ヒトデコンペ。
Expertになるべくとにかくメダルが欲しい一心で参戦。大したことはしてないくせに初コンペでメダルが取れた成功体験のせいで謎の自信をつけており、「銅メダルくらい余裕で取れるでしょ」と舐めてかかった結果、まったくスコアが伸びずメダル圏外。
今考えると、"高スコアノートブックが公開されたら飛びつく"、"スコアが出ないからといってvalidationの切り方をコロコロ変える"、"思考停止で適当にアンサンブルする"など、ありとあらゆるアンチパターンを踏み抜いていたので当たり前の結果だったと思います。

当時は小手先のことしかできなかったですが、上位ソリューションはヒトデ領域をポアソンブレンドで別画像にコピペしてAugmentationをするなどユニークで面白いものも多く、いつかまたこういうコンペでリベンジしたいです。

Happywhale - Whale and Dolphin Identification 🥈(Public73位/Private72位)

背ビレ画像からクジラやイルカの個体認識を行うコンペ。
いわゆる個人認識みたいなタスクで、距離学習でアプローチするのが主流でした。また画像数が非常に多くTPUを使ったTensorflowノートブックが人気で、慣れないTFと格闘しながら取り組んでいた記憶があります。

フル期間参加した初めてのコンペで、早々にアンサンブルに手をつけて金圏目前までLBを駆け上がりました。そして同時に早々にアイデアも出し切り、後半は周りがスコアを上げていくのを横目に自分の順位が転げ落ちていくのを指をくわえて眺めていました。何とか最後まで足掻いてギリギリ銀圏で踏みとどまり無事Expertに昇格できましたが、上位との実力差を痛感して打ちひしがれていました。

ちなみにこのコンペから上位ソリューションをちゃんと読んで、真面目に振り返りをするようになりました。当時Twitterで"kaggle弱い人あるある"みたいな投稿が流れてきたのですが、それが痛いほど自分に当てはまっていて、このままじゃいかんと思ったのがきっかけでした。何でも良いから何かしようと思って始めた取り組みでしたが、振り返るとここがターニングポイントになった気がします。

Expert~Master

Image Matching Challenge 2022 🥇(Public1位/Private1位)

画像ペアが与えられてそのマッチング精度を競うコンペ。
Trainデータは与えられているが基本的に学習は行わず、いかに公開モデルをうまく使いこなすことができるかがキーになる一風変わった面白いコンペです。

当時はクジラコンペの惨敗から「アンサンブルに頼るのは悪」という極端な信条を掲げていて、なるべくシングルモデルで精度を上げる方法を知恵を絞って考えてました。その結果、マッチング点をDBSCANでクラスタリングして重要領域をクロップする方法を思いついてギリギリ金圏に到達、ただ終盤で万策尽きたので順位が近いチームと初めてのマージをしました。マージ相手のチームはかなりアンサンブルに力を入れていて、自分のクロップ手法と組み合わせるとスコアが爆増、一気にトップに躍り出てそのまま優勝しました。
https://x.com/yume_neko92/status/1532667439258882049
用法容量をちゃんと守ったアンサンブルは強力という至極当然のことを学びました。

Master~Grandmaster

Feedback Prize - Predicting Effective Arguments 🥇(Public14位/Private12位)

学生が書いたエッセイの評価予測を行うNLPコンペ。予測対象が文書全体ではなくdiscourseと呼ばれるブロック単位なのが特徴的で、その特徴を上手いことモデリングした上でアンサンブルやPseudoLabelingを頑張るのが重要なコンペでした。

ふとNLPに興味が出てきたので勢いで参加。HuggingFaceを触ったことも無いNLP素人でしたが、Discussionやweb記事を読み漁りつつ楽しんで進めていました。
1ヶ月ほど経ったあたりで声をかけていただいて、@wanwanさん、@ktrさんとチームマージしました。序盤でチームマージしたのは初めてで、みんなでわいわいやり取りしながら進めるのはすごく新鮮でとても楽しかったです。その後、中盤で@Zacchaeusさん、終盤で@shirahamaさんとマージして最終的に5人チームで進めていました。

結果はチームメンバーのおかげで金メダル、NLP素人の自分にとっては十分すぎる結果でした。締め切り直前の深夜3時くらいにギリギリ学習終わったモデルをアンサンブルに混ぜてなんとか金圏に滑り込んだのは良い思い出です。
https://x.com/yume_neko92/status/1562230287219580928

Feedback Prize - English Language Learning 🥈(Public6位/Private21位)

FB2(↑のコンペ)が終わった1週間後くらいに始まった続編コンペ。このコンペもエッセイの評価をするNLP回帰タスクでした。

FB2でNLPに目覚め、金メダルも取れて気分がハイになっていたので、その勢いで参加。また、自分がどの程度の実力になったか知りたく、初のソロ金チャレンジをしたコンペでもあります。

しかしこのコンペけっこう曲者で、競技期間中のスコア表示桁数が少なすぎて金圏からメダル圏外まで全員同じスコアが並んでおり、はたから見ても参加者から見てもほとんど何の情報も得られないという謎のLBでした。ただ周りとの差は分からないものの、モデルを作ってアンサンブルすると順位だけはガンガン伸びて、たしか中盤くらいから金圏にいたような気がします。
中盤〜終盤にFB2で学んだPseudoLabelを試したのですが、CVは改善する一方でLBは大幅悪化してしまい頭を抱えていました。かなり悩みましたがリークの疑いを捨てきれなかったので、思い切ってPseudoLabelは捨てる方針に舵を切りました。それでも更にアンサンブルを頑張るとCVもLBも順当に改善できて、最終的にはPublic6位でコンペ終了日を迎えました。

そして順位発表日、ワクワクしながら蓋を開けてみると、悲しいかなLBにオーバーフィッティングしていて銀メダル。CVが良かったPseudoLabel学習モデルを使っていればPrize圏だったということで、身をもってTrustCVの重要性を思い知りました。
https://x.com/yume_neko92/status/1597760097799008256

Benetech - Making Graphs Accessible 🥇(Public8位/Private1位)

グラフチャート画像からデータ系列の値を読み取るグラフ版OCRのようなコンペでした。
ちょいちょい別なコンペを覗きつつも諸々の事情で本腰を入れられず、FB3から約半年ぶりの久々のコンペ。前回の悔しさを晴らすべく、2度目のソロ金チャレンジでした。

ホストの運営姿勢には思うところがあったものの、タスク自体はアプローチの仕方が色々あり工夫のし甲斐もあって今までで一番面白かったです。詳しい取り組みはこちらの資料にまとめてるので、興味ある方いたらぜひご覧ください。結果は狂ったように自前でアノテーションしてたのが決め手となって優勝、初ソロ金。kaggleやってて一番嬉しかった瞬間でした。
https://x.com/yume_neko92/status/1670945471425298432
そして人間、予想外のことが起こると本当に手が震えるということを知りました。

Google Research - Identify Contrails to Reduce Global Warming 🥈(Public30位/Private31位)

衛星画像から飛行機雲を検出するセグメンテーションコンペ。
TwitterのTLが盛り上がっていたので1ヶ月ほど参加していました。複数のスペクトル情報や時系列画像が与えられていて、工夫のし甲斐が色々ある面白い内容でした。

私は時系列順に画像をエンコードしてLSTMにつっこんで飛行機雲が存在するかどうかを分類し、飛行機雲があると判定した画像だけを2Dセグメンテーションモデルで推論するという2ステージアプローチでやっていましたが、イマイチ精度が出なくてしばらく放置。銅圏あたりまで落ちたところでIMC2022のチームメイトに拾ってもらい、最終的にはアンサンブルを頑張って銀メダルでした。

結局最後まで2Dセグメンテーションで頑張っていましたが、上位は2.5Dセグメンテーションで上手いこと時系列情報をセグメンテーションモデルに組み込んでいたので、アプローチの時点で差がついていたのかなと思います。

Kaggle - LLM Science Exam 🥇(Public5位/Private7位)

科学分野の5択問題を解くAIの精度を競うコンペで、今でこそ割と見かけるようになりましたがLLMを題材とした初のkaggleコンペでした。
ChatGPTの台頭で世はまさにLLM時代でしたが、自分はLLMについて何も知らずチンプンカンプンだったので時流に追いつくべく参加。公開ノートブックはDeberta v3を使ったアプローチが主流でしたが、LLMを触りたかったのでwebの情報をかき集めて、7B、13BのLLMをファインチューニングするアプローチで進めていました。

銀圏あたりをウロウロしていたタイミングで@someyaさんに声をかけていただき、チームを組ませていただきました。とても心強いチームメイトで、一緒に議論したり相談したりしながら進めるのはすごく楽しかったです。
コンペ後半に強力なノートブックが公開されてLBが大荒れしたりもしましたが、終盤で@anonamenameさん、@darekさんとマージして、各々のモデルをアンサンブルしながらスコアを堅実に上げて金メダルを獲得することができました。
https://x.com/yume_neko92/status/1711895681340961028

LLMコンペの話からは逸れますが、ちょうどこのコンペに参加している期間中に関東kaggler会というオフラインイベントに参加しました。ありがたいことに招待講演の機会もいただき、とても貴重な体験をさせていただきました。初のオフラインイベントでしたが、今までチームを組んでいただいた方、SNSを通じて知っていた方などとリアルでお話させていただくことができて非常に刺激的で楽しかったです。

SenNet + HOA - Hacking the Human Vasculature in 3D 🥈(Public652位/Private14位)

腎臓のCTスキャン画像から血管領域のセグメンテーションをするコンペ。
Privateの情報が謎に包まれていて早々に闇を感じたものの、当時コンペ過疎期でほかにやることも無かったので参加していました。ただタスク自体はとっつきやすく、深さ方向の情報もあるデータのため2.5Dセグメンテーションや3Dセグメンテーションを勉強するにはとても良いコンペだったと思います。

コンペ中盤で高スコアノートブックが公開されて順位がガッツリ落ちましたが、どう見てもPublicLBにオーバーフィットさせているようにしか見えなかったので、あまり気にせず自分のベースラインを育てていました。
最終的には大幅にシェイクアップしましたが、ギリギリ金メダルには届かず銀メダル。あと一歩及ばず、終了直後はしょげていましたが、上位チームはlossやAugmentationで刺さる工夫をしていて洗練度合いがまったく違ったので完敗でした。

Image Matching Challenge 2024 - Hexathlon 🥇(Public1位/Private1位)

複数の画像セットからそれぞれを撮影したカメラの姿勢推定の精度を競うSfMを題材としたコンペ。2年前に記念すべき初金メダルを獲得したIMC2022と同じシリーズのコンペです。
Hexathlon(6種競技)の名の通り、一般にカメラポーズ推定が難しいとされる6つの課題のいずれか(もしくは複数)の傾向を持つシーンが対象となっていて、それをいかに解くかが求められるコンペでした。...のはずなのですが、実際には6つある課題のうち、"Transparent"(透明オブジェクト)という課題さえ対策できれば金圏に行ける感じでした。

パッと見Transparentは激ムズですが、データや出力結果を眺めている中で隣接画像同士はマッチング数が多い傾向にあることに気づいて、工夫すればどうにかなりそう感があったので割と初期の段階からTransparentに狙いを定めて進めていて、中盤時点でPublic2位につけていました。
https://x.com/yume_neko92/status/1785448115589509278

その後、声をかけてくれた順位の近かったチームとマージ。マージ先チームもTransparent対策に力を入れていて自分のアプローチよりも洗練されていたので、マージ後はTransparent以外のシーンに対する改善やマルチプロセスを使った処理高速化とかをひたすら頑張っていました。
毎日5サブを使い切る勢いで実験を重ねていって、終盤でトップに浮上してそのままフィニッシュ。3回目の優勝、5枚目の金メダルでGrandmasterに昇格しました。
https://x.com/yume_neko92/status/1797782107114074157

kaggleをやって良かったこと

新たな学びがたくさんある

未知の分野はもちろん、馴染みのある分野のコンペでも一通り最後まで参加することで新たな知見を多く得られることがkaggleに参加して一番良かったことかなと思います。
最新の技術トレンドや自分の中には無かった考え方を知ることができたり、実際のデータを相手に試行錯誤することで自分なりのアプローチ方法や分析方法の経験値が貯まっていくので、データ分析の勘所みたいなものはkaggleを通してたくさん学べたと感じています。

自分の実力が客観的に分かる

普通に過ごしていると関わる機会が無いような世界中の技術者、研究者たちと同じタスクに取り組む経験をできるのもkaggleの良さの1つだと思います。特にkaggleはコンペ終了後に上位チームが解法を共有してくれるので、自分のアプローチの良かった部分、足りなかった部分を知ることができるのは独学で色々とやっていたころには味わえなかった経験でした。

仕事で役に立つ

少し実利的な話をすると、kaggleの経験が仕事で役立っているのも、やってて良かったことだったかなと思います。特に上位を狙って本気でコンペに取り組むと、期間を考慮しつつデータの特性や推論結果から仮説を立ててそのタスクに刺さる工夫を必死に考えるようになります。kaggleでこういう経験を積んだおかげでアイデアの引き出しが増え、仕事でも期間や実現したいことに合わせて筋の良いアプローチ方法が見えるようになってきたように思います。

お金がもらえる

すごく実利的な話をすると、上位に入って賞金がもらえたのもやってて良かったことかなと思います。あまり期待して参加していたわけでは無いですが、やっぱり目に見える形で報酬がもらえると、より達成感もあって嬉しかったです。
単純に時間対効果で考えると微妙かもしれませんが、趣味で楽しんでお小遣いまでもらえると考えるとこんなに良いことは無いんじゃないかなと思います。

さいごに

単純に楽しいのでkaggleはこれからもゆるりとやっていこうと思います。
気分屋なのでやってるうちに気が変わるかもしれないですが、次はDiscussionかNotebookあたりでMaster/GMを目指していきたいです。コンペ自体も頑張るので、どこかのコンペで見かけたらぜひ声かけてもらえると嬉しいです。

他にもオフラインイベントに参加したり、個人開発してみたり、情報発信してみたり、色々とやりたいことはたくさんあるので興味の赴くままにやっていきたいなと思います。
これからもどうぞよろしくお願いします!

Discussion