深度学习实战(八)——如何设置学习率

一、学习率的介绍

      学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过SGD求解问题的极小值时,梯度不能太大,也不能太小。太大容易出现超调现象,即在极值点两端不断发散,或是剧烈震荡,总之随着迭代次数增大loss没有减小的趋势;太小会导致无法快速地找到好的下降的方向,随着迭代次数增大loss基本不变。学习率越小,损失梯度下降的速度越慢,收敛的时间更长【1】。
      如公式所示:
                                                        new_weight= existing_weight — learning_rate * gradient
(新权值 = 当前权值 – 学习率 × 梯度)
                                   深度学习实战(八)——如何设置学习率_第1张图片
                                                        采用小学习速率(顶部)和大学习速率(底部)的梯度下降

        如果学习率过小,梯度下降很慢,如果学习率过大,如Andrew Ng的Stanford公开课程所说梯度下降的步子过大可能会跨过最优值。不同的学习率对loss的影响如下图所示【2】:
                            深度学习实战(八)——如何设置学习率_第2张图片


二、学习率的调整方法

        根据数据集的大小来选择合适的学习率,当使平方和误差作为成本函数时,随着数据量的增多学习率应该被设置为相应更小的值(从梯度下降算法的原理可以分析得出)。另一种方法就是,选择不受数据集大小影响成本函数-均值平方差函数

        训练全过程并不是使用一个固定值的学习速度,而是随着时间的推移让学习率动态变化,比如刚开始训练,离下山地点的最优值还很远,那么可以使用较大的学习率下的快一点,当快接近最优值时为避免跨过最优值,下山速度要放缓,即应使用较小学习率训练,具体情况下因为我们也不知道训练时的最优值,所以具体的解决办法是:在每次迭代后,使用估计的模型的参数来查看误差函数的值,如果相对于上一次迭代,错误率减少了,就可以增大学习率如果相对于上一次迭代,错误率增大了,那么应该重新设置上一轮迭代的值,并且减少学习率到之前的50%。因此,这是一种学习率自适应调节的方法。在Caffe、Tensorflow等深度学习框架中都有很简单直接的学习率动态变化设置方法。

      因此,我们常常用一些**退火**的方法调整学习率。学习率调整方法基本上有两种:
    1. 基于经验的手动调整。

      通过尝试不同的固定学习率,如3、1、0.5、0.1、0.05、0.01、0.005,0.005、0.0001、0.00001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。关于学习率的大小所带来的loss变化:

  1. 太大: loss爆炸, 或者nan
  2. 太小: 半天loss没反映(但是, LR(learning rate)需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
  3. 需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.
  4.  如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了.
  5.  如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR, 虽然这很蛋疼.
  6. LR在可以工作的最大值下往小收一收, 免得ReLU把神经元弄死了.

    2. 基于策略的调整。
           2.1 fixed 、exponential、polynomial
           2.2. 自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd
比如:

lr = tf.Variable(0.001, dtype=tf.float32)#学习率
# 定义损失函数和优化器,损失函数用sigmoid交叉熵,优化器选择AdamOptimizer
#tf.nn.sigmoid_cross_entropy_with_logits():对于给定的logits计算sigmoid的交叉熵。
#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=one_hot_labels))
optimizer = tf.train.AdamOptimizer(learning_rate=lr).minimize(loss) #是一个寻找全局最优点的优化算法,引入了二次方梯度校正

这是关于tf.nn.sigmoid_cross_entropy_with_logits()函数和tf.reduce_mean()函数的介绍

这篇文章讨论了调整学习率的理论研究:【AI学习】理解深度学习中的学习率及多种选择策略
 

参考:
【1】深度学习如何设置学习率:https://blog.csdn.net/mao_feng/article/details/52902666 

【2】深度学习(五)学习率的调节:https://blog.csdn.net/hzqgangtiexia/article/details/80509211 

 

你可能感兴趣的:(深度学习)