大多数机器学习(深度学习)任务就是最小化损失,在损失函数定义好的情况下,使用一种优化器进行求解最小损失。深度学习常见的优化方式是基于梯度下降的算法,本文将介绍随机梯度下降的具体实现方式,然后再说明Adam算法与随机梯度下降算法区别。
具体可参照官方文档:
https://www.tensorflow.org/api_docs/python/tf/train
TensorFlow中常见的优化器:
GradientDescentOptimizer
AdagradOptimizer
AdagradDAOptimizer
MomentumOptimizer
AdamOptimizer
RMSPropOptimizer
一、随机梯度下降SGD
给定一个可微函数,理论上可以用解析法找到它的最小值:函数的最小值是导数为 0 的点,因此你只需找到所有导数为0 的点,然后计算函数在其中哪个点具有最小值。
将这一方法应用于神经网络,就是用解析法求出最小损失函数对应的所有权重值。可以通过对方程gradient(f)(W)=0求解 W 来实现这一方法。
这是包含N 个变量的多项式方程,其中N 是网络中系数的个数。N=2 或N=3
时可以对这样的方程求解,但对于实际的神经网络是无法求解的,因为参数的个数不会少于几千个,而且经常有上千万个。
可以使用基于梯度的优化方式进行求解,基于当前在随机数据批量上的损失,一点一点地对参数进行调节。由于处理的是一个可微函数,你可以计算出它的梯度,从而有效地实现第四步。沿着梯度的反方向更新权重,损失每次都会变小一点。
(1) 抽取训练样本x 和对应目标y 组成的数据批量。
(2) 在x 上运行网络,得到预测值 y_pred。
(3) 计算网络在这批数据上的损失,用于衡量y_pred 和y 之间的距离。
(4) 计算损失相对于网络参数的梯度[一次反向传播(backward pass)]。
(5) 将参数沿着梯度的反方向移动一点,比如W -=step * gradient,从而使这批数据
上的损失减小一点。
这就叫作小批量随机梯度下降(mini-batch stochastic gradient descent,
又称为小批量SGD)。术语随机(stochastic)是指每批数据都是随机抽取的(stochastic 是random在科学上的同义词)。
此外,SGD 还有多种变体,其区别在于计算下一次权重更新时还要考虑上一次权重更新,而不是仅仅考虑当前梯度值,比如带动量的SGD、Adagrad、RMSProp等变体。这些变体被称为优化方法(optimization method)或优化器(optimizer)。
其中动量的概念尤其值得关注,它在许多变体中都有应用。
动量解决了SGD 的两个问题:收敛速度和局部极小点。
下图给出了损失作为网络参数的函数的曲线:
如上图所示,在某个参数值附近,有一个局部极小点(local minimum):在这个点附近,向左移动和向右移动都会导致损失值增大。如果使用小学习率的SGD 进行优化,那么优化过程可能会陷入局部极小点,导致无法找到全局最小点。
使用动量方法可以避免这样的问题,这一方法的灵感来源于物理学。
你可以将优化过程想象成一个小球从损失函数曲线上滚下来,如果小球的动量足够大,那么它不会卡在峡谷里,最终会到达全局最小点。动量方法的实现过程是每一步都移动小球,不仅要考虑当前的斜率值(当前的加速度),还要考虑当前的速度(来自于之前的加速度)。
这在实践中的是指,更新参数w?不仅要考虑当前的梯度值,还要考虑上一次的参数更新。
二、什么是Adam算法?
Adam 这个名字来源于自适应矩估计(Adaptive Moment Estimation),也是梯度下降算法的一种变形,但是每次迭代参数的学习率都有一定的范围,不会因为梯度很大而导致学习率(步长)也变得很大,参数的值相对比较稳定。
概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是 E(X),也就是样本平均值,X 的二阶矩就是 E(X^2),也就是样本平方的平均值。
Adam 算法利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。TensorFlow提供的tf.train.AdamOptimizer可控制学习速度,经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
各种优化器用的是不同的优化算法(如:Mmentum,SGD,Adam等),本质上都是梯度下降算法的拓展。
三、 Tensorflow 中算法参数介绍
初始化参数:
__init__(
learning_rate=0.001,
beta1=0.9,
beta2=0.999,
epsilon=1e-08,
use_locking=False,
name='Adam'
)
Args:
learning_rate: A Tensor or a floating point value. The learning rate.
学习速率、学习步长,值越大则表示权值调整动作越大;
beta1: A float value or a constant float tensor. The exponential decay rate for the 1st moment estimates.
接近 1 的常数,一阶矩估计的指数衰减因子;
beta2: A float value or a constant float tensor. The exponential decay rate for the 2nd moment estimates.
接近 1 的常数,二阶矩估计的指数衰减因子;
epsilon: A small constant for numerical stability. This epsilon is "epsilon hat" in the Kingma and Ba paper (in the formula just before Section 2.1), not the epsilon in Algorithm 1 of the paper.
大于但接近 0 的数,放在分母,避免除以 0 ;
use_locking: If True use locks for update operations.
要是True的话,就对于更新操作(update operations.)使用锁 ;
name: Optional name for the operations created when applying gradients. Defaults to "Adam".
名字,可选,默认是Adam