1.什么是学习率?
学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值,学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。
公式:new_weight = orign_weight — learning_rate * gradient
梯度下降代码:
repeat{
θj=θj−α
Δ
J
(
θ
)
Δ
θ
j
\frac{ΔJ(θ)}{Δθj}
ΔθjΔJ(θ)
}
当设置的学习率较小时,收敛过程如下:
当设置的学习率较大时,收敛过程如下:
由上图可以得出:当学习率设置较小时,其收敛过程较慢。而当学习率设置的过大时,梯度可能会在最小值附近来回震荡,甚至可能无法收敛。
如上图所示:不同学习速率对收敛的影响(图片来源:cs231n)
2.学习率的调整方法
2.1 离散下降
对于深度学习来说,每 t 轮学习,学习率减半。对于监督学习来说,初始设置一个较大的学习率,然后随着迭代次数的增加,减小学习率。学习率一般起始设置为0.1,接下来的每一次学习率都是前一次的十分之一,通过每次的手动调节,学习率大约设置到0.0001时为最佳
2.2 指数衰减学习率
训练全过程并不是使用一个固定值的学习速度,而是随着时间的推移让学习率动态变化,比如刚开始训练,离最优值还很远,那么可以使用较大的学习率下的快一点,当快接近最优值时为避免跨过最优值,下降速度要放缓,即应使用较小学习率训练,具体情况下因为我们也不知道训练时的最优值,所以具体的解决办法是:在每次迭代后,使用估计的模型的参数来查看损失函数的值,如果相对于上一次迭代,错误率减少了,就可以增大学习率如果相对于上一次迭代,错误率增大了,那么应该重新设置上一轮迭代的值,并且减少学习率到之前的50%。因此,这是一种学习率自适应调节的方法。
指数衰减学习率函数介绍:
tf.train.exponential_decay(
learning_rate,
global_step,
decay_steps,
decay_rate,
staircase=False,
name=None
)
其中:
1.learning_rate 为事先设定的初始学习率
2.global_step是一个变量,可以用Tensor或者Python number来表示,表示当前训练了多少步
3.decay_steps 用来控制衰减速度,经过多少伦学习率更新一次
4.decay_rate 为衰减系数
5.staircase 如果是True,表示每经过decay_steps训练之后进行梯度计算,表现为离散;如果是False,表示每个step之后都进行梯度计算,表现为连续(实际上还是离散)
该函数的计算公式如下所示:
decayed_learning_rate=learning rate
*decay_rate^(global_step/decay_step)
decayed_learning_rate为返回的衰减后的学习率,可以看出,global_step越大,learning_rate会乘以一个越来越小的系数,导致学习率递减。
画出梯度递减图像
我们分别用staircase = True 和 staircase = False来绘制相应的梯度递减,代码如下所示
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
learning_rate = 0.5
decay_rate = 0.9
# decay_steps控制衰减速度
# 如果decay_steps大一些,(global_step / decay_steps)就会增长缓慢一些
# 从而指数衰减学习率decayed_learning_rate就会衰减得慢一些
# 否则学习率很快就会衰减为趋近于0
global_steps = 1000
decay_steps = 100
global_step = tf.Variable(0)
lr1 = tf.train.exponential_decay(
learning_rate = learning_rate,
global_step = global_step,
decay_steps = decay_steps,
decay_rate = decay_rate,
staircase = True
)
lr2 = tf.train.exponential_decay(
learning_rate = learning_rate,
global_step = global_step,
decay_steps = decay_steps,
decay_rate = decay_rate,
staircase = False
)
LR1 = []
LR2 = []
with tf.Session() as sess:
for i in range(global_steps):
LR1.append(sess.run(lr1, feed_dict = {global_step: i}))
LR2.append(sess.run(lr2, feed_dict = {global_step: i}))
plt.figure(1)
plt.plot(range(global_steps), LR1, 'r-')
plt.plot(range(global_steps), LR2, 'b-')
plt.show()
其中lr1的staircase =True, 而 lr2的staircase =False,衰减如下所示,lr1是红色曲线,lr2是蓝色曲线,可以看到lr1中每经过decay_steps = 100步之后进行计算,而lr2在每个step都进行计算。