不注意でよく物を壊す

アクアリウムとかマイクロマウスとかアリュージョニストとかそのへん

Kaggle Competition Grandmasterになるまでの5年間を振り返る

はじめに

先日5枚目の金メダルを獲得し無事Kaggle Competition Grandmasterになることができました。5年前にKaggleを始めてからの目標を達成できたので、これまでを振り返ってみたいと思います。

Kaggleを始めるまで(~2019)

今では技術的な興味がCV中心とした深層学習技術周辺に集中していますが、深層学習に出会う前はサークルや研究室でロボットを作ったり、小学生にプログラミングを教えるバイトをしたりしていました。 深層学習を勉強し始めたのは研究室に配属されてからで、最初は松尾研主催のDL4USの2期生として講義を受講して基礎を学びました。
受講者にはiLectによるGPU環境が用意されており、毎週コンペ形式で宿題があったり最終課題では自分でテーマを設定してレポートを書いたりと基礎知識をつけるには打ってつけの経験でした。 現在では講義形式で開催されていないようですが、資料などは公開されておりgoogle colabで実行できる形になっているので初学者の方は参考になるかもしれません。

Kaggle初心者〜Expert時代 (2019~2020/1)

Kaggleのことは以前から知っていてアカウント登録はしていたのですが一人では手をつけようとは思えず、友人たちに誘われたのが本格的に始めたきっかけでした。
当初は誘ってくれた友人たちとplaygroundのテーブルコンペ主体で参加していたのですが、研究に支障がないのであれば研究室のGPUマシンを使って良いと許可が出たため画像コンペに参加することが多くなってきました。
この時期に参加したコンペで印象に残っているものとその結果をまとめてみます。

コンペ名 開催期間 結果
Humpback Whale Identification 2018/12~2019/3 メダル圏外
iMaterialist (Fashion) 2019 at FGVC6 2019/4~2019/6 メダル圏外
Recursion Cellular Image Classification 2019/6~2019/9 🥈(solo)
Understanding Clouds from Satellite Images 2019/8~2019/11 🥈(solo)
2019 Data Science Bowl 2019/10~2020/1 🥉(team)
浮世絵作者予測 2019/10~2020/1 3位(学生1位)

最初に参加した画像コンペはHumpback Whale Identificationでした。鯨の尾の画像から個体識別をするというコンペで、当時は距離学習?ナニソレ?な感じでひたすらResNetとSiamise Networkのチューニングをして終わった記憶があります。

次に参加したのがiMaterialist (Fashion) 2019 at FGVC6で、ファッションアイテムの領域を検出するというコンペでした。pix2pix likeなGAN構造を用いたUNetで中盤ですが初めて銀メダル圏内まで一時的に到達できたのを鮮烈に覚えています。結局、このコンペでは当時実装のハードルが高かったinstance segmentationのモデルがかなり強く、自分はついていくことができずメダル圏外で終わってしまいました。ですが、このコンペでLBを駆け上がる楽しみを初めて知ったように思います。

Recursion Cellular Image Classificationは細胞の種類を分類する内容でした。鯨コンペで学んだ距離学習の手法を工夫しながら、中盤から安定して銀メダル圏内のまま最後まで維持し、無事銀メダルを獲得しました。(雑な振り返り) この頃はChainerを使っており、論文をサーベイして手法を自前で実装したりしていました。また、このコンペの参加中にくるぴーさんのKaggleもくもく会に参加したり、Twitterで他のKagglerの方と接点を持ったりで知己を増やすことができました。

Understanding Clouds from Satellite Imagesは画像から雲の領域を検出するコンペでした。ラベルがそこまで詳細ではなく、Object detectionで解いたほうが良いんじゃないかなど序盤に議論があったのを覚えています。自分はさまざまな種類のsegmentation手法を実装してアンサンブルする方針で進めていました。
当時はCNNベースのsemantic segmentationの手法がたくさん発表されていて、SOTA手法を片っ端から実装して試していました。このとき実装したコード遺産は現在でもsegmentationコンペでの実装に生きています。また、PyTorchが論文実装が多くアツいということで、Catalystを用いて実装したりもしました。

こうしてメダルを2枚獲得してExpertになったのですが他の分野にも手を伸ばしてみようと思い、チームでテーブルコンペに参加したり、Kaggle以外のコンペに参加したりしていました。

