【知识点04】深度学习中常见的优化算法 Optimizaiton Algorithm

作者:欧新宇(Xinyu OU)

本文档所展示的测试结果,均运行于:Intel Core i7-7700K CPU 4.2GHz

最后修订: 2020-09-20


PS:因图片较多,影响访问速度,完整的输出,请自行使用Notebook或vscode运行

深度学习算法在血多情况下都涉及优化,例如,模型中的进行推断(如PCA)涉及求解优化问题。我们经常使用解析优化去证明或涉及算法。在深度学习涉及的诸多问题中,最难的是神经网络训练。在神经网络刚开始流行的时候,使用几百台机器投入几天到几个月来解决单个神经网络训练问题,也是很常见的。正是由于这其中的优化问题很重要,代价也很高,因此研究者们开发了一组专门为此设计的优化技术。

这篇教案,旨在以优化一维函数为例介绍常见的优化算法。在深度学习的实际应用中,模型的参数可能会有数百万维,但基本思想是一致的。梯度是这些优化算法的基础,它们常常在极高维度(通常参数有数百万个以上)也即数百万维的空间进行梯度下降,从最开始的初始点开始,寻找最优化的参数。在这个过程中,经常会遇到多种情况,例如:

  1. 提前遇到局部最小值从而卡住,再也找不到全局最小值了。
  2. 遇到极为平坦的地方:“平原”,在这里梯度极小,经过多次迭代也无法离开。同理,鞍点也是一样的,在鞍点处,各方向的梯度极小,尽管沿着某一个方向稍微走一下就能离开。
  3. "悬崖",某个方向上参数的梯度可能突然变得奇大无比,在这个地方,梯度可能会造成难以预估的后果,可能让已经收敛的参数突然跑到极远地方去。

为了可视化并更好地理解这些优化算法,我们首先拼出了一个很复杂的一维函数,并给出该函数的导数形式,然后再使用7种常见的优化算法,对该函数进行优化。

$f(x)=(0.15x)^2+cos(x)+sin(3x)/3+cos(5x)/5+sin(7x)/7$

$f'(x)=0.045x-sin(x)+cos(3x)-sin(5x)+cos(7x)$

从上图可以看出,该函数既有悬崖,又有大量的局部最小值,说明该函数已经足够复杂。

1. 纯粹的梯度下降算法

首先给出学习率lr,初始x

while True
    x = x - lr*df/dx

根据学习率的不同,可以看到不同的效果。学习率过小,卡在局部极小值,学习率过大,则不收敛。

2. 带动量的梯度下降

算法在纯粹的梯度下降法之上,外加了梯度,从而记录下了历史的梯度情况,从而减轻了卡在局部最小值的危险,在梯度=0的地方仍然会有一定的v剩余,从而在最小值附近摇摆。

# 首先给出学习率lr,动量参数m
初始速度v=0, 初始x
while True
    v = m * v - lr * df/dx
    x += v