しがない元高専生の競プロ日記

AtCoderとかいろいろ解いてく

異世界転生したらつよつよとKaggleチーム組むことになってそのまま銀メダル取った話

この記事は TUT Advent Calendar 2021 4日目の記事かつ豊田高専 Advent Calendar 2021 4日目(1本目)の記事です。

ちなみに今自分は卒業研究で絶賛大炎上しています。何故こうなったんや...

で、アンタ誰

TTです。豊田高専->技科大の地元引きこもり型高専生あるある街道真っ最中です。

うまくいけば来年は正規√から外れそうですが...

競プロer(最近はゆるふわ)でありながら年間N×1e6円を音ゲー(SDVX)にかける変態です。

けんきうはSGY研で画像系のことをやってます。

ぐわ〜トラックに轢かれて気付いたら大変なことに!?!?(Kaggleコンペ参加の経緯)

~今年の春~

B4になってから研究室配属いくぜ!!!!!!!!!

SGY研 配属者: TT (1名)

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

ということがありつつもなんだかんだ研究開始。

なんとか画像繋がりで隣の研究室の同級生+強い人で深層学習系の勉強会をすることに。

それから夏になってコンペ出てみたいね〜でなんとなくSIGNATEに参加するも結局何もしないで放置してしまい、こりゃあかんとなった。

そんな中でTLのFFer(院試関連で知り合った強い人)が、

競プロerでML初心者で集まってKaggleやりたいんですけど誰かやりませんか

やります!!!!!!!!!!

...ということでノリと勢いで参加決定。

その後集まったメンバーを見ると、

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

というわけで競プロerからKagglerに異世界転生したらチームメンバーが全員ガチプロで最強にになりました。

タイトル回収ですね。

そして今見たらメンバー4/5が同級生という偶然で草。

コンペ参加開始

今回参加するのはVentilator Pressure Prediction。昨今のCovid-19の背景から患者の肺の気圧情報その他諸々から今後の患者の肺気圧情報を予測するtabular data&時系列予測系コンペ。

Kaggleのコンペとしては入力も少ないしタスクは軽めのコンペで完全に初心者でも楽しめるタイプのコンペでうってつけ。

画像は計算資源ゴリゴリゲーだしNLPは独特の知見や手法(別コンペで痛い目を見た)が必要で大変。

初心者はテーブルデータ系で出るとモデル構築もできるしオススメかも。

後で知ったがこのコンペには日本人がめっちゃ参加してたらしい。

チームメンバーとしては主催者の人がコンペ経験者、残り全員が初心者という偏った編成。

卒業研究で機械学習をやってるのは主催者と自分だけで後の人は少し知ってるという感じ。

Slackでチャンネルを立ててKaggleコンペにjoinした後チーム結成。

チーム名はflag_of_gabbonに。(国旗の色がチームのAtCoderレート色になっているため)

コンペ参加開始。主催者(めんどいので次からリーダーで)の指示でまずはCodeやDiscussionで現在のコンペの主流な解法の把握から開始。

どうやら双方向LSTMを使ったモデルがいい感じらしい。Transformerを使うのはイマイチ?PytorchよりもTensorflowの方が強いからTensorflow1択。前処理はどんなことをやってる?

こんな感じのことをまずは調べ始める。わからない人にはLSTMのQiitaの記事をぶん投げたりする。

そんなこんなしてるとリーダーが学習の動くコードを実装してGitHubにあげてくれた。天才すぎて頭が上がらん。

というわけでローカルGPUを持っている自分とリーダーが学習担当で色々いじることに。

何もわからんのでとりあえずクソデカepochでゴリゴリ回すぜ!!!!をしていたらリーダーのコードに学習を監視するスケジューラーがちゃんと組み込んであって学習が習熟したら勝手に止まるようになってた。何ですかこれは...(頭上がらん)

そんなこんなしてたら社会人erがColab proに課金して急にGPU強者に。社会人すげ〜〜〜〜〜〜

というわけでモデルをガチャガチャしたり適当にパラメータを変えて遊びながら中身を理解していった。

そして学習ない組は前処理などの学習以外の部分を担当することに。

与えられたパラメータから計算して新しい特徴量を作ってみたり、作った特徴量が学習にどれだけ効いてるかを図示してみたりで地味ながら大事な作業を担当。あとはNotebookやDiscussionを監視したりもしてた。

ちなみに実行環境はKaggle内にColabみたいなNotebookを作って実行できるKaggle Notebookがあるのでそれでやってたっぽい。

そんなこんなで...

その後、特徴量やモデルが馬鹿みたいにデカくなってローカルで学習を回すと2日間CPUの7割とGPUメモリ全てを食い尽くされて何もできんしそもそもbatch size削ってやっとみたいなことが増えてきたのでKaggle NotebookでTPU使って回す方針に変更。

これにより全員が同じ環境で学習を回せるようになり知見の交換やコードの共有、移植が簡単に。(最初からこうしても良かったかも)

ということでコンペも終盤戦に入り、残りの時間はチームメンバー全員同じ環境の並列5セット学習が可能に。

ここからやることは...そう、アンサンブルです。

機械学習における「アンサンブル」は、複数のモデル(学習器)を組み合わせることで精度の高いモデルを作成する手法を意味します。

簡単な説明がu++さんのブログにあったので興味があったらぜひ。

ということでこれまで積み上げてきた知見と特徴量を基にモデルの学習をしてみんなのモデルをアンサンブルして提出!!!!!!

f:id:honehaniwa:20211204035349p:plain

f:id:honehaniwa:20211204035410p:plain

そしてほんの少しだけ改善してコンペは終了し、運命の最終スコア発表へ。

Kaggleではコンテスト中に見れる公開順位表でのスコアデータとは全く別の非公開順位表が存在し、最終順位は非公開順位表に基づく。

つまり最後に大逆転優勝も敗北もあり得る状態...

UTC+0の24時ピッタリにコンペが終了するので日本時間だと翌日の朝9時、最終結果は...

コンペ結果

銀メダル獲得しました!!!!うおおおおおおおおおお!!!!!

ちなみにあと1つコンペで銅以上のメダルを取ると晴れてKaggle Expertになれます。

詰まるところリーチ状態。

チームメイトに...感謝...ッ!

完走した感想

チームを組むことによるモチベーションの維持と進捗の発生具合は最高でした。

特にAtCoder青以上という地頭おばけのメンバーなので何としてでも追いつくために!でこれ以上ないモチベーションで取り組むことができて本当に最高でした。

ちなみにチームメイト全員ガチで強かったです。

後は休日の自由時間を消費して競プロやっているような人間で固まった為、平日休日関わらず当たり前のようにコンペに取り組む習慣が全員に定着していたので毎日何かしらの進捗やらイベントが発生してSlackが活発に動いていた(特に深夜)ので毎日わちゃわちゃして楽しかったです。

あとはチームのタスク管理をissueとGitHub Projects紐付けでやったらめっちゃいい感じになったのでオススメです。

最後に

みんなもKaggle、やろう!!!!!!!!