链接:https://www.zhihu.com/question/68109802
编辑:深度学习与计算机视觉
声明:仅做学术分享,侵删
作者:夕小瑶
https://www.zhihu.com/question/68109802/answer/263503269
反对回答区中一部分称“模型收敛于鞍点”的回答。当然也有的大牛可以一针见血,那我就对这个问题多展开一下吧,让鲜血流的更猛烈一些。(害怕.jpg)
我们知道,在局部最优点附近,各个维度的导数都接近0,而我们训练模型最常用的梯度下降法又是基于导数与步长的乘积去更新模型参数的,因此一旦陷入了局部最优点,就像掉进了一口井,你是无法直着跳出去的,你只有连续不间断的依托四周的井壁努力向上爬才有可能爬出去。更何况梯度下降法的每一步对梯度正确的估计都在试图让你坠入井底,因此势必要对梯度“估计错很多次”才可能侥幸逃出去。那么从数学上看,什么才是局部最优点呢?
这个问题看似很白痴,很多人会说“局部最优点不就是在loss曲面上某个一阶导数为0的点嘛”。这就不准确啦,比如下面这个马鞍形状的中间的那个点:
图片来自《deep learning》
显然这个点也是(一阶)导数为0,但是肯定不是最优点。事实上,这个点就是我们常说的鞍点。
显然,只用一阶导数是难以区分最优点和鞍点的。
我们想一下,最优点和鞍点的区别不就在于其在各个维度是否都是最低点嘛~只要某个一阶导数为0的点在某个维度上是最高点而不是最低点,那它就是鞍点。而区分最高点和最低点当然就是用二阶导数(斜率从负变正的过程当然就是“下凸”,即斜率的导数大于0,即二阶导数大于0。反之则为“上凹”,二阶导数小于0)。也就是说,若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点啦。
那么二阶导数大于0和小于0的概率各是多少呢?由于我们并没有先验知识,因此按照最大熵原理,我们认为二阶导数大于和小于0的概率均为0.5!
那么对于一个有n个参数的机器学习/深度学习模型,“loss曲面”即位于n+1维空间(loss值为纵轴,n个参数为n个横轴)。在这个空间里,如果我们通过梯度下降法一路下滑终于滑到了一个各方向导数均为0的点,那么它为局部最优点的概率即 ,为鞍点的概率为 ,显然,当模型参数稍微一多,即n稍微一大,就会发现这个点为鞍点的概率会远大于局部最优点!
好吧我再啰嗦的举个栗子,已经反应过来的同学可以跳过这个栗子:
假设我们的模型有100个参数(实际深度学习模型中一般会远大于100),那么某一阶导数为0的点为局部最优点的概率为约为 ,而为鞍点的概率则为 。就算我们的模型在训练时使用了特别厉害的“超级梯度下降法”,它可以每走一步都恰好踩在一个一阶导数为0的点上,那么从数学期望上来看,我们需要走10^31步才行。而实际的projects中,哪怕数据集规模为千万级,我们分了100万个batches,然后要迭代100次,那也仅仅是走了 步,你真的觉得运气可以辣么好的走到局部最优点上去吗?所以实际中,当我们的深度学习模型收敛时,几乎没有必要认为它收敛到了一个局部最优点,这完全等同于杞人忧天。
也就是说,如果最后模型确实在梯度下降法的指引下收敛到了一个导数为0的点,那这个点几乎可以肯定就是一个鞍点。
这就又回到了文章开头的那副马鞍状的图。
显然,站在马鞍中央的时候,虽然很难翻过两边的山坡,但是往前或者往后随便走一步就能摔下马鞍!而在文章《batch size》中小夕讲过,我们默认使用的mini-batch梯度下降法本身就是有噪声的梯度估计,哪怕我们位于梯度为0的点,也经常在某个mini-batch下的估计把它估计偏了,导致往前或者往后挪了一步摔下马鞍,也就是mini-batch的梯度下降法使得模型很容易逃离特征空间中的鞍点。
那么问题来了,既然局部最优点很难踩到,鞍点也很容易逃离出去,那么
初学者可能会说 “诶诶,会不会是学习率太大了,导致在“鞍点”附近震荡?” 首先,鞍点不像最优点那样容易震荡,而且哪怕你不断的减小学习率继续让模型收敛,大部分时候你这时计算output层或者后几层的梯度向量的长度时往往会发现它依然离0很遥远!(这句话是有实验支撑的,不过那篇论文我暂时没记起来,找到时贴出来)说明大部分时候收敛到的并不是鞍点。
那会不会踩到的鞍点太多,虽然前面的鞍点都轻松逃逸了,但是最后恰好收敛到一个跳不下去的鞍点身上了?
这倒是有可能,不排除有一些“马鞍面”特别平坦的鞍点区域,当模型陷入这种鞍点上时,由于计算出的梯度非常小,导致要连续迭代非常多次才可能慢慢移开这个鞍点,事实上大部分工程情况下,没等它移开的时候我们就已经默认为模型收敛、训练结束了,实际上人家模型还在努力逃离鞍点中呢。
不过话说回来,虽然高维空间中的鞍点数量远远大于最优点,而且鞍点数量随着特征空间维度增高而指数级增长,但是鞍点的数量在整个空间中又是微不足道的:按前面的假设,假设在某个维度上随机一跳有10%的概率踩到导数为0的点,那么我们在101维的空间中的一步恰好踩到这个点上的概率为10^-100,也就是说在101维空间里随机乱跳的时候,有10^-100的可能性踩到鞍点身上。因此,即使有难以逃离的鞍点,即使我们的优化算法在努力向附近的鞍点靠拢,那么被我们正好踩到那些难以逃离的特殊鞍点的概率也是非常小的。
所以更令人信服的是,在高维空间里(深度学习问题上)真正可怕的不是局部最优也不是鞍点问题,而是一些特殊地形。比如大面积的平坦区域:
图片来自《deep learning》
在平坦区域,虽然导数不为0但是却不大。虽然是在不断下降但是路程却非常长。对于优化算法来说,它需要走很多很多步才有可能走过这一片平坦区域。甚至在这段地形的二阶导数过于特殊的情况下,一阶优化算法走无穷多步也走不出去(设想一下,如果终点在一米外,但是你第一次走0.5米,后续每一步都是前一步的一半长度,那么你永远也走不到面前的一米终点处)。
所以相比于栽到最优点和鞍点上,优化算法更有可能载到这种类似平坦区的地形中(如果这个平坦区又是“高原地带”,即loss值很高的地带,那么恭喜你悲剧了)。更糟糕的是,由于高维地形难以可视化,还有很多更复杂的未知地形会导致假收敛,一旦陷入到这些危险地形中,几乎是无解的。
所以说,在深度学习中,与其担忧陷入局部最优点怎么跳出来,更不如去考虑数据集要怎么做才能让网络更好学习,以及网络该怎么设计才能更好的捕获pattern,网络该怎么训练才能学到我们想让它学习的知识。
深度神经网络“容易收敛到局部最优”,很可能是一种想象,实际情况是,我们可能从来没有找到过“局部最优”,更别说全局最优了。
很多人都有一种看法,就是“局部最优是神经网络优化的主要难点”。这来源于一维优化问题的直观想象。在单变量的情形下,优化问题最直观的困难就是有很多局部极值,如
人们直观的想象,高维的时候这样的局部极值会更多,指数级的增加,于是优化到全局最优就更难了。然而单变量到多变量一个重要差异是,单变量的时候,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也没那么重要了。
作者:知乎用户
https://www.zhihu.com/question/68109802/answer/263714561
反对@夕小瑶的答案。我虽然(还)不是做机器学习的,但是优化在计算化学中也算是一个中心议题。假如说神经网络的梯度下降法和一般计算数学中的“梯度下降法”一样,并且只用到loss函数 的一阶偏导数 和 的话,那从原理上就很难出现@夕小瑶提到的那种在 (或者 )方向最大,并且在 (或者 )方向最小的一阶鞍点。为什么呢?因为优化的时候在 和 方向就是沿着 和 的负方向前进的啊,除非初始点正巧落到了坐标轴上,否则如何能沿着另外一个方向爬山呢?
那么,为什么最终的优化结果,又很可能是一个鞍点呢?实际上,不需要更多维空间,一个二维曲面就能演示出来。如下图(来自于Symmetry of second derivatives)所示, 完全可以在两个坐标轴方向都是“下凸”,但是在 方向是“上凸”。不妨假设在 轴及其邻域内 , 轴及其邻域内 (也就是说山脊并不是那么尖,而是可以很平坦的),那么根据最朴素的梯度下降法,对于初始点在坐标轴附近的系统,最终就收敛于图中这样有四条上山路径和四条下山路径的四岔鞍点(比三条上山/下山路径的“猴鞍点”还复杂一点)。
很显然,对于一个一般的函数,由于其一阶偏导数只考虑到了 沿坐标轴方向的变化,它根本就不能反映任何一个点沿任何其它方向的变化。考虑到 ,那么根据一阶偏导数来估计鞍点的数目也根本无法进行。如果我们对loss曲面一无所知,那么仅仅对于一个二元函数,收敛到鞍点的概率恐怕也是无穷大。当然了,我们似乎总是怀着良好的信念,认为实际遇到的函数的性质足够良好,并没有那么那么多猴鞍点、四岔鞍点、五岔鞍点……虽然好像没有什么理论上的证明,但至少根据大家对化学势能面的研究,这种信念在大多数情况下好像是有效的。
作者:looooooop
https://www.zhihu.com/question/68109802/answer/264008642
很多回答已经从梯度的角度深入分析了收敛性,在这里我补充一下这个问题和泛化能力的关系,解释一下为什么没有收敛也不妨碍应用。
tl;dr:首先在实际的训练中,由于SGD以及dropout等regularization方法的使用,
最后模型基本不可能收敛于某一个点,它只是处在了一个比较平坦的区域。其次,神经网络的神奇之处在于,在这个平坦的区域内随便选一个点(即网络参数)都会具有很好的泛化能力,且这个平坦区域越大,泛化能力越好,从而可以在测试集上取得比较好的结果。这也是神经网络应用广泛的原因。
1. 最后不会收敛到某一点。sgd和dropout等都相当于是在模型中注入了具有随机性的噪声,所以基本没有可能存在一个点,可以在这些噪声的干扰下得到零梯度。所以最终稳定的模型应该是处在一个区域内,这些噪声的干扰不会让模型脱离这个区域。
2. 没有收敛并不是坏事。尽管模型最后并没有收敛到某一个点,我们仍将最后的稳定位置称为一个minima,在这里minima指的并不是点,而是一个区域。在这个区域里面,loss surface是基本平坦的,且低于周围的位置,看起来像是一个盆地。在[1]里面,作者指出神经网络的loss surface上会有很多这种minima,使用sgd得到的minima的函数值通常都比较小。这和我们的经验是相符合的:配合各种训练方法,随机初始化的神经网络训练到最后的training loss都会比较小。特别地,[1]里面提到全局最优的参数往往意味着严重过拟合(可以从数据存在噪声的角度理解这个结论)。在[2]以及它引用的一些文献中,我们可以看到,这些小“盆地”的面积和网络泛化能力强相关。通常,面积大的盆地(flat minima)泛化能力好(可以从loss对权重噪声的稳定性上理解)。
[1] Choromanska, A., Henaff, M., Mathieu, M., Arous, G. B., & LeCun, Y. (2015, February). The loss surfaces of multilayer networks. In Artificial Intelligence and Statistics (pp. 192-204).
[2] Hochreiter, S., & Schmidhuber, J. (1997). Flat minima. Neural Computation, 9(1), 1-42.
作者:李珂
https://www.zhihu.com/question/68109802/answer/261755787
因为你的直觉是错的。
你以为你所优化的神经网络参数空间可能会像下图一样陷入local minima:
图片来源:Deep Learning Specialization by Andrew Ng
但实际上在高维空间中绝大多数梯度值为0的点不是上图所示的local minima,而是saddle point(我们在将低维空间中的直觉想当然地推广到高维时出现了问题):
图片来源:Deep Learning Specialization by Andrew Ng
假设在一个20,000维的参数空间中,如果某个点梯度值为0,那么在每个方向上既可以是凸(convex)函数也可以是凹(concave)函数(如下图所示)。但要想该点成为local minima的话,所有的20,000个方向都必须是凸的,在神经网络构成的巨大的参数空间中,这个概率是十分小的。
图片来源:Deep Learning Specialization by Andrew Ng
作者:苏剑林
https://www.zhihu.com/question/68109802/answer/1533958114
我很奇怪这两个东西有什么逻辑关系吗?人干活很多时候连局部最优都做不到,难道就不用干了吗?比如你每天上班的路线,我估计也不是一个局部最优解,更不用说全局最优,难道就不用上班了?你等下想要吃的晚餐,也不一定就是最有营养的,难道就不吃了?
我们从来就没有多少次要求自己得到最优解的行为,何苦强求模型最优解?反过来讲,既然我们的“远远不足最优解”还能让我们好好活着,那就说明模型也未必需要最优解。
作者:知乎用户
https://www.zhihu.com/question/68109802/answer/262019967
SGD被广泛用于训练神经网络的主要原因是,在实际中好用。
对于机器学习来说,是不是收敛到局部最优其实无所谓,只要拿到的model能generalize就是好model。更极端点的说,其实很多时候收不收敛都无所谓,这个在深度学习里不少吧。
至于说一定要研究收敛到什么样的解,都是从理论的角度出发。所谓追求“deep thinking”嘛。不过很多时候deep thinking被狭隘的理解为deep math,完全是本末倒置了。
很多时候,所谓“理论上的局限性”只是做理论的人的局限性。因为没做明白嘛!
作者:Ginger
https://www.zhihu.com/question/68109802/answer/1679865421
这种优化问题其实大都是为了解释而解释,强行解释。其实在数据在高维空间形态各异,每种优化方法也可能在某些数据流型上适用。而对于它们之间的比较,不同的实验数据甚至模型都会让优化算法的高低排位重新洗牌。这也是为什么到目前为止并没有一个有效的确定的优化算法。
就像中医一样,靠经验就行。根据经验风险最小化,adam最好,而且没必要指定lr。
虽然有极少情况下它确实不收敛,在扫完一两个epoch之后,acc等指标雪崩。
作者:张翰韬
https://www.zhihu.com/question/68109802/answer/262985356
梯度下降通常是收敛到saddle points而不是收敛到局部最优,尤其是高维问题里面。目前,还没有很好的方法来解决神经网络里面的优化问题。实际上这一类问题通常不是凸优化问题,它不像凸优化问题性质那么好,但是目前基本都是借鉴凸优化的解决办法,比如梯度下降。另一方面,其实我们很多时候也不是说一定要最优解甚至全局最优解,够用就行了。
梯度下降简单,易于实现,如果考虑二阶优化的话,比如L-BFGS,那么通常需要你的硬件能够支持full batch update。现在人们针对梯度下降又设计了很多改进方法,来解决优化过程中被困在saddle points,或者local minima 的问题。主要有两类改进:一类是SGD + Momentum,可以理解为下坡的时候增加一点前面步骤留下来的惯性;另一类是AdaGrad,可以理解为在学习率上面动手脚, 使得每一个参数更新都会有自己与众不同的学习率。如果对AdaGrad里面grad_squared (dx^2)那一项加入Momentum那就是RMSProp,再给grad (dx)加上Momentum就是Adam,这些就是现在最常用的梯度下降法的延伸,确实能在一定程度上解决大部分问题。
作者:知乎用户
https://www.zhihu.com/question/68109802/answer/260067336
其实是分情况的,对于人类自己定义的知识集图谱内,存在比SGD更好的办法,AlphaZero就是一个例子,因为围棋的规则还有信息对于机器是完全透明公开的,所以它可以在短短时间内就超越前代经过人工训练的版本,甚至发现许多新的套路和招式(避开了陷入Local minimum的坑)。
然而在现实世界中,人们对于许多问题的信息并不是百分百清楚了解的,因为这些隐藏的未知信息,影响了我们的判断,也成为了让机器找到全局最优解的障碍,这种情况下,我们只能接受不完美,努力获取更多的信息.
个人认为,机器学习其实就是在大海捞针,以前我们人力有限,现在因为我们拥有近乎无限的计算力,所以可以,不同的区别在于,我们所处的海(问题领域)不尽相同,对于那些我们已知边界的海洋,我们是可以找到那一根针(最优解)的,而对于有的海洋,如同浩瀚宇宙一般无边无际的时候(受限于时间空间),我们所能做的就是找到一根最像针的物件作为我们的解。
SGD应用的广泛归根究底其实是我们还需要更努力的去探索这个世界
作者:KizW
https://www.zhihu.com/question/68109802/answer/262085594
先不管他是能不能局部最优,至少当初gd从凸优化过来,人家确实想找个最优解。而且mit那个deep learning那个书前面讲了好多怎么跳出saddle points,怎么跳出局部最优的吗。
就算你找到了个算法,能达到全局最优,但是你实际问题上不好用,因为问题本身有随机性,模型本身存在误差,另外你那个数据集不能包含整个问题空间的所有情况。就像比如一个人男生找女朋友,结果次次被骗,那么他就学习到了女生都是骗子,所以实际训练出来的网络可能是个喷子。好多算法模型确实是凸的,所以能找到全局最优解,但实际上工程师们不喜欢全局最优解,所以会搞个正则化项在模型里。
从数学的角度来讲,数值优化确实想找到最优解,但是大家发现挺难找的。但从机器学习的角度来讲,我们一开始就不想要最优解,当然要是我们有无限的数据量,无限的计算能力,那么我们肯定也想要最优解啊。类似的情况是机器人定位,现在传感器和控制器都有误差,最早用determinate的模型效果很差,现在在模型里人为引入误差,反而定位定的很准。反正做计算机别和做数学的混到一起了,管你数学上的性质有多好,解决不了问题都白扯。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