こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
今回の記事では、初心者Kagglerの私が所属企業の優秀なデータサイエンティストのメンバーとKaggleのPII-Detectionコンペに挑戦してみて得た学びとこれから実践していきたいことについてまとめてみたいと思います。
私は今回初めてチームを組んでKaggleに取り組みましたが、1人で取り組んでいた時には見えなかった、他のデータサイエンティストがどのようにしてKaggleを進めているのかについて知ることができたのでそれについてまとめていきたいと思います。
一方で、私はチームでなかなかバリューを出せなかったので、「なぜバリューが出せなかったのか」「今後どうすればチームでKaggleを行った時にバリューを出せるようになるのか」について考えていきたいと思います。
参加したコンペの概要
今回、所属企業のデータサイエンティストの方々と一緒に参加したのはKaggleの「The Learning Agency Lab – PII Data Detection」というコンペで、文章中のPII(個人情報)にラベルをつけ、その正確性でスコアを競うコンペティションです。
優秀なデータサイエンティストから得た学び
私が一緒に参加した優秀なデータサイエンティストの同僚から得た学びは以下の3つです。
- 参加しているコンペはCodeやDiscussionを見るのはもちろん、コメント欄からも情報を収集しよう
- 類似の過去コンペからも今回のコンペに活かせる手法がないか探ろう
- ローカルでCVをしっかり計測しよう
順を追って解説していきます
参加しているコンペはCodeやDiscussionを見るのはもちろん、コメント欄からも情報を収集しよう
私が今までソロで参加したコンペにおいては、CodeやDiscussionのMost Voteあたりのコードをコピペして実行して、少し微調整を加える、という非常に面白みのないコンペへの参加の仕方をしていました。
一方で、優秀なデータサイエンティストの同僚は、なんとCodeやDiscussionに目を通して、新しくめぼしい情報を拾ってくることはもちろん、CodeやDiscussionのコメント欄から
「こういう意見が出ていて、上位者はこう答えていたよ」
「ここら辺が上位者の設定しているハイパーパラメータっぽいよ」
という漫然とCodeやDiscussionをさらっているだけでは得られない情報まで取ってきて、チームのSlackに共有していてくれたのです。
確かに、実際見てみるとコメント欄には多くの鋭い指摘が紛れていたり、そのコメントを起点としてPublicLBのスコアの更新が起こるようなCodeが出てきたこともありました。
この情報への感度が、すでにKaggleで戦い抜いてきた同僚とKaggle初心者の自分との大きな相違点だなと感じました。
類似の過去コンペからも今回のコンペに活かせる手法がないか探ろう
情報への感度、という点で言うと、過去の類似コンペから今回のコンペに活きそうな手法を持ってきている点も私にとっては大きなパラダイムシフトでした。
今までは参加しているコンペのCodeやDiscussionにしか有用な情報はない、と思っていた私ですが、類似の過去コンペまでも探索範囲に入ってくると考えると、探索範囲は一気に何十倍にも膨れ上がります。
そして、過去コンペの手法がそのまま現在のコンペに転用できるとも限らないので、現在のコンペに適用できるように実装を書き換える力も要求されます。
既存nbのハイパラいじって満足していた温室プールピチャピチャ人間にとっては、突然同僚が大海原に向かって泳いでいくのを見たような、そんな気持ちでした。
ローカルでCVをしっかり計測しよう
ローカルでの検証についても苦戦したポイントでした。
優秀な同僚たちは当たり前のようにローカルでCVの検証を行った上で、実際に提出してみた時のPublicLBのスコアを比較していました。
限られた提出回数の中では、そのようにしてローカルで新しい手法の有用性をある程度確かめてから、PublicLBに提出してみて、CVとPBLに差分があればtrainデータとtestデータの挙動の違いに思いを巡らすのがさも当たり前のようでした。
一方で、Kaggle初心者の私にとっては、ローカル環境で検証用のCVを行うのは少しハードルがありました。
といっても、今思えば思い詰めすぎていたような気もします。
実際、TransformerのTrainクラスは訓練データの学習時に検証データに対するCV結果の値を出力してくれているので、ミニマムでいえばそこに出てくる数字をSpreadSheetにメモって、その横にPublicLBのスコアをメモるだけでも十分だったと思います。
しかし、その当座の自分は優秀な同僚が実行したように
「Wandbを使ってCV結果を記録したいな、、、でも使ったことないしな、、、」
と思い、なかなかCVを記録することに着手ができず、結局最後までにCVを記録せず、新しい手法を試してもPublicLBで手法が効いているか効いてないかを検証してしまっていました。
同僚がCVをしっかり追跡していたからこそ、TrainデータとPublicデータとの乖離にも気づくことができました。
ちなみに、今回のコンペではPublicLBでの成績とPrivateLBでの成績が乱高下するという現象が起きました。
これは、PublicLBに過学習してしまったようなモデルを上位者が作成していたことが原因にあげられます。
我々のチームも最終提出用に選んでいた3つのモデルよりも、PrivateLBに対して優れた性能を示している汎化性能のあるモデルが存在していました。
私自身もCVを取っていて、優秀な同僚と同じ目線で汎化性能について議論ができていたら、もしかしたらより高い最終スコアを上げることができていたかもしれません。
今後実践したいこと
今回のチームでのコンペティション参加の経験を踏まえて、私が実践していきたいことは以下の3つです。
- 毎日Kaggleの実装を行う時間を取る
- 毎日KaggleのCode/Discussion/過去コンペから情報収集する時間を取る
- チームでコンペティションに参加する場合は、毎週必ず何らかの進捗を生む
- ローカルにCV環境を整える
前半3つはKaggleにおける時間の使い方を変える、かつ習慣化を行うということを意味します。
僕の師匠Jeremy Harward(Kaggle初代最高責任者)も
「難しいロジックをたくさんの時間をかけて実装するよりも、まずは小さく提出を繰り返して改善していくことのほうが重要」
と言っていたので、Kaggleに関わる & 進捗を生む & 進捗の生み方の質を変える、というのは日常の習慣にしたいと考えています。
最後のCVについては、限られた提出回数以上に実験を行うために重要なことになります。
新しく参加したいAI Mathematical Olympiad – Progress Prize 1というコンペも、1日あたりの提出回数は2回しかありません。
機械学習モデルの構築については、新しい手法を実装してみるまでは有用性が分からない部分が多々あるかと思うので、試行回数を増やすための取り組みはすべきだと考えています。
まとめ
今回の記事では、初心者Kagglerの私が所属企業の優秀なデータサイエンティストの同僚とKaggleのPII-Detectionコンペに参加してみて、得た学びとこれから実践していきたいことについてご紹介いたしました。
今回のコンペにおいては優秀なデータサイエンティストの同僚のモデルで銀賞に入賞することができ、彼らの見つけてきたDiscussionの内容を元に訓練データ等を修正した結果、個人でも銀賞入賞圏内のスコアを叩き出すことができました。
今回のコンペを通じて成長した部分があるな、と感じつつも、チームに貢献しきれなかった部分は、自身のマインドや習慣の問題だなと感じたので本記事の執筆に至った次第です。
今回の記事が、私のような駆け出しKagglerの方の改善活動のお役に立てれば幸いです!
コメント