基于TensorFlow深度学习理论与实战:Tensorflow中优化器Optimizer
目录
博主看了一些Optimizer总结的文章,感觉有些博客全部是公式,不好理解。
Optimizer:
由随机梯度下降(SGD)发展的optimizer: GradientDescentOptimizer、MomentumOptimizer(Nesterov accelerated gradient)、AdagradOptimizer、AdagradDAOptimizer、AdamOptimizer、RMSPropOptimizer
GradientDescentOptimizer
就是使用了随机梯度下降(SGD)
tf.train.GradientDescentOptimizer()使用随机梯度下降算法,使参数沿着 梯度的反方向,即总损失减小的方向移动,实现更新参数,比较简单。
MomentumOptimizer
动量解决了SGD 的两个问题:收敛速度和局部极小点。
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球的向下的速度。
下图给出了损失作为网络参数的函数的曲线:
如上图所示,在某个参数值附近,有一个局部极小点(local minimum):在这个点附近,向左移动和向右移动都会导致损失值增大。如果使用小学习率的SGD 进行优化,那么优化过程可能会陷入局部极小点,导致无法找到全局最小点。
你可以将优化过程想象成一个小球从损失函数曲线上滚下来,如果小球的动量足够大,那么它不会卡在峡谷里,最终会到达全局最小点。动量方法的实现过程是每一步都移动小球,不仅要考虑当前的斜率值(当前的加速度),还要考虑当前的速度(来自于之前的加速度)。
这在实践中的是指,更新参数w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新。
Nesterov accelerated gradient
NAG在TF中跟 Momentum合并在同一个函数 tf. train. Momentumoptimizer中,可以通过参数配置启用。
在Momentum中小球会盲目地眼从下坡的梯度,容易发生错误,所以我们需要一个更聪明的球,这个小球提前知道它要去哪里,它还要知道走刭坡底的时候速度慢下来而不是又个坡。从而我们可以提前计算下一个位置的梯度,然后使用到当前位置
AdagradOptimizer
AdagradOptimizer是基于SGD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数。它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照片)。
Adagrad主要的优势在于不需要人为的调节学习率,它可以自动调节。它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0。
tf. train. AdagradOptimizer()可以不要参数。
RMSPropOptimizer
RMS(Root Mean Square)是均方根的缩写。
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来
值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来越低的问题,而且也能自己调节学习率,并且可以有一个比较好的效果。
AdamOptimizer
Adam 这个名字来源于自适应矩估计(Adaptive Moment Estimation),也是梯度下降算法的一种变形,但是每次迭代参数的学习率都有一定的范围,不会因为梯度很大而导致学习率(步长)也变得很大,参数的值相对比较稳定。
概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是 E(X),也就是样本平均值,X 的二阶矩就是 E(X^2),也就是样本平方的平均值。
Adam 算法利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。TensorFlow提供的tf.train.AdamOptimizer可控制学习速度,经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些处理之后再使用类似Adadelta和RMSprop的方式更新参数。