8. 深度學習實踐:優化(續)

接上部分討論:8. 深度學習實踐:優化

3. 基本算法

3.1 隨機梯度下降

SGD及其變種很可能是一般ML中應用最多的優化算法。

這裏寫圖片描述

關鍵參數:學習率。最好的選擇方法:監測目標函數值隨時間變化的學習曲線。與其科學,更像藝術。實踐中有必要隨時間逐漸降低學習率。

SGD(1998年就有了)、小批量、基於梯度優化的在線學習算法,一個重要性質:每一步更新的計算時間不依賴於訓練樣本數目的多寡。

3.2 動量(momentum)法

SGD的學習過程有時會很慢。動量法(1964年)旨在加速學習。積累了之前梯度指數級衰減的移動平均,並且繼續沿着該方向移動。

普通的梯度步驟會浪費時間在峽谷的窄軸上來回移動:

這裏寫圖片描述

動量正確的縱向穿過峽谷:

這裏寫圖片描述

動量主要針對兩個問題:一是海森矩陣的病態條件,二是隨機梯度的方差。該圖直觀解釋了第一個問題。紅色路徑表示動量學習規則所遵循的路徑,黑色箭頭表示梯度下降將在該點採取的步驟。

這裏寫圖片描述

動量版算法引入了變量v 充當速度角色,代表參數移動的方向和速率。速度被設定爲負梯度的指數衰減平均。動量一詞是物理類比,負梯度是移動參數空間中粒子的力。假設是單位質量,則速度向量v 可看作是粒子的動量。α 決定了之前梯度的貢獻衰減得有多大,越大則之前梯度對現在方向的影響也越大(放大了之前梯度的效果)。

步長大小爲:這裏寫圖片描述

例如,當α 爲 0.9 時,對應着最大速度10倍於梯度下降算法。當許多連續的梯度指向相同的方向時,步長最大。馬太效應的感覺。梯度下降算法基於每個梯度簡單的更新一步。動量算法則使用力改變粒子的速度。

3.3 Nesterov動量

受Nesterov加速梯度算法(1983,2004)啓發,Sutskever(2013)提出了動量算法的一個變種。和標準動量體現在梯度計算上。梯度計算在施加當前速度之後。

這裏寫圖片描述

4. 參數初始化策略

4.1 初始化很重要

有的優化算法是非迭代的,僅是求解一個解點(例如,求二次函數的最小值)。有的本質上是迭代的,但優化時能在可接受時間內收斂到可接受的解,並且與初始值無關(凸優化,不論從哪走,都可以到碗底)。

DL訓練算法通常沒有這兩種奢侈的性質。通常是迭代的,需要指定初始點。訓練網絡足夠困難,大多數算法很大程度地受到初始化選擇的影響。初始點能夠決定算法是否收斂。當學習收斂時,初始點可決定學習收斂得有多快,以及是否收斂到一個代價高或低的點。

現代的初始化策略是簡單的、啓發式的。設定改進的初始化策略很困難,因爲NN優化至今尚未很好理解。機理不知,沒有指導。一個比較確知的特性是:初始參數需要在不同單元間破壞對稱性。若相同激活函數的兩個隱藏單元連接到相同的輸入,則這些單元必須具有不同的初始參數。

4.2 常用的策略

本書講了2頁。理解沒到,看了僅是字面意思,暫不做筆記。

5. 自適應學習率算法

學習率是難以設置的超參數之一。若我們相信方向敏感度有些軸對齊(互相正交嗎?),則每個參數設置不同的學習率。在整個學習過程中自動適應這個學習率是有道理的。

以下討論內容,是基於梯度優化方法(學習率是超參數),本節做的改進的算法,對基本形式做了各種調整,學習率(步長)在訓練過程中成了一個變化着的值,謂之自適應。

5.1 AdaGrad算法

2011年。思路:獨立的適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根(平方根值越大,縮得越美,學習率越小了)。

這裏寫圖片描述

原來的參數更新,對於所有參數都使用相同的學習率。某一個參數向量變化爲:

