返回列表

4th Place Solution: Knowledge Distillation Is All You Need

553. BirdCLEF 2023 | birdclef-2023

开始: 2023-03-07 结束: 2023-05-24 环境监测 数据算法赛
第4名解决方案:知识蒸馏就是你所需要的一切
第4名解决方案 | 作者:atfujita | 创建时间:2023-05-25 | 获得55票

第4名解决方案:知识蒸馏就是你所需要的一切

首先,感谢Kaggle和康奈尔大学鸟类学实验室主办这场有趣的比赛。我要特别感谢通过xeno-canto提供数据的鸟类录音师们。

解决方案摘要

  • 知识蒸馏就是你所需要的一切
  • 添加无呼叫数据、xeno-canto数据和背景音频(Zenodo)是有效的

数据集

额外的数据集可以在这里找到。

  • Bird CLEF 2023
  • Bird CLEF 2021, 2022(用于预训练)
  • ff1010bird_nocall(5,755个文件用于学习无呼叫)
  • 未包含在训练数据集中的xeno-canto文件 CC-BY-NC-SA(896个文件)和 CC-BY-NC-ND(5,212个文件)
  • Zenodo数据集(背景噪声)
  • esc50(雨声、蛙声)
  • aicrowd2020_noise_30sec(用于预训练的背景噪声)

模型

  1. MelSpectrogram(采样率:32000,mel_bins:128,fmin:20,fmax:16000,window_size:2048,hop_size:512,top_db=80.0,NormalizeMelSpec)
    • Public:0.8312,Private:0.74424
  2. 在上述设置下使用平衡采样
    • Public:0.83106,Private:0.74406
  3. PCEN(采样率:32000,mel_bins:128,fmin:20,fmax:16000,window_size:2048,hop_size:512)
    • Public:0.83005,Private:0.74134
  4. MelSpectrogram(采样率:32000,mel_bins:64,fmin:50,fmax:14000,window_size:1024,hop_size:320)
    • Public:0.83014,Private:0.74201

训练

Kaggle Models(bird-vocalization-classifier)中提取预计算预测值的知识蒸馏是我的解决方案的标志性特征。这个模型无法在2小时内完成推理,但非常强大。在验证数据集上的cmAP_5达到了0.9479。因此我尝试从这个模型中提取有用信息。
Kaggle模型的预计算预测值生成代码在这里
根据这篇论文,他们认为高效的蒸馏需要1.一致的输入,2.激进的mixup,3.大量的epoch。由于难以将Kaggle模型集成到我的训练流程中,所以我采用了2和3。这看起来确实有效。
我只选择那些能同时提升CV和LB的方法。在这场比赛中,我无法完全信任其中任何一个指标。

  • 使用5折StratifiedKFold,只有1折未覆盖所有类别,因此使用其余4折进行训练
  • 评估指标是padded_cmap1,大多数情况下与padded_cmap5结果相同
  • 仅使用primary_label
  • 无呼叫用全0表示
  • 损失函数:0.1 * BCEWithLogitsLoss(primary_label)+ 0.9 * KLDivLoss(来自Kaggle模型)
    • Softmax温度=20时最佳(尝试过5, 10, 20, 30)
  • 训练时使用随机采样的20秒音频片段,短于20秒的音频会被重复
  • epoch = 400(大多数模型在100-300次时收敛)
  • 早停机制(预训练=10,训练=20)
  • 优化器:AdamW(学习率:预训练=5e-4,训练=2.5e-4,权重衰减:1e-6)
  • 余弦退火学习率调度器(t_initial=10,warmup_t=1,cycle_limit=40,cycle_decay=1.0,lr_min=1e-7,t_in_epochs=True)
  • mixup概率 = 1.0(比p=0.5更好)

我还遇到了一个问题:当使用过去比赛数据进行预训练时,训练时间显著延长。感谢大家提供解决方案建议。

数据增强

  • OneOf([Gain, GainTransition])
  • OneOf([AddGaussianNoise, AddGaussianSNR])
  • AddShortNoises esc50(雨声、蛙声)
  • Zenodo添加背景噪声。从每个数据集中提取鸟叫最少的60分钟,并分割成30秒片段(仅用于训练)
  • 从aicrowd2020_noise_30sec和ff1010bird_nocall添加背景噪声(仅用于预训练)
  • 低通滤波
  • 音高变换

硬件配置

  • 1 * RTX 3090
  • 预训练时间:每个模型30-40小时
  • 训练时间:每个模型9-12小时

推理

减少推理时间是我一直头疼的部分。感谢@leonshangguan分享他的有效方法,使我能够使用4个模型。

未生效的方法

  • focal loss
  • 拆分低样本类别
  • eca_nfnet_l0和eca_nfnet_l1以外的骨干网络
  • 其他优化器(adan、lion、ranger21、shampoo)。我曾尝试创建自定义的normalize-free模型但失败了
  • CMO(使用蒸馏时mixup效果更好)
  • CQT(速度慢且性能下降)
  • 将第一层步长改为(1, 1)。CV效果好但推理时间太长,单个模型无法在2小时内完成
  • 预训练Zenodo数据(尝试蒸馏之前的方法)
  • 从零开始蒸馏训练(不使用imagenet权重)。在可接受的时间内无法收敛
  • 将MelSpectrogram、PCEN和CQT集成到输入通道的所有组合中,没有协同效应

消融研究

名称 Public LB Private LB
BaseModel 0.80603 0.70782
BaseModel + 知识蒸馏 0.82073 0.72752
BaseModel + 知识蒸馏 + 添加xeno-canto 0.82905 0.74038
BaseModel + 知识蒸馏 + 添加xeno-canto + 预训练 0.8312 0.74424
BaseModel + 知识蒸馏 + 添加xeno-canto + 预训练 + 集成(4个模型) 0.84019 0.75688

致谢

我的解决方案建立在本次及过往比赛参与者、鸟类爱好者和机器学习社区工作的基础上。非常感谢 🙏
训练代码https://github.com/AtsunoriFujita/BirdCLEF-2023-Identify-bird-calls-in-soundscapes

同比赛其他方案