かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

メラノーマコンペ参戦記と kaerururu part solution

こんばんは、kaerururu です.

先日終了したメラノーマコンペ SIIM-ISIC Melanoma Classification に参加し、結果としてチームで private 39th 銀メダルを獲得したので、自分の solution 部分や取り組みについて残しておこうと思います. solution 部分だけみたいよという方は 4. kaerururu のsolution だけご覧下さい.

1. コンペについて

概要

  • 皮膚の画像から皮膚ガンであるか否か (0 ~ 1) を当てるコンペです

データ

  • 本コンペの データとして train 33126, test 10982 サンプルずつ
  • 他 External data として、2017 ~ 2019 年のデータが利用できました
  • 108GB と大きいデータだったが, GM の Chris 氏が画像のサイズごとに (128, 192, 384, 512, 768, 1024) データセットを公開していた

評価指標

  • ROC-AUC score

2. 参加の動機, 経緯

  • 転職を機で前職で福利厚生として利用できていた 2080 * 1 の GPU マシンが使えなくなり、自分のマシンの購入を検討していました
  • 限られたリソースの中で知識/手法の整理を目的に Notebook だけでやれるところまでやって、流れに乗れそうだったら GCP に課金しようと思ってゆるく始めるつもりだでした
  • そのような中、
    • データサイズが大きい (参入障壁が高い)
    • GM による公開 Notebook をベースに LB が形成されていました
    • その Notebook が Notebook TPU / TF2.0 ベースで書かれていました
    • 初期段階でアンサンブル祭りになっていました

    という特徴があると感じました

以上の観点から, TPU / TF 2.0 の練習がてら、画像サイズの異なる複数モデルを作成し、公開 Notebook からいくつか拝借し, Stacking したらソロでも良いとこまで行くのではないかという打算で無理のない範囲で参戦することに決めました。

結果、金圏ソリューションでも 画像サイズの異なる複数モデルを作成し、公開 Notebook からいくつか拝借し, Stacking というのがチラホラあって見込みは悪くなかったようです.

しばらく、ソロで参加するも

  • min-max stacking や stacking という名の averaging notebook 達がメダル圏ボーダーを上げまくっている状況
  • 新しい環境での仕事が始まる
  • CV も微妙 (LB 0.96 前後が銅メダルボーダーで自分の LB が 0.9554, ベストシングルの CV 0.914)

という状況で心が折れて, 最終サブでも作ろうとしていた残り 10日くらいの頃に GM の mobassir 氏から team mearge のお誘いが来て (このコンペは多様性で勝負するコンペやで!一緒やろうぜ!みたいな内容でした) それを承諾することにしました。

当時、顔の見知った方以外とチームを組んだことがなかったので一度組んでみたいと思っていたのと, ツイッター相互で NLP のコンペでよくお見かけしていて一度ご一緒してみたいと思っていた ktr さんがいらしたのが理由でした.

最終的には mobassir 氏, 彼が bros とよんでいた Mizanur 氏, ktr-san, こちらもよく TL でお見かけしていた toru ito-san の合計 5人チームでやっていきました.

3. チームでの取り組みについて

戦略

  • 基本各々のモデルを伸ばす方針で最後にアンサンブルしようぜという感じ.
  • TPU のリソース (30h/week) はチーム単位で管理して、notebook の snapshot を保存して誰かに回してもらうみたいなことをしてました.
  • アンサンブル祭りになっていて LB は信用できないので 一貫して Trust CV 戦略でした.
  • Last Sub は3つ選べたので CV が高い 2つ (LB は圏外) と LB が高い 1つ (LB 銅圏) を選択

LB 圏外のサブが shakeup & 天誅による Private LB の掃討により 39th まで伸びました.

コミュニケーション

  • 言語は英語, 日本人同士では twitter の DM で挨拶を交わしました

  • 最初 LinkedIn のDM でグループメッセージしていたのですが、これがとんでもなく使いづらく、ただでさえ不慣れな英語でのコミュニケーションだったのに これだけでコミュニケーションのやる気が削がれるものでした

  • Slack のグループを作って解決しました

4. kaerururu の solution

  • Chris の notebook をベース

    • EfficientNet B4
    • pretrain imagenet
    • image size 384
    • image のみ
    • fold : Tripple Stratified 5 fold
    • augmentation : zoom とか rotate とか
    • 過去コンペデータなし
  • kaerururu の追加部分

    ### Single model

    ##### TPU

    • EfficientNet B4 (512), B6 (384)
    • augmentation : add CoarseDropout
    • Add metadata with model arch (Petfinder 1st 解法参考)
    • 2 stage training
      • B4
      • Pretrain : 2017-2019 (BN 層だけ freeze)
      • Finetune : 2020 (全層)

      • B6

      • Pretrain : 2018
      • Finetune : 2020

    #### GPU

    • EfficientNet B1 (192)
    • augmentation : add CoarseDropout
    • Add metadata with model arch
    • 2 stage training

    • Only Pseudo-labeled test data prediction

      • TPU で学習した B4/B6 の avaraging の target を閾値 0.6 以上のものを 1 として test data だけで学習 (CV 0.678, LB 0.73, Private 0.6936)
      • metadata だけで学習した LightGBM (LB 0.7 程度) を混ぜれば スコアが伸びることが discussion で報告されていたのでスコアは低かったが、混ぜたら良い感じになると思いました.
      • 本来、このデータを教師データに追加して学習しなおすのが筋なのだが、TFRecord に不慣れすぎてできなかったです (TPU だとエラーになるバグがあって最後まで改善できなかった)

    ### Stacking

    • 最終モデル (Private 0.9437) で使用された kaeru single は以下

    Effn B4 (512) pretrained with 2017-2019 (1) auc:0.91395 Effn B6 (384) pretrained with 2018 auc:0.90949 Effn B4 (384) pseudo labeled test data auc:0.67771 Effn B4 (512) pretrained with 2017-2019 (2) auc:0.92049 Effn B4 (512) pretrained with 2017-2019 (3) auc:0.90873

    • 他, last sub には採用されなかったが, Ridge 回帰で Stacking (Private 0.9427) なども作成

5. まとめ

  • ゆるく参加するつもりだったメラノーマコンペで初の知人以外から誘ってもらって銀圏 finish した
  • ドメイン知識云々には時間をかけられず込み入った工夫はできなかった
  • が、画像コンペですべきことを粛々とやっていったらメダル取れた
  • 来週くらいには自分の GPU マシン (2080ti * 1) が届くのでまた画像コンペ出たい