🙌

Kaggle Masterになったのでポエム

2022/12/15に公開

はじめに

アドベントカレンダー「ほぼ横浜の民」の1日目の記事です。2022年10月に終了した Google Universal Image Embedding の結果をもって Kaggle Masterになったのでちょっと振り返りポエムを書こうと思います。

Kaggleを始めるまで

大学時代は機械学習にほぼ触れることなく今の会社に新卒で入りました。業務で画像系タスクを担当することになり、自分なりに本を読むなどして勉強しながら業務を進めた記憶があります。Coursera の Machine Learning の講座は受けたような記憶がありますが、最後のほうサボったような…。

勉強を進める中でKaggleというものがあるということを知り、世界のトップソリューションから何か学びがあればくらいの軽い気持ちで最初のコンペに参加しました。

コンペ参戦歴

Global Wheat Detection

期間:2020/5/5 - 2020/8/4

現在のプロフィールには履歴が残っていませんがこれが最初に参加したコンペになります。お試しで知り合いと一緒に参加しました。小麦の穂の検出という今思えばかなりシンプルな物体検出のタスクでした。結果はというと全く奮わず途中でやめた上に、ライセンス違反ということでLB[1]から削除されてしまいました…(確かこのときはYOLOv5を使ったソリューションが全て消されました)。散々な結果ですね。

データ拡張の組み合わせやパラメータをひたすらいじってスコアをあげようとしていましたが成果が出ずにやめちゃいました。ちょっとパラメータ変えれば簡単に上がるんじゃない?って舐めてましたがそんなに甘くはなかったです。今の知識とスキルでは全く通用しないという事実を突きつけられて無力感だけが残るKaggleデビューとなりました。

まとめ

  • ちょっとかじるくらいでは簡単には上に行けなかった
  • パラメータ調整すらうまくできていない疑惑。。。無力感

PetFinder.my - Pawpularity Contest

期間:2021/9/20 - 2022/1/15

小麦コンペの苦い経験から、しばらくは業務で基礎レベルをあげようとKaggleには手を出していませんでした。ただKaggleへの興味はあったのでコンペに参加している人のツイートを眺めるなどはしていた気がします。

そんなある日同じ部署の先輩Aさんがいつの間にかKagglerになっていることを発見します。Aさんは小麦コンペをやっていた頃には果てしなく遠くに見えていた銀メダル圏内にいて、既に別のコンペで銀メダルも持っているようでした(知らないうちに10個近くのコンペに参加していたのでびっくりです)。

Aさんに負けじと始めてみたこのコンペでしたが、結論から言うと1週間でやめてしまいます(もっと頑張れよ)。初サブこそ銅メダル圏内に届いたのですが、それ以降は例のパラメータ調整のフェーズで全くスコアを上げることができませんでした。また、ペットの魅力度スコアなるものを推定するというタスクが本当に解けるのかよくわからなかったことも大きな理由でした。結局、たいしてサブもせずにやめてしまい、Kaggleへの苦手意識をさらに強めてしまうコンペになってしまいます。

ちなみに部署の先輩Aさんはこのコンペでも銀メダルを獲得しており、実力に明確な差があることも痛感しました。中途半端に参加したコンペの結果がマイページに最初の成績として記録されたわけですが、最終的に1148/3537位でした。とても、ひどい。

ただ、このコンペではいくつかの公開コードをしっかり読んで理解したためちょこっと勉強になりました。ここでお試ししたデータ前処理や学習のスクリプトを、部分的にではありますが当時の業務に活かすことができたのもラッキーでした。1週間でやめたものの、未熟な自分にとってはkaggleから学ぶことはがたくさんあるかもしれないと感じたコンペでもありました。

まとめ

  • 中途半端に参加して再度撤退。。。先輩との圧倒的な実力差を痛感
  • kaggle で得た知見を業務に活かせた!

TensorFlow - Help Protect the Great Barrier Reef

期間:2021/11/22-2022/2/14

PetFinderでコンペ成績の履歴を汚してしまった私は、仕事が落ち着くまで暫くkaggleはやらないと心に誓います(デジャブ)。ただ、相変わらずコンペを漁って眺めてはいたのでこのコンペのことも知っていました。そして、例の会社の先輩Aさんを再びLBで発見します。普段はやってる素振りを全く見せないのにサブ数だけ見るとえぐいことになっていて、コンペ終了間際には金圏の下まで駆け上がっていました。シンプルにスゴイ。

