主要是用在梯度下降中的学习率问题上,设置学习率的大小, 是在精度和速度之间找到一个平衡:
- 如果学习率的值比较大, 则训练速度会提升, 但结果的精度不够。
- 如果学习率的值比较小, 精度虽然提升了, 但训练会耗费太多的时间。
global_step
所以引入了退化学习率又叫学习率衰减, 它的本意是希望在训练过程中对于学习率大和小的优点都能够为我们所用, 也就是当训练刚开始时使用大的学习率加快速度, 训练到一定程度后使用小的学习率来提高精度, 这时可以使用学习率衰减的方法:
tf.train.exponential_decay(learning_rate,global_step,deacy_step,deacy_rate,staircase = False,name = None)
当staircase = True
表示没有衰减的功能。默认为False
。
举个例子:
tf.train.exponential_decay(learning_rate,global_step,1000,0.9)
上面函数的意思是每迭代1000步,学习率衰减到原来的90%,其中global_step
表示的是当前的迭代步数,用来记录循环次数。
global_step = tf.Variable(0,trainable=False)
实例表述
import tensorflow as tf
tf.reset_default_graph()
global_step = tf.Variable(0,trainable=False)
通过exponential_decay函数生成学习率
learning_rate = tf.train.exponential_decay(0.1,global_step, 10, 0.9, staircase = False)
opt = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
add_global = global_step.assign_add(1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(learning_rate.eval())
for i in range(20):
g,rat = sess.run([add_global,learning_rate])
print(g,rat)
结果
0.1
1 0.09895193
2 0.09791484
3 0.09688862
4 0.095873155
5 0.095873155
6 0.09387404
7 0.092890166
8 0.09191661
9 0.09095325
10 0.089999996
11 0.089999996
12 0.08812335
13 0.087199755
14 0.08628584
15 0.0853815
16 0.08448663
17 0.08360115
18 0.08272495
19 0.08185793
20 0.08099999
注意:在使用时, 一定要把当前迭代次数global_step传进去, 否则不会有退化的功能。