nbmeコンペ 1st solution

18.8K Views

May 23, 22

スライド概要

NBMEコンペ反省会発表資料です。https://connpass.com/event/246896/

profile-image

カレーちゃん

@currypurin

スライド一覧

Kaggleのチュートリアル第6版Kindleで2021年中は無料公開中。/2年ほどの専業Kagglerを経て、データサイエンティストになりました/ GrandMasterまで金メダルあと1つ。2022年中になりたい。/podcast,YouTubeやっています→プロフィールのnoteより

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

NBME 1st solution 2022年5月17日(火) 主催:NBMEコンペ反省会 1

2.

プロフィール kaggle プロフィール twitter 著書 2

3.

目次 3

4.

目次 ❖ 1. 参加時の意気込み ❖ 2. コンペ概要 ❖ 3. 解法の概要図 ❖ 4. コンペ取り組みの流れ (時系列で) ❖ 5. 使用環境 (実験管理やGPU) 4

5.

1. 参加時の意気込み 5

6.

1つ前に参加したFeedback prizeコンペ 1位のsolutionが強すぎる singleでcv:0.706, AWPが効いているらしい ❖ lightGBMでアンサンブルしてcv:0.74 ❖ ❖ https://www.kaggle.com/competitions/feedback-prize-2021/discussion/313177 自分のモデル(最終順位41位) singleでcv:0.685程度、アンサンブル(ブレンド)してcv:0.713程度 ❖ ⇨ NBMEコンペでリベンジしたい ・ AWPを試して、singleを強くしたい ・ アンサンブル頑張りたい ・そろそろGMになりたい(これがあるから頑張れた) 6 8 ❖

7.

2. コンペ概要 7

8.

コンペの概要 1 ・医師試験の患者メモ(カルテ, patient_note)と臨床概念の組が与えられ、その臨床概念と同じ表現を見つけたい。 例:臨床概念が「早起き(Early-wakening)」の場合 「早起き」、「午前4時から5時に起床」、「いつもより早く起床」とどのようにカルテに記述されても、 アノテーションする必要がある。 ・評価指標:文字毎のMicro F1 ・提出ファイルの例: カルテ「Dif culty falling asleep, waking up early」、臨床概念 「Early-wakening」 → 27:42 と提出する必要がある (実際のカルテはより長い) 学習データ(医師試験の患者メモ) 42,146カルテ 14,300行 ラベルなし 41,146カルテ テストデータ(後述) ・ラベルありデータは各症例毎に100カル テがある。 ・ラベルなしデータは、症例毎にカルテ数 が大きく異なる。 ・症例毎にそれぞれ14個程度の臨床概念が ある fi 全カルテ ラベルあり 1,000カルテ ・症例(case_num) は0から9までの10種類。 8

9.

コンペの概要 2 学習データ(医師試験の患者メモ) 全カルテ 42,146カルテ ラベルあり 1,000カルテ 14,300行 症例(case_num)毎のカルテ数 ラベルあり ラベルなし ・ラベルあり は,casenum毎に10 ・ラベルなしは、偏 りが大きい ラベルなし 41,146カルテ 臨床概念の例 異なる臨床概念が、同一の箇所を参照することもある ・pn_num=2285, case_num=0の例 ・そのため、CrossEntropyで予測するのは難しかったと思う。 ・自チームは全て、Binary Cross Entropy with Logits Los s 0 9

10.

コンペの概要 3 ❖ 以上のコンペの概要からこのコンペの特殊性は次の2点 ❖ ラベルなしのデータが非常に多い ❖ ラベルありのデータは、各症例に100件ずつと非常に少ない 結果的にコンペの特殊性に対応する次の取り組みが効果的だった ❖ ラベルなしのデータを用いる ❖ ❖ 事前学習(MLM)、pseudo labelin データ数を確保する ❖ cross validationを5foldから10foldに変更、また全データ学習を用いる 10 g ❖

11.

3. 解法の概要 11

13.

・solutionは、 ディスカッションに 書きました。 https://www.kaggle.com/ competitions/nbme-scoreclinical-patient-notes/ discussion/32309 5 13

14.

4. コンペ取り組みの流れ 今回は取り組みを時系列で説明したいと思います。 どのように取り組むべきか考えつつ見てもらえたら 14

