Tensorflow笔记——详解深度学习learning_rate以及如何调整学习率

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都进行计算。
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值