计算机视觉深度学习模型训练和部署经验总结

一、学习率(learning rate)选择

一般来说,越大的batch-size使用越大的学习率。原理很简单,越大的batch-size意味着我们学习的时候,收敛方向的confidence越大,我们前进的方向更加坚定,而小的batch-size则显得比较杂乱,毫无规律性,因为相比批次大的时候,批次小的情况下无法照顾到更多的情况,所以需要小的学习率来保证不至于出错。

在显存足够的条件下,最好采用较大的batch-size进行训练,找到合适的学习率后,可以加快收敛速度

另外,较大的batch-size可以避免batch normalization出现的一些小问题。

二、正则手段Dropout的使用

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是 「暂时」,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

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

Dropout一般适合于全连接层部分,而卷积层由于其参数并不是很多,所以不需要dropout,加上的话对模型的泛化能力并没有太大的影响。

我们一般在网络的最开始和结束的时候使用全连接层,而hidden layers则是网络中的卷积层。所以一般情况,在全连接层部分,采用较大概率的dropout而在卷积层采用低概率或者不采用dropout

三、差分学习率与迁移学习

随着网络层数的增加,神经网络学习到的特征越抽象。因此,卷积层和全连接层的学习率也应该设置的不一样,一般来说,卷积层设置的学习率应该更低一些,而全连接层的学习率可以适当提高

四、余弦退火(cosine annealing)和热重启的随机梯度下降

「余弦」 就是类似于余弦函数的曲线,「退火」 就是下降,「余弦退火」 就是学习率类似余弦函数慢慢下降。

「热重启」 就是在学习的过程中,「学习率」 慢慢下降然后突然再 「回弹」(重启)然后继续慢慢下降。

五、多尺度训练

多尺度训练是一种 「直接有效」 的方法,通过输入不同尺度的图像数据集,因为神经网络卷积池化的特殊性,这样可以让神经网络充分地学习不同分辨率下图像的特征,可以提高机器学习的性能。

也可以用来处理过拟合效应,在图像数据集不是特别充足的情况下,可以先训练小尺寸图像,然后增大尺寸并再次训练相同模型,这样的思想在Yolo-v2的论文中也提到过。

需要注意的是:多尺度训练并不是适合所有的深度学习应用,多尺度训练可以算是特殊的数据增强方法,在图像大小这一块做了调整。如果有可能最好利用可视化代码将多尺度后的图像近距离观察一下, 「看看多尺度会对图像的整体信息有没有影响」,如果对图像信息有影响的话,这样直接训练的话会误导算法导致得不到应有的结果。

六、Cross Validation (交叉验证)

李航的统计学方法中说到,交叉验证往往是对实际应用中 「数据不充足」 而采用的,基本目的就是重复使用数据。在平常中我们将所有的数据分为训练集和验证集就已经是简单的交叉验证了,可以称为1折交叉验证。「注意,交叉验证和测试集没关系,测试集是用来衡量我们的算法标准的,不参与到交叉验证中来。」

交叉验证只针对训练集和验证集。

我们经常使用的是5-折(5-fold)交叉验证,将训练集分成5份,随机挑一份做验证集其余为训练集,循环5次,这种比较常见计算量也不是很大。还有一种叫做leave-one-out cross validation留一交叉验证,这种交叉验证就是n-折交叉,n表示数据集的容量,这种方法只适合数据量比较小的情况,计算量非常大的情况很少用到这种方法。

七、优化算法(SGD、Monmentum、Adam)

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

Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam[14], AdamW 啥的)抢救。

Adam的相比SGD,收敛快,但泛化能力差,更优结果需要精调SGD。Adam是需要特别调lr,sgd要多花点时间调lr和initial weights。

八、训练过程trick总结

1、梯度归一化

要做梯度归一化, 即算出来的梯度除以minibatch size

2、梯度裁剪

clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w12+w22….), 如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15。

3、dropout

dropout对小数据防止过拟合有很好的效果,值一般设为0.5

4、dropout+sgd

小数据上dropout+sgd在大部分实验中,效果提升都非常明显。

5、sigmoid

除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数。

sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题

输入0均值,sigmoid函数的输出不是0均值的

6、Batch Normalization

Batch Normalization据说可以提升效果,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift.

7、learning rate

在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可

参考文献

https://zhuanlan.zhihu.com/p/376068083
https://zhuanlan.zhihu.com/p/137567177
https://zhuanlan.zhihu.com/p/63841572
https://zhuanlan.zhihu.com/p/79020733

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值