tensorflow笔记02:学习率如何更新权重w
学习率的概念
学习速率是指导我们该如何通过损失函数的梯度调整网络权重的超参数。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。
结论:学习率过大,会导致待优化的参数在最小值附近波动,不收敛;学习率过小,会导致待优化的参数收敛缓慢。在训练过程中,参数的更新向着损失函数梯度下降的方向。
下述公式表示了上面所说的这种关系。
new_weight = existing_weight — learning_rate * gradient
如何调整学习率
这里我们课程讲了传统的两种方法:
1 .公式1:Wn+1 = W n − learning_rate∇
#coding=utf-8
import tensorflow as tf
#设计前向传输的参数w
w = tf.Variable(tf.constant(5,tf.float32))
#定义反向传播,损失函数,反向传播方法、
loss = tf.square(w+1)
#学习率小,=0.001
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#创建会话,初始化参数
with tf.Session() as sess:
init_opt = tf.global_variables_initializer()
sess.run(init_opt)
#输出初始的权重
print"the first w is:\n",sess.run(w)
#定义训练次数
steps = 40
for i in range(steps):
sess.run(train_step)
w_val = sess.run(w)
loss_val = sess.run(loss)
print "After %d steps'training ,the w is %f, the loss is %f:\n"%(i,w_val,loss_val)
学习率=0.001,属于小学习率时,训练40次,权重下降很慢,loss也是
现在把学习率调节到0.1,训练40次,发现实际的结果与loss的图像符合,w无限趋向-1,loss趋向0,loss收敛。
现在将学习率继续调节到1,发现权重在-7和5之间震荡,loss基本保持在36,不收敛; 符合结论。
2. 使用指数衰减学习率:学习率随训练轮数而动态更新
公式2:
Learning_rate = Learning_rate_Base*Learning_rate_Decay*(global_step/Learning_rate_BATCH_SIZE)
其中,Learning_rate_Base是学习率的初始值,Learning_rate_Decay是学习率的衰减率,global_step是当前训练轮数,Learning_rate_BATCH_SIZE是学习率 learning_rate 更新频率,输入数据集总样本数除以每
次喂入样本数。
在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)
注:若 staircase 设置为 True 时,表示 global_step/learning rate step 取整数,学习率阶梯型衰减;若 staircase 设置为 false 时,学习率会是一条平滑下降的曲线。
我用代码演示上面的loss = (w+1)2的衰减如下:
#coding=utf-8
import tensorflow as tf
import numpy as np
#自适应学习率指数衰减
Learning_rate_Base = 0.1#初始学习率
Learning_rate_Step = 1#喂入多少轮更新一次学习率,一般设置为总样本数/BATCH_SIZE
Learning_rate_Decay = 0.99#学习率指数衰减率
#运行几轮的BATCH_SIZE后的计数器,初值0,设为不给训练
global_step =tf.Variable(0,trainable=False)
#w = tf.Variable(tf.constant(5,tf.float32))
learning_rate = tf.train.exponential_decay(Learning_rate_Base,global_step,Learning_rate_Step,Learning_rate_Decay,staircase=True)
#定义待优化参数
w = tf.Variable(tf.constant(5,dtype=tf.float32))
#定义反向传播,损失函数,反向传播方法、
loss = tf.square(w+1)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
#创建会话,初始化参数
with tf.Session() as sess:
init_opt = tf.global_variables_initializer()
sess.run(init_opt)
#输出初始的权重
print"the first w is:\n",sess.run(w)
#定义训练次数
steps = 500
for i in range(steps):
sess.run(train_step)
w_val = sess.run(w)
loss_val = sess.run(loss)
learning_rate_val = sess.run(learning_rate)
global_step_val = sess.run(global_step)
print "After %d steps'training ,the global_step is %f,w is %f, the loss is %f ,the learning_rate is %f;:\n"%(i, global_step_val, w_val, loss_val, learning_rate_val)
训练40轮时,我们可以看到,它自己进行学习率的调整,尽管是慢慢下降,但是权重在40轮的训练中,基本趋向于-1,loss趋向于0:
加大训练次数观察,step = 500,学习率变得很小,微调了,权重与实际值-1,loss与实际值0无限接近。
更好的办法
这里引用一篇文章,待自己知识会了更多再看
更好选择学习率