在前面已经介绍了神经网络优化的基本算法,通过梯度下降算法和反向传播算法。其中梯度下降算法学习率的设置尤为重要,因为它是控制参数更新的速度,决定了每次更新的幅度,如果幅度过大,那么可能导致参数在极优值得两侧来回移动。以为例,如果优化中使用的学习率为1,那么整个优化过程如下表所示:
轮数 | 当前轮参数值 | 梯度X学习率 | 更新后参数值 |
1 | 5 |
2x5x1=10 | 5-10=-5 |
2 | -5 | 2x(-5)x1=-10 | -5-(-10)=5 |
3 | 5 | 2x5x1=10
| 5-10=-5 |
从上表中可以看出,无论迭代进行多少轮,参数将在5和-5之间摇摆,不会收敛到一个极小值。相反 ,当学习率过小时,虽然能保证收敛性,但这会大大降低优化速度。我们需要更多轮迭代才能达到一个比较理想的优化效果。所以学习率既不能过大,也不能过小,为了解决学习率问题,Tensorflow提供了一种更加灵活的学习率设置方法————指数衰减法。通过tf.train.exponential_decay函数实现了指数衰减学习率。这个函数实现了下面代码的功能:
decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
其中decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定好的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度。下面给出了一段代码来示范如何在Tensorflow中使用该函数:
global_step=tf.Variable(0)
#通过expoential_decay函数生成学习率
learning_rate=tf.train.exponential_decay(0.1,global_step,
100,0.96,staircase=True)
#使用指数衰减的学习率,在minimize函数传入global_step将自动更新
#global_step参数,从而使得学习率也得到相应的更新。
learning_step=tf.train.GradientDescentOptimizer(learning_rate)\
.minimize(...my loss...,global_step=global_step)
上述代码中设定学习率为0.1,因为制定了staircase=True,所以每训练100轮以后学习率乘0.96.