Upgrade to Pro — share decks privately, control downloads, hide ads and more …

鳥コンペ反省会資料

Hidehisa Arai
September 26, 2020

 鳥コンペ反省会資料

6位の解法です。

Hidehisa Arai

September 26, 2020
Tweet

More Decks by Hidehisa Arai

Other Decks in Technology

Transcript

  1. ⿃コンペ反省会
    6位解法
    チーム「Deepでポン」
    Hidehisa Arai
    1

    View Slide

  2. ⾃⼰紹介
    @kaggle_araisan
    https://www.kaggle.com/hidehisaarai1213
    かつてKaggle Masterのアライさんという名前
    でKaggleをやっていたアライグマ
    東⼤航空宇宙の修⼠3年⽣をしながらNABLAS
    という会社でパートタイムResearcherをして
    いる
    Audioデータは昨年のFreesound Audio
    Tagging 2019のコンペティションが初めてで
    その後業務でチョットダケ扱っていた
    2

    View Slide

  3. 結果
    Public 2nd (0.628) → Private 6th (0.668)
    3

    View Slide

  4. 解法概要
    4
    • 3ステージの学習によって段階的にラベルのノイズを除去
    • Sound Event Detection(SED)スタイルの学習および推論
    • 全データで学習 + EMAのモデル11個の重み付き和でアンサンブル

    View Slide

  5. コンペの主課題
    Train/Testの乖離 (Domain Shift) WeakかつNoisyなラベル
    1. ⾳データの出⾃
    • Train: Xeno Cantoに収録者がアップ
    ロード
    • Test: (おそらく)野外設置型マイクロ
    フォンで取っている
    2. アノテーション
    • Train: アップローダがつけた⾳クリッ
    プごとのラベル
    • Test: アノテータがつけたchunk(⼩区
    間)ごとのラベル
    Trainのラベルはクリップごとにしか存在しな
    い(weak label)上に、主ラベルは1つのみ
    secondary_labelsという副ラベルがある場合も
    あるが信頼性はまちまち(noisy label)
    secondary_labelsはアップローダがつけていな
    い場合もあり、複数種の⿃が鳴いていてもつい
    ていない場合もある(missing label)
    nocallクラスはTestにしか存在しない
    5

    View Slide

  6. モチベーション ‒ domain shift
    Domain Shiftを分解して考える
    : ⼊⼒、: ラベル、∗: 真のラベル(観測できない)
    "#$": "#$" → "#$"
    を推定するのが今回のタスク
    !"#$%
    ≠ (!&'!
    )
    TrainとTestでは⼊⼒の性質が
    異なる
    • 集⾳環境の違いに由来
    • Testは遠くの⽅で⿃が鳴い
    ていることが多くSNRが⼩
    さめ
    • ⿃の声以外の⾳イベントの
    頻度や種類・傾向なども異
    なる(と考えられる)
    !"#$%
    ∗ ≠ (!&'!
    ∗ )
    TrainとTestでは真のラベルの
    出現頻度が異なる
    • 集⾳場所の違いなどに由来
    • 集⾳地点の⿃の分布や鳴き
    ⽅の差が反映されて分布差
    が出る
    • Testはパッシブなため、
    nocallが多いことも分布差に
    つながっている
    !"#$%
    ≠ !&'!
    TrainとTestでは⼊出⼒の対応
    関係がそもそも違う
    • アノテーション⽅法の違い
    に由来
    • Trainはアノテータが投稿者
    なのでアノテーションには
    ⼤きなばらつきがある
    • Testはアノテーションがコ
    ントロールされている上、
    chunk levelでラベルがある
    6

    View Slide

  7. モチベーション ‒ domain shift
    TrainとTestでは⼊⼒の性質が
    異なる
    • 集⾳環境の違いに由来
    • Testは遠くの⽅で⿃が鳴い
    ていることが多くSNRが⼩
    さめ
    • ⿃の声以外の⾳イベントの
    頻度や種類・傾向なども異
    なる(と考えられる)
    TrainとTestでは真のラベルの
    出現頻度が異なる
    • 集⾳場所の違いなどに由来
    • 集⾳地点の⿃の分布や鳴き
    ⽅の差が反映されて分布差
    が出る
    • Testはパッシブなため、
    nocallが多いことも分布差に
    つながっている
    !"#$%
    ≠ !&'!
    TrainとTestでは⼊出⼒の対応
    関係がそもそも違う
    • アノテーション⽅法の違い
    に由来
    • Trainはアノテータが投稿者
    なのでアノテーションには
    ⼤きなばらつきがある
    • Testはアノテーションがコ
    ントロールされている上、
    chunk levelでラベルがある
    Data Augmentationであり得
    るバリエーションを網羅
    ラベル⽐率を変えたデータで学
    習させたモデルをアンサンブル
    ラベルの修正を⾏なって!"#$%
    を!&'!
    に近づける
    7
    !"#$%
    ≠ (!&'!
    ) !"#$%
    ∗ ≠ (!&'!
    ∗ )

    View Slide

  8. モチベーション ‒ label noise
    Label Noiseを分解して考える
    Weak labelはnoisy label
    ラベルがクリップごとにしか存
    在しないこと⾃体がnoisy
    Labelにある⿃の声がない場合がある
    主ラベルは概ね信じていいが、⾳
    クリップ上でまばらな場合が多い
    副ラベルはよりまばらでほとんど
    聞こえない場合もある
    Labelにない⿃の声がある場合もある
    2/3の学習データは副ラベルが
    ない
    副ラベルをつけるかどうかは投
    稿者に委ねられているため、
    missing labelもある
    8
    ラベル: aldfly, leafly, amered, canwar ラベル: warvir

    View Slide

  9. モチベーション ‒ label noise
    9
    Weak labelはnoisy label
    ラベルがクリップごとにしか存
    在しないこと⾃体がnoisy
    Labelにある⿃の声がない場合がある
    主ラベルは概ね信じていいが、⾳
    クリップ上でまばらな場合が多い
    副ラベルはよりまばらでほとんど
    聞こえない場合もある
    Labelにない⿃の声がある場合もある
    2/3の学習データは副ラベルが
    ない
    副ラベルをつけるかどうかは投
    稿者に委ねられているため、
    missing labelもある
    学習を⻑いchunkで⾏うことで
    chunkにラベル中の⿃の声が⼊
    るようにする
    蒸留により信頼度の低いラベル
    を排除
    学習させたモデルで副ラベルが
    ないデータからmissing label
    を発⾒

    View Slide

  10. Sound Event Detection (SED)
    10
    今回のタスクを解くには⼤きく⼆つの⽴場がある
    Audio Tagging Sound Event Detection
    ⼊⼒の⾳クリップ単位でラベルづけを⾏う ⼊⼒に時間情報込みでラベルづけを⾏う
    時間⽅向に集約
    (max, mean, attention,…)
    Feature Extractor
    特徴マップ
    ⼊⼒
    (waveform,melspec,…)
    特徴抽出
    CNNなど Feature Extractor
    特徴マップ
    ⼊⼒
    (waveform,melspec,…)
    特徴抽出
    CNNなど
    Pointwise
    Classifier
    Classifier
    Clip-level予測
    Frame-level予測
    時間⽅向に集約
    (max, mean, attention,…)
    出⼒はClip-level予測と
    Frame-level予測の2つ

    View Slide

  11. Stage 1
    11
    5fold PANNsでmissing labelを⾒つける
    • PANNsのCnn14DecisionLevelAtt
    • ⼊⼒は30sでクロップしたchunk←Weak label対策
    • Data Augmentation ←()のシフト対策
    • Gaussian Noise
    • Pitch Shift
    • Volume Up/Down
    • Lossはclipwise outputとframewise outputの両⽅
    にかける
    • 5fold学習し、Out-of-Foldの予測でTrain全体の予
    測を作る
    • 副ラベルがないデータに絞って確率が>0.9かつ主
    ラベルではないクラスを副ラベルに追加←missing
    label対策
    Attention map
    要素積をとった後時
    間⽅向に潰して集約
    Feature Extractor
    Segment-wise予測
    Clip-level予測
    (maxで集約)
    Clip-level予測
    (attentionで集約)
    ℒ = , (
    !"" + 0.5(, (
    #!$)
    Attention map
    → 0.578(public) / 0.619(private) (銀圏)

    View Slide

  12. Stage 2
    12
    5foldのSEDモデルでラベルの蒸留
    • PANNsのアーキテクチャを継承
    • CNNをResNeSt50に変更
    • Stage1で⾒つけた追加ラベル使⽤ ←missing label
    対策
    • ⼊⼒は20sでクロップしたchunk←Weak label対策
    • Data Augmentation ←()のシフト対策
    • Gaussian Noise
    • Pitch Shift
    • Volume Up/Down
    • 3channel input (melspec, pcen, melspec ** 1.5)
    • Lossはclipwise outputとframewise outputの両⽅
    にかける
    • 5fold学習し、Out-of-FoldのFrame-wise予測を得

    • 元のラベルをoofの予測で修正 ←noisy label対策
    264
    n_frame(≠len(y))
    クロップされたchunk
    Frame-wise予測
    元のClipごとのラベル
    Chunk内の予測(確率値)を
    frame⽅向にmaxで集約し
    閾値をかける
    np.logical_and
    修正されたラベル
    閾値を変えることで修正の度合いを変
    化させモデルに多様性を与えられる
    → 0.601(public) / 0.655(private) (⾦圏)

    View Slide

  13. Stage 3
    13
    ラベル修正の度合いを変化させた複数のモデルをAll
    data + EMAで学習しアンサンブルの種を⽤意
    • PANNsのアーキテクチャ + ResNeSt50/EfficientNet-B0
    • Train Dataset/Train ExtendedのAll data training
    • Stage1で⾒つけた追加ラベル使⽤ ←missing label対策
    • ⼊⼒は20sでクロップしたchunk←Weak label対策
    • Data Augmentation ←()のシフト対策
    • Gaussian Noise
    • Pitch Shift
    • Volume Up/Down
    • 3channel input (melspec, pcen, melspec ** 1.5)
    • Lossはclipwise outputとframewise outputの両⽅にかけ
    る(EfficientNetはFocalLossを使⽤)
    • 元のラベルをoofの予測で修正 ←noisy label対策
    • Oof予測にかける閾値を0.3-0.7で変えてラベル修正の度
    合いを変化させる ←(∗)のシフト対策
    • 合計11個のモデルの重み付け平均(重みはpublic LB参考
    に⼿動調整)
    ※ All data + EMA: Foldを切らずに全データを
    Trainに使い、重みのExponential Moving
    Averageをとったモデルを使うこと
    → 0.628(public) / 0.668(private) (⾦圏)
    librosa.power_to_db(librosa.feature.melspectrogram(y, ))
    librosa.pcen(librosa.feature.melspectrogram(y))
    librosa.power_to_db(librosa.feature.melspectrogram(y) ** 1.5)

    View Slide

  14. なぜ負けたのか?
    14
    優勝したいなら圧倒的な差をつけないと厳しいコンペだった
    ラスト2週間の戦略の失敗
    • 新しいことを試さず、アンサンブルの種を
    ずっと作っていた
    • 学習時間が2倍強になるためExtendedデー
    タセットをギリギリまで使わなかった
    • Stage2とStage3でprivate scoreはほとんど
    変わっていなかった・・・(丸1ヶ⽉無駄に)
    締め切り前⽇に気付くアライグマ

    View Slide

  15. その他諸々
    15
    その他反省点
    • Seedを固定する関数にバグがあり再
    現性が取れなくなった、しかも気が
    ついたのがStage3の学習をしていた
    とき
    • パイプラインが複雑化した結果、新
    しく加えた変更で過去の実験が再現
    できなくなった
    • 結局1実験1scriptが⼀番わかり
    やすい(CPMPも⾔ってる)
    • Augmentationをエイヤで決めたのがた
    またまワークしてしまったので使い
    続けていたが、pitch shiftが死ぬほ
    ど遅かったので削れば1.5倍くらい実
    験ができたはず・・・
    • 優勝者の解法でおそらくhard voting
    がかなり効いていたが、試しもせず
    可能性を排除してしまった
    効かなかったこと
    • Mixup
    • Logとる前に混ぜる(2nd,36th)
    • ラベルはUnionをとる(3rd ,36th)
    などが効いたらしい
    • Calltype classification
    • 実は⿃の鳴き声は複数パターンある
    • ⼤雑把に⾔ってもCallとSongはかな
    り異なるので別のクラスとして扱う
    • Calltypeというカラムがあったので
    ⼿作業で綺麗にして871クラス分類
    するも変わらず
    • Larger model
    • 5thのOlegによると局所受容野が⼤き
    すぎるとダメらしい
    時間があればやりたかったこと
    • モデルを増やす
    • ラベルの修正を繰り返す
    • Locationとelevation予測を分類の修
    正に使う
    • ⿃の共起情報をもとに予測を後処理で
    修正
    • 背景雑⾳を混ぜ込む

    View Slide

  16. Goldメダルはどうやれば取れるのか?
    • コンペの主題(メインの課題)を正確に把握すること
    • Bengaliのようにあまりはっきりと書かれていない場合もある
    • 最近はnoisy labelやdomain shiftが多かった(MLの研究の場でもホットな話題)
    • Discussion / Notebookには⼀通り⽬を通す
    • 公開情報で役に⽴つことは全てやるのが前提
    • 「みんながやっていること」は全部やった上でやっている⼈が少なさそうなことを試す
    • Notebookはノイズも多いのでDiscussion重視⽬(特にGMとか強そうなMasterが集まってるところ)
    • 難しいタスクは案外⽳場
    • とりあえず⼿をつけやすいタスクは乱戦模様になりがち
    • 0.000xを競うタスクは⼿数の勝負になることもある
    • 2sub/dayはソロの味⽅
    • Discussion/Notebookを投稿すると⾃分に有利になることもある
    • 議論が進む
    • コンペの流れを⽀配できる
    16

    View Slide