《人工智能实践:Tensorflow笔记》听课笔记15_4.2学习率

附:课程链接

第四讲.神经网络优化
4.2学习率

由于个人使用Win7系统,并未完全按照课程所讲,以下记录的也基本是我的结合课程做的Windows系统+PyCharm操作。且本人有python基础,故一些操作可能简略。并未完全按照网课。

记住编写代码时,除注释内容外,字符均使用英文格式。

二、神经网络的优化(从四个方面理解:损失函数loss、学习率learning_rate、滑动平均ema、正则化regularization)
2.学习率learning_rate
学习率决定了每次参数更新的幅度。在训练过程中,参数的更新遵照如下公式:
在这里插入图片描述
即,参数的更新向着损失函数梯度下降的方向。
举例:学习率如何影响参数更新:
在这里插入图片描述
由图可知,损失函数loss的最小值会在(-1,0)得到,此时损失函数的导数为0,故得到最终参数w = -1。优化参数的目的就是找到这样一个w = -1的点使得loss = 0。
代码验证:

"""
	设损失函数loss = (w+1)^2,令w初值是常数5.
	反向传播就是求最优w,即求最小loss对应的w值
"""
import tensorflow as tf
#定义待优化参数w初值为5
w = tf.Variable(tf.constant(5,dtype = tf.float32))
#定义损失函数loss
loss = tf.square(w + 1)
#定义反向传播方法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)  #学习率为0.2
#生成会话,训练40轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    for i in range(40):
        sess.run(train_step)
        w_val = sess.run(w)
        loss_val = sess.run(loss)
        print("After %s steps:w is %f, loss is %f."%(i,w_val,loss_val))

验证结果:
在这里插入图片描述在这里插入图片描述
由结果可知,随着损失函数值的减小,w无限趋近于 -1,模型计算推测出最优参数w = -1。

那么,学习率设置成何值合适呢?
上述代码,学习率由0.2改为1,即:

train_step = tf.train.GradientDescentOptimizer(1).minimize(loss)  #学习率为1

验证结果:
在这里插入图片描述在这里插入图片描述

我们发现loss并未下降,w在5和-7之间跳动,不收敛。
再令学习率为0.0001,即:

train_step = tf.train.GradientDescentOptimizer(0.0001).minimize(loss)  #学习率为0.0001

验证结果:
在这里插入图片描述在这里插入图片描述
我们发现,随着loss的下降,w也在缓慢的下降。

由此可见,学习率大了振荡不收敛,学习率小了收敛速度慢
于是,提出了指数衰减学习率
指数衰减学习率根据运行BATCH_SIZE的轮数,动态更新学习率:
在这里插入图片描述
tensorflow代码如下:

global_step = tf.Variable(0,trainable=False)
#定义global_step作为计数器,记录当前一共运行了多少轮。
#由于这个变量只用于计数,并非训练的参数,故为不可训练型参数(trainable = False)
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,#学习率的基数,即最开始时设置的学习率
                                            global_step,#当前运行到第几轮的参数
                                            LEARNING_RATE_STEP,#学习率多少轮更新一次,通常设置为(输入数据集最样本数)/(每次喂入多少个数据)
                                            LEARNING_RATE_DECAY,#学习率衰减率
                                            staircase=True)
                                            #stricase为True时,global/learning rate step为整数,学习率阶梯型衰减
                                            #stricase为False时,学习率会是一条平滑下降的曲线

代码举例:

"""
    设损失函数loss = (w+1)^2,令w初值是常数5,反向传播就是求最优w,即求最小loss对应的w值。
    使用指数衰减的学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得更有效收敛度
"""
import tensorflow as tf

LEARNING_RATE_BASE = 0.1    #最初学习率
LEARNING_RATE_DECAY = 0.99  #学习衰减率
LEARNING_RATE_STEP = 1  #学习率多久更新一次,一般为(数据集中总样本数)/(每次喂入的个数BATCH_SIZE),也就是总样本数中共有几个BATCH_SIZE
#这里为了方便,直接设置为1

#定义运行了多少轮的计数器global_step,设定为不可训练
global_step = tf.Variable(0,trainable=False)
#定义指数衰减学习率
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,LEARNING_RATE_STEP,LEARNING_RATE_DECAY,staircase=True)
#定义待优化参数,初值给为5
w = tf.Variable(tf.constant(5,dtype = tf.float32))
#定义损失函数loss
loss = tf.square(w + 1)
#定义反向传播方法
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step = global_step)
#生成会话,训练40轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    for i in range(40):
        sess.run(train_step)
        learning_rate_val = sess.run(learning_rate)
        global_step_val = sess.run(global_step)
        w_val = sess.run(w)
        loss_val = sess.run(loss)
        print("After %s steps:global_step is %f,w is %f,learning_rate is %f,loss is %f."%(i,global_step_val,w_val,learning_rate_val,loss_val))

验证结果(只显示部分):
在这里插入图片描述

【注意:网课中的注释,将w赋值为10,但是代码中仍为5。此处沿用w初值为5】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值