のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Kaggle Grandmasterになるまでの7年間の軌跡

Sponsored Links

皆さんこんにちは
お元気でしょうか。冬だというのに、GPUと暖房で半袖装備でも過ごせています。
今年、長きにわたるMaster生活の終演を迎え、ようやくGrandmasterになることができました。
そこで、Grandmasterになるまでの経験をこちらに書き記しておこうと思います。

この記事はKaggle AdventCalendar2021カレンダー2、25日目になります。

qiita.com

著者の背景

M2(情報系)のときにKaggleをはじめました。(学部は文系です)

先輩が研究の一つの検証(過程)でKaggleにサブミットしているのを見て知りました。
そうしたふとある日、現実逃避でもはじめたのか、Kaggleで競争してみるのが面白そうと思って参加を試みました。
AutoEncoderなど流行っていた頃ではあったので、研究でC++やtheanoを書いていました。研究分野としては画像です。

そこから今の会社に就職しても、続けて、早7年です。
昔から画像系のコンペを中心に参加していましたが、テーブルやNLPも面白そうであれば参加しています。
戦績は金6枚、銀21枚、銅4枚といったほとんど銀で埋め尽くされているため、ほぼシルバーコレクター化しております。金も多く獲得したいです。

Masterになるまで4年、Grandmasterになるまで7年もかかっており、他の現Grandmasterの方と比べても非常に長期間かかったように思えます。

f:id:tereka:20211216001735p:plain
Kaggle Profile

Kaggleへの取り組み

1-3年目

このあたりは正直コンペ、よくわからないと思いながら参加していました。

当時は、所謂コンペティション、データ分析の知識の高速道路が少なかったです。
そのため、ソリューションを読んでもどうしてこれをやったのか、お決まりのパターンはよくわからないものも多く、色々と手探りで進めていた覚えがあります。

今の画像やNLPなどの非構造データよりも圧倒的に構造化されているテーブルデータが多かったです。
毎回EDAをしたりしますが、今のように体系だった、GroupbyのAggregationやTargetEncoderを使うような特徴量の作り方がよくわからず、頭を抱えながらトライしていました。

DLのFWも当時、今ほどPyTorchかKerasぐらいに絞れているわけではなく、theano, lasagne, torch(lua)を中心として、色々なライブラリに触れてました。
なんとなくですが、Kerasは人気ありました。

この時代は画像のモデルはPretrainedが禁止されている傾向にありましたので、ランダム初期値から学習させてました。
しばらくして、このコンペははじめて、Pretrainedの利用がOKになったように記憶しています。(ResNet出た頃ですね)

State Farm Distracted Driver Detection | Kaggle

そのため、今のようにPretrainedを意識することなく、コンペの公開Notebookなどに従って、各自使いやすいライブラリを使っていたのではと思っています。(私はそうでした)

※今はKaggle本をはじめとして、初心者からでも学べるものが増えてきているのは良いところですね。

4年目

IEEE's Signal Processing Society
f:id:tereka:20211218102833p:plain
IEEE's Signal Processing Society

写真を撮影したカメラを推定する問題です。
問題設定としては面白く、私の目で確認しても何もわかりませんでしたが、機械的には9割を超える精度が獲得できます。
ただし、このコンペ、ルール側に穴があり、最後、阿鼻叫喚で大変だった覚えがあります。

ロシアチームの多くが上位にいたのですが、External Dataをダウンロードして利用するといった条件を運営がルールに書き忘れていました。

その結果、コンペの特性上、YandexやFlickrなどのデータからダウンロードしていました。
EXIFをチェックすれば答えがわかるので、画像をダウンロードするといったことで精度向上が可能といった状態でした。
これに気づいていなかったチームは苦戦を強いられました。
(ロシアのチーム、ods.ai以外気づいていなかったのでは‥)

このコンペで最終的にはギリギリで金に収まり、晴れてKaggle Masterになりました。

www.slideshare.net