15.

序盤 優れた公開Notebook(※)を参考に、ベースラインを作成 ❖ PytorchLightning、5分割GroupKfold、Deberta-baseやDeberta-v3-larg ❖ エポック数を変えたり、ネットワークを変えて色々試す ❖ エポック数は5epoch程度良さそう ❖ Deberta-v3-largeで、cv: 0.88程度 (token単位で計算したcv)、LB: 0.883 ※ https://www.kaggle.com/code/theoviel/roberta-strikes-back https://www.kaggle.com/code/yasufuminakama/nbme-deberta-base-baseline-train e ❖ 15

16.

AWPを試す ❖ AWP(Adversarial Weight Perturbation)(※) ❖ Feedback Prizeコンペで、1位のチームが使っていた ❖ どのパラメータを使えば良いのかわからないので、影響がありそうな パラメータを簡単に調整 ❖ deberta-v3-largeで5epoch、1つのfoldで比較 adv_lrの調整 adv_eps: 0.01を採用 adv_lr adv_eps cv 10.0 0.001 0.8814 1.0 0.01 0.8815 0.1 0.01 0.01 0.001 adv_lr adv_eps cv 1.0 1.0 0.8752 0.8798 1.0 0.1 0.8720 0.01 0.8809 1.0 0.01 0.8815 0.01 0.8760 1.0 0.001 0.8800 adv_lr: 1.0を採用 ※ https://arxiv.org/abs/2004.05884 https://www.slideshare.net/ssuserc45ddf/adversarial-trainingpptx adv_eps: 0.01を採用 16

17.

AWP(補足) ❖ AWP(Adversarial Weight Perturbation)(※) ❖ 使用したAWPのコード→ ❖ コンペ中盤にAWPのコードを改変して、いくつかのversionを試したが、 これがbestだった ❖ 「weightの重みに摂動を加えた場合のモデル精度の不安定性(weight loss landscape) の低さが重要であると主張」 ※ https://www.kaggle.com/competitions/nbme-score-clinical-patient-notes/discussion/323095 https://www.slideshare.net/ssuserc45ddf/adversarial-trainingpptx より抜粋 ※ https://arxiv.org/abs/2004.05884 https://www.slideshare.net/ssuserc45ddf/adversarial-trainingpptx 17

18.

使われていないデータで事前学習 ❖ Discussionで共有されていた 。 ❖ MLM(Masked Language Modeling)、 ❖ 入力文字列の一部をマスクし、そのマスクを予測するように学習 ❖ ラベルなしのデータを使用 ❖ ラベルありのデータは、MLMのvalidationとして使用 deberta-v3-large、5epoch、AWPありでの学習結果 学習率 epoch MLMの train_loss MLMの重みを 読み込んで学習した時のcv 2e-05 2e-05 2e-05 2e-05 2e-05 2e-05 2e-05 2e-06 1 2 3 5 10 2 2 2 1.700 1.341 1.215 1.684 1.059 1.530 1.530 2.978 0.8822 0.8824 0.8843 0.8839 0.8864 0.8835 0.8820 0.8815 0.8784 ・5epochの学習を採用、cvは0.004程度向上 その他、特記事項 MLMなし ←採用 MLMでembeddings層をfeeze MLMでembeddings層と12層目までをfeez (※)この論文では、TAPT(Task-adaptive pretraining)と呼ばれている e https://arxiv.org/abs/2004.10964 18

19.

途中経過(4月7日時点) 次の4モデル、5foldのアンサンブルでPublic LB 0.88 ❖ ❖ deberta-v3-larget pseudo labeling(hard ラベル ❖ deberta-v3-larg ❖ deberta-xlarg ❖ deberta-large 0.893 ここからpseudo labelingなどを続けてcvを上げるが PublicLBが改善せずが続く ❖ ❖ trainはcase_num毎のカルテ数が同じだが、テストは違う? ❖ それによってpseudo labelingの学習の仕方も違うかも 9 ) e e 19

20.

