接上部分討論:8. 深度學習實踐:優化
3. 基本算法
3.1 隨機梯度下降
SGD及其變種很可能是一般ML中應用最多的優化算法。
關鍵參數:學習率。最好的選擇方法:監測目標函數值隨時間變化的學習曲線。與其科學,更像藝術。實踐中有必要隨時間逐漸降低學習率。
SGD(1998年就有了)、小批量、基於梯度優化的在線學習算法,一個重要性質:每一步更新的計算時間不依賴於訓練樣本數目的多寡。
3.2 動量(momentum)法
SGD的學習過程有時會很慢。動量法(1964年)旨在加速學習。積累了之前梯度指數級衰減的移動平均,並且繼續沿着該方向移動。
普通的梯度步驟會浪費時間在峽谷的窄軸上來回移動:
動量正確的縱向穿過峽谷:
動量主要針對兩個問題:一是海森矩陣的病態條件,二是隨機梯度的方差。該圖直觀解釋了第一個問題。紅色路徑表示動量學習規則所遵循的路徑,黑色箭頭表示梯度下降將在該點採取的步驟。
動量版算法引入了變量
步長大小爲:
例如,當
3.3 Nesterov動量
受Nesterov加速梯度算法(1983,2004)啓發,Sutskever(2013)提出了動量算法的一個變種。和標準動量體現在梯度計算上。梯度計算在施加當前速度之後。
4. 參數初始化策略
4.1 初始化很重要
有的優化算法是非迭代的,僅是求解一個解點(例如,求二次函數的最小值)。有的本質上是迭代的,但優化時能在可接受時間內收斂到可接受的解,並且與初始值無關(凸優化,不論從哪走,都可以到碗底)。
DL訓練算法通常沒有這兩種奢侈的性質。通常是迭代的,需要指定初始點。訓練網絡足夠困難,大多數算法很大程度地受到初始化選擇的影響。初始點能夠決定算法是否收斂。當學習收斂時,初始點可決定學習收斂得有多快,以及是否收斂到一個代價高或低的點。
現代的初始化策略是簡單的、啓發式的。設定改進的初始化策略很困難,因爲NN優化至今尚未很好理解。機理不知,沒有指導。一個比較確知的特性是:初始參數需要在不同單元間破壞對稱性。若相同激活函數的兩個隱藏單元連接到相同的輸入,則這些單元必須具有不同的初始參數。
4.2 常用的策略
本書講了2頁。理解沒到,看了僅是字面意思,暫不做筆記。
5. 自適應學習率算法
學習率是難以設置的超參數之一。若我們相信方向敏感度有些軸對齊(互相正交嗎?),則每個參數設置不同的學習率。在整個學習過程中自動適應這個學習率是有道理的。
以下討論內容,是基於梯度優化方法(學習率是超參數),本節做的改進的算法,對基本形式做了各種調整,學習率(步長)在訓練過程中成了一個變化着的值,謂之自適應。
5.1 AdaGrad算法
2011年。思路:獨立的適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根(平方根值越大,縮得越美,學習率越小了)。
原來的參數更新,對於所有參數都使用相同的學習率。某一個參數向量變化爲:
現在,學習率隨着每次迭代,根據歷史梯度變化:
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,將其替換爲:
本節暫不做詳細筆記。
7.2 座標下降
某些情況下,將優化問題分解可更快解決。我們相對於某個單一變量
當優化問題中的不同變量們,可以清楚分成相對獨立的組時,座標下降最有意義。舉例,有代價函數爲:
這是稀疏編碼的學習問題。目標是尋求一個權重矩陣W(字典),可以線性解碼激活值矩陣H(稀疏表示),以重構訓練集X(原本樣本)。第一項說H要儘量稀疏(非0元儘量少),第二項說儘可能編碼X。以前做過筆記見《西瓜書》筆記11:特徵選擇與稀疏表示(三)。
代價函數非凸,但如果將訓練算法的輸入分成兩個集合:字典W和表示H。最小化二者之一的任意一組變量的目標函數都是凸。塊座標下降允許我們高效的凸優化算法,交替做:固定H優化W,固定W優化H。
當然了,當一個變量的值很大程度地影響另一個變量的最優值時,座標下降不是一個很好的方法。
7.3 Polyak平均
Polyak平均(1992年)會平均優化算法在參數空間訪問軌跡中的幾個點。若t次迭代梯度下降訪問了點
應用其到非凸問題時,通常會用指數衰減來計算平均值:
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 延拓法、課程學習
暫不做詳細筆記。