我们找到第所以它可以完美解决 GD 的第一个问题——算得慢。这也是当初人们使用 SGD 的主要目的。而且,大家并不用担心导数中包含的噪声会有什么负面影响。有大量的理论工作说明,只要噪声不离谱,其实(至少在 f 是凸函数的情况下),SGD 都能够很好地收敛。虽然搞理论的人这么说,但是很多完美主义者仍会惴惴不安,觉得用带了随机噪声的导数来训练自己的神经网络不放心,一定要用最准确的导数才行。于是他们往往还会尝试用 GD 跑一遍,和 SGD 得到的结果比较比较。
结果呢?因为我经常干这样的事情,所以我可以负责任地告诉大家,哪怕 GD 训练的时候有多几百倍几千倍的时间,最后结果往往是 SGD 得到的网络表现要比 GD 得到的网络要好得多!很意外是不是?加了噪声的算法反而更好,这简直就像说"让马路上的司机多喝点酒,交通能够更顺畅"一样让人难以接受。但事实就是如此。实践中,人们发现,除了算得快,SGD 有非常多的优良性质。它能够自动逃离鞍点,自动逃离比较差的局部最优点,而且,最后找到的答案还具有很强的一般性(generalization),即能够在自己之前没有见过但是服从同样分布的数据集上表现非常好!
这是为什么呢?今天我们就简单谈谈为什么它可以逃离鞍点。之后有机会我会再详细介绍 SGD 的别的优良性质——这些性质也是目前优化和机器学习领域研究的热点问题。那么我们先理解一下,鞍点的数学表达是什么。首先,我们考虑的情况是导数为0的点。这些点被称为 Stationary points,即稳定点。稳定点的话,可以是(局部)最小值,(局部)最大值,也可以是鞍点。如何判断呢?我们可以计算它的 Hessian 矩阵 H。
__是一个很好的方法.jpg)
最速下降__为什么说随机最速下降法__(_SGD_)__是一个很好的方法
如果 H 是负定的,说明所有的特征值都是负的。这个时候,你无论往什么方向走,导数都会变负,也就是说函数值会下降。所以,这是(局部)最大值。如果 H 是正定的,说明所有的特征值都是正的。这个时候,你无论往什么方向走,导数都会变正,也就是说函数值会上升。所以,这是(局部)最小值。如果H既包含正的特征值,又包含负的特征值,那么这个稳定点就是一个鞍点。具体参照之前的图片。也就是说有些方向函数值会上升,有些方向函数值会下降。虽然看起来上面已经包含了所有的情况,但是其实不是的!还有一个非常重要的情况就是 H 可能包含特征值为0的情况。这种情况下面,我们无法判断稳定点到底属于哪一类,往往需要参照更高维的导数才行。想想看,如果特征值是0,就说明有些方向一马平川一望无际,函数值一直不变,那我们当然不知道是怎么回事了:)
我们今天讨论的情况只包含前三种,不包含第四种.第四种被称为退化了的情况,所以我们考虑的情况就叫做非退化情况。在这种非退化的情况下面,我们考虑一个重要的类别,即 strict saddle 函数。这种函数有这样的特点:对于每个点 x要么 x 的导数比较大要么 x 的 Hessian 矩阵包含一个负的特征值
__是一个很好的方法.jpg)
最速下降__为什么说随机最速下降法__(_SGD_)__是一个很好的方法
要么 x 已经离某一个(局部)最小值很近了为什么我们要 x 满足这三个情况的至少一个呢?因为如果 x 的导数大,那么沿着这个导数一定可以大大降低函数值(我们对函数有光滑性假设)如果 x 的 Hessian 矩阵有一个负的特征值,那么我们通过加噪声随机扰动,跑跑就能够跑到这个方向上,沿着这个方向就能够像滑滑梯一样一路滑下去,大大降低函数值如果 x 已经离某一个(局部)最小值很近了,那么我们就完成任务了,毕竟这个世界上没有十全十美的事情,离得近和精确跑到这个点也没什么区别。所以说,如果我们考虑的函数满足这个 strict saddle 性质,那么 SGD 算法其实是不会被困在鞍点的.那么 strict saddle 性质是不是一个合理的性质呢?实际上,有大量的机器学习的问题使用的函数都满足这样的性质。比如 Orthogonal tensor decomposition,dictionary learning, matrix completion 等等。而且,其实并不用担心最后得到的点只是一个局部最优,而不是全局最优。因为实际上人们发现大量的机器学习问题,几乎所有的局部最优是几乎一样好的,也就是说,只要找到一个局部最优点,其实就已经找到了全局最优,比如 Orthogonal tensor decomposition 就满足这样的性质,还有小马哥 NIPS16 的 best student paper 证明了 matrix completion 也满足这样的性质。我觉得神经网络从某些角度来看,也是(几乎)满足的,只是不知道怎么证。
下面讨论一下证明,主要讨论一下第二篇。第一篇论文其实就是用数学的语言在说"在鞍点加扰动,能够顺着负的特征值方向滑下去"。第二篇非常有意思,我觉得值得介绍一下想法。
__是一个很好的方法.jpg)
最速下降__为什么说随机最速下降法__(_SGD_)__是一个很好的方法
首先,算法上有了一些改动。算法不再是 SGD,而是跑若干步 GD,然后跑一步 SGD。当然实际上大家是不会这么用的,但是理论分析么,这么考虑没问题。什么时候跑 SGD 呢?只有当导数比较小,而且已经很长时间没有跑过 SGD 的时候,才会跑一次。也就是说,只有确实陷在鞍点上了,才会随机扰动一下下。因为鞍点有负的特征值,所以只要扰动之后在这个方向上有那么一点点分量,就能够一马平川地滑下去。除非分量非常非常小的情况下才可能会继续陷在鞍点附近。换句话说,如果加了一个随机扰动,其实大概率情况下是能够逃离鞍点的!虽然这个想法也很直观,但是要严格地证明很不容易,因为具体函数可能是很复杂的,Hessian 矩阵也在不断地变化,所以要说明"扰动之后会陷在鞍点附近的概率是小概率"这件事情并不容易。
作者们采取了一个很巧妙的方法:对于负特征值的那个方向,任何两个点在这两个方向上的投影的距离只要大于 u/2,那么它们中间至少有一个点能够通过多跑几步 GD 逃离鞍点。也就是说,会持续陷在鞍点附近的点所在的区间至多只有 u 那么宽!通过计算宽度,我们也就可以计算出概率的上届,说明大概率下这个 SGD+GD 算法能够逃离鞍点了。
[ 原文 Figure 1 画得很漂亮,推荐一下 ] 最新最速下降: 为什么说随机最速下降法 ( SGD ) 是一个很好的方法可以看看这篇名叫房价下降: 房价下跌有 6 大危害,越跌反而你越买不起!的文章,可能你会获得更多最速下降: 为什么说随机最速下降法 ( SGD ) 是一个很好的方法
__是一个很好的方法.jpg)
最速下降__为什么说随机最速下降法__(_SGD_)__是一个很好的方法
__是一个很好的方法.jpg)