LB Probing(※) 症例(case_num)毎のカルテ数 ラベルあり ラベルなし テストのデータの分布が、 ラベルありに近いか、ラベルなしに近い かはとても気になる これによって、pseudo labelを使った学習 を変える必要があるかも LB Probingであたりをつける ❖ テストデータは、26271行~26300行であることが確定 ❖ ❖ カルテにして、1880程度 case_numの数も右の通りで、ラベルありデータに近い分布 ※ https://qiita.com/wakame1367/items/1f92212286beb2d65ac9 LB probing結果 case_num testの行数 0 2201~2400 1 2301~2600 2 3001~3200 3 2601~3000 4 1801~2000 5 3001~3500 6 2201~2400 7 0~1800 8 3201~3400 9 3001~3200 20

21.

Pseudo Labeling(※) ❖ ラベルのないデータに対する予測値を目的変数の値と し、学習データに加えて再度学習するテクニック。 ③両者を学習データとして学習 ①学習 ②擬似ラベルを付与 ❖ ハードラベルにするか、ソフトラベルにするか、 擬似ラベルデータのうちどれを使うかを決める必要がある。 例:Dif culty falling asleep, waking up early というカルテの場合の例、special tokenは省略 token化 [61656, 3927, 7980, 261, 12366, 322, 737] 予測 [0.1, 0.1, 0.1, 0.2 , 0.9, 0.9, 0.9] ハードラベル [0, 0, 0, 0 , 1, 1, 1] をtargetにする ソフトラベル [0.1, 0.1, 0.1, 0.2 , 0.9, 0.9, 0.9] をtargetにする fi ※ Kaggleで勝つデータ分析の技術 4.7.4 21

22.

Pseudo Labeling ❖ テーブルデータコンペの経験上、0.99以上のデータと0.01以下のデータなど、一定 の閾値でフィルタリングし、ソフトラベルで入れてやるのが、精度が高いと思って いる。またpseudo Labelingを複数回繰り返すことも精度が上がることが多い。 ❖ 自然言語のデータの場合は、経験がなかったため、さまざまパターンで実験を実施 22

23.

Pseudo Labeling 実験結果1 deberta-base、5分割GroupKFoldの1fold、学習率1e-5、batch_size: 8、 1epochをラベルありデータの全データ数(14,300行)、データは全データから 0 ランダムサンプリングとしての実験 擬似ラベルデー MLMの タの割合 train_loss 実験番号 epoch cv score 1 5 20% soft 0.8798 2 5 50% soft 0.8772 3 5 80% soft 0.8745 4 5 90% soft 0.8750 5 5 20% hard 0.8788 6 5 50% hard 0.8761 7 5 80% hard 0.8737 8 1 20% soft 0.8778 9 10 80% soft 0.8764 10 3 20% soft 0.8729 11 5 20% soft 0.8734 12 10 20% soft 0.8798 13 5 10% soft 0.8812 14 5 30% soft 0.8785 15 5 5% soft 0.8804 16 5 15% soft 0.8802 17 3 10% soft 0.8760 18 10 10% soft 0.8794 19 5 10% soft 0.8790 その他、特記事項 → softlabel、擬似ラベルの データの割合10%が良い? →精度の高い,deberta-v2など でcv、LBがあまり改善せず 学習率1e-6 →deberta-v2でも実験する 23

24.

Pseudo Labeling 実験結果2 deberta-v2-xlarge、10分割Strati edGroupKFoldの1fold、学習率1e-5、batch_size: 5、 1epochをラベルありデータの全データ数(14,300行)、データは全データから ランダムサンプリングとしての実験 擬似ラベルデー MLMの train_loss タの割合 実験番号 epoch cv score 1 5 20% soft 0.8966 4 5 50% soft 0.8999 6 5 70% soft 0.8986 3 5 80% soft 0.9010 7 5 90% soft 0.9017 2 5 10% hard 0.8984 5 5 80% hard 0.8975 その他、特記事項 → softlabel、擬似ラベルデータの割合90%に統一することで決定 ・このほかに、次のような色々な条件を加えて、試したがランダムにサンプリングするのが一番cvがよかった ・1つでも0.95以上の予測値がある擬似ラベルのみを使う。 ・学習データと同じcase_numになるようにサンプリング fi ・上記に加え、予測値の最大値が0.05以下の擬似ラベルを使う。 24

25.