DSB2019はログデータを扱うコンペで、バイト関係で知り合った方たちとチームを組んで参加し、銅メダルを取りました。自分達はkaggle notebookをコピーしてチューニングするだけで終わってしまったのですが、3rd place solutionのTransformer解法を読んで、自分もDNNをこのように綺麗に使えるようになりたいと思いました。

浮世絵作者予測ではその名の通り浮世絵画像から作者を予測するというオーソドックスなお題でした 。自分はsemantic segmentationのNN構造をクラス分類に用いるという工夫でなんとか3位を取ることができました。Kaggleではないコンペでしたが、国内の画像コンペに強い方と競い合うことができたり、自前の学習パイプラインを作り込んだりと結果以上に実りあるコンペでした。

新卒就活 (2020/1~2020/6)

この時期は人生で初めての就活をやっていました。
ソロで銀メダルを2枚獲得していて、まあなんとかなるだろうと思っていましたが何も面接対策や自己分析をせず突っ込んでたくさんお祈りされました。
その時は訳もわからずなぜと憤慨したものでしたが、企業の方や友人からいただいたアドバイスは後の転職の際に活かすことができました。

Expert〜Masterになって転職活動を始めるまで (2020/1~2022/5)

新卒就活と並行してコンペへの参加も続けていました。しかしそこで自分を待っていたのは巨大なシェイクダウンの波でした。

コンペ名 開催期間 結果
Bengali.AI Handwritten Grapheme Classification 2019/12~2020/3 メダル圏外
Prostate cANcer graDe Assessment (PANDA) Challenge 2020/4~2020/7 メダル圏外
Cornell Birdcall Identification 2020/6~2020/9 🥈(solo)
Lyft Motion Prediction for Autonomous Vehicles 2020/8~2020/11 🥉(solo)
Rainforest Connection Species Audio Detection 2020/11~2021/2 🥉(solo)
BirdCLEF 2021 - Birdcall Identification 2021/4~2020/6 🥇(solo)
TensorFlow - Help Protect the Great Barrier Reef 2021/11~2022/2 🥈(solo)
凸版印刷株式会社 くずし字認識チャレンジ② 2021/3?~2022/5 4位(solo)

Bengali.AI Handwritten Grapheme ClassificationProstate cANcer graDe Assessment (PANDA) Challenge はどちらも問題設定を正しく理解して実装に落とし込んでいるかどうかで勝敗が分かれるコンペでした。前者はtrainデータにない未知のデータに対する汎化性能を高める必要があり、後者はtrainに含まれるnoiseを適切に除去しながら学習させる必要がありました。自分はどちらも愚直にクラス分類として問題設定を捉えてしまったため、適切なCVを切ることができず大幅にシェイクダウンさせてしまいました。
この頃から適切にCVを切ること、最終subを注意深く選ぶことを意識し始めました。

この時期で印象に残っているコンペとしてはLyft Motion Prediction for Autonomous Vehiclesが挙げられます。このコンペでは乗用車の過去の軌跡から現在以降の軌跡を予測するというお題で、他の乗用車の影響も考えないといけないという点がユニークな問題設定がされていました。主流なアプローチでは、hostのLyftが提供しているL5Kitと呼ばれるライブラリを用いて運転データを整形し画像化してCNNを用いたモデリングをするというアプローチが多く用いられていました。自分も例に漏れずそのアプローチを採用していたのですが、上位陣はhostから提供される追加データセットを利用して1カ月など長時間学習させることでさらにスコアを上げていました。他にも画像化せずにベクターデータとしてGNNを用いる解法などがありました。

BirdCLEF 2021 - Birdcall Identificationでは念願の金メダルを獲得し、Kaggle Competition Masterになりました。このコンペでは鳥の鳴き声を分類するという点で似たようなコンペのCornell Birdcall Identification が終わった頃から考えていたアイディアを用いて、参加序盤から金メダル圏内をキープし続け無事4位で終えることができました。実はこのコンペ参加中は新卒なのに家を決めれられておらず、また会社から関東圏内でリモートワークをすることが強制されていたため一カ月間、都内のホテルで暮らしていました。なのでギリギリで賞金を逃してしまったことは結構痛手でした......

