Slide 1

Slide 1 text

鳥蛙コンペ反省会 2021/2/27

Slide 2

Slide 2 text

自己紹介 2 ◎ 名前:yuki(Twitter, kaggle) ◎ kaggleは2019年のNFLコンペあたりから参戦 ◎ 音コンペは今回の鳥蛙コンペが初 ◎ Husband kaggler(not PAPA kaggler) 鳥蛙コンペはチームで参戦

Slide 3

Slide 3 text

コンペ概要 3 ◎ 音声ファイル内に含まれる24種の鳥と蛙の鳴き声を当てるMultiLabel分類 ◎ 音声ファイルはすべて60秒 ◎ Clip単位の分類 ◎ 鳴き声の周波数、時間は学習データに含まれている ◎ 評価指標はlabel-weighted label-ranking average precision(LWLRAP) ◎ 学習データは2種類提供されている ○ 鳴き声を自動で検出して ◉ 専門家レビューによって正しいと判断されたもの -> train_tp.csv(1132ファイル) ◉ 専門家レビューによって間違っていると判断されたもの -> train_fp.csv ✓自動検出できなかった鳴き声のラベルは欠損してしまうことがポイント

Slide 4

Slide 4 text

結果 4 ◎ Public32位/Private33位で銀メダル 去年の同じ時期に参加したDSB2019では 26位から837位のshake downを経験。 その時の記憶が蘇ってきて発表の瞬間は いつも以上にドキドキしたぜ。

Slide 5

Slide 5 text

提出モデル 5 ◎ 提出モデルはSEDモデル3つ、not SEDモデル4つから成る7モデルのアンサンブル (PublicLB:0.927/PrivateLB:0.934) # model CV PublicLB PrivateLB 1 SED EfficientNet-B3 0.845 0.919 0.927 2 SED EfficientNet-B3 0.838 0.916 0.925 3 SED EfficientNet-B3 0.835 0.912 0.922 4 not SED ResNeSt50 0.863 0.893 0.908 5 not SED ResNeSt50 0.851 0.891 0.897 6 not SED Densnet121 0.806 0.886 0.894 7 not SED Densnet121 0.823 0.885 0.892 主にこれらついてお話します アンサンブルは加重平均ですが、OOF予測値がほとんど参考にならなかったので、 精度の低いモデルほどweightが低くなるように調整

Slide 6

Slide 6 text

Model 6 ◎ PANNsアーキテクチャーのSEDモデル (shinmuraさんのディスカッションがベース) • Feature Extractor : EfficientNet-B3 • Loss Function : BCELoss • Optimizer : SGD • Scheduler : CosineAnnealingLR • LR : 0.15 • CV : 4Fold multilabel-stratifiedkfold • Data Augmentation : denoise • train_fp、soudtype_idは使ってない waveform input Log-melspectrogram croped melspectrogram clipwise output framewise output output Data Augmentation Convert melspectrogram crop PANNs base SED (EfficientNet-B3) aggregate ✓ 学習率は0.15より下げると精度が落ちる(epoch数増やしてもダメ) ➢ 学習率は高いほうが良いと言っているnotebook有り ✓ Data Augmentationはいろいろ試したがほとんど効かなかった。Todaさんが 紹介されていたDenoiseをData Augmentationとして使うと効いた (0.912->0.919) ✓ ValidationデータにOverfitしないように5Fold CVではなく4Fold CVにした (どのくらい効果があったかは不明)

Slide 7

Slide 7 text

学習データ/検証・テストデータ 7 学習データ 検証・テストデータ Target ・ ・ ・ ・ ・ ・ 60/9秒のwindowを半分ずつスライドさせながらcrop。1Clipあたり17枚の画像 が作成される。1Clip予測するのに17画像予測する必要がある。 (testと同じように評価するためにvalidationも17画像予測していたが、 missing labelのことを考えると、targetが存在する画像のみで評価したほうがよ かったかも。) train_tpのラベルが含まれるように60/9秒でrandom crop。周波数方向は切り 取らない。 60/2秒~60/20秒を実験したが60/9秒、60/10秒あたりが精度良かった。 17images 60 9 Sec. 256*1001pixel missing labelsへの対処をしていないのにもかかわらずそこそこ(?)の精度が出せたのは 60/9秒という秒数が鳴き声の情報を損なわず、ラベルが欠損している鳴き声が混入しづらい いい感じの秒数となったことが要因?( 60/6秒でcropした人が多い印象) 38位の人も60/6秒より、60/12秒のほうが良かったと言ってる。

Slide 8

Slide 8 text

Adversarial Validation 8 ◎ Testデータのほうがノイズが少ないというディスカッションを見て、TrainとTestの分布 がどのくらい異なるのか気になりAdversarial Validationを実施 ◎ 結果はAUC0.81と高め。ただ、データを見てみるとノイズでTrainとTest判断してい るわけではない印象。収音環境や収音機材が違うのかと推測 ✓ Train寄りのTrainを少し除いたデータで学習すること僅かに精度向上 ➢ 0.912 -> 0.916

Slide 9

Slide 9 text

Didn't work 9 •Araiさんのnotebookで紹介されているAugmentationの他、mixup、 random brightness 、SpecAugment など、いろいろ試したがことごとく効かなかった(not SEDモデルではいくつか効くものもあった) Data Augmentation •そもそもmissing labelsへの対処をしておらず、Pseudo label自体の信頼性が低かったことが原因? Pseudo labeling(test/train、soft label/hard label) •Class3の精度が目立って低くかったため、Class3を2値分類で当てる専用モデル作成を試みたがうまくいかず Class3専用モデル •予測値に閾値を設けて閾値以上の値の和を求める(多く鳴いているもをより評価するイメージ) •各Classに係数をかけるような後処理。OOFが最大化するような係数を求めていたが、そもそもOOFが信頼できるもの ではなく、よい係数を求めることができなかった Post Process

Slide 10

Slide 10 text

反省 10 ◎ なんといってもmissing labelsへの対処を何もしていないこと。チーム内でもmissing labelに関 する議論はほとんどしていない。 ○ データがどう作られたかよく考えなければいけなかった(よく言われているやつ) ◎ 見落としているディスカッションがあった ○ 主催者の論文が存在することをソリューションを読んで知った ○ (英語が苦手なのでディスカッション読むの結構しんどい) コンペ序盤から5人チームで参加したことはよかった! いつもは数か月も続かないモチベーションもなんとか保つことができた。 わからないことは教えてくれるし、間違いも指摘してくれるし最高。