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