cross validation deberta-v3-largeで、次の2つのサブミットがLB0.886で同じ ❖ ❖ 5分割GroupKFoldで5foldの平均 ❖ 全データ学習(seedアベレージなし) もしかして、学習データ数を増やすことが重要なのでは?? ❖ ❖ 学習データ数を増やすことが重要だとすれば、Strati edGroupKFoldでfold間で のcase_numの方よりもなくした方が良いかも ❖ 10foldStrati edGroupKFoldを試してみる cv model cv_score PublicLB PrivateLB cv_scoreの計算と subに使ったfold 5分割GroupKfold deberta-large 0.8917 0.88642 0.88715 5/5folds 全データ deberta-large - 0.88680 0.88834 - (1つ) 10分割Stratifeid GroupKfold deberta-v2-xlarge 0.8904 0.89229 0.89199 5/10folds 10分割Stratifeid GroupKfold deberta-v2-xlarge 0.89261 0.89153 5/10folds + all fi fi 25

26.

cross validation ❖ 10分割にすると、他modelのアンサンブルすることも考えると、サブミット時間 の関係からおそらく5foldぐらいしかサブミットに使えない。 ❖ アンサンブルのために、10fold全部回すのはリソース的につらい ❖ 込み入ったアンサンブルが無理そうなので、とりあえずアンサンブルも5fold分の out of foldで最適化することにする。 26

27.

マルチタスク学習1 ❖ pseudoラベルありで学習したモデルから、さらにpseudoラベルを作って学習す る方法ではcv、LBが向上しないことを確認。 ❖ pseudoラベルなしのモデルと、pseudoラベルありのモデルのpseudoラベルの平 均をとって、学習するとcvが向上することを確認。 ③両者を学習データとして学習 ①-a学習 (pseudoラベルなし) ①-b学習 (pseudoラベルあり) ②擬似ラベルを付与 平均をとる ❖ pseudoラベルなしとpseudoラベルありのモデルでは、モデルの性質が異なり多様性があるこ とから精度が向上し、効果があるのでは? ❖ マルチタスク学習で、更に多様性があるモデルを作り精度を向上させてみる 27

28.

マルチタスク学習2 ❖ ❖ マルチタスク学習:関連する複数の課題を同時に学習し、精度の向上を図る ❖ Kaggleでは、Ventilator Pressure Predictionコンペ、RANZCR CLiPコンペなどの上位solutionで使われている。 ❖ コンペのtarget以外のものをtargetにする場合、Auxiliary Target Learningと呼ぶことも多そう 具体例 ❖ 今回のデータの場合、targetの開始と終わりをそれぞれ1チャンネルとして、targetにした。 「Dif culty falling asleep, waking up early」というカルテで、waking up earlyがpositiveな場合 token化(special tokenは省略) [61656, 3927, 7980, 261, 12366, 322, 737] target作成 [[0., 0., 0., 0. , 1., 1., 1.] [0., 0., 0., 0. , 1., 0., 0.] [0., 0., 0., 0. , 0., 0., 1.]] ❖ これをtargetにして学習し、pseudoラベルを作って再度学習することでcvとPublicLBが向上 ❖ 更にpseudoラベルをブレンドし、学習し直すことでcv、PublicLBが向上 , , fi 28

29.

アンサンブル ❖ Optunaで、cvが最大になるように最適化 29

30.

できなかったこと、効かなかったこと ❖ できなかった ❖ ❖ 違うモデルから、アンサンブルにより1つのpseudoラベルと作ることは、時間 の関係上、できなかった。 効かなかったこと ❖ ラベルスムージングロス。 ❖ clip_grad_norm。入れるとcvが悪化した。 30

31.

5. 使用環境 実験管理や、GPUなど 31

32.

環境 ❖ ❖ コード:Pytorch Lightnin ❖ 自分で学習ループを書くと、収集が付かなくなるので利用 ❖ AWPを使用すると、automatic_optimization = Falseにして、自分でmanual_backwardと optimizer.stepを書かないといけなくなるが、それでも 利用してよかったと思う 実験管理: Weights & Biase ❖ ❖ ❖ とても便利すぎる con g管理 ❖ 実験番号.yamlという leにする。 ❖ 学習時は、python [学習コードのversion].py [実験番号].yaml —do_train で学習が回るようにしてから、早く回せるようになったと思う GP ❖ GCPでA100インスタンスを2つ使用、colab pro+も軽い実験やpseudo labeleの作成に利用 s g fi fi U 32