tensorflow学习笔记四-2:神经网络优化(学习率)

  1. 学习率(learning_rage):每次参数更新的幅度
    学习率 决定了 参数每次更新的幅度
    在训练过程中,参数的更新 遵照如下公式:
    下一时刻参数 = 当前时刻参数 - 学习率 * 损失函数的导数。(也即 参数的更新 向着 损失函数 梯度下降的方向
    Wn+1 = Wn - learning_rate * 损失函数的导数
    Wn+1:更新后的参数
    Wn:当前参数
    learning_rate:损失函数的梯度(导数)
    优化参数 w,就是要找的某个w,使得 损失函数的 梯度 最小。
    (损失函数的梯度 即 导数)

  2. 学习率 设置为多少 合适?
    学习率大了 震荡不收敛,学习率小了 收敛速度慢。
    于是,提出来 “指数衰减学习率
    指数衰减学习率:
    根据BATCH_SIZE 的轮数 动态更新 学习率
    learning_rate = LEARNING_RATE_BASE * LEARNING_RAGE_DECAY
    LEARNING_RATE_BASE:学习率基数。(即 最开始时 设置的 学习率)
    LEARNING_RATE_DECAT:学习率衰减率(0, 1)
    global_step/LEARNING_RATE_STEP:LEARNING_RATE_DECAT的指数
    LEARNING_RATE_STEP:多少轮更新一次 学习率 = 总样本数/BATCH_SIZE

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  # 为true时,指数global_step/LEARNING_RATE_STEP取整数,学习率以阶梯型衰减。如果是false,学习率是一条平滑下降的曲线。
)

glocal_step:是计数器。记录 当前共运行了多少轮。
如果再程序中使用指数衰减学习率,只需把上面两行代码加到程序中即可。
反向传播就是求最优w,即求最小loss对应的w值
示例代码:

#coding=utf-8
'''
    指数衰减学习率
'''
# 设损失函数 loss = (w+1)^2,令w初值是常数10。
# 反向传播就是求最优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)
# 定义待优化参数,初值给10
w = tf.Variable(tf.constant(10, 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 rage is %f, loss is %f"
              % (i, global_step_val, w_val, learning_rate_val, loss_val))

体会常量对学习率动态变化的影响 以及 指数衰减学习率对参数优化速度的影响。

转载于:https://my.oschina.net/workhardforward/blog/2654741

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值