0%

【动手学深度学习】5 优化算法

前面我们主要介绍了各种经典网络,这次我们主要来看看这些网络中非常基础但是核心的部分 - 优化算法,也就是模型到底是如何训练的。


更新历史

  • 2019.11.12: 完成初稿

优化与深度学习

  • 优化算法通常只考虑最小化目标函数
  • 在实际训练中,除了要利用优化算法降低训练误差外,还需要注意应对过拟合
  • 优化过程中我们主要会遇到的问题是局部最小值和鞍点

代码如下:

梯度下降与随机梯度下降

具体的公式这里不赘述,需要理解梯度的意义以及为啥沿着梯度反方向更新可以降低目标函数值,具体参考代码:

简单总结:

  • 学习率过大过小都会出问题,合适的学习率需要多次试验找到
  • 训练样本比较多,一般用随机梯度下降,降低计算开销

小批量随机梯度下降

可以理解为梯度下降和随机梯度下降的中间状态,比较好平衡了计算量和稳定性。这里我们使用 NASA 飞机机翼噪音数据集来比较各个优化算法。我们同样有自行实现与框架实现两种:

动量法

简单来说,就是自变量的迭代方向仅仅取决于自变量当前位置的话会带来一些问题,所以我们不仅要考虑位置,还要考虑方向。具体的代码如下,本节其他内容都会把自行实现和框架实现合并到同一个文件中:

注:可以利用指数加权平均来理解动量法

AdaGrad

AdaGrad 可以根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免同意的学习率难以适应所有维度的问题。主要问题:当学习率在迭代早期下降较快但没有找到比较好的解的时候,后期因为学习率较低,比较难找到有用解。具体的代码如下:

注:自变量中每个元素的学习率在迭代过程中一直在降低

RMSProp

RMSProp 可以看作是 AdaGrad 的改进,避免在后期迭代因为学习率过小而无法找到可用解的问题。可以理解为 AdaGrad 的指数加权移动平均版本(使用小批量随机梯度按元素平方指数加权移动平均)。具体代码如下:

AdaDelta

AdaDelta 同样是想解决 AdaGrad 在迭代后期比较难找到有用解真个问题,但 AdaDelta 是没有学习率这个超参数的。AdaDelta 使用有关自变量更新量评分的指数加权平均的项来代替学习率。具体代码如下:

Adam

简单粗暴点理解,Adam = RMSProp + 动量法,并且使用了偏差修正。具体代码如下:

最后提一句:Tensorflow 是符号式编程,PyTorch 是命令式编程。