婴儿啼哭比赛经验总结

O

通过婴儿啼哭比赛总结经验

比赛地址

KR

1. 比赛前期分析

初赛是少样本比赛,下面我分析一下这个数据的特征,婴儿哭泣本身是一个大致以1.6s为周期的运动,自己在比赛的时候只关注有的数据时间很少,没想到单个样本中也可以按照时间拆分成多个帧,将多个帧的结果加权得出结果(其实我是想后期做的)。自己之前参加时第一步就错了,导致自己后面怎么尝试效果都不好。所以第一步非常关键。 我们要先分析数据是不是小样本, 小样本的话要怎么做扩充,不是小样本怎么做好数据预处理等。

1. 数据及其预处理

这个数据是少样本。但是它本身比较特殊,一个样本完全可以分成多个样本。因此我觉得能首先想到这一点成绩都不会差。
这次对数据做了以下处理:

  1. 对数据进行打乱

  2. 将一个样本按照经验值分成多个样本进行训练,相当于做了数据扩增,其实还可以用提取另外一种特征方式做数据扩增。(关键点,少样本数据增强做的好,训练就更稳定)

  3. 对于数据没有进行降噪等预处理,不知道效果如何,应该会有提升吧? (not do it)

  4. 数据增强的区别是数据扩增在开始阶段增加数据量,但是方法大致和数据增强差不多。怎么选择结合情况而定。这个比赛用了mixup, 然后有人说google的一个对语谱图做随机裁剪的增强方式也有用。

模型选择

对于这种分类比赛一般就是resnet,最近出来一个eff**好像效果更好。但是本文有人用的是CNN+LSTM。这也是对时序数据进行分类的经典方法。(经典方法:模型方面,可以先用2或3层LSTM试一下,通常效果都不错。)
整体细节如下:

  1. 如果数据很少,低于百万,直接拿imagenet预训练的模型微调即可。 但是本文没有使用imagenet的,因为模型不是预训练模型结构。 (not do it)

  2. 模型按照结构化数据用机器学习中的树算法,图像和音频分类用CNN(经典的是vgg和resnet), 文本和语音识别用RNN类, 模态变换用GAN,数据表示降维用自编码器。 一般模型方面,可以先用2或3层LSTM试一下,通常效果都不错。

  3. 不管什么模型,先在一个较小的训练集上train和test,让他过拟合证明模型的学习能力。如果不能过拟合,可能是学习率太大,或者代码写错了。先调小学习率试一下,如果不行可能就是有问题。 (not do it)

模型结构

  1. 激活函数选择:激活函数选了relu,其实tan效果可能会更好。(not do it)

  2. BN层具有加速训练速度,有效防止梯度消失与梯度爆炸,具有防止过拟合的效果,所以构建网络时最好要加上这个组件。(not do it)

  3. dropout只需要最后1层softmax 前用基本就可以了。

  4. weight decay可以试一下,一般用1e-4。 (not do it)

  5. 网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小。

超参数

超参数比赛中基本没调整,直接默认了。

  1. 优化器优先用adam,学习率设1e-3或1e-4,再试Radam(LiyuanLucasLiu/RAdam)。不推荐sgdm,因为很慢。( not do it )
  2. 学习率衰减也比较重要。随着网络训练的进行,学习率要逐渐降下来,如果你有tensorboard, 你有可能发现,在学习率下降的一瞬间,网络会有个巨大的性能提升,(用这个加上adam系的optimizer基本就不用怎么调学习率了) ( not do it )
  3. batchsize设置小一点通常会有一些提升,某些任务batchsize设成1有奇效。 ( not do it )

训练

这个比赛因为数据比较少,而且还要本地调试,我们将数据集一部分作为测试集,根据本地测试集的效果去调整网络结构,这样就节省了提交的次数。就不设置验证集了,担心过拟合直接在精度快到100%时候停止,通过测试集看是否过拟合。

如何判断训练集和测试集:

  1. 看train/eval的loss曲线,正常的情况应该是train loss呈log状一直下降最后趋于稳定,eval loss开始时一直下降到某一个epoch之后开始趋于稳定或开始上升,这时候可以用early stopping保存eval loss最低的那个模型。如果loss曲线非常不正常,很有可能是数据处理出了问题,比如label对应错了,回去检查代码。

调参

  1. 因为我们使用了训练集一些数据做了测试集,我们可以根据结果进行调参。 网络方面主要调整过拟合和一些基础的结构,重点还是要放到数据方面。

最后的提升

这个比赛只用了类似交叉验证的思想,求一个样本的多个子结果的平均结果。但是最后提升不要最开始去做,因为这个步骤很费时间,往往会造成捡芝麻丢西瓜。当你觉得精度提升已经很难的时候再用。

  1. 交叉验证法(Cross Validation, CV)
    将训练集划分成 K 份,将其中的 K-1 份作为训练集,剩余的 1 份作为验证集,循环 K 训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是 K 份平均得到。这种方式的优点是验证集精度比较可靠,接近测试集的结果。训练 K 次可以得到 K 个有多样性差异的模型; CV 验证的缺点是需要训练 K次,不适合数据量很大的情况。 ( not do it )

  2. 模型融合
    在训练得到模型之后,还可以考虑使用模型融合来继续提高精度,特别是在机器学习竞赛中。原始模型能够决定 90% 的精度,通过模型融合或许能够继续提高 10% 的精度。模型融合是基于模型多样性的基础之上的,模型越多样最终融合的结果就越稳定。
    比赛中经常会发生前几名将模型融合组成一个队,名次直接上升好几位的现象。 可以从偏差与方差的角度来进一步介绍,不同的模型会有不同的偏差和方差,多个模型的融合会减少偏差,最终得到的精度更高的结果。必须要指出的是,模型融合是要求单模型有多样性,也要求各个单模型精度都足够好,最终融合模型的结果才会有提高。模型融合主要用比较简单的Blending。 ( not do it )

补充

初赛是少样本的, 复赛数据量就比较大。对于数据量较大的比赛, 一些数据扩增工作可能会降低了,调参、特征选择、数据清洗、融合的工作会增加。其他部分路线可以直接参照本文的。

你可能感兴趣的:(best,way,about,life)