θt+1,i=θt,iϵg

現在,學習率隨着每次迭代,根據歷史梯度變化:

θt+1,i=θt,iϵr+δg

r是d*d的對角矩陣,每個對角線位置i對應某個參數,i的值累加到t次迭代的對應參數的梯度平方和。平方根是因爲實踐中發現效果更好。

具有損失最大偏導的參數,則相應的有一個快速下降的學習率(縮得厲害)。具有小偏導的參數,在學習率上有相對較小的下降(縮得輕,學習率仍較大)。淨效果是參數空間中更平緩的傾斜方向上(小偏導)取得更大的進步(學習率較大),越是陡急的方向上步子小一些。(

凸優化時,該算法還行。然而經驗上已發現,對於訓練DL模型時,從訓練開始時就積累梯度平方會導致有效學習率過早和過量的減小。

5.2 RMSProp算法

2012年,Hinton修改AdaGrad算法,以在非凸設定下效果更好,改變梯度累積,爲指數加權的移動平均。當訓練非凸函數的NN時,Ada的學習軌跡可能穿過了很多不同鋼結構,最終到達一個局部是凸碗的區域。Ada根據平方梯度的整個歷史收縮學習率,可能使得學習率在達到這樣的凸結構前就變得很小了,從而勝利的前夜腳步慢了。

RMSProp使用指數衰減平均,以丟棄遙遠故去的歷史,使其能夠在找到凸碗結構後快速收斂,就像一個初始化於該碗狀結構的Ada算法實例。

算法標準形式:

這裏寫圖片描述

加上了一個衰減速率,代表着對以前結果的考慮,若爲0.5,則歷史和現在都考慮着,若未0.1,則歷史考慮1份,現在考慮9份。用來控制移動平均的長度範圍。其餘一樣。

結合Nesterov動量的形式:

這裏寫圖片描述

在動量中,步長因子上,考慮了累計梯度的效果。該法已被證明行之有效,目前常用。

5.3 Adam算法

2014年提出,源自“adaptive moments”,另一種學習率自適應的優化算法。

這裏寫圖片描述

主要是基於RMSProp法來做。Adam中,動量直接併入了梯度一階矩的估計(結合動量使用沒有明確的理論動機)。其次,Adam中包括偏置修正,修正從原點初始化的一階矩(動量項)和二階矩估計。RMSProp也採用了二階矩估計,但缺失了修正因子。Adam通常被認爲對超參數的選擇相當魯棒。

5.4 如何選擇?

沒有一致共識。具有自適應學習率的算法族表現很好,但沒有那個脫穎而出。

當前最流行的優化算法:SGD,動量SGD,RMSProp,動量RMSProp,Adam和AdaDelta。選擇哪個算法:取決於你對哪個較熟悉,以便調節超參數。

6. 二階近似方法

暫不做詳細閱讀和筆記。

6.1 牛頓法

6.2 共軛梯度

6.3 BFGS法

7. 優化策略和元算法

7.1 批標準化

設H是需要標準化的某層的小批量激活函數,排布爲設計矩陣。每個樣本的激活出現在矩陣的每一行中。爲了標準化H,將其替換爲:

H=Hμδ

μ 是包含每個單元均值的向量,δ 是包含每個單元標準差的向量。應用於矩陣H的每一行,每行內是逐元素運算。

本節暫不做詳細筆記。

7.2 座標下降

某些情況下,將優化問題分解可更快解決。我們相對於某個單一變量xi 最小化f(x) ,然後相對於另一個變量xj 等,反覆循環所有變量,達到局部極小值。稱之爲:座標下降法。更一般的,塊座標下降法,是指我們對於某個子集(子集中只有一個元素時就是單個座標下降了)的變量同時最小化。

當優化問題中的不同變量們,可以清楚分成相對獨立的組時,座標下降最有意義。舉例,有代價函數爲:

這裏寫圖片描述

這是稀疏編碼的學習問題。目標是尋求一個權重矩陣W(字典),可以線性解碼激活值矩陣H(稀疏表示),以重構訓練集X(原本樣本)。第一項說H要儘量稀疏(非0元儘量少),第二項說儘可能編碼X。以前做過筆記見《西瓜書》筆記11:特徵選擇與稀疏表示(三)

代價函數非凸,但如果將訓練算法的輸入分成兩個集合:字典W和表示H。最小化二者之一的任意一組變量的目標函數都是凸。塊座標下降允許我們高效的凸優化算法,交替做:固定H優化W,固定W優化H。

當然了,當一個變量的值很大程度地影響另一個變量的最優值時,座標下降不是一個很好的方法。

7.3 Polyak平均

Polyak平均(1992年)會平均優化算法在參數空間訪問軌跡中的幾個點。若t次迭代梯度下降訪問了點θ(1),...,θ(t) ,則Polyak平均算法的輸出是θ^(t)=1tiθ(i)

應用其到非凸問題時,通常會用指數衰減來計算平均值:

這裏寫圖片描述

7.4 監督預訓練

7.4.1 監督預訓練

模型如果太複雜,難以優化。任務如果很困難,直接訓練模型來解決的挑戰很大。那麼,可以訓練一個較簡單的模型來求解問題,然後逐步加大模型的複雜度可能會有效。訓練模型求解一個簡單問題,轉移到大問題上,有時也會有效。

預訓練:在直接訓練目標模型求解目標問題之前,訓練簡單模型求解簡單問題的方法(pretraining)。

貪心算法:將問題分解爲許多部分,然後獨立在每個部分求解最優值。但是,結合各個最佳部分不能保證得到一個最佳的完整解。然而,貪心算法計算上比求解最優聯合解高效得多,而且我們常會接受該解。貪心也可緊接一個 精調(fine-tuning)階段,聯合優化算法搜索全問題的最優解。使用貪心解,來初始化聯合優化算法,可以加大加速算法。

貪心預訓練,在DL中普遍存在。greedy supervised pretraining。在2007年Bengio的原始版本中,每個隱藏層,以先前訓練的隱藏層的輸出,爲輸入。

這裏寫圖片描述這裏寫圖片描述

2015年有版本是預訓練深度卷積網絡(11層),然後使用該網絡前4層、最後3層初始化更深的網絡(多達19層),並非一次預訓練一層。非常深的新網絡的中間層是隨機初始化的。然後聯合訓練新網絡。等等。

7.4.2 貪心預訓練爲什麼會有幫助?

2007年Bengio提出的假說:有助於更好地指導深層結構的中間層的學習。

默默無聞的中間層,有機會被拉出來重點關注下,因此它們挺開心,表現也很好。

遷移學習 想法:2014年在一組任務上,預訓練了一個8層權重的深度卷積網絡(ImageNet數據集的子集)。然後用該網絡的前k層初始化了一個同樣規模的網絡。然後第二個網絡的所有層,聯合訓練以執行不同的任務(ImageNet數據集的另一個子集),但訓練樣本小於第一個任務。(似乎是第一個捕捉到了某種神祕信息,遷移地用到了第二個上)

7.5 設計有助於優化的模型

實踐中,選擇一族容易優化的模型,比使用一個強大的優化算法更重要。NN在過去30年的大多數進步主要來自於改變模型族,而非改變優化過程。1980年代用於訓練NN的帶動量的SGD,仍然是現代NN的前沿算法。

現代NN的設計選擇體現在:層之間的線性變換,幾乎處處可導的激活函數,大部分定義域都有明顯的梯度。LSTM,ReLU,maxout單元都比先前的模型使用更多的線性函數。

其他的模型設計策略還包括:層之間的線性路徑,跳躍連接,減少了從較低層參數到輸出最短路徑的長度,緩解了梯度消失問題(2015年)。這是預訓練策略的替代方法。以這種方式,可在一個階段聯合訓練所有層,不改變架構,使得中間層,低層,可通過更短路徑得到一些如何更新的有用信息。

7.6 延拓法、課程學習

暫不做詳細筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章