TensorFlow - Help Protect the Great Barrier Reefでは、初めて物体検出に取り組みました。動画に対して物体検出を適用するコンペで、検出対象が小さいためKalman filterやOptical flowなどを駆使したtrackingを実装することで検出精度を上げることを試みました。また、Time-series APIと呼ばれる逐次的にデータが提供されるような制限がありました。個人的には時系列でリークを防ぐこのような仕組みはいろんな問題設定に適用できると考えているため、もっと増えても良いのではと思っています。(参加者としては実装が難しくなるため悩ましいですが)

凸版印刷株式会社 くずし字認識チャレンジ②では、浮世絵予測コンペ以来の賞金を獲得しました。OCRに取り組むことも初めてだったので、論文をサーベイした結果をもとに自分なりの工夫を組み込むことで精度を大幅に上げることができました。ディスカッションなどは活発ではなかったのですが、個人的には工夫しがいが多く楽しいコンペでした。

転職活動 (2022/6~2022/12)

当時の職場でのやらないといけないことと自分がやりたいことの方向性が異なると感じてきたため、転職活動を始めました。
新卒就活の時に採用エージェントに対して良い印象がなかったため、今回は興味がある企業に直接コンタクトをとってカジュアル面談を申し込みました。
友人が働いている企業やKagglerが在籍していて自分の強みが活かせそうな企業などの話を聞きながら、最終的に3社の採用に応募し2社から内定をいただきました。
2023年3月からは現職に勤務し始め、楽しくお仕事ができています。

Grandmasterになるまで(2023/1~)

転職活動が終わり、2023年になると画像コンペでもチームを組んで取り組むようになりました。

コンペ名 開催期間 結果
G2Net Detecting Continuous Gravitational Waves 2022/10~2023/1 🥈(team)
1st and Future - Player Contact Detection 2022/12~2023/3 🥈(solo)
Vesuvius Challenge - Ink Detection 2023/3~2023/6 🥇(team)
Google Research - Identify Contrails to Reduce Global Warming 2023/5~2023/8 🥇(team)
RSNA 2023 Abdominal Trauma Detection 2023/7~2023/10 🥇(team)
Stanford Ribonanza RNA Folding 2023/9~2023/12 🥇(team)

G2Net Detecting Continuous Gravitational Wavesではsqrt4kaidoさんとチームを組んで取り組みました。このコンペは重力波干渉計の時間周波数データノイズから重力波を検出するコンペで中盤以降、深層学習を用いた解法には限界があるんじゃないかとも話しながらももっと掘り下げることができませんでした。またsqrt4kaidoさんのCNNモデルが強かったため自分では満足できない結果に終わってしまいました。ただ、チームを組んで取り組むことで、自分が考えもできなかったであろう発想に直近に触れることができかなりの刺激を受けました。

Vesuvius Challenge - Ink Detectionは火山流によって炭化したパピルスの文字領域を検出するコンペでした。segmentationコンペだったのですが、ラベルをダウンサンプリングしても問題なく、既存のsegmentationのような複雑なDNN構造を用いなくても済むという仮説を立てて参加しました。
実際にはそれだけだと不十分で、中盤にチームを組んだろんさんのアイディアでData augmentationを強めにかけるとCVとLBが相関しつつ大幅に精度が上がるということに気づくことができました。そこからはさまざまな正則化を入れてさらに精度を上げることができました。
また、終盤にチームを組んだyukke42さんとも週2~3回の頻度でオンラインミーティングをして密にコミュニケーションをとりながらコンペに取り組みました。その甲斐もあって、最終的には準優勝することができました。

Google Research - Identify Contrails to Reduce Global Warming は衛星画像から飛行機雲を検出するコンペでした。
中盤からTawaraさんとチームを組み、それぞれ別々のパイプラインを育てる形で進めました。自分は火山コンペの経験と本コンペでも時系列の画像データがあることから、3DCNNを用いた2.5Dモデルを使用する手法を中心に学習させました。一方Tawaraさんの手法では、ベースライン手法よりも多くのchannel情報を用いて精度を向上させることができました。これらの系統が違うパイプラインのアンサンブルと、飛行機雲があるかどうかの2値分類とsegmentationの二段階の推論により汎化性能を高めることができ、public LBでは17位だったのがprivateでは6位入賞で終えられました。

