第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(用于预训练的背景噪声)
模型
- 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
- 在上述设置下使用平衡采样
- Public:0.83106,Private:0.74406
- PCEN(采样率:32000,mel_bins:128,fmin:20,fmax:16000,window_size:2048,hop_size:512)
- Public:0.83005,Private:0.74134
- 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