KaggleでGrandMasterになるまでの5年間を振り返る
はじめに
先日Google Universal Image Embeddingコンペのメダルが確定して憧れのGrandMasterになることが出来ました。丁度いい節目なので今までの分析コンペと歩んできた5年間を振り返ってみたいと思います。意外と長くなってしまったので興味のあるところから読んでもらえたらと思います。
振り返り
Kaggleとの出会い
自分は2017年8月に新卒で現在のデータ分析グループに配属され、画像系のDeepLearningを中心にデータ分析の勉強を始めました。一応大学では情報を専攻していましたがデータ分析をしっかり学んだことはありませんでした。初めてのボーナスでGTX1070を積んだゲーミングPCを購入しDeepLearningの勉強をするんだと意気込んでいたころに出会ったのがSIGNATEの台風コンペでした。
今考えてみると当時のスキルは非常に低く、コンペ終了時でも交差検証?SE-ResNet?アンサンブル?何それ????といった状態で今ならkaggle本を進呈したいレベルでしたが、毎日どうしたらスコアが上がるのかを自分なりに考え、仕事から帰ってから実装し、限界までサブミットをするという生活をしていました。こういうところは分析コンペで競うという事に関しては適性があったのだと思います。この時にアーク情報さんからprizeとして頂いたGTX1080tiは今でも現役です。
このコンペが終わった後、会社の仲間と一緒にkaggleコンペに参加しようということになり参加したのがQuick, Draw! Doodle Recognition Challengeでした。
台風コンペで学んだ技術も生かし、チームメイトと知恵を出し合い、仕事の合間を縫ってモデルを作りまくりました。うろ覚えですが途中でケロッピ先生のLB Probingによってクラスごとのサンプル数に予想がついたことでそれを生かした後処理とかも効いたような気がします。結果としては6位で金メダルを獲得することが出来ました。本当に運もよかったのだと思います。このコンペのポイントがたまたまモデルを作りまくってアンサンブルすることが重要で、クラスごとのサンプル数を考慮した後処理も重要で、会社にはV100があったということです。しかし最初のコンペで金メダルを獲得することができたためKaggle Masterを目指したい気持ちが強くなったのは言うまでもありませんでした。
Masterになるまで
暗黒期
最初に参加したkaggleコンペで金メダルを取れたことで完全に調子に乗ってしまいました。Masterになるためにはあと銀メダルが2つ必要でしたが、銀メダルくらいなら適当にモデルをたくさんアンサンブルすれば取れるだろうと浅はかな考えを持っていました。当時の自分は驕っていて本当にダメなやつだったと思います。当時参加したコンペをここで供養しておきます。
今振り返ってみたらなかなか変わったコンペに参加してましたね。良い感じのベースラインを作ってあとはひたすらハイパラのチューニングとパワーで殴るような戦い方をしていましたがそれだと銀メダルに届きませんでした。これだけ言わせてください。Kaggleコンペはそんな舐めたプレイで勝てるほど簡単ではありません。だからこそのめり込んでしまう魅力があります。 そんなに舐めたプレイをしていたにも関わらずこれらのコンペからも多くの学びを得ました。学びの場としてはkaggleは本当に便利です。あとこれらのコンペでボコボコにされたおかげで目が覚めて最後まで課題のデータと向かい合おうとする姿勢を取り戻すことが出来ました。
AutoSpeech
そんな中会社の同僚とkaggle以外のコンペにも参加していました。codalabのAutoSpeechコンペです。ルールが複雑なので詳細は省きますが音声版のAutoMLモデルの性能を競うコンペです。結果としては3位を獲得することが出来、更にこのコンペがNeurIPSのワークショップの一部であったこともあってバンクーバーで開催されたNeurIPSに招待してもらえて本当に貴重な経験が出来ました。そこで感じたことの詳細はここでは書ききれませんが、世界のトップランナーたちの熱量に触れることが出来て自分の中の縮こまっていた世界が一気に広がるのを感じました。
初めての銀メダル
また、鉄コンペというのもありました。訳あって多くは語れませんがこのコンペには会社のメンバーとともに参加しましたが実働していたのは自分とSinpcwだったと思います。彼とはよくチームを組んで一緒にコンペに参加しました、手が非常によく動いて本当に頼もしい仲間です。このコンペでは少しでも良い結果を残したいという思いも強く、最後までしっかり考え抜いてプレイをできたことで銀メダルを獲得することが出来ました。
念願のKaggle Master
ここまで色々なコンペに一気に参加していたこともあって疲れてしまって半年くらいコンペには参加しておらず、久しぶりに参加したコンペがPANDAコンペでした。
個人的に病理に対する興味が強いこともあったのと、ちょうど医療画像系の案件を始めようとしていた矢先だったという事もあって非常に強いモチベーションが働きました。初めてのWSIに戸惑いながらもあらゆるアイデアを実装し、とにかくshakeしないように汎化性能を重視しながら取り組むことで最終的に4位を獲得することが出来ました。またその後のワークショップで自分たちの提出したモデルが汎化性能が最も良かったということでBest generalization performance awardを獲得し賞金も頂きました。また論文にも名前を載せてもらいました。
また、この頃は分析コンペ用のパイプラインを作るのが流行っていた時期でもあり、自分も自前で作ったものを使って取り組み始めました。しかし実際に使ってみると色々と課題が出てくるもので、自分でパイプラインを管理するのは大変&バグを埋め込む原因にもなるということで、最終的にはPyTorch Lightningを使いこなすということに落ち着きました。PyTorch Lightningを使うとアイデアを試すための重要な部分の実装に集中することが出来て、使いこなせるようになると少し変わった処理でも割と自由に組み込めるので個人的には大好きです。
GrandMasterになるまで
正直PANDAが終わった段階ではMasterになったことに満足しており、運よくソロ金とれたらいいなとかは思っていましたがGrandMasterを目指す気持ちはあまり強くありませんでした。しかし、まだまだkaggleから学べることはあると感じていたのと、kaggleに興味を持っていて闘争心に燃えている同僚が何人かいたため自分も一緒にコンペに参加したりしていました。MoA, ジャンケンコンペ, RANZCR, HuBMAPあたりに参加していましたが金メダルには届きませんでした。それぞれ何かしらの考えがあってモチベーションをもって参加していたのは間違いないのですがあまり覚えていません。。。なんならこの頃はコロナで延期になった結婚式の準備とかで忙しくしていたような気がします。。。
初めてのソロ金
そんな中、ふと参加したSETI Breakthrough Listen - E.T. Signal Searchでソロ金を獲得することが出来ました。このコンペは久しぶりのcsvを提出する形式のコンペで、データがシミュレーションデータであるというのが興味を持ったポイントです。やはりcsvを提出するタイプのコンペは提出結果がすぐにLBに現れるので楽しいですね。あとシミュレーションデータはラベルの質が非常に高いのでラベルノイズとかアノテータ間のブレとか変なことに頭を悩ませなくていいのも好きですね。
このコンペは最初はリークが発生してLBが崩壊し仕切り直しになりましたが、仕切り直してからは順調にスコアを伸ばすことが出来ました。当時仕事でよく調べていた半教師ありのNoisyStudentも相性が良くスコアをぐっと伸ばしてくれてコンペの中盤からはずっと金圏にいることが出来ました。
4枚目の金メダル
SETIコンペで金メダルを取れた後、並行して開催されていたG2Netコンペにも興味が湧きました。というのも会社の重力波ガチ勢チームが先に参加していたのと、SETIと問題設定がかなり近くてコードの多くを使いまわすことが出来たからです。(実際、最後までデータセットクラスの名前はSETIDatasetでやってました)
残り1か月ほどでしたが、ベースラインを作成するとすぐに金圏に到達することができ、Sinpcwを誘って一緒に取り組むことにしました。少しすると先に参加していたNaoismさん, Araiさん, Nakamaさんチームからマージの誘いを頂いて一緒に取り組むことにしました。自分にとってはこれが社外の人とマージをする初めての経験で、アプローチも分析の仕方も色々と勉強になることがありました。最終的に137個のモデルをアンサンブルするというゴリ押しでぎりぎり金圏に滑り込むことが出来ました。最後の最後にSinpcwが作った1dCNNモデルをアンサンブルに混ぜたのが決め手となっていたようです。
5枚目を求めて
ここまできてようやくGrandMasterを目指したいという気持ちが強くなりました。そして丁度会社でMasterを目指す熱いメンバーanonamenameがいたので一緒に金メダルを獲得して昇格したいと思ってチームを組んで頑張っていました。
まず初めにPetFinder.my - Pawpularity Contestに参加しましたが力が及ばず金メダルは取れませんでした。
次に参加したのがHappywhale - Whale and Dolphin Identificationでした。しかし、このタイミングで第一子が誕生し、コンペばかりに時間を割いている場合ではなくなってしまいました。プライベートの時間が無くなるとコンペの参加の障壁が一気に上がるのを感じました。なんとか時間をやりくりしながら取り組んではいましたが、それまでの半分も時間を割くことが出来ていなかったと思います。チームメンバーには本当に感謝です。
クジラコンペではマシンパワーの必要性を思い知らされ、colabのTPUを活用することに目を付けました。初めはPyTorchでcolabのTPUを使いこなそうと考えましたが、それは実際にはほぼ不可能であることに気づきTensorFlowを使うことを考え始めました。TensorFlowでコンペをする上で足りていないと感じたのはalbumentationに相当するDataAugmentationライブラリでした。もちろんTensorFlowでもalbumentationを使うことは可能ですがTPU上となると話が違います。
そこでTPU上で動作するTensorFlowで書かれたaugmentationライブラリを自作しました。
これを使用してマシンパワーで戦いに行ったのがUW-Madison GI Tract Image Segmentationでした。実際TPUの使い勝手は非常によく、imgaug-tfもとてもよく機能したのですが、TensorFlowだと慣れていないのもあって細かい工夫を実装するのに少しハードルが高く、思いついたアイデアの多くを充分に試さずに終わってしまいました。あとこのコンペはパワーで殴る系のコンペではなかったため入り方を間違えました。ただTPUのおかげで学習は爆速でした。colabの制限が厳しくなってしまったのは本当に残念です。あれだけ制限をかけるならTPUをNodeじゃなくてVMにしてくれないだろうか???
やはりPyTorchの方が好きだなと思いながら次に参加するコンペを探しているとGoogle Universal Image Embeddingを見つけました。最初、このコンペはほとんど学習をしなくても戦えるんじゃないかと考えて参加することにしました。実際中盤までは一切学習をせずに上位をキープすることが出来ました。途中でArcFaceを使う方法が公開されてからもそれまでの学習をしないアプローチと組み合わせることで上位を常にキープし続けることが出来ました。後半2週間くらいは抜かされないかとずっとドキドキしていましたが幸いなことに金メダルで終えることが出来て念願のGrandMasterになることが出来ました!ついでにarXivデビューも果たしました。もし、このコンペの第二弾が開催されるとすると今回とは比べ物にならない非常に厳しい戦いになると思います。初回ならではの創意工夫が試されるコンペでした。
Kaggleに参加してきて感じたこと
ここまで5年間にわたってKaggleに参加してきましたが良い面もたくさんありましたが良くない面もありました。自分の考えを簡単に書いておこうと思います。
メリット
データ分析のスキルの向上
間違いなく向上したと思います。コンペ中はずっと新しいアプローチを検討するので引き出しの数が増えましたし、アプローチを導くための思考力も身についたと思います。アイデアを素早く試すための実装力や実験を組み立てる力なども身につきました。それに加えてどのようなアプローチが実際に精度の向上に効くのか?このタスクではどのくらいの精度が出せそうなのか?という勘所も抑えることが出来ました。
今からコンペでデータ分析の技術を磨きたいと考えている人がExpertやMasterを目指すのはとてもいい勉強になると思うのでお勧めです。kaggleのどこから始めるのがいいか分からないという人はSIGNATEやProbspace,Nishika,atmaCupのような日本のプラットフォームで興味の持てるテーマに参加してみるのもいいと思います。大事なのはまず参加してみることです。
困難を乗り越えた経験
終盤にどんどん迫ってくる他のチームからの圧力を感じながら、アイデアが出尽くして出涸らしになった脳みそを更に限界まで絞ってアイデアをひねり出す経験は日常生活はもちろん仕事でもあまり体験できないと思います。そういった経験を積んでおくと日頃の考えることが非常に楽になります。例えるならスポーツ選手が試合より厳しい練習を積むことで本番にリラックスして臨めるようなものだと思います。
学会参加などの体験
kaggleに限らず上位に入賞することで賞金はもちろん国際学会やイベントに招待してもらえることがあります。こういった体験はとても刺激的で楽しいですね。あとは論文に名前が載ったりするのも世に貢献できている感じがして楽しいです。
デメリット
多くの時間が費やされる
もうこれは一部の天才を除いて上位を目指す上では仕方ないかと思います。プライベートの時間が有り余ってる場合は問題ないと思いますが家庭をもっているとそうはいかないと思います。特に子供が生まれてからは時間を捻出するのが難しく、家事育児をしながら頭の中ではアプローチやその実装方法を検討してパソコンの前にいる時間をできるだけ短くしていましたが、アプローチを考えている時はずっと上の空になっていたりして本当に大変でした。
kaggleのスコアに結びつかない技術の習得が後回しになる
頭の片隅にいつもkaggleがあるので、ついついシステム回りやMLOps系の技術や問題定義のスキル、その他kaggleのスコアに結びつかなさそうな技術の習得を後回しにしてしまったと思います。(悔しいので今から猛勉強します。)
また、コンペで上位を目指すために参加するコンペのジャンルが絞られていたので得意分野以外の技術の習得も後回しになってしまっていました。自分はONかOFFしか調整が効きませんでしたが、器用な人はkaggleのweightを適度に調整して取り組むことをお勧めします。
今後の挑戦
kaggle以外のコンペ
今まではkaggleでの称号が欲しいのでkaggleで開催されているコンペを優先していましたが、今後は興味を優先して面白いと思ったコンペにはどんどん参加していきたいと思います。
社外の人とのコンペ参加
ここまであまり社外の人とチームを組んで取り組んでこなかったので、今後はどんどん社外のkagglerとチームを組んで知見を共有すると同時にもっと交流の輪を広げていけたらと思います。
情報発信
今まで自分の性格上、コンペに取り組み始めると敵に情報を与えたくない一心で一切の情報を出さないようにしていましたが今後はkaggleのKernelやDiscussionをはじめとして色々な情報を発信していきたいと思います。
最後に
ここまでKaggleとともに歩んできた道のりはとても険しく、犠牲にしたものも少なくはないと思っていますが得られたものも非常に多く、結果としては有意義なものであったと思っています。
今まで共に戦ってくれたチームメイト、特に最初からずっと一緒にチームで戦ってきたSinpcwには本当に感謝しています。
今後はしばらく子育てを優先しながら引き続きコンペにも参加していきたいと思っているので皆さんよろしくお願いします!
Discussion