梯度下降法的神经网络容易收敛到局部最优,为什么应用广泛?
创建时间:2017-11-14 16:33:39
最后编辑:2017-11-14 16:33:39
这是Deep Learning Theory里很基本也很核心的一个问题。
在这个问题上,初学者容易被入门教学误导,非此研究方向的业内人士也容易有过时的认知。
首先问题描述不够准确。
更准确的说法是——
(1)正因为梯度下降法容易收敛到局部最优,所以大家几乎从来不用梯度下降做非凸优化,包括训练神经网络。
(2)正因为随机梯度下降法容易逃离鞍点和泛化不好的minima(主要是sharp minima),所以随机梯度下降(SGD)和它的变种(比如Momentun、Adam)才是训练神经网络最流行的方法。
鞍点(saddle points)和泛化不好的最优点(bad/sharp minima)在深度学习里的确是广泛存在的。但这是神经网络复杂的loss landscape带来的问题,而不是优化器带来的问题。反而,优化器是来解决问题的。
正因为saddle points和bad minima太多了,所以你才太需要随机优化了。
有很多问题在深度学习理论里有和传统机器学习和最优化理论完全不一样的解答。很多传统观点在深度学习里都是值得怀疑的。很少有教材会强调这件事或者指出它们的不同。于是就有一个很尴尬的现象。很多深度学习入门的教材和课程里面混合了大量传统机器学习的观点和最优化理论的观点。大量的博客和科普文章更是剪不断、理还乱。
(另一个常见误解是模型大小对泛化的影响:https://www.zhihu.com/question/434846017/answer/1651711327)
这也不奇怪。因为深度学习理论的进展主要藏在最近几年的论文里,可能还要很长时间才能进入英文教材,还需要更长的时间才能进入中文教材。
归纳一下:
优化理论里大家更在乎的是到critical points的收敛性,梯度逐渐收敛到0即可。至于是找到minima还是saddle points,超纲了。
机器学习里大家在乎是找到的是global minima,还是local minima。local minima意味着training loss还比较高,还没优化到位。但是global minima还是local minima在深度学习里不重要,因为所有的minima对应的loss都差不多小[1]。
深度学习里,大家很在乎saddle points附近的动力学(影响优化),大家非常在乎flat minima还是sharp minima(影响泛化)。因为saddle points附近的优化会非常慢,而minima flatness对深度学习泛化界的影响非常大。
(Note: 鞍点逃逸问题一般指的是逃离 \epsilon -first-order stationary points,其实是鞍点附近、梯度很小的区域,而不是梯度严格等于0的点。)
所以深度学习动力学有两个非常值得研究的核心问题:
一,怎么快速逃离鞍点;
二,怎么逃离sharp minima找到flat minima。
其理论价值是,我们可以更好地理解深度神经网络的训练过程。其实践价值是,我们可以更有依据地调参或者设计新的随机优化器。
很幸运的是,SGD为代表的随机优化器在这两个问题里都有相当好的性质。
直觉上的理解其实很简单——在随机梯度噪音扰动下,优化器可以加速逃离鞍点,也可以加速逃离sharp minima。
一般的意义上的回答就到这里就结束了。但这个回答只是定性的,还不够好,因为我们不能量化地预测SGD的行为。
就像我们都知道苹果会掉在地上,但我们还需要牛顿力学来准确语言苹果是如何掉在地上的。现在的深度学习理论的完善程度差不多相当于牛顿前的运动学,主要靠经验和定性的结论。俗称“炼丹“,便是如此。
如果想更深(shu)入(xue)地理解这个问题,我正好可以介绍一下这个方向的最新进展。正好是我们组的一个系列工作的其中一篇SGD Diffusion Theory[2]:分析了为什么SGD倾向于逃离sharp minima找到flat minima。(ICLR2021新鲜出炉,评分前6%: https://openreview.net/forum?id=wXgk_iCiYGo)
(我们组特长其实是弱监督学习。去年ICML2020全组(只计一作、尾作)正好10篇,其中一半左右都是弱监督学习的文章。深度学习理论是最近些年组里少部分人做的新方向,还不算很强。目前全组中的conference大多是是ICML和NeurIPS,估计以后ICLR文章也会稍稍变多一些。)
我们先来看一个一维示意图(高维空间也不难想象)。假如一个粒子初始时刻在能阱a1里,那么:Q1.它需要多长时间才能越过鞍点b进入势阱a2?Q2.经过足够长的时间,这个粒子落入陷阱a1和a2的概率分别有多大?

抽象一下,深度学习的训练过程其实就对应着这么个经典的Kramers Escape问题。这个问题的原型最早出现在1940年的一篇经典论文[3]。
统计物理学家Kramers提出了这么一个布朗运动粒子(服从朗之万动力学Langevin Dynamics)的逃逸问题。经过一些统计物理学里的经典近似手段,得到了热噪音下(即各向同性的高斯噪音)的平均逃逸时间公式:
\tau = 2\pi \sqrt{ \frac{-\det (H_{b})}{ \det(H_{a})}} \frac{1}{H_{be}} \exp\left( \frac{\Delta L_{ab}}{k_{B}T}\right)
\Delta L是势阱深度;H_{a}和H_{b}分别是a和b处的Hessian;T是温度;k_{b}是统计物理里的玻尔兹曼常数。
很容易发现,在最简单的热噪音的情况,我们已经能看到随机动力学是偏好flat minima的,这种偏好是多项式级的。
这里的\det(H_{a})(一维情况下的二阶导数或者高维情况下的Hessian的行列式)就是minima sharpness的一种度量。
在化学里面,类似的方法还可以计算化学反应的速率和反应式左右比例。
在深度学习里,“类似”的方法则可以计算出SGD逃离minima的速率和SGD对flat minima的偏好。
虽说是“类似”的方法,但是深度学习动力学比热力学复杂太多了。因为随机梯度噪音是一种各向异性的、位置依赖的复杂噪音。
中间的数学细节可以参考[2]。大概的流程是,从SGD算法得到对应的Generalized Langevin Dynamics,再得到对应Fokker-Planck Equation。从Fokker-Planck Equation可以解出粒子的概率密度。再借助Smoluchowski Equation可以解出粒子的概率密度从一个势阱流向另一个势陷的概率流大小。
可以直观的理解为,一堆概率云最开始在一个势阱内,渐渐地通过鞍点流向了另一个势阱,并逐渐达到平衡。达到平衡的特征时间就是平均逃逸时间 \tau ,最终概率云的分布则反映了找到不同的解的概率。
热力学版的Kramers Escape问题其实也是走这个数学流程。只是布朗运动的Langevin Dynamics只含有非常简单的热噪音。而[2]这个工作最大的贡献就是,解决了随机梯度噪音版的Kramers Escape问题。可以说,深度学习动力学是一种自然界不存在的动力学问题。其对应的Kramers Escape问题其实就是一种物理学家没有见过的物理问题。
(这套数学工具,CS背景的同学基本上都不熟。但是有统计物理背景的同学可太熟了。解决问题的关键可能是先准确定义这个问题,再找一个懂统计物理的来解这个方程,就能大功告成。所以AI研究还是很需要diversity的。我也在和统计物理PhD合作中。。)
回到正题。[2]最后得到的深度学习版的Kramers Escape问题的平均逃逸时间表达式是:
\log(\tau) =O\left( \frac{B\Delta L_{ab}}{\eta H_{a}} \right) (简单起见,这里只写一维空间的情况。高维空间类似。)
其中 B 是batch size, \eta 是学习率。这里可以看到,平均逃逸时间对minima sharpness的依赖是指数级的。
而且,很幸运,SGD逃逸对minima sharpness、batch size和学习率的指数关系都在[2]的实验中被验证:

另外,SGLD(随机梯度朗之万动力学)是一种常用的做Bayesian inference的方法,它的行为更接近于热力学,因为梯度噪音主要是人为加的高斯噪音。这不奇怪,因为Bayesian inference就是从玻尔兹曼分布中推断参数。[2]的实验也验证了,SGLD对minima sharpness的依赖是多项式级的。这也说明了为什么Bayesian inference的方法都不是好的深度学习训练方法。
最后文章的结论很清晰,随机梯度噪音的性质优对深度学习来说很优越:
(1)热力学对于flat minima的偏好是多项式级的,而SGD对flat minima的偏好是指数级的。这就是为什么随机优化对深度学习如此重要。
(2)这个batch size和学习率的比值 \frac{\eta}{B} 也是指数级的重要的。这个也解释为什么large batch training时需要保持\frac{\eta}{B}在一个稳定的值[4]。另外,这个比值还可以影响深度学习的泛化[5]。
(3)深度学习的参数空间虽然很高维,但是学习动力学主要是发生在一个低维空间的。参数几乎不会沿着在Hessian的本征值接近0的那些方向学习。这一点也和FAIR的一个经验发现[6]相符。
参考文献:
[1] Kawaguchi, K. (2016). Deep learning without poor local minima.Advances in neural information processing systems,29, 586-594.
[2] Xie, Z., Sato, I., & Sugiyama, M. (2020). A Diffusion Theory For Deep Learning Dynamics: Stochastic Gradient Descent Exponentially Favors Flat Minima. In International Conference on Learning Representations.
[3] Kramers, H. A. (1940). Brownian motion in a field of force and the diffusion model of chemical reactions. Physica,7(4), 284-304.
[4] Krizhevsky, A. (2014). One weird trick for parallelizing convolutional neural networks. arXiv preprint arXiv:1404.5997.
[5] He, F., Liu, T., & Tao, D. (2019). Control batch size and learning rate to generalize well: Theoretical and empirical evidence. In Advances in Neural Information Processing Systems(pp. 1143-1152).
[6] Gur-Ari, G., Roberts, D. A., & Dyer, E. (2018). Gradient descent happens in a tiny subspace.arXiv preprint arXiv:1812.04754.
关于鞍点逃逸的研究是另外一个很重要的课题。我们组的工作还没有经过peer review,这里就不详细介绍了。以后有空再写。
大概的结论是,随机梯度噪音在鞍点逃逸的过程里依然扮演了一个指数级重要的角色。
比较特别的发现是,Adam对flat minima的偏好比SGD要弱很多(所以泛化差),但在鞍点逃逸的表现上要比SGD快很多(所以收敛快)。
所以Adaptive Learning Rate是毒也是药。
关于Adam和SGD各自的优势,可以参考我的另一篇回答:
更多回答
深度神经网络“容易收敛到局部最优”,很可能是一种想象,实际情况是,我们可能从来没有找到过“局部最优”,更别说全局最优了。
很多人都有一种看法,就是“局部最优是神经网络优化的主要难点”。这来源于一维优化问题的直观想象。在单变量的情形下,优化问题最直观的困难就是有很多局部极值,如

人们直观的想象,高维的时候这样的局部极值会更多,指数级的增加,于是优化到全局最优就更难了。然而单变量到多变量一个重要差异是,单变量的时候,Hessian矩阵只有一个特征值,于是无论这个特征值的符号正负,一个临界点都是局部极值。但是在多变量的时候,Hessian有多个不同的特征值,这时候各个特征值就可能会有更复杂的分布,如有正有负的不定型和有多个退化特征值(零特征值)的半定型

在后两种情况下,是很难找到局部极值的,更别说全局最优了。
前面很多回答说了,现在看来神经网络的训练的困难主要是鞍点的问题。在实际中,我们很可能也从来没有真的遇到过局部极值。Bengio组这篇文章Eigenvalues of the Hessian in Deep Learning里面的实验研究给出以下的结论:
• Training stops at a point that has a small gradient. The norm of the gradient is not zero, therefore it does not, technically speaking, converge to a critical point.
• There are still negative eigenvalues even when they are small in magnitude.
另一方面,一个好消息是,即使有局部极值,具有较差的loss的局部极值的吸引域也是很小的Towards Understanding Generalization of Deep Learning: Perspective of Loss Landscapes。
For the landscape of loss function for deep networks, the volume of basin of attraction of good minima dominates over that of poor minima, which guarantees optimization methods with random initialization to converge to good minima.
所以,很可能我们实际上是在“什么也没找到”的情况下就停止了训练,然后拿到测试集上试试,“咦,效果还不错”。
补充说明,这些都是实验研究结果。理论方面,在各种假设下,深度神经网络的Landscape 的鞍点数目指数增加,而具有较差loss的局部极值非常少。
SGD收敛性的很多结论都是经验性的。在loss function landscape是退化的情况下loss 停滞在某个数值上训练不动的原因,很大程度上不是因为停在某个点不动了,是停在某个区域不动了。over-parameterized的神经网络有大片的平坦区域,这里一阶二阶乃至更高阶都是退化的,甚至有实验说这样的区域时dominant的(虽然我觉得那个结论有点大)。这时候可以说反复迭代也没啥改进,但是这反过来说算法无需太多迭代就能找到这样一个平坦区域,这里loss 和其中的local minima (可能也是退化的)相差不大,是不是真的找到local minima也没那么重要了。
相关的回答:
反对回答区中一部分称“模型收敛于鞍点”的回答。当然也有的大牛可以一针见血,那我就对这个问题多展开一下吧,让鲜血流的更猛烈一些。(害怕.jpg)
真的结束于最优点吗?
我们知道,在局部最优点附近,各个维度的导数都接近0,而我们训练模型最常用的梯度下降法又是基于导数与步长的乘积去更新模型参数的,因此一旦陷入了局部最优点,就像掉进了一口井,你是无法直着跳出去的,你只有连续不间断的依托四周的井壁努力向上爬才有可能爬出去。更何况梯度下降法的每一步对梯度正确的估计都在试图让你坠入井底,因此势必要对梯度“估计错很多次”才可能侥幸逃出去。那么从数学上看,什么才是局部最优点呢?
这个问题看似很白痴,很多人会说“局部最优点不就是在loss曲面上某个一阶导数为0的点嘛”。这就不准确啦,比如下面这个马鞍形状的中间的那个点:

显然这个点也是(一阶)导数为0,但是肯定不是最优点。事实上,这个点就是我们常说的鞍点。
显然,只用一阶导数是难以区分最优点和鞍点的。
我们想一下,最优点和鞍点的区别不就在于其在各个维度是否都是最低点嘛~只要某个一阶导数为0的点在某个维度上是最高点而不是最低点,那它就是鞍点。而区分最高点和最低点当然就是用二阶导数(斜率从负变正的过程当然就是“下凸”,即斜率的导数大于0,即二阶导数大于0。反之则为“上凹”,二阶导数小于0)。也就是说,若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点啦。
那么二阶导数大于0和小于0的概率各是多少呢?由于我们并没有先验知识,因此按照最大熵原理,我们认为二阶导数大于和小于0的概率均为0.5!
那么对于一个有n个参数的机器学习/深度学习模型,“loss曲面”即位于n+1维空间(loss值为纵轴,n个参数为n个横轴)。在这个空间里,如果我们通过梯度下降法一路下滑终于滑到了一个各方向导数均为0的点,那么它为局部最优点的概率即 0.5^n ,为鞍点的概率为 1-0.5^n ,显然,当模型参数稍微一多,即n稍微一大,就会发现这个点为鞍点的概率会远大于局部最优点!
好吧我再啰嗦的举个栗子,已经反应过来的同学可以跳过这个栗子:
假设我们的模型有100个参数(实际深度学习模型中一般会远大于100),那么某一阶导数为0的点为局部最优点的概率为约为 0.5^{100}\approx10^{-31} ,而为鞍点的概率则为 1.0-10^{-31}\approx 1.0 。就算我们的模型在训练时使用了特别厉害的“超级梯度下降法”,它可以每走一步都恰好踩在一个一阶导数为0的点上,那么从数学期望上来看,我们需要走10^31步才行。而实际的projects中,哪怕数据集规模为千万级,我们分了100万个batches,然后要迭代100次,那也仅仅是走了 10^6*10^2=10^8 步,你真的觉得运气可以辣么好的走到局部最优点上去吗?所以实际中,当我们的深度学习模型收敛时,几乎没有必要认为它收敛到了一个局部最优点,这完全等同于杞人忧天。
也就是说,如果最后模型确实在梯度下降法的指引下收敛到了一个导数为0的点,那这个点几乎可以肯定就是一个鞍点。
如果我们的模型真的收敛到鞍点上了,会很可怕吗?
这就又回到了文章开头的那副马鞍状的图。
显然,站在马鞍中央的时候,虽然很难翻过两边的山坡,但是往前或者往后随便走一步就能摔下马鞍!而在文章《batch size》中小夕讲过,我们默认使用的mini-batch梯度下降法本身就是有噪声的梯度估计,哪怕我们位于梯度为0的点,也经常在某个mini-batch下的估计把它估计偏了,导致往前或者往后挪了一步摔下马鞍,也就是mini-batch的梯度下降法使得模型很容易逃离特征空间中的鞍点。
那么问题来了,既然局部最优点很难踩到,鞍点也很容易逃离出去,那么
为什么我们的模型看起来是收敛了呢?
初学者可能会说 “诶诶,会不会是学习率太大了,导致在“鞍点”附近震荡?” 首先,鞍点不像最优点那样容易震荡,而且哪怕你不断的减小学习率继续让模型收敛,大部分时候你这时计算output层或者后几层的梯度向量的长度时往往会发现它依然离0很遥远!(这句话是有实验支撑的,不过那篇论文我暂时没记起来,找到时贴出来)说明大部分时候收敛到的并不是鞍点。
那会不会踩到的鞍点太多,虽然前面的鞍点都轻松逃逸了,但是最后恰好收敛到一个跳不下去的鞍点身上了?
这倒是有可能,不排除有一些“马鞍面”特别平坦的鞍点区域,当模型陷入这种鞍点上时,由于计算出的梯度非常小,导致要连续迭代非常多次才可能慢慢移开这个鞍点,事实上大部分工程情况下,没等它移开的时候我们就已经默认为模型收敛、训练结束了,实际上人家模型还在努力逃离鞍点中呢。
不过话说回来,虽然高维空间中的鞍点数量远远大于最优点,而且鞍点数量随着特征空间维度增高而指数级增长,但是鞍点的数量在整个空间中又是微不足道的:按前面的假设,假设在某个维度上随机一跳有10%的概率踩到导数为0的点,那么我们在101维的空间中的一步恰好踩到这个点上的概率为10^-100,也就是说在101维空间里随机乱跳的时候,有10^-100的可能性踩到鞍点身上。因此,即使有难以逃离的鞍点,即使我们的优化算法在努力向附近的鞍点靠拢,那么被我们正好踩到那些难以逃离的特殊鞍点的概率也是非常小的。
所以更令人信服的是,在高维空间里(深度学习问题上)真正可怕的不是局部最优也不是鞍点问题,而是一些特殊地形。比如大面积的平坦区域:

在平坦区域,虽然导数不为0但是却不大。虽然是在不断下降但是路程却非常长。对于优化算法来说,它需要走很多很多步才有可能走过这一片平坦区域。甚至在这段地形的二阶导数过于特殊的情况下,一阶优化算法走无穷多步也走不出去(设想一下,如果终点在一米外,但是你第一次走0.5米,后续每一步都是前一步的一半长度,那么你永远也走不到面前的一米终点处)。
所以相比于栽到最优点和鞍点上,优化算法更有可能载到这种类似平坦区的地形中(如果这个平坦区又是“高原地带”,即loss值很高的地带,那么恭喜你悲剧了)。更糟糕的是,由于高维地形难以可视化,还有很多更复杂的未知地形会导致假收敛,一旦陷入到这些危险地形中,几乎是无解的。
所以说,在深度学习中,与其担忧陷入局部最优点怎么跳出来,更不如去考虑数据集要怎么做才能让网络更好学习,以及网络该怎么设计才能更好的捕获pattern,网络该怎么训练才能学到我们想让它学习的知识。