TensorFlow北大公开课学习笔记-4.2学习率

注:本系列文章主要是复现北京大学TensorFlow笔记中的代码,方便以后使用,并没有详细讲解流程,因为我并不是专门做教程的。何况北大的教程讲的已经很好了,有需要了解详细过程的可以去看北大的教程哈。

√学习率 learning_rate: 表示了每次参数更新的幅度大小。 学习率过大, 会导致待优化的参数在最小值附近波动,不收敛;学习率过小, 会导致待优化的参数收敛缓慢。
在训练过程中, 参数的更新向着损失函数梯度下降的方向。
参数的更新公式为:这里写图片描述

假设损失函数为 loss = (w + 1)2。梯度是损失函数 loss 的导数为 ∇=2w+2。如参数初值为 5,学习
率为 0.2,则参数和损失函数更新如下:

1 次 参数 w: 5 5 - 0.2 * (2 * 5 + 2) = 2.6
2 次 参数 w: 2.6 2.6 - 0.2 * (2 * 2.6 + 2) = 1.16
3 次 参数 w: 1.16 1.16 – 0.2 * (2 * 1.16 + 2) = 0.296
4 次 参数 w: 0.296

损失函数 loss = (w + 1)2 的图像为
这里写图片描述
由图可知,损失函数 loss 的最小值会在(-1,0)处得到,此时损失函数的导数为 0,得到最终参数 w =
-1。 代码如下:

#coding:utf-8
#设损失函数 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)
#生成会话,训练40轮
with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    for i in range(400):
        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。

√学习率的设置
学习率过大,会导致待优化的参数在最小值附近波动,不收敛;学习率过小, 会导致待优化的参数收敛缓慢。

√指数衰减学习率: 学习率随着训练轮数变化而动态更新
学习率计算公式如下:
这里写图片描述
用 Tensorflow 的函数表示为:

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/False)

其中, LEARNING_RATE_BASE 为学习率初始值, LEARNING_RATE_DECAY 为学习率衰减率,global_step 记录了当前训练轮数,为不可训练型参数。学习率 learning_rate 更新频率为输入数据集总样本数除以每次喂入样本数。若 staircase 设置为 True 时,表示 global_step/learning rate step 取整数,学习率阶梯型衰减;若 staircase 设置为 false 时,学习率会是一条平滑下降的曲线。
例如:在本例中,模型训练过程不设定固定的学习率,使用指数衰减学习率进行训练。其中,学习率初值设置为 0.1,学习率衰减率设置为 0.99, BATCH_SIZE 设置为 1
代码如下:

#coding:utf-8
#设损失函数 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

#运行了几轮BATCH_SIZE的计数器,初值给0,设为不被训练
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)
#定义待优化参数w初值赋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))

运行结果如下:
这里写图片描述
由结果可以看出,随着训练轮数增加学习率在不断减小。

欢迎扫码关注我的微信公众号

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值