一文简述深度学习优化方法:梯度下降
作者:媒体转发 时间:2018-07-24 09:10
从很大程度上来说,深度学习实际上是在解决大量烦人的优化问题。神经网络仅仅是一个非常复杂的函数,包含数百万个参数,这些参数代表的是一个问题的数学解答。以图像分类为例,AlexNet 就是一个数学函数,它以代表图像 RGB 值的数组为输入,生成一组分类得分的输出。
实质上,通过训练神经网络,我们是在最小化一个损失函数。这个损失函数的值衡量了我们网络的性能在给定数据集上离完美还差多少。

一、损失函数
简单起见,假设我们的网络只有两个参数。实际上,这个数量是在十亿左右,但是我们在这篇文章中会坚持使用两个参数的例子,以便我们在做一些可视化的尝试时不会把自己逼疯。一个很棒的损失函数的轮廓可能是这样的。

1. 损失函数的轮廓
为何我说这是一个很棒的损失函数?因为拥有这种轮廓的损失函数就像圣诞老人一样,是不存在的。然而,它仍然是一个不错的教学工具,有助于全面了解关于梯度下降的一些最重要的想法。那么,我们从这里开始吧。
x 轴和 y 轴分别代表两个权值,z 轴代表在给定两个特定权值的情况下损失函数的值。我们的目标就是找到损失最小的特定权值,这个点被称作损失函数的最小值点。
你一开始就随机初始化了权值,所以你的神经网络可能会表现得像喝醉了的你一样,把猫的图片归类为人。这样的情况对应的是损失函数轮廓中的 A 点,此处的网络性能十分差,因此损失也很高。
我们需要寻找一种能够导航到「谷底」B 点处的方法,这里的损失函数值最小。那么我们要怎么做呢?

2. 梯度下降
初始化权值的时候,我们处于损失函数图形中的 A 点。首先要做的就是查看 x-y 平面中所有可能的方向,看看哪个方向是损失函数的值下降最陡峭的方向。这个就是我们必须移动的方向,它恰恰与梯度的方向相反。梯度是高维导数的另一种说法,它给出了最陡峭的上升方向。
要想理解这个概念,请看下图。在曲面的任何一点,我们都能够定义一个与其相切的平面。在更高维度,我们总能够定义一个超平面,但在这里我们还是坚持使用 3 维空间。然后,在这个平面上有无限个方向。其中,准确来说只有一个使函数上升最快的方向,这个方向由梯度给出,与之相反的方向就是下降最快的方向。这就是算法名称的来源,我们沿着梯度的方向进行下降,所以就叫做梯度下降。

现在,既然已经有了前进方向,我们必须决定需要采取步子的大小,而控制下降步幅大小的参数即学习率。为了保证降到最小值,我们必须谨慎地选择学习率。
如果移动得太快,我们可能越过最小值,沿着「山谷」的山脊蹦蹦跳跳,永远都不可能到达最小值。如果移动太慢,训练可能花费太长的时间,根本就不可行,此外太慢的学习率也容易让算法陷入极小值,我们会在本文后面的部分讨论。
一旦有了梯度和学习率,我们就开始行动,然后在最终到达的任何位置重新计算梯度,然后重复这个过程。
梯度的方向告诉我们哪个方向上升的最快,它的幅值则表示最陡峭的上升/下降有多陡。所以,在最小值的地方,曲面轮廓几乎是平坦的,我们期望得到几乎为零的梯度。事实上,最小值点的梯度就是 0。

梯度下降过程

使用太大的学习率
在实践中,我们可能永远无法精确地达到最小值,但是我们能够在最小值附近的平坦区域震荡。当我们在这个区域震荡时,损失值几乎是我们能够达到的最小值,并且不会有很大的变化,因为我们是在真实的最小值附近跳动。通常,当损失值在预定的数字内没有提升的时候我们会停止迭代,例如 10 次或者 20 次迭代。当这种情况发生时,我们就说训练已经收敛了,或者说收敛已经实现了。
二、常见的错误



