国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【DL-CV】更高級的參數更新/優化(一)

tinyq / 2994人閱讀

摘要:對所有參數更新時應用同樣的學習率梯度由許多偏導數組成,對應著各個參數的更新。對于偏導數大的,我們希望配個小的學習率給他對于偏導數小的,我們希望配個大的學習率給他,這樣各個參數都能獲得大致相同的更新幅度,提高網絡的健壯性。

后續【DL-CV】更高級的參數更新/優化(二)

【DL-CV】正則化,Dropout<前篇---后篇>【DL-CV】淺談GoogLeNet(咕咕net)


原版SGD的問題

原味版的SGD(以下稱SGD)是通過死跟負梯度方向來對參數進行更新的,也就是走一步、停下確定方向、再走一步,如此循環。非常簡單,非常老實的走法不是麼?但是SGD這個相對簡單的算法在實際使用中還是會產生不少的問題,下面我們來看看最主要的幾個


1??SGD 一旦陷入損失的局部最小值或鞍點(既不是最大值也不是最小值的臨界點)訓練將變得緩慢:

作為問題的引入我們先考慮參數只有一個的情況下損失關于該參數的圖(如上,x軸是該參數,y軸是損失)

當SGD遇到局部最小值時,因為梯度為0,參數不會更新,最終就卡在局部最小值這個點了

當SGD遇到或接近鞍點時,同樣梯度為0或非常小,參數也幾乎不會更新,于是也卡在該鞍點

這是一維的情況,在高維的情況下(上千上萬個參數),局部最小值意味著所有參數無論往哪個方向走損失都會增大,這其實是非常罕見的事情。而高維情況下的鞍點可以這樣理解,即在該點下某些方向會使損失增大,某些方向會使損失減少;所以在高維情況下遇到鞍點將會是非常常見的事情,在鞍點附近訓練速度將會變得緩慢。


2??SGD 對所有參數更新時應用同樣的學習率:
梯度由許多偏導數組成,對應著各個參數的更新。對于偏導數大的,我們希望配個小的學習率給他;對于偏導數小的,我們希望配個大的學習率給他,這樣各個參數都能獲得大致相同的更新幅度,提高網絡的健壯性。可惜SGD固定死的學習率不能滿足我們的要求


3??SGD 在遇到噪聲時,訓練將變得緩慢:
SGD 是通過隨機抽取小批量樣本進行訓練的,是對每次損失和梯度的估計(不像批量學習一樣全部訓練樣本全往里塞獲得真實的損失和估計),當估計中存在噪音,參數更新的方向會受到影響而偏離,導致訓練時間延長


綜上,使用原版的SGD進行參數更新帶來的體驗并不是那么好(需要更新換代啦)。還好的是,偉大的研究人員,或是對原版SGD進行了各種各樣的魔改,或是靈光一閃提出新的更新算法,現在已經有多種更高級的參數更新的方法啦,下面就來看一下

普通動量更新

該方法的關鍵是引入一個速度的概念。速度這個量將對歷次求得的梯度進行累加,在每次累加時會有一參數$gamma$對原速度進行衰減處理后再進行累加。參數更新時,我們不在根據當前的負梯度方向進行更新,而是根據當前速度方向更新。這樣引入速度之后 SGD卡在局部最小值和鞍點的問題 會得到有效解決,從而加速訓練。

上面的說明不懂沒關系,看了下面的比喻你便會豁然開朗

想象有一座高山,其高度代表損失值;有一個小球代表著參數,在山的不同點有不同的值;我們的目標是讓小球滾到山底取得最優參數(下山的過程就是訓練的過程)。在這種想象下,負梯度就相當于重力在斜面上的分力使得小球有下降的趨勢,小球在下降的過程中因為重力做正功速度會增加;也因為這個速度的存在,小球會安然越過小山谷(對應局部最小值)或平原(對應鞍點)繼續下山。當小球真正接近“U型”山底時,小球會在山底來回擺動,最后因為阻力(對應參數$gamma$)而停在山底(參數訓練完成)。

懂了下面就放公式,順便比較SGD和魔改后的SGD,公式中的t代表第t次迭代更新

SGD SGD + 動量
公式(x是待更新參數) $$x_{t+1}=x_t-alpha abla_xL(x_t)$$ $$v_{t+1}=gamma v_t+alpha abla_xL(x_t)$$$$x_{t+1}=x_t-v_{t+1}$$
代碼實現

至于參數$gamma$,其存在相當于摩擦力,可使使速度衰減。如果沒有$gamma$,小球到達最后的“U型”山底就不會停下來,訓練時參數可能就收斂不了。$gamma$常為[0.5,0.9,0.95,0.99]中的一個,并且通常為0.9。$gamma$也可以隨著訓練的進行而逐漸上升,如剛開始將$gamma$設為0.5而在后面的多個epoch中慢慢提升到0.99

Nesterov動量

Nesterov動量與普通動量原理上有些許不同(Nesterov動量可以說是普通動量的小升級)。在理論上對于凸函數Nesterov動量能得到更好的收斂,在實踐中也確實比普通動量表現更好一些。

使用Nesterov動量時,不會計算當前點的梯度,而是先往速度方向步進到下一點,計算這“下一點”的梯度,然后回到原點把這“下一點”的梯度加到速度上,再用累加后的速度在原點上進行步進。這個看似多此一舉的操作并不是無意義的,計算“下一點”的梯度可以看作是對未來位置梯度的預測從而提前對速度方向進行修正,從而進一步加快訓練速度。下面來對比一下普通動量和Nesterov動量:

普通動量 Nesterov動量
圖示
公式 $$v_{t+1}=gamma v_t+alpha abla_xL(x_t)$$$$x_{t+1}=x_t-v_{t+1}$$ $$v_{t+1}=gamma v_t + alpha abla_xL(x_t - gamma v_t)$$$$x_{t+1} = x_t-v_{t+1}$$

這兩個動量更新方法都有效解決了SGD的問題1??

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19802.html

相關文章

  • DL-CV高級參數新/優化(二)

    續【DL-CV】更高級的參數更新(一) 【DL-CV】正則化,Dropout【DL-CV】淺談GoogLeNet(咕咕net) Adagrad 全名 Adaptive gradient algorithm ,翻譯過來就是適應梯度算法,該算法能根據梯度中偏導數的大小給不同的偏導數以不同的學習率,偏導數大(小)的給個小(大)的學習率,以此來減少參數更新時的擺動。 其核心是引入一個參數對歷次的梯度的平方...

    jone5679 評論0 收藏0
  • DL-CV高級參數新/優化(二)

    續【DL-CV】更高級的參數更新(一) 【DL-CV】正則化,Dropout【DL-CV】淺談GoogLeNet(咕咕net) Adagrad 全名 Adaptive gradient algorithm ,翻譯過來就是適應梯度算法,該算法能根據梯度中偏導數的大小給不同的偏導數以不同的學習率,偏導數大(小)的給個小(大)的學習率,以此來減少參數更新時的擺動。 其核心是引入一個參數對歷次的梯度的平方...

    lemon 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<