你的模型真的陷入局部最优点了吗?
小夕曾經收到過一個提問:“小夕,我的模型總是在前幾次迭代后很快收斂了,陷入到了一個局部最優點,怎么也跳不出來,怎么辦?”
?
本文不是單純對這個問題的回答,不是羅列工程tricks,而是希望從理論層面上對產生類似疑問的人有所啟發。
真的結束于最優點嗎?
?
我們知道,在局部最優點附近,各個維度的導數都接近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的點上,那么從數學期望上來看,我們需要走步才行。而實際的projects中,哪怕數據集規模為千萬級,我們分了100萬個batches,然后要迭代100次,那也僅僅是走了步,你真的覺得運氣可以辣么好的走到局部最優點上去嗎?所以實際中,當我們的深度學習模型收斂時,幾乎沒有必要認為它收斂到了一個局部最優點,這完全等同于杞人憂天。
?
也就是說,如果最后模型確實在梯度下降法的指引下收斂到了一個導數為0的點,那這個點幾乎可以肯定就是一個鞍點。
?
如果我們的模型真的收斂到鞍點上了,會很可怕嗎?
?
這就又回到了文章開頭的那副馬鞍狀的圖。
顯然,站在馬鞍中央的時候,雖然很難翻過兩邊的山坡,但是往前或者往后隨便走一步就能摔下馬鞍!而在文章《batch size》中小夕講過,我們默認使用的mini-batch梯度下降法本身就是有噪聲的梯度估計,哪怕我們位于梯度為0的點,也經常在某個mini-batch下的估計把它估計偏了,導致往前或者往后挪了一步摔下馬鞍,也就是mini-batch的梯度下降法使得模型很容易逃離特征空間中的鞍點。
?
那么問題來了,既然局部最優點很難踩到,鞍點也很容易逃離出去,那么為什么我們的模型看起來是收斂了呢?
?
初學者可能會說 “誒誒,會不會是學習率太大了,導致在“鞍點”附近震蕩?” 首先,鞍點不像最優點那樣容易震蕩,而且哪怕你不斷的減小學習率繼續讓模型收斂,你這時計算output層或者后幾層的梯度向量的長度時會發現它依然離0很遙遠!(這句話是有實驗支撐的,不過那篇論文我找不到惹,也忘了名字了。熱心的觀眾幫忙補充一下哦)
?
難道,踩到的鞍點太多,最后恰好收斂到一個跳不下去的鞍點身上了?
雖然高維空間中的鞍點數量遠遠大于最優點,但是鞍點的數量在整個空間中又是微不足道的:按前面的假設,假設在某個維度上隨機一跳有10%的概率踩到導數為0的點,那么我們在101維的空間中的一步恰好踩到這個點上的概率為,也就是說在101維空間里隨機亂跳的時候,有的可能性踩到鞍點身上。因此,即使有難以逃離的鞍點,那么被我們正好踩到的概率也是非常小的。
?
所以更令人信服的是,在高維空間里(深度學習問題上)真正可怕的不是局部最優也不是鞍點問題,而是一些特殊地形。比如大面積的平坦區域:
?
(圖片來自《deep learning》)
?
在平坦區域,雖然導數不為0但是卻不大。雖然是在不斷下降但是路程卻非常長。對于優化算法來說,它需要走很多很多步才有可能走過這一片平坦區域。甚至在這段地形的二階導數過于特殊的情況下,一階優化算法走無窮多步也走不出去(設想一下,如果終點在一米外,但是你第一次走0.5米,后續每一步都是前一步的一半長度,那么你永遠也走不到面前的一米終點處)。
所以相比于栽到最優點和鞍點上,優化算法更有可能載到這種類似平坦區的地形中(如果這個平坦區又是“高原地帶”,即loss值很高的地帶,那么恭喜你悲劇了)。更糟糕的是,由于高維地形難以可視化,還有很多更復雜的未知地形會導致假收斂,一旦陷入到這些危險地形中,幾乎是無解的。
?
所以說,在深度學習中,與其擔憂模型陷入局部最優點怎么跳出來,更不如去好好考慮:
如何去設計一個盡量沒有“平坦區”等危險地形的loss空間,即著手于loss函數的設計以及深度學習模型的設計;
盡量讓模型的初始化點遠離空間中的危險地帶,讓最優化游戲開始于簡單模式,即著手于模型參數的初始化策略;
讓最優化過程更智能一點,該加速沖時加速沖,該大膽跳躍時就大膽跳,該慢慢踱步時慢慢走,對危險地形有一定的判斷力,如梯度截斷策略;
開外掛,本來下一步要走向死亡的,結果被外掛給拽回了安全區,如batch normalization策略等。
總結
以上是生活随笔為你收集整理的你的模型真的陷入局部最优点了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那些在家啃书自学算法的人,最后都找到工作
- 下一篇: 新手福利:百度官方中文教程,过年也要深度