RSNA 2023 Abdominal Trauma DetectionはCT画像から腸、血管外漏出、腎臓、肝臓、脾臓の外傷を検出するお題でした。このコンペでは同じ会社のyu4uさんと序盤からチームを組んで参加しました。 このコンペの難しい点として患者数に対してCT画像の枚数が多く、またその中でも外傷が含まれる画像・領域が少ないという点が挙げられます。また、腎臓・肝臓・脾臓に関しては臓器領域をある程度絞り込むことができるのですが、腸と血管外漏出に関しては外傷がある可能性がある範囲が大きくなるべく全てのCT画像を使ったモデリングをする必要があります。腎臓・肝臓・脾臓と腸と血管外漏出ではアプローチが異なると考え、自分は腸と血管外漏出に関して以前のRSNAコンペ解法を参考にしながら開発を進めました。結果的にyu4uさんの完成度が高いパイプラインと、自分の部分ではpositive sampleの少なさを克服するupsampleやtrainに対するpseudo labelを使用することでなんとか金メダルを獲得することができました。

2023年11月に開催されたKaggle Tokyo Meetup 2023では、前述したVesuvius Challengeの準優勝チームとして招待講演を行いました。(発表資料)

Stanford Ribonanza RNA FoldingRNAの塩基列に対して、それぞれの反応性を回帰予測するコンペでした。このコンペではRSNA2023の際も組んでいただいたyu4uさんと、同じ会社のmonnuさんとチームアップして参加しました。序盤からtransformerを用いたベースラインが共有されていたため、それを元にbp matrixと呼ばれる塩基対がどのように作用するかの行列などを用いたり、最新のLLMで用いられている手法を用いることや過去の似たようなコンペのコンペでの上位解法も参考にしつつ4位入賞することができました。また、monnuさんがこのコンペの直前に累計4枚目となる金メダルを獲得していたこともあり、このコンペで二人同時にKaggle Competition Grandmasterになることができました。

Kaggleに取り組むときに意識したこと

以下に自分がコンペ中に意識していることを書き出してみました。  

  • アイディアだしをこまめにやる
    • コンペの問題設定をまず理解して、どんなやり方があるかを書き出しそこにアイディアを継ぎ足す形でアイディアシートを作る
    • どんな小さいアイディアでも忘れないように書き留め(Twitterの自分宛のDMを使っていました)、時間があるときに実現できないかをじっくり考える
  • 普段から気になる論文やTwitterで流れてきた勉強会資料をためておく
    • 流し読みしておくとコンペ中に思い出して取ってこれる
    • 論文サーベイの起点にもなる
  • ベースライン作成の時点で信頼できるCVを設計する
    • CVが信頼できないことに気付いたり、バグに気づいたら優先して実装し直す
  • 実験間の差分がわかるように実験を管理する
    • wandbを用いて実験管理し、結果を再現できるようにする
    • 時間が許す限り、実験間の差分を小さく取り結果の変化が何に起因するかを明確にする
  • チームマージ
    • チームメイトがパイプラインを共有してくれる場合はコードを読んで気になるところなどを質問する
      • お互いのバグに気付きやすくなるし、意識していなかった改善点などが見つかる場合もある
    • できれば口頭で話すようにする

特にアイディアシートを作成して、コンペ中に逐次更新していくとチームメンバーへの共有や、コンペ後に解法を書いたり振り返ったりするときにも便利なのでおすすめです。

終わりに

特に最後の一年はチームを組んでKaggleに取り組むことを意識したおかげで、より多くの刺激をいただきKaggle Grandmasterになることができました。 今後もこれまで組んでくれた人とも組んだことがない人とも機会があればチームアップしてコンペ参加していきたいと思っています。
また、2023年はコンペの結果には満足できた反面、コンペ終わりには毎回と言っていいほど体調を崩していたので健康を維持できるように体力づくりなども行っていきたいと思っています。

今後ですが、興味がそそられるコンペに参加してベースラインや分析を人に見せられる形でアウトプットできるようにしたいというのと、久しぶりに面白そうな論文を読んで再実装をしたいと思っています。前者では自分のKaggle的なスキルセットの中でNNをこねくり回す職人芸的なスキルが強めになってしまっているので、本業の方でもKaggle Grandmasterの肩書きに恥じない働きができるように実装力や分析力、ソフトスキルも鍛えていきたいです。
後者では最近Kaggleにかかりっきりで最近の研究のトレンドなど把握できていないので論文読みを再開したいです。個人的には以前論文読み会で紹介した技術とのつながりでGaussian Splatting周りの技術や動画からの情報抽出などに興味があります。LLMもTwitterの話題に乗れたり、自身の開発業務に利用できるくらいには理解しておきたいですね。