2.4K Views
March 19, 22
スライド概要
atmaCup#11の1st place solutionです
Discussion:
https://www.guruguru.science/competitions/17/discussions/d4a737a1-2f39-4c1e-9ac9-1b52c1b419e2/
Code:
https://github.com/ishikei14k/atma11_1st_solution
atmaCup#11 1st place solution & 忙しい⼈のための画像コンペとの向き合い⽅ 2021/8/5 @ishikei4
自己紹介 • 石 圭一郎 / Twitter: @ishikei4 • Engineer @Rist Inc. • Kaggle Master • PAPA Kaggler (娘1.6歳)
目次 1. 1st place solution 2. (おまけ)忙しい人のための画像コンペとの向き合い方
atmaCup#11 1st place solution
1st place solution Discussion • https://www.guruguru.science/competitions/17/discussions/d4a737a1-2f39-4c1e-9ac9-1b52c1b419e2/ Code • https://github.com/ishikei14k/atma11̲1st̲solution 注意点 • 出てくる手法の細かい説明は記載していません • 手法そのものより、なぜそれを選んだのか、どんな方針で動いたのか、 あたりの説明が多めです
Overview Model Trainig Stacking Photos LightGBM • DINO pretraining • resnet18d / ViT̲small / ViT̲base • Regression Image Padding 画像の長辺に合わせて正方形に PaddingしてからResize Post process Fine-tuning Pre process • Classificationの場合は各label のprobalilityも入力 np.clip(pred, 0.0, 3.0) Final Sub Scratch training • resnet18d • Regression / Classification • CV=0.5995 • Public=0.6017 • Private=0.5878
SSL SSL: Self Supervised Learning (自己教師あり学習) • ラベルなし画像で学習して、特徴表現を獲得する手法 • ImageNet pretrainedが使えないことへの対応 DINO:self-DIstillation with NO labels (ラベルなし自己蒸留) • teacher, student 2つのモデルで蒸留 ただしteacherはstudentの移動平均
SSL なぜDINOを選択した? • 公式実装のREADMEが充実していてそのままローカルで動かしやすい →効果確認までの時間が短くてすむ • コンペ初期からDiscussionに上がっていたSimSiamはうまく学習させられなかったが、 きちんと動けばSSLの各手法でそこまで大きな違いはないんじゃないか、と予想 →より簡単に確認できる手法を選択したかった(ぜんぶ試す時間はなかった😇)
SSL • Model: resnet18d, ViT̲small, ViT̲base • Epochのみ本タスクの精度を確認しながら100→300に増やした • SSL pretrain weightを使用してFine-tuning(重み固定なし, 100epoch) Model SSL epoch SSL loss CV Public Private ViT_small_patch16 100 7.587 0.7422 0.7154 0.7002 ViT_small_patch16 300 3.814 0.6890 0.6574 0.6408
SSL • SSLのepoch数をさらに増やせば、もっと single modelの精度は改善できたかも... • ただ、今回はstackingで割とスコアが上がる 感覚があったため、single modelの追求は 程々にしてモデルの数を増やす方針で実験を 進めた SSLのtraining̲loss epoch数を増やすほど緩やかに減少していく印象
Image Padding • 画像の縦横比が年代によって僅かに 偏っているように見えた • 画像の長辺に合わせて正方形に paddingしてから目的の解像度に Resize • これによって同じpixel sizeでも Image Paddingを入れたほうが スコアが改善した Model Img Padding resnet18d - 0.6779 0.6758 0.6522 resnet18d ✓ 0.6674 0.6609 0.6474 CV Public Private
Image Padding 元画像 • Target=0 • size=207x224 • Target=2 • size=136x224 • Target=3 • size=224x70 そのままResize Image Padding
Scratch Training Training Parameter • 最初は Discussion に上がっていた SimSiamを試していたが全くうまく いかず... • コンペ中盤まではScratch学習の • epoch=450 • optimizer=AdamW(weight decay=0.01) • learning rate=0.001 (Cosine decay) • image̲size=360x360 • batch̲size=128 EfficientNet-B0, ResNet18dを 使っていた • (最終subにはScratch学習の ResNet18dのみ使用) Augmentation • HorizontalFlip • ShiftScaleRotate • Blur • RandomBrightnessContrast • Mixup, Cutmix
Scratch Training なぜepoch=450? • 今回、ImageNet pretrainを使わずに scratchでモデルを学習するのが初めて だったため、timmのTraining Examplesの ページをかなり参考にした • batch̲sizeは以外と大きくなくて大丈夫 / epoch数は思ってたよりかなり長くとる、 など勘所がわかってその後の実験が効率的に 進められた
Scratch Training 学習曲線 • resnet18d, img̲size=360x360, regression, SSLなし • CV=0.6818 / Public=0.6798 / Private=0.6630 • まだepoch数伸ばせる気もする...
Regression vs Classification • 基本はRegressionを使っていたが、いくつかClassificationモデルも学習 • そこまで大きな違いはなかったが、後から確認するとsingle bestはClassification だったみたい • Model SSL ViT_base_patch16 ✓ Img size 224x224 Classificationの場合はこちらのDiscussionに あるように予測値を連続値に変換 CV 0.6759 Public 0.6400 Private 0.6306
Stacking • LightGBMを使ったStacking • Regression, Classification双方のモデルを使うが、Classificationに関しては、 各labelのprobabilityも入力として加えた Model1: Regression Target pred 0 1 pred 0.3 : 1.2 Model2: Classification ➕ proba̲0, 1, 2, 3 0.1 0.8 0.1 0.05 0.05 1.3 0.1 0.65 0.2 0.05 2 2.2 2.1 0.0 0.1 0.7 0.2 3 2.9 2.8 0.0 0.1 0.3 0.6 LightGBM Stacking
Stacking なぜStacking? • 初期にEnsembleとStacking両方試していた→その時点で双方に精度差はなかった • CV / LBの相関が高かったこと、コンペの性質、主催者の性格などからPublic / Private も割と相関しているだろう、と予測 →CVにOverfittingしやすいStackingでもLBで精度を保ってくれると踏んで採用 • 結局、その後Classificationのprobabilityを加えたことでスコアもboostしたし良い判断 だった
solutionまとめ • Model: ResNet18d, ViT̲small, ViT̲base • DINO pretrain (300epoch) --> Fine tuning / Scratch traininig (long epoch) • Image Padding • Regression & Classification • LGBMでstacking (Classificationは各labelのprobabilityも入力)
(おまけ)忙しい⼈のための画像コンペとの向き合い⽅
(おまけ)忙しい人のための画像コンペとの向き合い方 話すこと • 普段自分が画像コンペやるときに気にしてること • 特に、色々な事情によりなかなかコンペやる時間がとれない人向け 注意点 • 一応画像コンペに絞って話します • (他のドメインのコンペでも共通な部分はあるかも知れませんが) • あくまで分析コンペという「ネットゲーム」でどう上位を狙うか、に焦点 (実務とは別の観点)
画像コンペ特有の悩み 一回の学習に時間がかかるため、試行回数を増やせない • 個人的にはこれにつきる... • 完全にモデルの学習に生活リズムを合わせられれば良いが、そうもいかない • 仕事、学校、育児、etc...
画像コンペ特有の悩み 例えば今回のコンペの場合... • resnet18d, img̲size=360, batch̲size=128, RTX3090使用で1epoch16秒 →450epoch x 5fold = 10時間 • 1日2モデル回せても2週間のコンペだと28回しかフルモデルを作れない
画像コンペ特有の悩み どうする? • 1epochにかかる時間を短くする • 「やること」「やらないこと」を明確にする
どうする? 1epochにかかる時間を短くする • お金でなぐる • GPUを効率的に使う • • 例:画像をnpy形式で持ったりメモリに載せておいたり / dataset内では特徴はnp.arrayで持つ、など • GPU以外で処理に時間がかかっている箇所を特定する 小さい画像サイズ、1foldのみ、一部の画像のみで実験を高速に回す • ただし、あまり同じfoldでのみ確認してるとそのfoldにどんどん過学習してしまうのでほどほどに • 気をつけないと、試行回数 shake確率になってしまいがち(な気がしている)
どうする? 「やること」「やらないこと」を明確にする • 理想的には全部試してその中から選択したい(が、そんな時間はない) • 「効きそうなこと」「効かなそうなこと」をコンペのデータや背景から考察(妄想) したり、そのための初期検討に時間をかける
どうする? コンペ序盤で気にしていること • • コンペ特有の性質は何か • 今回ならMaterialsなどの情報、外部データ禁止、画像比率? • 色々試して無理そうならすぐ他の方針に切り替える • (結局Materialsなどの情報うまく使えませんでした...) Ensemble, Stackingでの上がり幅はどれくらいか? • single modelに固執した方が良いのか、モデルの多様性を重視した方が良いのか • 自分は3つ以上いい感じのモデルができた時点で確認している • 最終的にはここの判断が割と重要になる気がする
どうする? 逆に深追いしないようにしていること • • モデルの学習パラメータやAugmentationの細かい調整 • ※もちろんここが重要になるコンペもあるし、個人の感想です • 自分の場合、optimizerやLR(scheduler含む), 基本的なaugmentationは割りと固定 モデルのcustom head (最終的に予測する部分) の工夫 • やったら効くかもだけど、他の優先度の方が高い
その他 (自分が)寝ている時間を活用する • 絶対になにか学習を回してから寝る ときには人読みも活用する • そのHOSTが過去開催したコンペでのshake具合 • コンペの開催目的などからどのようにPublic / Privateが分かれているか • 上位陣がどんなことをしてそうか etc...
まとめ • 1epochにかかる時間を短くする • 「やること」「やらないこと」を明確にする • 就寝時間を有効に使う • モデルのパラメータ調整に時間をかけすぎない • 人読みも活用する
ご静聴ありがとうございました!!