タスクは海中映像からヒトデを検出するというもので、動画データが元になっているという点が単純な物体検出との差分でした。普段の業務でも動画に対する物体検出を扱うことはあったので、コンペ開始時からDeepなトラッキングを使うとどうなるんだろう?という部分が気になっていました。気になった結果、トラッキングを試すだけだからと自分に言い聞かせ、終了2週間前にコンペに参加します。kaggleやらない宣言終了

トラッキングを機能させるためにはそれなりの物体検出モデルが必要だよなと思い、物体検出モデルのチューニングを始めます。ん。。??お察しの通り、トラッキングを試すだけのはずでしたが、ガッツリKaggleを再開してしまいました

後に引けなくなった私は開き直ってdiscussionをちゃんと読み、CVを見つつパラメータ調整を完遂します。それでも始めたのが遅すぎたので終了3日前になってもメダル圏内に入っていませんでした。ただ、PetFinderの二の舞にはなるまいと睡眠時間を削ってそこそこ頑張りました。2日前に銅圏に到達し、最後のアンサンブルまでやり切った最終日に銀圏に滑り込みました。最後の2日間はサブする度にぐんぐん伸びたので、脳内からアドレナリンがドバドバでていた気がします。今思えばこのときにKaggleの沼に引きずり込まれ始めていたのかもしれません

コンペ終了直前は連日の寝不足により心も体もボロボロでしたが、最終的に74/2025位で銀メダルを獲得することができました。ちゃんと時間をかければ上に行ける!という自信がついたコンペになりました。記念すべき初メダルでした。

私個人としては特殊でかっこいい解法は使いませんでしたが、LB/CVの確認・モデルの選択・ハイパラ調整・アンサンブルといった基本的な作業をある程度正しい手順で行えたような気がしています。これらは基本的な手順ではあるものの、誤った操作が入ってしまうと性能に大きな影響が及んでしまうため、discussionを読んだり調べたりしたうえで適切な方法を選択するように心がけていました。この辺は実タスクでやってみないと感覚わからないよなあと思いますし、実際私もこのコンペを通して少しコツをつかんだ気がします。

もちろん、普段の業務でもパラメータの調整作業などはありますが、自分の手順が正しいのか?とか、ちゃんと追い込めているのか?という部分ってなかなか分からないですよね。客観的に自分が正しい手順である程度の性能まで追い込めているという結果を知ることができたことも収穫でした

このコンペではAさんも銀メダルを獲得していて、コンペ終了後に次はチームを組んでみよう!という話になりました。ちなみにあれだけ気になっていたトラッキングはそこまで機能しなさそうだったので試しませんでした。最終的な解法に使っている人もそんなにいなかった気がします。

まとめ

  • やればできる!!
  • 地味だけど大事なハイパラ調整の感覚とかもわかってきた

Image Matching Challenge 2022

期間:2022/4/4-2022/6/2

金メダルを取るために初めてチームを組んだコンペになります。コンペ終了1ヶ月前くらいからAさんとチームを組んでいました。タスクは画像の特徴点マッチングでした。以下の画像のように、同じ場所を様々な角度から撮影した画像が複数準備されていて、同じ特徴点同士をいかに精度よくマッチさせるかというイメージです(正確にはそれぞれの画像を撮影したカメラの相対位置関係の推定タスクです)。


特徴点マッチングの例[2]

結果はと言うと、、銀メダルでした。。惜しい!!

参加直後から金圏の下にはりつくような形でスコアを伸ばしていきましたが、最後あとひと伸び足りませんでした。Aさんとタスクを分担して進めていたのですが、私が試す手法はことごとくダメでほぼスコアに貢献することができませんでした。一方でAさんはぐんぐんスコアを伸ばしており、チームを組んでも実力差を感じていました。個人的に貢献できた感じがしなかったので、良い順位のわりに不完全燃焼に終わったコンペでした。かなりもやもやが残っていたので、今振り返ってみるとここで簡単に金メダルが取れなくても良かったのかもしれないですね。

個人的には、特徴点マッチングのタスクが初めてで面白かったですし、この分野でもDeepな手法がかなり強くなってきていることを実感しました。実装が公開されて数日の手法を解法に組み込むこともあり、日進月歩で技術が進化していることも感じましたね。また、最終的な解法には使いませんでしたが、マッチング処理高速化のために漁っていたライブラリやアルゴリズムに関する知見はのちの業務に活かすことができました。

