初心者チームでkaggleコンペに参加して銅メダルを取った話

# 前置き
[SIIM-FISABIO-RSNA COVID-19 Detection](https://www.kaggle.com/c/siim-covid19-detection)というコンペ（5月18日〜8月10日）に参加して、銅メダルを取得することができました（116位/1324）。
そのときに行った勉強法や取り組み方をこの記事にまとめていこうと思います。
ちなみにTitanicを終えて、コンペに挑戦する方に向けて＆自分の振り返りを兼ねてこの記事を書きます。

# 目次
* 今回チームで参加するとなったきっかけ
* チームのレベル感
* 勉強会しました
* コンペへの取り組み方
* 反省点
* 最後に


## 今回チームで参加するとなったきっかけ
私が機械学習を始めてからTwitterでも情報発信・情報収集などを行っていました。
そこでフォローしているkagglerの方々がコンペの話を楽しそうにしているところを拝見して、自分もこの方達と同じレベルでkaggleに参加したいと思い、「kaggle参加したい」とツイートしたのがきっかけでした。
一人がそのツイートに反応してくださり、チームを組むことになりました。
今でも誘っていただいたこと、感謝しています。
初めは2人でコンペに挑んだのですが（5月18日）、5月下旬より1人が参加、もう1人参加となり、4人で挑むことになりました。全員Twitter繋がりです。
恐るべし、Twitter。
そして何より恐ろしいのが、メダルを狙いに行くという目標を掲げていたことです。モチベーションはすごく高かったです。一人ではできなかったなと思います。

## チームのレベル感
4人で参加したわけですが、私以外はkaggle初参加でした。
うち1名は1年半前から機械学習を勉強されていてE資格の勉強中、他2名は機械学習の勉強を初めて半年？とかだったと思います。
私はというと、[こちら](https://note.com/natsumin_723/)を見ていただけると何者なのかがわかると思います。
リンクへわざわざ飛ぶのが面倒な方のためにざっくりまとめます。

* 機械学習は2021年1月より開始
* kaggleコンペは2回出ていた（公開Notebookのパラメータ変えるくらいしかしていない）
* 元SE(4年半、webアプリ開発など)
* 現在離職中（時間はいっぱいある）
* 深層学習はほぼ未着手


## 勉強会しました
チームでコンペに取り組むためにまず、コンペに関わる勉強を行うこととなりました。チームでコンペに参加するにあたり、以下を取り入れました。

* Slackでのやりとり
* Google meetで顔を合わせて勉強会

こちらは血迷っていて、Zoomやteamsなど試しましたが、最終的にGoogle meetが採用されました。


2人の時は最初、[Pythonで儲かるAIをつくる](https://www.amazon.co.jp/Python%E3%81%A7%E5%84%B2%E3%81%8B%E3%82%8BAI%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B-%E8%B5%A4%E7%9F%B3-%E9%9B%85%E5%85%B8-ebook/dp/B08F9P726T)の4章、5章を一人で取り組んで、週2（1日2時間ほど）で勉強会を開いてわからなかったところや疑問に思ったことなど意見交換をしたり、そもそも参加するコンペのデータや評価指標について頑張って英語を読んだりしていました。2人とも英語が読めないというレベルでの参加でした。
途中から上記の本で学習していることが今回のkaggleコンペへ繋がるか、疑問に思い、方向性を変えることになりました。
主にkaggleのdiscussionや公開NotebookのEDAでわかりやすそうなものを共有してコードを理解するために画面共有して一緒に勉強したりしました。

1名追加になって3人になったところで、勉強会の流れが一気に変わりました。
kaggleのdiscussionや公開Notebookの情報収集は行いつつ、週2の勉強会では、今回のコンペで役に立ちそうなQiitaの記事の紹介や評価指標の勉強（今回のコンペで言うとmaP）、過去の類似コンペ（画像分類）の紹介、類似コンペの上位解法（どんなモデルを使用していたかなど）をLT会より少し長めの発表や疑問点の質問や意見交換を行っていました。
ありがたや〜。

4名になったところでも、同じように勉強会はしていて、私もコンペとは関係ないですが、githubの使い方を実際にやってみるという発表をさせていただきました。


本格的にコンペのコードを書くにあたって、まず理論部分を定着させてから実装にあたろうというスケジュールになりました。
理論部分とは？というと以下の内容です

* [ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)
こちらは私自身良書だと思っていて、2週間ほどで読み終えました。わからないところはSlackや勉強会で質問したりなどチームならではの動き方ができたと思います。

* [キカガクの無料の講座](https://www.kikagaku.ai/)
こちらでは主にPytorchの勉強を行いました。実践的な内容で、コードを書いたりする時間もあって、Pytorch初心者にはありがたい教材だなと感じました。


## コンペへの取り組み方
6月下旬から本格的にコンペのコードを実装していくことになりました。
モデルの訓練からsubmitまでできる精度の良い公開Notebookを見つけたので、それをベースラインとして少しずつ改良していきました。

改良とはというと以下の点です（チーム全員で試しました、私一人の力では無理でした）。

* WBFを自力で実装
* アンサンブルを試す
* ハイパーパラメータをいじる
* Augmentationを工夫してみる
* とにかくアンサンブルを試す
* 訓練モデルの改良（公開Notebookまるパクリではなく、オリジナリティを追加して精度を上げる）


7月中旬～下旬はチームのみんなのモチベーションが下がってしまい、週2で行っていた勉強会もネタがない・進捗がないなどで開催されなくなりました。
精神的にやられていました。
コンペ終盤にスコアが良い公開Notebookが公開され、それらをベースのコードに取り入れたところ、少しスコアが上がってメダル圏内に戻れることができました（一時期、メダル圏外へ落とされたのでここでモチベーションが上がりました）。

最終日が近づくにつれ、submit数も増えてきて、誰が何回submitしたいかなどSlackで会話したりもしました。
最終日前日まで実装したりして、徹夜をしましたが、結局そのコードは提出が間に合わず、残念という形になりましたが、最後のsubmitは余裕を持って行うという知見が得られたのでよかったです。


## 反省点
チームで行った時の反省点と自分自身の反省点をまとめます。

### チームでの反省点

3ヶ月のコンペで大事だと思ったのは情報共有と、モチベの保ち方です。

ダメだなと思った点

* 「スコアが上がったよ」→何をしてスコアが上がったのか、あまり理解できていない自分がいたこと
* メンバーの改良していくコードの方向性が多少ばらつきがあったと感じた
* このDataset使っているよな、だから改良してみたら実はもう使われていなかった
* 週2で行っていた勉強会が途切れる
    * モチベーションが下がっていた
    * そのモチベを上げることができなかった（自分は割と周囲が気になるタイプなのでどうやったらモチベが上がるのか悩んでいた）

よかったなと思う点

* 何を検証するか迷ったときにチームメンバーが提案をしてくれた
* GPU制限に引っかかってしまったときにチームメンバーにこのコードを実行してほしいと頼めたこと
* 何より勉強会で知識を深められた
* みんなが頑張っているから私も頑張らなきゃと思えた

### 自分自身の反省点

ダメだなと思った点

* GPUを使うコードをベースにしていたので、あれこれ試していたらkaggleのGPUの利用時間の制限にひっかかってしまった(n回繰り返すという失態) 
    * 検証できないのはもったいないと思い、google colabを使って検証などを行いましたが、これが大きな致命点となる
    * kaggleとcolabのライブラリやそもそもPythonのバージョンが違っていたりなど問題が発生
    * colabを有効活用しようとkaggleよりcolabの使い方がメインになってしまった

* コードを書く時間が少なかった
    * アンサンブルなどは私は実装していないため、今後コンペに参加する際うまくできるか不安あり
* kaggle日記のつけ忘れ
    * これが今回一番の反省点で、日記をつけなかった＝先週の自分が何をしていたか忘れる、効率よく検証ができない（同じ検証を繰り返す）といった問題があった
    * 次回以降は絶対kaggle日記つけると心に誓った


よかった点

* kaggleでの検証は数epochずつ行えばある程度良いか悪いかわかる
* 無理にGPUを使わずともCPUで検証できるとわかった
* コード管理にgithub使うと良さそうとわかった（バージョン管理できるのが嬉しいところ）
* CV（交差検証）は大事とわかった（今回は取り入れなかったが次回からは取り入れたい）
* colabとkaggleのNotebookの違いを痛感した
* 公開Notebook丸パクリではなく自分で考えてコードを改良できた
* kaggle日記の大切さに気づいた 

## 最後に
主にチームでの参加の方法をずらっと書く形になりましたが、時間を取って、計画的に取り組めばソロで参加してもいけるのではないかと思います。
しばらくは私はソロでコンペに参加して実力をつけたらまたチームで参加したいなと思っています。

この記事が初心者の参考になるかどうかわかりませんが、参考になったら嬉しいです。

最後に、一緒に戦ってくださったチームのみなさんに感謝です。