動画Ver(Kaggle Meetup #4)
www.youtube.com

Avito Demand Prediction Challenge
f:id:tereka:20211218102949p:plain
Avito Demand Prediction Challenge

個人的に面白いコンペでした。
最近ではあまりないのですが、テーブル+画像+NLPの三種類のデータを扱わなければならないもので、ニューラルネットワークの作成しがいがありました。
非構造単品だと普通なので、いかに多くのドメインを扱うかといったところはやりがいあると感じます。

私が途中CVPRに行きながら参加していたため、日本、アメリカ、ヨーロッパで24h体制でコンペしていたことを覚えています。
かなり頑張ったのですが、最後Shakedownして金から弾かれてしまったのはとても悔しかったです。力量不足でした。

www.kaggle.com

Home Credit Default Risk
f:id:tereka:20211218103116p:plain
Home Credit Default Risk Leaderboard

12人でチームを組んだ感慨深いコンペです。
少なくともKaggleでは、もうこの人数でチームを組むことはないでしょう。
(これがきっかけでチームマージがこのあと確か5人までになったような・・)

チームを組んだそれぞれのメンバが違うアプローチに取り組み、色々と議論ができたのは勉強になりました。
チームマージ当時、既にいろいろなものがやり尽くされているのでは‥とまで思っていたので、趣向を凝らして、様々なソリューションに取り組みました。

最後ギリギリで2位の初賞金になったのはなんともいえませんが貴重な経験でした。
ソリューションの図は今、振り返っても参加した中で、最も複雑な図面だと思います。

speakerdeck.com

5年目あたり

なかなか成果が出ない年で、また金に届かなかったと思うことが多くありました。
Google QA、Humpbackは金を狙っていましたが、最後に追い抜かれたり、シェイクダウンしたりで一歩届きませんでした。
ただ、負ける中でも各コンペで学べたことは多く、今振り返ると無駄なことはなかったんだなと思います。当時は頭抱えてました。

どのコンペもソリューションを読んでほんのわずかな差で足りなかったもので、あと一息だとも思いましたが、同時にそこで勝てないのが実力なのかなと思っていました。

6年目

Global Wheat Detection
f:id:tereka:20211218103229p:plain
Global Wheat Detection Leaderboard

コンペで初めて真面目に行う物体検出でした。
通称、小麦コンペの難しいところは、世界各国の小麦の検出が必要になり、地方によって小麦の穂が変わってきます。
今回、このドメインの差分をどのように埋めるかがコンペティションの中で難しかったポイントだと思います。

問題設定としては面白かったのですが、データやモデルなど色々問題があり、最後までヒヤヒヤさせられていました。
物体検出で今もなお利用されているYoloV5のモデルがありますが、このモデルがGPL-3であることにより使っていいのか悪いのか議論が多くありました。
DeepFakeコンペみたいに終わってからライセンス失格になるような状態にはなりたくないので、モデルやデータの利用は慎重にならざるお得ませんでした。

判断の賛否はあると思いますが、運営がはっきりとYes/No出してくれたのが良いポイントかなと思います。

このコンペは非常に精神ダメージが高く、Private公開されてから
データのアノテーション修正前と後間違ってたすまんやり直す、みたいなことが発生しており、大変心臓に悪かったことを覚えています。
ある日起きたら深夜に更新されており、気がついたら金にいました。(最初の公開時は吹っ飛んでました)

ここでソロ金を取れたのはこれから残りのメダルを集める上で、何も気にする必要がなくなった点で非常に楽でした。

www.kaggle.com

7年目

Shopee - Price Match Guarantee
f:id:tereka:20211218103500p:plain
Shopee - Price Match Guarantee

軽い気持ちでECサイトのデータに興味あり、解析を適当やっていたら上位に来てしまいました。
NLP+Imageの両方のデータを解析しないと上位に到達できないこともあり、非常に面白いコンペだったように記憶しています。

このあたりからTransformer関連(Swin Transformer)のモデルが猛威を奮っており、時代の変化を感じだした頃合いです。

www.kaggle.com

Hungry Geese
f:id:tereka:20211218103601p:plain
Hungry Geese Leaderboard

初めて挑戦した強化学習コンペティションです。
日本人が多かった&HandyRLベースの実装が公開されており、強化学習にきちんと挑戦するにはもってこいといった状況でした。
強化学習の勉強をしていくにつれ、モデルや探索系のアルゴリズムも必要になり厳しかったことを覚えています。
そのような中でチームを組ませていただき、議論や改善できたのは非常に貴重な体験でした。

ちなみに評価期間2Wの手が出せない期間はもどかしく、日夜カツ丼を食べる、前日は物理神社に通うなどしており、神頼みスタイルで乗り切りました。
普段は金から追放される私が11位ギリギリに残りKaggle Grandmasterになりました。

www.kaggle.com

Landmark Competitions
f:id:tereka:20211221224652p:plain
Landmark Retrieval2021 Leaderboard

ほぼ毎年参加しているLandmark Competitonです。(2019は計算リソースは必要すぎるので諦めた)
2021年はRecognition/RetrievalともにNotebookで、Retrievalは昨年の謎のTensorFlow縛りもなくなり、純粋に面白いコンペティションになりました。
過去のコンペだと2018年にGLDv1、2019年からより巨大なGLDv2、2020年からNotebookと進化してきました。

コンペ序盤にチームに誘われたのでマージしました。
少しやってみて想像通り、計算リソースが足りないことははじめからわかっていたので、マージして効率よくモデルを作ろうとしていました。
お互いがTPUを利用していてGCPで30万の請求されたのも苦しいですが、良い思い出でした。

※30万溶かした記事
nonbiri-tereka.hatenablog.com

終結果としては、Retrieval:5位(金)、Recognition:12位(銀)になり、どちらも金を狙っていた私達としては悔しい気持ちになりました。
しかし、RetrievalにてICCVに発表する機会をもらい、非常に嬉しかったです。
Kaggleなど成果を国際学会できちんと対外的に報告するのは一つの目標だったので、それが実現できたのは良かったです。

www.kaggle.com

動画はこちら
www.youtube.com

Kaggleに取り組んで思ったこと

この経験から、時々議論されるKaggleやっててどうだったのかといった話を書いていこうと思います。

良かったこと

データを見ればいろんな意味でやばさがわかる。

仕事でも当然ですが、データを見て、分析することが必要になってきます。
私ももちろんですが、大半の方は一度ぐらいは交差検証ミスをやらかしたことがあると思います。
実際の仕事のシステムを考慮すると検証時のリークは非常に危険なもので、PoC後に、システム化して、期待と違うと思われるのは問題です。

Kaggleはその感覚をノーリスクで体験できます。(リスクに後でショックを受けるとかは省いています)

手数の多さ

Kaggleでコンペをいくつか経験すると、成否問わず、自分で考え、挑戦してきた結果や知見があると思います。
これに基づき、実データに対してその経験が適用できるかできなさそうかの判断ができるようになる。
また、どうすれば解けそうかがなんとなく見えるようになってきます。
そして大体の場合、実装のストックを持っていることが多いので、その実装を利用すれば、すぐに試せます。

こういった手数の多さ(=アイデアの多さ)は非常に役立つので、Kaggleやっててよかったと思うことはあります。
(いざ直面して、実際今までやったことがあるものも多いです)

精度の見積もりと実現できる手法

コンペの経験が多くなってくると、そもそもこの検証、精度がすぐに頭打ちになりそうか、
直感的に難しそうかの区別がつくようになってくると思っています。
また、問題を見てすぐにこの手法だとほぼ成功しそうといったものが経験ベースでわかるのはかなり安心できます。

そういったことを経験ベースで得られるのは非常に貴重な場だと思います。

悪かったこと/身につかないこと

問題定義をする能力

Kaggleのコンペは開催地点で基本的に問題と評価が定義されています。
ただし、実案件は機械学習を使ってやりたいことを決めることが多いと思いますので、システム的にどのような物が良いのか、などそういったものの役には直接は立ちません。

しかし、その問題が解けそうかの判断はなんとなくわかるようになるので、その設定で問題ないかがわかります。

精神力の消耗

特に上位にいて追い抜かれるときのストレスは危険です。
計算中は気晴らししないと正常な精神を保てないことも多々ありました。

Kaggleで勝つ&コンペ続けるのには精神力が必要です。(他のことに手がつかない・・・

今後の挑戦

Kaggle Championship

今年の一番大きな目標の一つはこのコンペティションです。
一度、New Delhiで参加していますが、普段と違う能力が問われており、刺激的でした。
4時間という私が参加した中で史上最短のコンペでしたが、参加することでの学びも多くあり、本戦出場に向けて一つ一つ積み上げたいと思っています。

皆さんとスペインでお会いしたいので、がんばります。

学会系コンペへの参加

Kaggleに限らず、学会の中で主催されているコンペにも参加してきたいと思っています。
例えば、RecSysやKDDでコンペが開催されていますが、そういったところも挑戦したいと考えています。
Kaggleとは違った知見を獲得できそうなので、積極的に新しい知識を得ていきます。

情報発信

Kaggle Grandmasterになるまでその達成に完全にかかりきりになっており、あまり他のことに取り組む時間が取れておりませんでした。
コンペ参加して、Youtubeやブログなど何らかの形で書き残すことも大事だと思うので、来年は増やしていければと思っています。

最後に

Grandmasterになるまで、非常に長い道のりでした。
その長い期間で多くのコンペに参加してきましたが、学生から社会人と無駄なことはなかったなと振り返って思います。

コンペは引き続き参加していきますので皆さんよろしくお願いします。