学习率的简单介绍
学习率的作用: 控制神经网络中参数更新的速度。
- 如果学习率过大,那么可能会导致参数在极优值的两侧来回移动。
例如 J ( x ) = x 2 J(x)=x^2 J(x)=x2 函数,如果学习率设置为 1,那么整个优化过程如下表:
无论进行多少轮迭代,参数将在 5 和 -5 之间摇摆,而不会收敛到一个极小值。
- 如果学习率过小,虽然能收敛,但是神经网络优化的速度会很慢。
学习率设置方法
指数衰减法
通过指数衰减的方法设置梯度下降算法中的学习率。
优点:
- 让模型在训练的前期快速接近较优解。
- 保证模型在训练后期不会有太大的波动,从而更加接近局部最优。
TensorFlow 中的实现:
tf.train.exponential_decay 函数
实现指数衰减的过程:
- 先使用较大的学习率来快速得到一个比较优的解;
- 随着迭代的继续逐步减小学习率,使得模型在训练后期更加稳定
decayed_learning_rate = \
learning_rate * decay_rate ^ (global_step / decay_steps)
# decayed_learning_rate 为每一轮优化时使用的学习率
# learning_rate 为事先设定的初始学习率
# decay_rate 为衰减系数
# decay_steps 为衰减速度
exponential_decay 函数实现了上述代码的功能。
exponential_decay 函数解析:
tf.train.exponential_decay 函数可以通过设置参数 staircase 选择不同的衰减方式。
- staircase 默认值为 False,学习率为一个连续函数;
- staircase 设置为 True时,global_step / decay_steps 会被转化为整数,使得学习率为一个阶梯函数(staircase function)。
decay_steps 代表了完整的使用一遍训练数据所需要的迭代轮数,即总训练样本数除以每一个 batch 中的训练样本数。
- 对于阶梯衰减学习率:每完整地过完一遍训练数据,学习率就减小一次。 使得训练数据集中的所有数据对模型训练有相等的作用。
- 对于连续衰减学习率:不同的训练数据有不同的学习率。因此当学习率减小时,对应的训练数据对模型训练结果的影响会变小。
# 在 TensorFlow 中使用tf.train.exponential_decay 函数
global_step = tf.Varaiable(0)
# 通过 exponential_decay 函数生成学习率
learning_rate = tf.train.exponential_decay(0.1, global_step, 100, 0.96, staircase=True)
# 使用指数衰减的学习率。在 minimize 函数中传入 global_steo 将自动更新
# global_step 参数,从而使得学习率也得到相应更新。
learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(...my loss...,global_step=global_step)
上述代码设定初始学习率为 0.1,因为指定了 staircase=True,所以每训练 100 轮后学习率乘以 0.96。
- 初始学习率、衰减系数和衰减速度都是根据经验设置的。
- 损失函数下降的速度和迭代结束之后总损失的大小没有必然联系。
- 不能通过前几轮损失函数下降的速度来比较不同神经网络的效果。