文章目录
Fancier optimization(更有效的优化)
SGD随机梯度下降算法的问题:
- 若损失函数对于某个权重W很敏感,而对于其他的W不太敏感,SGD会出现“之”字形的路线跨越等高线达到最低点,在多维度的问题上这个问题更加普遍。
- 鞍点问题(鞍点saddle point:不是极大值也不是极小值的临界点),在鞍点上,梯度为0,这个点两边的方向,一个方向是梯度增加的方向,另一个方向是梯度减小的方向,对于多维问题,每一个维度都可能出现这种情况。
- 噪声问题,可能是由于批量化数据的时候产生的,在整个过程中的随机化处都可能产生,这使损失函数达到最小值的速度比较慢。
策略:
SGD+Momentum,在随机梯度下降中,加入动量项
Momentum借用了物理中的动量概念,即前几次的梯度也会参与运算。为了表示动量,引入了一个新的变量v,v是之前的梯度的累加,但是每回合都有一定的衰减,p为衰减指数,一般取0.9或者0.99
可以理解为:将一个小球从山顶滚下山,即使到了鞍点,没有梯度,但是仍然还有之前刚下山时积累的动量,所以小球仍然能够越过鞍点,朝梯度下降的方向继续前进。
Nesterov Momentum

Nesterov Momentum是对Momentum的一个改进,在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。这方法就是Nesterov Momentum。
核心思想:Momentum方法只注重 x t x_t xt项,而在Nesterov Momentum中, x t x_t xt可以看作是当前优化的一个“展望”位置,所以,是在 x t + p v t x_t + pv_t xt+pvt处求导。
AdaGrad
AdaGrad主要的特点是可以自动调整学习率,先对梯度进行一个平方和的累加,每次更新参数的时候需要用学习率除以累加和的开方,这里的1e-7是为了保证除以一个不会为0的数。
这样处理的好处是:若有两个坐标轴,一个方向上的梯度比较大,另一个的梯度比较小,累加小的梯度的平方,可以得到一个比较小的数,更新参数时除以一个小的数就可以得到一个比较大的数,相反,累加大的梯度的平方,得到一个比较大的数,更新参数时除以一个大的数就可以得到一个比较小的数。
存在的问题:随着训练时间的增长,这个平方和一直在增加,导致步长会变得越来越小。
RMSProp
这是对AdaGrad优化方法的变形,主要解决了上述步长越来越小的问题。这个方法仍然在计算梯度的平方和,但是不是简单的累加,而是给了一个衰减率decay_rate,当前的grad_squared先乘以衰减率,然后再加上当前梯度乘以(1-decay_rate)。这样随着时间的增长,步长不会一直变得越来越小。
Adam
这是上述两种思想的结合。first_moment是梯度的累加,second_moment是梯度平方和的累加,最后更新参数的时候用学习率乘以first_moment除以second_moment的开方。
这存在的问题是:刚开始我们把second_moment初始化为0,经过第一步之后,second_moment很接近于0,这样可能会导致步长很大,如果刚开始参数的初始化就不合理,再加上一个很大的步长,就会出现问题。
解决方法:增加bias correction来避免刚开始时步长很大的问题。
*二阶优化
之前的方法都是一阶优化的方法,二阶优化与一阶优化不一样的是不再需要学习率这个参数,但是增加了求二阶导数,根据二阶导数提供的信息,直接跳转到二阶导数最小的点,不再需要学习率。
提高模型在测试集上的准确率:Model Ensembles模型集成
先从不同的随机初始值上训练多个不同的模型,到了测试阶段,我们在这些模型上分别运行测试数据,然后平均这些测试结果。
Regularization(正则化)
正则化的作用是防止模型在训练集上过拟合。之前学习过L1,L2以及二者搭配使用的方法。
正则化还有其他的方法:Dropout
Dropout的思想是:网络在正向传播的过程中,在某一层上随机失活部分神经元,这样可以使模型的泛化能力更强,而不会过多的依赖某些局部特征。如下图所示
Dropout方法也可以看作使一种模型集成的学习方法,经过dropout失活部分神经元而得到多种模型,在训练时我们的输出是多个模型结果的加权平均。
所有正则化方法的共通点:在训练阶段增加随机性,也可以说是增加噪点,而在测试阶段,要努力消除之前增加的随机性。Batch Normalization、Data Augmentation、DropConnect(随机将权重矩阵W中的一些值置零)、Fractional Max Pooling、Stochastic Depth都是这样的思想。
Transfer Learning(迁移学习)
有时候过拟合问题是因为数据集太小,迁移学习的方法就是使用比较小的数据集训练神经网络。其思想是:首先在一个很大的数据集上训练卷积神经网络,然后再使用这个预训练的网络作为初始化网络后进行微调、或者作为特征提取器。
- 若数据集接近,数据量较小,可以在原有网络的基础上只训练最后一层线性分类器。
- 若数据集接近,数据量较大,可以精调网络。
- 若数据集差别很大,数据量较小,这时候需要重新初始化大部分的网络。
- 若数据集差别很大,数据量较大,可以精调网络的大多数层。
Model Zoo: