你的模型真的陷入局部最优点了吗?
小夕曾經(jīng)收到過一個(gè)提問:“小夕,我的模型總是在前幾次迭代后很快收斂了,陷入到了一個(gè)局部最優(yōu)點(diǎn),怎么也跳不出來,怎么辦?”
?
本文不是單純對(duì)這個(gè)問題的回答,不是羅列工程tricks,而是希望從理論層面上對(duì)產(chǎn)生類似疑問的人有所啟發(fā)。
真的結(jié)束于最優(yōu)點(diǎn)嗎?
?
我們知道,在局部最優(yōu)點(diǎn)附近,各個(gè)維度的導(dǎo)數(shù)都接近0,而我們訓(xùn)練模型最常用的梯度下降法又是基于導(dǎo)數(shù)與步長的乘積去更新模型參數(shù)的,因此一旦陷入了局部最優(yōu)點(diǎn),就像掉進(jìn)了一口井,你是無法直著跳出去的,你只有連續(xù)不間斷的依托四周的井壁努力向上爬才有可能爬出去。更何況梯度下降法的每一步對(duì)梯度正確的估計(jì)都在試圖讓你墜入井底,因此勢必要對(duì)梯度“估計(jì)錯(cuò)很多次”才可能僥幸逃出去。那么從數(shù)學(xué)上看,什么才是局部最優(yōu)點(diǎn)呢?
?
這個(gè)問題看似很白癡,很多人會(huì)說“局部最優(yōu)點(diǎn)不就是在loss曲面上某個(gè)一階導(dǎo)數(shù)為0的點(diǎn)嘛”。這就不準(zhǔn)確啦,比如下面這個(gè)馬鞍形狀的中間的那個(gè)點(diǎn):
(圖片來自《deep learning》)
?
顯然這個(gè)點(diǎn)也是(一階)導(dǎo)數(shù)為0,但是肯定不是最優(yōu)點(diǎn)。事實(shí)上,這個(gè)點(diǎn)就是我們常說的鞍點(diǎn)。
?
顯然,只用一階導(dǎo)數(shù)是難以區(qū)分最優(yōu)點(diǎn)和鞍點(diǎn)的。
我們想一下,最優(yōu)點(diǎn)和鞍點(diǎn)的區(qū)別不就在于其在各個(gè)維度是否都是最低點(diǎn)嘛~只要某個(gè)一階導(dǎo)數(shù)為0的點(diǎn)在某個(gè)維度上是最高點(diǎn)而不是最低點(diǎn),那它就是鞍點(diǎn)。而區(qū)分最高點(diǎn)和最低點(diǎn)當(dāng)然就是用二階導(dǎo)數(shù)(斜率從負(fù)變正的過程當(dāng)然就是“下凸”,即斜率的導(dǎo)數(shù)大于0,即二階導(dǎo)數(shù)大于0。反之則為“上凹”,二階導(dǎo)數(shù)小于0)。也就是說,若某個(gè)一階導(dǎo)數(shù)為0的點(diǎn)在至少一個(gè)方向上的二階導(dǎo)數(shù)小于0,那它就是鞍點(diǎn)啦。
那么二階導(dǎo)數(shù)大于0和小于0的概率各是多少呢?由于我們并沒有先驗(yàn)知識(shí),因此按照最大熵原理,我們認(rèn)為二階導(dǎo)數(shù)大于和小于0的概率均為0.5!
?
那么對(duì)于一個(gè)有n個(gè)參數(shù)的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)模型,“l(fā)oss曲面”即位于n+1維空間(loss值為縱軸,n個(gè)參數(shù)為n個(gè)橫軸)。在這個(gè)空間里,如果我們通過梯度下降法一路下滑終于滑到了一個(gè)各方向?qū)?shù)均為0的點(diǎn),那么它為局部最優(yōu)點(diǎn)的概率即,為鞍點(diǎn)的概率為,顯然,當(dāng)模型參數(shù)稍微一多,即n稍微一大,就會(huì)發(fā)現(xiàn)這個(gè)點(diǎn)為鞍點(diǎn)的概率會(huì)遠(yuǎn)大于局部最優(yōu)點(diǎn)!
好吧我再啰嗦的舉個(gè)栗子,已經(jīng)反應(yīng)過來的同學(xué)可以跳過這個(gè)栗子:
假設(shè)我們的模型有100個(gè)參數(shù)(實(shí)際深度學(xué)習(xí)模型中一般會(huì)遠(yuǎn)大于100),那么某一階導(dǎo)數(shù)為0的點(diǎn)為局部最優(yōu)點(diǎn)的概率為約為,而為鞍點(diǎn)的概率則為。就算我們的模型在訓(xùn)練時(shí)使用了特別厲害的“超級(jí)梯度下降法”,它可以每走一步都恰好踩在一個(gè)一階導(dǎo)數(shù)為0的點(diǎn)上,那么從數(shù)學(xué)期望上來看,我們需要走步才行。而實(shí)際的projects中,哪怕數(shù)據(jù)集規(guī)模為千萬級(jí),我們分了100萬個(gè)batches,然后要迭代100次,那也僅僅是走了步,你真的覺得運(yùn)氣可以辣么好的走到局部最優(yōu)點(diǎn)上去嗎?所以實(shí)際中,當(dāng)我們的深度學(xué)習(xí)模型收斂時(shí),幾乎沒有必要認(rèn)為它收斂到了一個(gè)局部最優(yōu)點(diǎn),這完全等同于杞人憂天。
?
也就是說,如果最后模型確實(shí)在梯度下降法的指引下收斂到了一個(gè)導(dǎo)數(shù)為0的點(diǎn),那這個(gè)點(diǎn)幾乎可以肯定就是一個(gè)鞍點(diǎn)。
?
如果我們的模型真的收斂到鞍點(diǎn)上了,會(huì)很可怕嗎?
?
這就又回到了文章開頭的那副馬鞍狀的圖。
顯然,站在馬鞍中央的時(shí)候,雖然很難翻過兩邊的山坡,但是往前或者往后隨便走一步就能摔下馬鞍!而在文章《batch size》中小夕講過,我們默認(rèn)使用的mini-batch梯度下降法本身就是有噪聲的梯度估計(jì),哪怕我們位于梯度為0的點(diǎn),也經(jīng)常在某個(gè)mini-batch下的估計(jì)把它估計(jì)偏了,導(dǎo)致往前或者往后挪了一步摔下馬鞍,也就是mini-batch的梯度下降法使得模型很容易逃離特征空間中的鞍點(diǎn)。
?
那么問題來了,既然局部最優(yōu)點(diǎn)很難踩到,鞍點(diǎn)也很容易逃離出去,那么為什么我們的模型看起來是收斂了呢?
?
初學(xué)者可能會(huì)說 “誒誒,會(huì)不會(huì)是學(xué)習(xí)率太大了,導(dǎo)致在“鞍點(diǎn)”附近震蕩?” 首先,鞍點(diǎn)不像最優(yōu)點(diǎn)那樣容易震蕩,而且哪怕你不斷的減小學(xué)習(xí)率繼續(xù)讓模型收斂,你這時(shí)計(jì)算output層或者后幾層的梯度向量的長度時(shí)會(huì)發(fā)現(xiàn)它依然離0很遙遠(yuǎn)!(這句話是有實(shí)驗(yàn)支撐的,不過那篇論文我找不到惹,也忘了名字了。熱心的觀眾幫忙補(bǔ)充一下哦)
?
難道,踩到的鞍點(diǎn)太多,最后恰好收斂到一個(gè)跳不下去的鞍點(diǎn)身上了?
雖然高維空間中的鞍點(diǎn)數(shù)量遠(yuǎn)遠(yuǎn)大于最優(yōu)點(diǎn),但是鞍點(diǎn)的數(shù)量在整個(gè)空間中又是微不足道的:按前面的假設(shè),假設(shè)在某個(gè)維度上隨機(jī)一跳有10%的概率踩到導(dǎo)數(shù)為0的點(diǎn),那么我們在101維的空間中的一步恰好踩到這個(gè)點(diǎn)上的概率為,也就是說在101維空間里隨機(jī)亂跳的時(shí)候,有的可能性踩到鞍點(diǎn)身上。因此,即使有難以逃離的鞍點(diǎn),那么被我們正好踩到的概率也是非常小的。
?
所以更令人信服的是,在高維空間里(深度學(xué)習(xí)問題上)真正可怕的不是局部最優(yōu)也不是鞍點(diǎn)問題,而是一些特殊地形。比如大面積的平坦區(qū)域:
?
(圖片來自《deep learning》)
?
在平坦區(qū)域,雖然導(dǎo)數(shù)不為0但是卻不大。雖然是在不斷下降但是路程卻非常長。對(duì)于優(yōu)化算法來說,它需要走很多很多步才有可能走過這一片平坦區(qū)域。甚至在這段地形的二階導(dǎo)數(shù)過于特殊的情況下,一階優(yōu)化算法走無窮多步也走不出去(設(shè)想一下,如果終點(diǎn)在一米外,但是你第一次走0.5米,后續(xù)每一步都是前一步的一半長度,那么你永遠(yuǎn)也走不到面前的一米終點(diǎn)處)。
所以相比于栽到最優(yōu)點(diǎn)和鞍點(diǎn)上,優(yōu)化算法更有可能載到這種類似平坦區(qū)的地形中(如果這個(gè)平坦區(qū)又是“高原地帶”,即loss值很高的地帶,那么恭喜你悲劇了)。更糟糕的是,由于高維地形難以可視化,還有很多更復(fù)雜的未知地形會(huì)導(dǎo)致假收斂,一旦陷入到這些危險(xiǎn)地形中,幾乎是無解的。
?
所以說,在深度學(xué)習(xí)中,與其擔(dān)憂模型陷入局部最優(yōu)點(diǎn)怎么跳出來,更不如去好好考慮:
如何去設(shè)計(jì)一個(gè)盡量沒有“平坦區(qū)”等危險(xiǎn)地形的loss空間,即著手于loss函數(shù)的設(shè)計(jì)以及深度學(xué)習(xí)模型的設(shè)計(jì);
盡量讓模型的初始化點(diǎn)遠(yuǎn)離空間中的危險(xiǎn)地帶,讓最優(yōu)化游戲開始于簡單模式,即著手于模型參數(shù)的初始化策略;
讓最優(yōu)化過程更智能一點(diǎn),該加速?zèng)_時(shí)加速?zèng)_,該大膽跳躍時(shí)就大膽跳,該慢慢踱步時(shí)慢慢走,對(duì)危險(xiǎn)地形有一定的判斷力,如梯度截?cái)嗖呗?#xff1b;
開外掛,本來下一步要走向死亡的,結(jié)果被外掛給拽回了安全區(qū),如batch normalization策略等。
總結(jié)
以上是生活随笔為你收集整理的你的模型真的陷入局部最优点了吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那些在家啃书自学算法的人,最后都找到工作
- 下一篇: 禁术级竞赛刷分技巧:找到跟测试集最接近的