《TensorFlow实战Google深度学习框架(第2版)》4.3 节介绍了在训练神经网络时, 需要设置学习率( learning rate )控制参数更新的速度。 本节将进一步介绍如何设置学习率。学习率决定了参数每次更新的幅度。 如果幅度过大, 那么可能导致参数在极优值的两侧来回移动。 4.3 节介绍过优化 J(x) = x2 函数的样例。 如果 在优化中使用的学习率为 l ,那么整个优化过程将会如表 4-2 所示。
从以上样例可以看出,无论进行多少轮法代,参数将在 5 和,5 之间摇摆,而不会收敛 到一个极小值。 相反, 当学习率过小时,虽然能保证收敛性,但是这会大大降低优化速度。 我们会需要更多轮的法代才能达到一个比较理想的优化效果。 比如当学习率为 0.001 时, 选代 5 次之后, x 的值将为 4.950 要将 x 训练到 0.05 需要大约 2300 轮:而当学习率为 0.3时,只需要 5 轮就可以达到。综上所述,学习率既不能过大,也不能过小。 为了解决设定 学习率的问题, TensorFlow 提供了一种更加灵活的学习率设置方法一一指数衰减法。 tf. train.exponential_ decay 函数实现了指数衰减学习率。通过这个函数,可以先使用较大的学 习率来快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率,使得模型在训练后 期更加稳定。 exponential_decay 函数会指数级地减小学习率,它实现了以下代码的功能:
decayed_learning_rate = learning_rate * decay_rate^(global_step I decay_ steps)
其中 decayed_learning_ rate 为每一轮优化时使用的学习率, learning_rate 为事先设定的 初始学习率, decay_rate 为衰减系数, decay_steps 为衰减速度。 图 4-13 显示了随着法代轮 数的增加,学习率逐步降低的过程。
tf.train.exponential_decay 函数可以通过设置参数staircase 选择不同的衰减方式。 staircase 的默认值为 False,这时学习率随法代轮数变化的趋势如 图 4-13 中灰色曲线所示。当 staircase 的值被设置为 True 时, global_step I decay_ steps 会被 转化成整数。这使得学习率成为一个阶梯函数(staircase function)。图 4-13 中黑色曲线显 示了阶梯状的学习率。在这样的设置下, decay_steps 通常代表了完整的使用一遍训练数据 所需要的迭代轮数。这个迭代轮数也就是总训练样本数除以每一个 batch 中的训练样本数。 这种设置的常用场景是每完整地过完一遍训练数据,学习率就减小一次。这可以使得训练 数据集中的所有数据对模型训练有相等的作用。当使用连续的指数衰减学习率时,不同的 训练数据有不同的学习率,而当学习率减小时,对应的训练数据对模型训练结果的影响也就 小了。下面给出了一段代码来示范如何在 TensorFlow 中使用 tf.train.exponential_decay 函数。
global step= tf.Variable(O)
#通过 exponential_decay 函数生成学习率。
learning rate= tf.train.exponential decay( 0.1, global step, 100, 0 . 96, staircase=True)
# 使用指数农减的学习率。在 minimize 函数中传入 global step 将自动更新 global_step 参数,从而使得学习率也得到相应更新。
# 如果global_steps = 10000,学习率以基数0.96每100步进行衰减,则当迭代次数从1到10000次,迭代到最后一次时,10000/100=
#100. 则衰减到基数0.96的100次方。即此时的学习率为0.01*0.96^100 已经基本等于0了
learning_ step = tf . train . GradientDescentOptimizer (learning_rate) .minimize( ... my loss ... , global_step=global_step)