一、问题简介
学习率过大会导致在最优的点附近颠簸,无法收敛到最优,二学习率太小又会造成收敛速度过慢的问题。
二、直观感受
我们利用tensorflow2.0来直观感受这一问题:
代码:
import tensorflow as tf
w = tf.Variable(tf.constant(5, dtype=tf.float32))
lr = 0.2
epoch = 40
for epoch in range(epoch): # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环40次迭代。
with tf.GradientTape() as tape: # with结构到grads框起了梯度的计算过程。
loss = tf.square(w + 1)
grads = tape.gradient(loss, w) # .gradient函数告知谁对谁求导
w.assign_sub(lr * grads) # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))
结果:
(学习率0.2时):很快收敛
学习率为0.009时:收敛速度很慢
学习率为0.99时:在最优结果左右反复变化
扫描二维码关注公众号,回复:
14824559 查看本文章
因此,学习率是影响爱戴结果的重要因素,如何解决这一问题,有很多种方法比如adam,adagrad等等,参考另一篇博客: