注:本系列文章主要是复现北京大学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))
运行结果如下:
由结果可以看出,随着训练轮数增加学习率在不断减小。