姬壯偉
(長治學院計算機系,山西長治 046011)
深度學習是近年來發(fā)展十分迅速的研究領域,并且在人工智能的很多子領域都取得了巨大的成功,從移動端的人臉識別,到alphago機器人擊敗人類職業(yè)圍棋選手,現(xiàn)代人的生活已經(jīng)和人工智能密切相關。
人工神經(jīng)網(wǎng)絡是人工智能研究領域最熱的深度學習模型,由早期的神經(jīng)科學家受到人腦神經(jīng)系統(tǒng)的啟發(fā)構(gòu)造而成,該網(wǎng)絡是指由很多人工神經(jīng)元構(gòu)成的網(wǎng)絡結(jié)構(gòu)模型,這些人工神經(jīng)元之間的連接強度便是可學習的參數(shù)。隨著人工神經(jīng)網(wǎng)絡越來越復雜,數(shù)據(jù)越來越多,計算量急劇增加,我們需要在神經(jīng)網(wǎng)絡參數(shù)學習上花費的時間也就越來越多,可是現(xiàn)實中往往為了解決復雜的問題,復雜的網(wǎng)絡結(jié)構(gòu)和大數(shù)據(jù)又是不可避免的,神經(jīng)網(wǎng)絡的優(yōu)化器便由此而生,通過優(yōu)化算法加速神經(jīng)網(wǎng)絡的訓練,加速參數(shù)的學習。
Gradient Descent,即梯度下降算法,由Cauchy,Augustin 于1847 年首次提出,依據(jù)數(shù)學理論解決了神經(jīng)網(wǎng)絡中參數(shù)學習的方向問題,基于此算法,往后的科研人員做出了許多優(yōu)化。在1951 年,SGD 算法的早期形式被提出,隨機梯度下降的參數(shù)學習方法被廣泛應用,由于SGD 學習效率的局限,在1964 年,由Polyak 提出了Momentum 的優(yōu)化算法,此算法利用給學習參數(shù)附加慣性值,大大提高了參數(shù)學習的效率。在神經(jīng)網(wǎng)絡興起的這幾年中,優(yōu)化算法也從沒停止發(fā)展,2011 年John Duchi 提出了通過優(yōu)化學習率參數(shù)來提高學習效率的AdaGrad 優(yōu)化算法,2015年Diederik P.Kingma 和Jimmy Lei Ba 提出的Adam 優(yōu)化算法集合了Momentum 和AdaGrad 算法的優(yōu)點,進一步提高了學習效率。在接下來的幾年中,相繼提出了AdaMax、Nadam、SGDW、Adabound、RAdam 等優(yōu)化算法。
總體來說,目前的優(yōu)化算法皆是從調(diào)整學習率和調(diào)整梯度方向兩方面來優(yōu)化訓練速度,各優(yōu)化算法匯總?cè)绫?所示。
表1 神經(jīng)網(wǎng)絡常用優(yōu)化算法匯總
SGD[1-2]即隨機梯度下降,是梯度下降算法的變種。批量梯度下降算法在梯度下降時,每次迭代都要計算整個訓練數(shù)據(jù)上的梯度,當遇到大規(guī)模訓練數(shù)據(jù)時,計算資源需求多,數(shù)據(jù)通常也會非常冗余。隨機梯度下降算法則把數(shù)據(jù)拆成幾個小批次樣本,每次只隨機選擇一個樣本來更新神經(jīng)網(wǎng)絡參數(shù),如圖1所示。
圖1 SGD優(yōu)化算法示意圖
實驗表明,每次使用小批量樣本,雖然不足夠反應整體數(shù)據(jù)的情況,但卻很大程度上加速了神經(jīng)網(wǎng)絡的參數(shù)學習過程,并且還不會丟失太多準確率。
動量是物理學中的概念,是指物體在它運動方向上保持運動的一種趨勢,Momentum 方法[3-4]則將其運用到神經(jīng)網(wǎng)絡的優(yōu)化中,用之前累計的動量來替代真正的梯度,計算負梯度的“加權(quán)移動平均”來作為參數(shù)的更新方向,其參數(shù)更新表達式為
其中ρ為動量因子,通常設為0.9,α 為學習率。這樣,每個參數(shù)的實際更新差值取決于最近一段時間內(nèi)梯度的加權(quán)平均值,當某個參數(shù)在最近一段時間內(nèi)的梯度方向不一致時,其真是的參數(shù)更新幅度變小;相反,當在最近一段時間內(nèi)的梯度方向都一致時,其真實的參數(shù)更新幅度變大,起到加速作用,相比SGD,能更快的到達最優(yōu)點。
在標準的梯度下降算法中,每個參數(shù)在每次迭代時都使用相同的學習率,AdaGrad 算法[5]則改變這一傳統(tǒng)思想,由于每個參數(shù)維度上收斂速度都不相同,因此根據(jù)不同參數(shù)的收斂情況分別設置學習率。
AdaGrad 算法借鑒正則化思想,每次迭代時自適應的調(diào)整每個參數(shù)的學習率,在進行第t次迭代時,先計算每個參數(shù)梯度平方的累計值,其表達式為
其中⊙為按元素乘積,gt是第t次迭代時的梯度。然后再計算參數(shù)的更新差值,表達式為
其中α 是初始的學習率,ε 是為了保持數(shù)值穩(wěn)定性而設置的非常小的常數(shù)。
在Adagrad 算法中,如果某個參數(shù)的偏導數(shù)累積比較大,其學習率相對較小;相反,如果其偏導數(shù)累積較小,其學習率相對較大。但整體是隨著迭代次數(shù)的增加,學習率逐漸縮小。
RMSprop 算法[6-7]對AdaGrad 算法進行改進,在AdaGrad 算法中由于學習率逐漸減小,在經(jīng)過一定次數(shù)的迭代依然沒有找到最優(yōu)點時,便很難再繼續(xù)找到最優(yōu)點,RMSprop算法則可在有些情況下避免這種缺點。
RMSprop 算法首先計算每次迭代梯度gt平方的指數(shù)衰減移動平均,
其中β為衰減率,然后用和AdaGrad 同樣的方法計算參數(shù)更新差值,從表達式中可以看出,RMSprop算法的每個學習參數(shù)不是呈衰減趨勢,既可以變小也可以變大。
Adam算法[8-9]即自適應動量估計算法,是Momentum 算法和RMSprop 算法的結(jié)合,不但使用動量作為參數(shù)更新方向,而且可以自適應調(diào)整學習率。
Adam 算法一方面計算梯度平方的指數(shù)加權(quán)平均(和RMSprop 類似),另一方面計算梯度的指數(shù)加權(quán)平均(和Momentum法類似),其表達式為
其中β1和β2分別為兩個移動平均的衰減率,Adam算法的參數(shù)更新差值為
Adam 算法集合了Momentum 算法和RMSprop 算法的優(yōu)點,因此相比之下,Adam 能更快更好的找到最優(yōu)點,迅速收斂。
使用由Facebook 開源的Pytroch[10]神經(jīng)網(wǎng)絡框架,該框架是基于Python 的張量庫,近幾年和Tensorflow 成為該研究領域的主流框架,并且通過Python 的Matplotlib 可視化工具包將實驗結(jié)果展示出來。用神經(jīng)網(wǎng)絡領域典型的回歸問題來測試我們不同優(yōu)化算法的參數(shù)學習效率和收斂速度。
訓練數(shù)據(jù)為5000 個偽數(shù)據(jù)點,由平方曲線的正太上下浮動生成,訓練時的批量大小為64,學習率為0.01,如圖2所示。
圖2 實驗數(shù)據(jù)展示圖
每個優(yōu)化算法使用的都是同一個神經(jīng)網(wǎng)絡,本實驗中搭建的神經(jīng)網(wǎng)絡的輸入層包含1 個輸入神經(jīng)元,共兩層隱藏層,每層隱藏層包含20 個神經(jīng)元,輸出層包含1 個輸出神經(jīng)元,每層神經(jīng)網(wǎng)絡這件用RELU激活函數(shù)進行激活,神經(jīng)網(wǎng)絡搭建好后,用不同的神經(jīng)網(wǎng)絡優(yōu)化算法對同一神經(jīng)網(wǎng)絡進行參數(shù)優(yōu)化,對比不同優(yōu)化算法的參數(shù)收斂速度,以及訓練誤差,并通過Matplotlib 可視化工具對結(jié)果進行可視化展示,如圖3所示。
圖3 不同優(yōu)化算法收斂展示圖
圖3 中橫軸為訓練時間線,縱軸為誤差率,在同一圖中展示了不同的優(yōu)化算法在同一神經(jīng)網(wǎng)絡的參數(shù)收斂速度,以及不同優(yōu)化算法的誤差率。
通過用不同優(yōu)化算法對同一神經(jīng)網(wǎng)絡的多次訓練,可以看出,幾乎沒有任何加速效果的SGD 優(yōu)化算法參數(shù)收斂速度最慢,且誤差率最高,而將SGD 改良后Momentum 則由于動量的存在,相比之下參數(shù)更快的收斂,誤差達到一個穩(wěn)定的低值,而RMSprop 和Adam 是進一步優(yōu)化算法升級,明顯收斂速度逐步增加,誤差率更早達到穩(wěn)定狀態(tài)。
優(yōu)化算法對神經(jīng)網(wǎng)絡的學習效率影響很大,如今的優(yōu)化算法從調(diào)整學習率和調(diào)整梯度兩個方向,來優(yōu)化訓練速度,在神經(jīng)網(wǎng)絡處理的不同數(shù)據(jù)中,要多次嘗試選擇合適的優(yōu)化器才能讓神經(jīng)網(wǎng)絡的性能最大化。