cs231n 更好的优化

    这边开始讲到在训练网络的过程中,更好的优化,目前人们使用的正则化项减少过拟合,迁移学习,当你的测试数据小于预期时,怎么把问题转换成另一种问题。等问题。

    在使用随机梯度下降法的时候,会遇到鞍点,局部最小值的问题。在训练大网络中,鞍点的问题更加的普遍。

而在一般实际训练的过程当中,我们使用的是小批量梯度下降法,所以在实际中训练的不是实际的梯度,这就相当于在梯度下降过程中加了干扰。 但这样,梯度下降会很慢。

所以需要进行一些优化,有一个简单但很好的方法就是加入一个动量,加入一个不随时间变化的速度,并将梯度值加到这个速度上没然后再速度方向前进。这就解决了以上的问题,相当于小球下山。初速度基本都是零。

    但这样会有的问题是之后的计算中,不是和梯度以及loss函数一起下降的.所以使用了 Nesterov Monmentum 换元法化简,在梯度中加上了之前的速度变化量。

一些很差的局部极小值很多时候是因为样本太少,过拟合了。

梯度下降:

 SGD ( Stochastic gradient descent)

最简单原始的迭代算法,就是减去learning_rate*梯度值。 
Stochastic的名字好像是对比于全训练集训练方法的,每次只使用训练集中的一小部分(batch),具体请参照Optimization: Stochastic Gradient Descent。 
这个算法具有的问题之一就是会根据梯度值的大小决定步长,所以如果各个维度的步长相差很大,就会不断震荡,而且收敛缓慢,如图所示。 

Momentum动量法

把更新迭代的问题考虑成为物理问题,模拟为使得小球收敛到谷底的问题。那么梯度值对应于小球在某一点所受到的力(加速度),参数每次更新的量对应于小球当时的速度,参数值对应于小球当时的高度(位置,能量)。注意这里力是不会直接影响高度的,而是通过更改速度,间接影响高度。上诉模拟方式,也是Momentum的由来。 
其中v对应于速度,dx对应于加速度,x则对应于高度。同时为了使得小球可以收敛于谷底,加入了能量损失机制,即每次在mu*v的基础上改变。mu的值通常是0.5,0.9,0.99。v被初始化为0
回答SGD中的问题,Momentum通过对于速度的修改间接影响高度,所以具有延迟作用以及累加作用,有效的解决了震荡的问题。同时因为会累加小梯度的维度上的速度值,所以可以加快收敛速度。

AdaGrad

上诉算法中的learning rate不变,从而每次更新的步长变化不大。但实际应用中,我们在开始的时候需要高学习率收敛到最优值附近,然后使用低学习率收敛到最优值(因为如果步长过大,参数会在最优点附近震荡而不收敛(此处的震荡无法被Momentum解决))这里就需要引入自适应的算法,可以在迭代过程中合理的减小学习率,使得收敛效果更好。 
AdaGrad是第一个自适应算法,通过每次除以根号下之前所有梯度值的平方和,从而使得步长单调递减。同时因为cache的变化与每个维度上的值有关,所以此方法可以解决各个维度梯度值相差较大的问题。 
 注意到在AdaGrad算法中,学习率是单调递减的,有的时候这种调整步长的方式过于贪婪了,即可能使得学习率过早的降低,最后停留在最优点较远的位置。RMSprop就是对于AdaGrad的改进版本。

Adam 很多事时候符合要 学习率变化,不断减少

猜你喜欢

转载自blog.csdn.net/fsdfasfawre/article/details/79735030