AI常见算法调参策略

《AI常见算法调优》教程视频

 

曾经有个形象的比喻,将以前的炼丹术士比作现在的机器学习工程师。

药材   -- > 数据

炼丹炉 -- > 网络结构

火     -- > 优化算法

所以咱们的常见算法该如何调优呢?不如先想想炼丹的道理。

 

网络结构

对于网络结构,若需换网络,尽量使用前人留下来的网络,不要随意修改网络结构,当然建议使用已经得到很好效果的网络结构,否则会在网络结构方面浪费很多时间。

 

调参-minibatch

调参主要有两个方面:minibatch大小的调整、学习率的调整,这两个不是分割的,而是相互辅助的。

对于minibatch:不要过大(易过拟合)或过小,建议使用minibatch大小为2的n次方、10的n次方(建议值1,64,128,256);当使用GPU时,一般都会遇到显存问题,若显存不过大,minibatch也不要过大。

对于图形或非序列型工作,建议使用 BN 技术(批量归一化),这是现在做深度学习的标配技术,尤其是在图像问题中。

数据规模不大时,建议加入正则化策略。

 

调参–学习率

一般刚开始学习率设置的大一点,比如0.1;接着逐渐变小学习率,比如是上一次的 ½ 或 1/5。初始学习率的选择:尝试使用不同的初始学习率,然后以5-10轮的训练为标准,比较最终的学习效果。一般学习率可以从0.1-10e-8或更大的范围去搜索 。

 

梯度下降策略

 

                            复杂损失函数形成梯度下降图

 

常见梯度下降策略:SGD、Momentum、Adam

 

  • SGD

SGD:stochastic gradient descent,即随机梯度下降。是梯度下降的batch版本。对于训练数据集,我们首先将其分成n个batch,每个batch包含m个样本。我们每次更新都利用一个batch的数据,而非整个训练集。

其中,η为学习率,为x在t时刻的梯度。

SGD的优点:Loss 往往更低,甚至可能达到最优 loss。

SGD的缺点:综合性能差:收敛慢,占用内存多、容易陷入鞍点。

  • Momentum

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。

momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:

其中,ρ 即momentum,表示要在多大程度上保留原来的更新方向,这个值在0-1之间,在训练开始时,由于梯度可能会很大,所以初始值一般选为0.5;当梯度不那么大时,改为0.9。η 是学习率,即当前batch的梯度多大程度上影响最终更新方向,跟普通的SGD含义相同。ρ 与 η 之和不一定为1。

  • Adam

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

Adam问题分析方面由于使用了窗口范围内的梯度值,可能导致学习率不稳定从而来回震荡而无法下降到最小值。

优点:综合新能好:在资源受限的情况下,占用内存少,收敛速度快()若想尽快出结果,建议使用Adam)

缺点:收敛性不稳定;泛化能力不如 SGD(在测试集上的 loss 表现不好)。

 

数据扩充

深度卷积网络自身拥有很强大的表达能力,不过正因如此,网络本身需要大量甚至海量的数据来驱动模型训练,否则便有极大可能陷入过拟合的窘境。而实际中,并非所有数据集或真实人物都能提供如ImageNet数据集一般的海量训练。因此,在实践中数据扩充(data augmentation)便成为深度模型训练的第一步。

常见的数据扩充方式:

  1.水平翻转(horizontally flipping):会使原数据集扩充一倍。

  2.随机抠取(random crops):一般用较大(约0.8-0.9倍原图大小)的正方形在原图随机位置抠取图像(image patch/crop),每张图像抠取的次数决定了数据集扩充的倍数。

  3.旋转(rotating):将原图旋转一定角度(-30°,30°),将经旋转变换后的图像作为扩充的训练样本加入原训练集。

  4.色彩抖动(color jittering):在RGB颜色空间对原有RGB色彩分布进行轻微的扰动,或在HSV颜色控件随机改变原有图像饱和度和明度或对色调进行微调。

在实践中,往往会将上述几种方式叠加使用,如果便可将图像数据扩充至原有数量的数倍甚至数十倍。

 

数据预处理

在使用卷积神经网络模型处理图像数据过程中,获取足够的训练样本后,在训练前,数据预处理操作是必不可少的一步。

计算训练集图像像素均值,之后在处理训练集,验证集和测试集图象是需要分别减去该均值。

减均值操作的原理是,我们默认自然图象是一类平稳的数据分布,此时从每个样本上减去数据的统计平均值(逐本计算)可以移除共同部分,凸显个体差异。

  • 对输入特征做归一化处理(normalization)预处理操作是常见步骤,同样在图像处理中
  • 可以将图像的每个像素信息看作一种特征。
  • 在实践中,对每个特征减去平均值来中心化数据的归一化处理方式称为“中心式归一化”(mean normalization)。

需要注意的是,实际操作中应首先划分好训练集,验证集和测试集,该均值仅针对划分后的训练集计算,不可再未划分的所有图上计算,如此会违背机器学习的基本原理,即“在模型训练过程中能且仅能从训练集中获取信息”。

 

迁移学习

现实中,很少有人从零开始训练一个完整的神经网络,因为有一个足够大的数据集是相对很少见的。事实上,常用的方法是提前训练一个很大的数据集(比如ImageNet,包含了120万张图片和1000个类别),并将这个训练好的神经网络作为一个起始点,或者是特征提取器。这既是迁移学习。

迁移学习主要分两种:Freezing all but last layer 和Finetuning all layers

如何使用Fine-tune

使用Fine-tune,决定冻结的网络层数主要取决两个因素:新旧数据集的规模大小、新旧数据集的相似度

  • 新的数据集很小,并且和原有数据集很相似
  • 冻结所有CNN层,只训练 FC 层
  • 新的数据集很大,并且和原有数据集很相似
  • 可不冻结,也可冻结(可节省大量训练时间)
  • 新的数据集很小,并且和原有数据集不相似
  • 比较危险。先冻结浅层,再不冻结
  • 新的数据集很大,并且和原有数据集不相似
  • 可以只冻结浅层(因为浅层网络抽取的更加普遍特征),甚至不冻结

该图说明了再较浅层抽取一些普遍信息,如一些边缘、色块等较浅的信息,在较深层抽取一些抽象的信息。

 

【AI实战营】第三期开启招募啦!!!

收藏 评论(3)
分享到:
共3条回复 最后由kikiwu0927 回复于2019-10-11 10:47
#2 AIOps智能运维 回复于2019-10-11

真棒

0
#3 kikiwu0927 回复于2019-10-11

0
#4 kikiwu0927 回复于2019-10-11
#3 kikiwu0927回复

不错

0