このコンペでの結果を受けて、銀メダル2枚になったので Kaggle Expert になりました。ただ、 Expert まではたくさんいる印象だったので、残りの金メダル1枚を取ってMasterにならねばという気持ちは強かったです。

ちなみにこのコンペが終わって暫くした頃、同じ部署の別の先輩Bさんから実は同じコンペに参加していたという事実を知らされます。同じ部署に3名も kaggler がいるなんてすごいなあと少し驚きました。

まとめ

  • チームに貢献できなかった無力感
  • 今回もちょっと業務に活かせる知見が得られた
  • Expertにはなった

Google Universal Image Embedding

期間:2022/7/11-2022/10/10

AさんもBさんも Expert だったのであと1枚の金メダルがあれば Kaggle Master になれるという状況でした。したがって、今度こそ3名で金メダルを目指そう!と意気込んで参加したコンペになります。タスクとしては、画像検索に使える64次元の汎用的な特徴埋め込みを作るというもので、顔識別で利用されるような技術を応用できるタスクでした。ただ、64次元の特徴に埋め込むという制約が問題の難易度を上げていたように思います。

コンペ開始直後から地味にサブしてましたが、残り1ヶ月になってから本格始動しました。程なくして金圏に到達し、幸先いいな??と思ってましたがそれから1週間ほどずるずる順位を落としていきました。いわゆる「ナニモワカラナイ期」に陥ってしまい、いろいろな工夫を試してみますが尽くスコアに効きませんでした…。LBを開く度に順位が下がっていくのは心にくるものがありますね

暫く非常に辛い期間を過ごした後、Openclip のモデルが効くことを発見してから再び金圏に返り咲きます。ナニモワカラナイ期にデータセットの選別や損失や学習方法などの実験をやっていたおかげで、単純にモデルを変えただけで金圏に行けたような気がします。地味できつい作業でしたがしぶとくやっておいて良かったです。また、今回は自分でスコアを上げる回数も増え、チームへの貢献も多少は感じることができました。

残り期間をどう過ごしたかですが、金圏から落ちないかヒヤヒヤしながらLBを開く日々でしたね。モデルのアンサンブルまで済ませた後はスコアが伸び悩み、スコア的に安心できない日々が続きました。最後は性能を追い込んだというより他チームのスコアが上がらないことを祈っていました笑。

最終的に10/1022位で金メダルを獲得します。素直にうれしかったですが非常に疲れました。開放感の方が大きかったですね。チームメンバーのAさんとBさんには感謝の気持ちでいっぱいです。

このコンペでの学びとしては、CLIPめちゃめちゃ強い!ってことでした。めっちゃシンプルです。また、この最強のCLIPをどのようにファインチューンするかということが勝負の分かれ目になったようで、大規模データで学習された大規模モデルをどのように再学習するのか?というテクニックはとても参考になりました。最近のトレンドを見ていると、一部の組織でしか再現できないような大規模な事前学習によって強力なモデルを構築する例が非常に多く見受けられます。個人的には、これらの事前学習済みモデルを他のタスクに転用する技術は非常に重要になってきそうなので、このコンペで学んだことも今後に活かせるのではないかと考えています

このコンペの結果を受けて Kaggle Master に昇格することができました。ちなみに現時点で各ランクのkagglerが何人いるか確認してみましたが、こうやって見てみると Master もそれなりに多いですね。まだまだたいしたことないのかもしれません。


2022/12/14 時点のランキング

まとめ

  • 非常に疲れたがMasterになった!!
  • 今回はチームに貢献できた
  • 今回も業務に活かせそうなネタを勉強できた

kaggle は業務の役に立つか?

長年の議論に終止符を打つつもりはなく、あくまで個人的な意見になりますが、私の業務の役には立っています。現在の業務に活かせそうなタスクを選んでいるというのも大きな要因かもしれません。

今後の目標

Kaggle Master になったものの、金メダル1枚のみの Master はそれなりに多く存在すると思うので、あと1, 2枚の金メダルを獲得することを直近の目標に頑張りたいと思います。長文ポエムを読んでいただきありがとうございました。

脚注
  1. Leaderboardの略.コンペの順位表のこと. ↩︎

  2. Image Matching https://paperswithcode.com/task/image-matching ↩︎

Discussion