KagglerはGrandMasterになるとポエムを詠むというので、類にもれず私も綴ろうと思いました。過去に参加したコンペに関する思い出的なものや、コンペやってから変化があったことなどをぼちぼち書いています。
技術的にはちょっとしたtipsぐらいしかないので、そういうのはあまり期待しないでください
自己紹介
- アカウント名: K_mat
- Competition Grandmaster (動画像系や時系列センサデータ系が主)
- 元々、本業はメカニカルエンジニアで博士
- Kaggleおよび機械学習は2019年から4-5年
コンペ振り返り
2019年ごろ 【何やっても楽しい期】
エクセルマクロで少し遊ぶぐらいしかプログラム能の無かった私にとって、機械学習やデータ分析はめちゃくちゃ新鮮で楽しくて、たくさんのコンペや勉強をしました。
はじめは1Dデータ
過去の記事でもダラダラ綴っていますが、最初は製造業バックボーン的になじみのある1Dデータから入りました。わからないけど取り合えず現行コンペでLANL Earthquakeなんかをやりました。
当時はCSV提出コンペが多く、私の初回サブも他の方の作ったCSVに後処理を加えただけのようなものでしたが、リーダボードに自分の名前が出てくるだけでもドキドキしていたことを覚えています。
今思えば大した工夫でもないのですが、もしかして良い順位が出るんじゃないかとサブの都度ひそかに期待していました。笑
最終結果でJunKodaさんやかれーちゃんさんなど日本の方々が上位にいて、とても羨ましかったことを覚えています。一部の人からは嫌がられるかもしれませんが、私は当初からメダルよりも入賞に興味がありました。
画像に興味をもちはじめて
もともと深層学習に興味があり、その魔法のようなパフォーマンスに魅せられて画像コンペに手を出しはじめました。わからないけどとりあえずSignateのJTたばこコンペに手を出しました。
https://signate.jp/competitions/159
物体検出タスクだったので、わからないなりにも当時強いとされたYOLOv3を触り始めました。前処理や後処理をさわりつつ、はじめて学習をさせてみたりしました。今思うとギャグのようですが、自宅のノートPC(CPU)で学習をまわして、ジワジワ上がっていくメトリクスにすごくワクワクしました。
難解なソースコードを何度も読み、いじり倒しましたが、そう簡単に精度があがるわけもありません。物体検出の処理や学習はセマンティックセグメンテーションなどと比べると実際かなり複雑で、今思うと結構無茶だったなと思いますが、必死に頑張った甲斐があり、行列操作や画像処理に対するハードルがグッと下がりました。
本コンペも大した結果を出せずに終了しました。当時少ないサブでサクッと現れたyu4uさんや力強く優勝していったtascjさんには、今でも(戦う前から)勝ちにくいイメージを持っていたりします。
画像にハマって
ImageNetやCOCOなどのSOTA合戦は激しさを増し、コンペにおいてもいち早く新しいモデルアーキテクチャを導入するようなスピード感を感じる時期でした。やれこのネットワークがいいぞ、やれこのaugmentationが効くぞ、gem poolingが効いたぞといった具合です。私も無駄にEfficientNetをスクラッチ実装したりしました。
(強いモデルを早く導入してアンサンブルというのも芸が無いように聞こえますが、この頃のチューニング&実験祭りのおかげで、NNの調整勘が養われたのでやって良かったと思っています)
画像ってこんなものなのかなぁと思っていたところで、Kaggle崩し字コンペに参加しました。
https://www.kaggle.com/c/kuzushiji-recognition
崩し字を検出・翻刻するというコンペでした。
模様と文字の識別や、部首などのせいで複合的に見える文字の誤検出の扱い、著者が異なることによるドメインシフトへの対応や、崩し字の文字の連なりの文脈をモデルに解釈させる方法など、工夫しろが豊富で改めて画像コンペの奥深さを味わいました。
ちなみに、このコンペでもtascjさんが優勝をかっさらい、私の苦手(勝てない)イメージを加速します。
2020-21年ごろ 【画像ハマり期】
このころになると論文を読めるようになってきたこともあり、コンペと関係のない実装も楽しめるようになりました。
- Instance Segmentationの実装
https://qiita.com/Kmat67916008/items/474da9f1f5553579cf76 - 単眼depth推定の実装
https://qiita.com/Kmat67916008/items/267a3d3a6ac7c3512382 - 動画や3Dが楽しくて、optical flow系やNeRFなども実装に手をだしました
- 公開していませんが、sim2realなんかもやりました
実装がめちゃくちゃ難しく、おかげでモデル実装面では不安がなくなってきました。思考パターンも増えたように思います。ただ、コンペではpytorchが主流で、tensorflowを選択したことにほんのりとした後悔が付きまとっていました。笑
強い勝ち方に憧れたのもこの頃でした。-> kaggleのコンペでカッコよく勝ちたい話
2022年ごろ~ 【🥇挑戦期】
3年経つのにコンペのメダルがまだなく、そろそろコンペでいい感じに入賞したくて、ワンサブでジャブしてはちょくちょく感触を確かめていました。そこで開催されたのがNFLコンペでした。
① 初優勝 @ NFL Helmet Assignment
プレイヤとマップ上の配置を紐づけるのがコンペの肝でした。->コンペ概要はこちら
ビュー変換と位置関係のマッチをNNですべてやろうと思うとまぁまぁ面倒なので、実装的にもあまりやりたがる人はいないだろうと思い、初手から特殊なモデルを組んでいました。
幸いこれが当たってしまい、序盤からpublic1位をキープすることになります。
順位が低いときに見ていた「スコアアップで上位に食い込む夢」とは打って変わって、public1位では「なんかえらいことが起きてめっちゃ抜かされる夢」も見るようになりました。上位は洗練されたkaggler勢で、序盤から終盤まで気が抜けず、日々のほとんどのメンタルをkaggleで消耗していました。合計300hrぐらいはコンペをしていたと思います。
Public1位で迎えた最終日は今でもドキドキしますが、恐らくNFLコンペのときが一番緊張していました。何をしても手につかず、既に処理したメール画面を開いたり閉じたりと挙動不審でした。笑
無事に優勝できたものの、再現性や提出物、winner callなど不安要素がモリモリで、なかなか安心できませんでした。
② チームマージを楽しむ @ FourSquare
NFLで少し自信がつき、チームマージしても迷惑かけないかなと思えるようになりました。ちょうどその頃開催されていたFoursquareコンペで、nyanpさんとterekaさんにチームマージしていただきました。
4sqコンペは、緯度経度や名称などテーブルデータとして与えられた地図上のランドマークやお店の情報から重複を見つけ出すようなコンペでした。『東京タワー』と『tower of tokyo』は同じものとしてまとめますが、『セブンイレブン東京タワー前店』は別物として判定するような感じです。
nyanpさんはテーブル、terekaさんが自然言語でゴリゴリとパフォーマンスをだされていました。
kaggleではじめてのチームマージでしたが、今思えばとても贅沢なチームマージでした。二人とも実装の速さは言わずもがな、抽象的な能力(着眼点やメタな読みや執着心) もすばらしく、Leapのアプリを入れて実際にサービスを体験しだしたりと、机上にこだわりすぎていた自分に足りないものを実感させられました。
なんとか貢献しようと躍起になっていましたが、まぁなんだかんだあってホストの仕掛けた罠にかかり、銀メダル🥈となりました
test phaseではtraining dataが別のtraining dataにすり替わる仕様のコンペ(?)で、色々と残念なところはありましたが、この歪なデータを解明しきる能力を持った人も多く、舌を巻きました。
ついでに、これ以降スパイダーマンのmemeが大好きになりました
③ 2回目のソロプライズ @ DFL
(動画系に味をしめて)NFLにつづいてDFL(ブンデスリーガ)コンペに参加しました。もとい、NFLが再現性のない偶然の結果とも思えたので、もう一度しっかり頑張ろうと思いました。
アメフトもそうですが、見ていてわかる・見ていて楽しいコンペはいいですね。「ボールを追おうかな」とか、「ラインを検出して後処理に加えようかな」といった、工夫のアイデアもたくさんでてきます。学習はAIだけに頼らず、私自身もキャプ翼やアオアシ、BeBluesなどでドメイン知識も積極的に学習して万全の構えです。
日本の方も多く参加されていたので、ソロでしたが寂しさは感じませんでした。上位のCamaro-sanやohkawa3-sanやkzykmyzw-sanは同系統のコンペでも一緒になることが多いので、いい意味で必死になれました。
最終解法は2パターンに分かれたのが興味深かったです。
[1] 検出ベースで恣意的に見せる場所を制限するアプローチ
[2] フィールド全体の画像をそのまま加えてイベント判定するアプローチ
私は上述[1]を選択しました。フィールド上のイベントという疎な情報を学習させるのが難しく感じて、下図のようにボール周辺を検出してからイベントを判定するようなモデルを組みました。ですが、1,3,4位などはシンプルに[2]で結果をだしていました。
個人的に、人の事前知識に基づくアプローチが取れて、それ次第で差が出そうなコンペはパズルみたいで好きなので良く参加しています。本コンペも人の事前知識が有効なコンペでしたが、そういったアプローチは学習させやすい一方で情報量をむやみにそぎ落としかねないことを改めて認識させられました。
結果は2位で、Camaro-sanがX(旧twitter)で煽ったh2oチームにボコられるという結果におわりましたが、前回の優勝のまぐれ感を払拭できたことが嬉しかったです。
④ 2度目のチームマージ @ NFL2023
なんやかんやあって仲良くさせていただいていたnyanp-sanとcamaro-sanとhata-sanで2023年もNFLに挑戦しました。今回のNFLは衝突したプレイヤ間や地面に転倒したプレイヤを判定するもので、動画とテーブルの両方を駆使するコンペになりそうでした。偶然飲み会があったので、どちらにも強いメンツであった方々を誘った形です。
しかも、前年度のコンペの出力がデータとして配布されるという珍しいパターンで、「こりゃあ美味しいぞぐへへ」という気持ちで参加しました。(結局過去のソースコードは役に立ちませんでしたが)
今回も全員がプロフェッショナルを発揮しており、あっという間に分析や検証が終了します。改めて上位勢の思考と手のはやさを体感することができました。この調子で僕の会社業務もかわりにやってほしい。
本コンペも解法に多様性があり、幣チームのように画像とテーブルでくみ上げるチームもあれば、画像のみでごり押す解法もありました。最近たまに見られる、画像をスタックして食わせる系の一見強引なプレーも上位解法で見られて興味深かったです。結局のところスコアリングはアノテーションデータで行われるので、『人はどうやってアノテーションしているんだろう』といつも考えさせられます。
誘っといてダメだったらどうしようと結構焦りましたが(笑)、チームが強かったので無事4位でprizeとなりました。h2o teamに二連続で負けたのが地味に悔しかったです。1勝2敗。
⑤ 時系列データでソロプライズ @ 睡眠コンペ
画像しかできないやつだと思われるとちょっと悔しいので、1Dデータを扱うChild Mind Institute 睡眠コンペに参加しました。
道中1位が続いたので『K_mat何やってんだ…』みたいなmemeもいただき、「そうか、そう思われる側なのか (メタな分析をされる側なのか)」とちょっと嬉しかったです。いつも適当にやっています。
コンペ自体は1Dのデータにおけるイベント判定で、NN系が強かったです。一方で、起床・睡眠イベントは一日に最大一回しかないイベントなので、評価指標に対してその予測値を如何に最適化するかなどもポイントで、NNに工夫する人や、後処理をくみ上げる人、2nd stageを組む人など様々でした。個人的に自分の2nd stageの問題設定は今でも好きで、うまいことやったなと自画自賛しています。
最終結果はshimacos-san, sakami-san, kami-san teamに敗北し、private2位転落のよくあるパターンでした。悔しかったですが1Dデータのprizeは初めてだったので上出来でした。やっとこさGMリーチです。
なお、h2oチームは参加していなかったですが、脳内では勝っていたので2勝2敗のイーブンにもちこみます。
⑥ お天気予測でGMチャレンジ @ LEAPコンペ
ちょうどそのころ、関西kaggler会でkurupical-sanやchumajinさんなど、GMになられたかたを何人か拝見し、さすがに羨ましく少し欲が出てきました。そんなときに開催されたのがLEAPコンペでした。
天候という身近なお題で1Dデータだったので「うまいことドメイン活かしてモデル組めばいい感じに作れるかな」と甘い気持ちで参戦しました。ですが、思いのほかそういうものが組めるタイプの問題設定ではなく、ドメインもそれほど効かず、「これはそういうの(得意なやつ)とちゃうぞ…」と気づき始めました。久々のモデルコネコネをしながらチームマージをしたい雰囲気を醸し出していたところに、同じくGMチャレンジのpao-sanが乗ってくれました。その後、さらにcamaro-sanにもマージしてもらいました。
何をやっても伸び悩むスコア、活かせないリーク、下がるweight、デカいデータ、バレるリーク、のびる延長、長い学習、暑い夏、熱い部屋、またバレるリーク。チームじゃなければきついコンペでした。笑
当チームの解法はpao-sanが共有してくれていますが、「なんか色々やった気がするのにあっさりしてしまう」とのもっぱらの噂で、下図のソリューションも比較的シンプルです。データさえあればNNゴリ押しは強いなぁと実感しました。
最終結果は無事3位入賞でしたが、そのころのにはweightもほぼなく、2nd stageもそれほど効かず、かなりおんぶに抱っこでいただいたありがたい結果です。
以上でGM
合計solo3+team2のprize5本でGMとなれました!
メダル取るぞ!と思ってからは順調に結果を出せたのですがなんだかんだで2年以上かかってしまいました。
一見楽にとったように見えますが、そう簡単な話ではなく、比較的取れそうなものに全力で参加して、終わるたびに疲弊していました。
Kaggleやってよかったこと・変わったこと
なんだかんだでKaggle歴(=ML歴)が5年になってしまいました!まだ元の機械系の経験の方が長いのですが、それでもちょっと驚きです。基本的に時間泥棒以外は良い点も多く、たくさんのいい機会に恵まれました。
- 交友関係
- 一緒に仕事をしてくれる後輩が増えた。普通にお仕事も楽しいことが多い。
- 知り合いの上司も増えた。社内知名度∝社内昇進
- 友達や社外交流が増えた。イベント系で「あのヘンテコモデル組む人だ」と声をかけていただけて嬉しい
- 知識関係
- 業務で活かせるシーンができた。ML、コーディング、企画。
(良い結果だけでなく、結果につながらなかった数多の試行錯誤が活きているなというシーンが多いです) - AIトレンドについていくことができた
- 業務で活かせるシーンができた。ML、コーディング、企画。
- 実利・懐事情
- ちょっと昇進した
- ちょっと賞金もらった
- メンタル関係
- 多少没頭しても心が痛みにくい趣味をもてた
- コンペの賞金(=自分の中で雑に使っていい所得)で心持ち豊かになった
- 結果そのものやメディアなどで、自分の子に対してわかりやすく自慢できるものができた。パパすごいと思ってくれているのが嬉しい。
ここのところは勝ちにこだわっていましたが、これからは勉強・教育などのウェイトを増やしつつ頑張っていこうと思います。とかいって、いつも勝つために必死こいてしまうのですが。