先大致講一下什么是深度學習中優化算法吧,我們可以把模型比作函數,一種很復雜的函數:h(f(g(k(x)))),函數有參數,這些參數是未知的,深度學習中的“學習”就是通過訓練數據求解這些未知的參數。
由于這個函數太復雜了,沒辦法進行直接求解,所以只能換個思路:衡量模型的輸出與真實標簽之間的差距,如果差距過大,則調整模型參數,然后重新計算差距,如此反復迭代,直至差距在接受范圍內。
深度學習中通過目標函數或者損失函數衡量當前參數的好壞,而調整模型參數的就是優化算法。
所謂優化, 就是利用關于最優解的信息,不斷逼近最優解, 目前深度學習中最常用的是梯度下降法, 梯度方向就是最優解的信息,因為梯度方向指向最優解方向, 沿著梯度方向前進即可靠近最優解。
到這里,你是不是覺得優化算法很簡單?其實,不然。讓我們進一步分析。
難點一:梯度(困難指數兩顆星)
所謂梯度下降法,當然要計算梯度,前面那個復合函數再加上損失函數,最終要優化的函數是這個樣子:L(h(f(g(k(x)))),y),L是損失函數,y是標簽值。
復合函數通過鏈式法則進行求導,例如f(g(x)),
這就要求g(x)和f(x)都得可導,對于神經網絡而言,卷積層和全連接層都可以看作是矩陣與向量乘法,是可導的,剩下的就是激活函數和損失函數,好在目前常用的MSE,交叉熵損失函數,Sigmoid,Relu激活函數都是可導的。
所以,梯度的問題不大。
難點二:凸優化和非凸優化( 困難指數五顆星 )
深度學習由于多個隱藏層的疊加所形成的復合函數,外加損失函數,最終的函數往往不是凸函數。
所謂凸函數,就是只有全局最優解,通過梯度下降最終都能找到這個最優解,對于機器學習中的線性回歸的損失函數:最小二乘而言,它是一個凸函數,也就是說能找到使損失函數達到最小值的全局最優解。
在非凸函數中,存在大量的局部最優解,局部極值隨著特征維度的增加呈指數增長,優化算法很大概率找不到全局最優解,這也是優化算法最苦惱的地方。
如果只有局部最優解,那情況還不算最糟糕,畢竟局部最優解意味著從所有維度看都是最小值或者最大值,更糟糕的是鞍點,這種情況雖然一階導數都為零,但二階導數不同向,也就是說從某些維度看是極小值,而從某些維度看卻是極大值。
而且,不幸的是,隨著特征向量維度的增加,鞍點的數量也是隨著指數級增加的。
那如何逃離鞍點?
這里再次注意:這里我們所說的梯度下降指的是:使用全部樣本的損失的平均值來更新參數,這就意味著梯度的精度非常高,會精確地逼近鞍點,但我們不希望這樣,我們希望能夠跳出鞍點,幸好,隨機梯度下降SGD或者其變體(比如Momentun、Adam、mini-batch)的出現很大程度上解決了該問題。
例如,mini-batch是指每次參數更新只是用一小批樣本,這是一種有噪聲的梯度估計,哪怕我們位于梯度為0的點,也經常在某個mini-batch下的估計把它估計偏了,導致往前或者往后挪了一步摔下馬鞍,也就是mini-batch的梯度下降法使得模型很容易逃離特征空間中的鞍點。
既然,局部極值點也可接受,且又能有方法逃離鞍點,到這里你覺得問題就結束了嗎?還沒有,其實,神經網絡中最讓人望而生畏的不是局部最優點和鞍點,而是平坦地區,這些地區一經進入很難逃離。
總結來說,人們認為的深度神經網絡“容易收斂到局部最優”,很可能是一種想象,實際情況是,我們可能從來沒有找到過“局部最優”,更別說全局最優了。
所以,與其擔憂陷入局部最優點怎么跳出來,更不如去考慮數據集要怎么做才能讓網絡更好學習,以及網絡該怎么設計才能更好的捕獲pattern,網絡該怎么訓練才能學到我們想讓它學習的知識。
最后,也要為優化算法鳴個不平。其實這并不是優化算法的問題。是損失函數和網絡結構的錯,是他們的復雜性導致優化問題是一個非凸優化問題,優化算是是來解決問題的,而不是制造問題。
-
優化算法
+關注
關注
0文章
35瀏覽量
9715 -
函數
+關注
關注
3文章
4346瀏覽量
62972 -
深度學習
+關注
關注
73文章
5514瀏覽量
121551
發布評論請先 登錄
相關推薦
評論