学习率衰减,对于训练非常重要。在 TF中可以用exponential_decay() 官方API文档
tf.train.exponential_decay()
Parameters:
1) learning_rate
2) global_step
3) decay_steps
4) decay_rate
5) staircase=False
6) name=None
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
Eg1:
import tensorflow as tf
import matplotlib.pyplot as plt
global_step = tf.Variable(0, trainable=False)
initial_learning_rate = 0.1 #初始学习率
learning_rate = tf.train.exponential_decay(initial_learning_rate,
global_step=global_step,
decay_steps=1000,decay_rate=0.5, staircase=False)
opt = tf.train.GradientDescentOptimizer(learning_rate)
y = []
x= []
add_global = global_step.assign_add(1)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(learning_rate))
for j in range(10000):
rate = 0.0
_, rate = sess.run([add_global, learning_rate])
x.append(_)
y.append(rate)
line3, = plt.plot(x,y, label='learning rate')
plt.legend(handles=[line3])
plt.show()
如果 staircase = True
训练前期如果用过小的学习率,很可能会导致梯度下降到局部最小值,模型不收敛。
(纵轴是错误率, 学习率是0.0001)
如果采用大一点的学习率,其他参数不变。
(学习率是0.001)
而在模型训练后期,过于大的学习率,会造成模型震荡。此时我们又希望采用较小的学习率,使得模型进一步的收敛。可见,在训练过程中,控制学习率是非常重要的。
Alexnet网络训练步骤: 学习率初始化 0.01 momentum 0.9 学习率衰减 0.0005。 当验证集趋于稳定时候,学习率 / 10。