从前面几节的实例中可以看出,优化器(optimizer)似乎是构建监督型 tensorflow 神经网络必不可少的,例如第三节中的AdamOptimizer,以及第六节中的 GradientDescentOptimizer,它们的作用是什么呢?tensorflow 有哪些优化器呢?本节将介绍这些。
优化器(optimizer)的作用
通过前面几节的介绍,发现这类人工神经网络是由很多神经元组成的,每个神经元都有自己的权重w,表示在某项任务中,该神经元的重要程度。假设输入数据为x,那么预测值即为:
prediction = wx + b # b 是偏置量
训练的过程,其实就是计算合适的w和b的过程。那么,什么样的w和b是“合适”的呢?答案就是预测值与真实值相差不大。例如定义损失函数:
loss = sum(|(y_ - prediction)|)
即,真实值减去预测值,取绝对值后求和。训练的过程,可以粗略的理解成:调节 w 和 b, 使 loss 尽可能小。对w和b参数的调节,就是优化器(optimizer)需要做的,这就是优化器的作用。
上面这种 loss 的定义只是一种比较简单的例子,当然有其他定义方式。例如的第六节中的cross_entropy(交叉熵),它是用来描述两种分布的接近程度的,越接近,交叉熵越小。
tensorflow 有哪些优化器(optimizer)
Tensorflow 官方提供了 7 种优化器:
- GradientDescentOptimizer
- AdagradOptimizer
- AdagradDAOptimizer
- MomentumOptimizer
- AdamOptimizer
- FtrlOptimizer
- RMSPropOptimize
优化器的目的都是为了训练网络的,这 7 种优化器在对资源的需求上,和训练速度上有些差异,因此需要根据实际情况选用。下图是几种优化器的训练速度对比,能够看出差异:在这次应用中, SGD 虽然路径最短,但是速度却很慢,其他几种高阶优化器,速度快很多。
下面介绍几个常用的优化器的构造函数,构造函数告诉我们如何构建这些优化器。
1. GradientDescentOptimizer
这个就是最基础的基于梯度下降法的优化器了。GradientDescentOptimizer 需要用到全部的样本,速度比较慢,但是迭代到一定次数最终能够找到最优解,GDO 有个别名 SGD?。建立时,构造函数为:
tf.train.GradientDescentOptimizer.__init__(learning_rate,
use_locking=False, name='GrandientDescent')
# learning_rate:学习率
# use_locking:用锁
# name:名字
2. MomentumOptimizer
MomentumOptimizer 利用了上一次的调整量,因为它考虑了过去的值的影响,有点像物理学中的小球运动会受到之前动量的影响,所以被称为Momentum(动量)优化器。如果上一次梯度显示是正方向,这次也是正方向,那么这次的调整量将加上一定的幅度。如果上次和这次的梯度方向相反,则削减变动幅度,使之更加平稳和快速的往最小点移动。MomentumOptimizer 的构造函数如下:
tf.train.MomentumOptimizer.__init__(learning_rate, momentum,
use_locking=False, name='Momentum', use_nesterov=False)
# momentum: 动量,可以是一个张量,也可以是一个浮点数值
3. AdamOptimizer
AdamOptimizer 结合了 MomentumOptimizer 和 RMSPropOptimize,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。它对学习率有个约束,使得每一次学习率都有个确定范围,因此参数比较平稳。构造函数如下:
tf.train.AdamOptimizer.__init__(learning_rate=0.001, beta1=0.9,
beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
# beta1, beta2:对第一和第二动量估计的指数衰减率,可以是张量,也可是是浮点数值。
# epsilon:非常小的常量。
最后
其实更直观的可以参考下面这两张动图,出处找不到了,如果侵权,请联系我删除。