关于训练神经网路的诸多Trick

1. 避免过拟合

  • overfitting即过拟合,典型的表现为训练集损失远远小于验证集损失。而欠拟合则表现为训练集损失大于验证集损失。
    要清楚远远大于的概念,如果训练集损失只比验证集损失多一点点的话,同等数量级(例如0.8与0.9)这种情况下并不是过拟合的表现。我们一般遇到的过拟合应该是0.8(训练集损失)与2.0(验证集损失)这种差距很大或者明显不在一个量级的损失比。

  • 方法:使用Drop out
    Dropout类似于bagging ensemble减少variance。也就是投通过投票来减少可变性**。通常我们在全连接层部分使用dropout,在卷积层则不使用。**但要声明,dropout并不适合所有的情况,请不要无脑上Dropout。

2. 数据集是否损坏?

  • 数据集的好坏是算法泛化好坏的一个非常重要的前提条件,我们通常在构建深度学习的任务中,所得到的数据集一般不会是非常完美的(不论是自己搭建还是利用他人的数据,在数据集量过大的时候,数据集中难免会有图像损坏或者错误的个例)。
    损坏的数据一定会影响计算的准确性。这个时候就需要我们自己去手动编写代码将那些错误且无法参与训练的图像挑选出来。
  • 那么如何正确过滤这些图像呢?
    找到损坏图像的特点,例如无法读取,编写程序去除无法读取的图像。
    找到内容缺失的图像,这样的图像大小往往比普通图像小一些,通过过滤文件大小小于某一阈值去除。

3. 关于学习率(寻找合适的学习率)

  • 学习率是一个非常非常重要的超参数,这个参数呢,面对不同规模、不同batch-size、不同优化方式、不同数据集,其最合适的值都是不确定的,我们无法光凭经验来准确地确定lr的值,我们唯一可以做的,就是在训练中不断寻找最合适当前状态的学习率。
    比如下图利用fastai中的lr_find()函数寻找合适的学习率,根据下方的学习率-损失曲线得到此时合适的学习率为1e-2。
    关于训练神经网路的诸多Trick_第1张图片
学习率和batch_size的关系
  • 一般来说,越大的batch-size使用越大的学习率。
    原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,batch_size小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。
    可以看下图损失Loss与学习率Lr的关系:

关于训练神经网路的诸多Trick_第2张图片
关于训练神经网路的诸多Trick_第3张图片

  • 当然我们也可以从上图中看出,当batch_size变大后,得到好的测试结果所能允许的lr范围在变小,也就是说,当batch_size很小时,比较容易找打一个合适的lr达到不错的结果,当batch_size变大后,可能需要精细地找一个合适的lr才能达到较好的结果,这也给实际的large_batch分布式训练带来了困难。\

4.差分学习和迁移学习

  • 首先说下迁移学习,迁移学习是一种很常见的深度学习技巧,我们利用很多预训练的经典模型直接去训练我们自己的任务。虽然说领域不同,但是在学习权重的广度方面,两个任务之间还是有联系的。
    关于训练神经网路的诸多Trick_第4张图片

  • 由上图,我们拿来model A训练好的模型权重去训练我们自己的模型权重(Model B),其中,modelA可能是ImageNet的预训练权重,而ModelB则是我们自己想要用来识别猫和狗的预训练权重。

  • 那么差分学习率和迁移学习有什么关系呢?我们直接拿来其他任务的训练权重,在进行optimize的时候,如何选择适当的学习率是一个很重要的问题。
    一般地,我们设计的神经网络(如下图)一般分为三个部分,输入层,隐含层和输出层,随着层数的增加,神经网络学习到的特征越抽象。因此,下图中的卷积层和全连接层的学习率也应该设置的不一样,一般来说,卷积层设置的学习率应该更低一些,而全连接层的学习率可以适当提高。
    关于训练神经网路的诸多Trick_第5张图片

  • 这就是差分学习率的意思,在不同的层设置不同的学习率,可以提高神经网络的训练效果,具体的介绍可以查看下方的链接。
    关于训练神经网路的诸多Trick_第6张图片
    上面的示例图来自:https://towardsdatascience.com/transfer-learning-using-differential-learning-rates-638455797f00

5. 关于优化算法

  • 按理说不同的优化算法适合于不同的任务,不过我们大多数采用的优化算法还是是adamSGD+monmentum

6. 数据增强

  • 大部分我们使用的图像增强技术一般是随机旋转,水平翻转,高斯模糊和尺度变化还有什么拉伸等操作。这些图像变化对大部分的任务是比较适合的。
  • 但也需要提个醒,并不是所有的图像增强都可以提升模型的泛化能力。而且有些图像增强技术会对原始图像造成损失从而导致神经网络学习到错误的信息。

你可能感兴趣的:(深度学习)