賈 桐
(華北計算機系統(tǒng)工程研究所,北京 100083)
隨著人工智能技術的盛行,深度學習越來越受到學術界和工業(yè)界的關注,而優(yōu)化算法的選擇和使用則直接決定了一個深度學習任務的成敗[1]。本文將依次介紹深度學習領域常用的梯度下降和其啟發(fā)式變種優(yōu)化算法,從理論角度剖析每種算法的設計思想和原理,分析算法的優(yōu)缺點,并在實際數(shù)據(jù)集上對比不同優(yōu)化算法的性能,最后對深度學習任務中優(yōu)化算法的使用技巧和注意事項進行總結。
深度學習[2](deep learning)本質(zhì)為一個無約束優(yōu)化問題,可以將其建模為一個最小化期望風險(expected risk)的問題,形式化表示如下:
minJ(θ)εD~p(x,y)L(f(x;θ)
(1)
其中,x和y分別為樣本的特征向量和監(jiān)督值;f為模型的推理函數(shù),θ為該推理函數(shù)的參數(shù),形式固定;L為損失函數(shù),一般情況下回歸問題的損失函數(shù)定義為平方誤差(mean squared error),分類問題的損失函數(shù)定義為交叉熵(cross entropy)。
通常情況下假設所有樣本滿足獨立同分布的條件,因此目標函數(shù)可以定義為所有訓練樣本上的經(jīng)驗風險[3](empirical risk):
minJ(θ)=εD~p(x,y)L(f(x;θ),y)
(2)
因此求解一個深度學習模型的最優(yōu)解,可等價地轉(zhuǎn)換為求解式(2)表示的一個無約束優(yōu)化問題。
一般而言,考慮到深度學習龐大的參數(shù)量和高度非凸性,通常采用迭代式、基于梯度信息的優(yōu)化求解策略。選擇迭代式的算法,使得可以持續(xù)優(yōu)化目標函數(shù),逐步逼近并收斂于最優(yōu)解所在位置。而采取梯度信息而不計算Hessian矩陣,從理論角度,算法迭代的每一步都使用采樣數(shù)據(jù)進行優(yōu)化,因此具有很強的隨機性,所以此時采用更精確的方式計算優(yōu)化方向并無太大意義;從工程角度,由于深度學習模型本身巨大的參數(shù)量,計算Hessian矩陣會帶來非常巨大的時間和空間開銷,甚至實際設備資源和任務實效要求根本無法滿足支持計算Hessian[4]。
因此一般而言,只計算目標函數(shù)關于訓練參數(shù)的梯度,并且在具體每一步優(yōu)化迭代中,會隨機從所有訓練樣本中抽樣部分樣本用于當前梯度計算,即選擇批數(shù)據(jù)量。
以最基本的梯度下降(gradient descent)優(yōu)化算法為例,根據(jù)批數(shù)據(jù)量大小選擇的不同,優(yōu)化算法可分為批梯度下降算法(batch gradient descent)、隨機梯度下降算法(stochastic gradient descent)和迷你批梯度下降算法(mini-batch gradient descent)。批梯度下降算法在每一步迭代過程中使用全部訓練樣本,因此參數(shù)更新方向最穩(wěn)定,但是時間開銷和空間開銷最大;與之恰恰相反,隨機梯度下降算法在每一步迭代過程中只使用隨機抽樣的一個樣本,因此時間和空間開銷都是最小的,但是由于樣本的隨機性,參數(shù)的更新方向是最不穩(wěn)定的;迷你批梯度下降算法則是二者的折中,算法每一次迭代隨機從n個樣本中采樣m個樣本,因此該方式中和了批梯度下降和隨機梯度下降的優(yōu)勢和劣勢,使得在空間開銷和時間開銷合理的情況下,獲得相對較為穩(wěn)定的參數(shù)更新方向。注意其中迷你批量m的大小為優(yōu)化算法的超參數(shù),一般而言當樣本分布的隨機性強時,m可設置為相對較大的值以平穩(wěn)化隨機性[5]。
在實際優(yōu)化問題中一般均采用迷你批梯度下降算法及其變種。
隨機梯度下降[6](Stochastic Gradient Descent,SGD)是最基本的基于梯度的優(yōu)化算法,并且是其他一階優(yōu)化算法的基礎。在每一步迭代中,選擇最優(yōu)優(yōu)化方向的最直觀方式為:沿最陡峭的方向,即最速下降的方向進行迭代更新,因此隨機梯度下降算法又被稱為最速下降(steepest descent)算法,而這個方向就是梯度(最速上升方向)的反方向。因此算法每一步迭代的更新公式如下:
(3)
θ←θ-η⊙g
(4)
其中,η表示當前迭代步的學習率(learning rate)。
隨機梯度下降算法在每一步優(yōu)化方向更新時只使用了當前步隨機采樣樣本的信息,因此具有相對較強的隨機性,從而使得優(yōu)化方向一直“震蕩”,同時由于震蕩的原因,收斂速度相對較慢,因此引入了動量優(yōu)化算法[7](Momentum)。該算法在每一步迭代過程中,保留上一輪更新后的參數(shù)動量,并加入該輪的梯度,從而降低算法在收斂過程中的震蕩程度,同時提高收斂速度。迭代更新公式如下:
(5)
v←α·v-η·g
(6)
其中,α為動量累積系數(shù),一般設置為0.9,動量算法相當于累積過去最近1/(1-α)步更新方向。
Nesterov[8]動量算法是2.2節(jié)所述動量算法的更新,該算法與Momentum唯一的不同在于,Nesterov算法會先根據(jù)當前位置預判前方地形,從而移動到一個新的預估位置,然后在該位置計算梯度,最后將所得梯度與歷史累積動量加權后的方向作為真正更新方向。因此算法迭代更新公式如下:
(7)
(8)
v←α·v-η·g
(9)
θ←θ+v
(10)
對于式(7)、式(8)可以理解為優(yōu)化過程中順應大勢所趨,在主流的方向上先行邁出一步,因此在一定程度上會加速收斂速度。
上述動量法和Nesterov動量法雖然相較于SGD優(yōu)化了更新方向,但是對于學習率卻沒有起到調(diào)節(jié)作用,因此在實際深度學習的優(yōu)化過程中,存在以下問題:(1)在每一步迭代更新中,學習率的大小需要人為設置。學習率太小導致收斂速度太慢,學習率太大又會導致在損失函數(shù)最小值點附近波動甚至發(fā)散,因此找到一個合適的學習率十分困難。(2)若想要調(diào)節(jié)學習率,就得人為設置學習率衰減策略,然而在訓練過程中,人為設置衰減策略的學習率不能夠自動匹配數(shù)據(jù)的特征。(3)所有參數(shù)維度的更新都使用相同的學習率。如果數(shù)據(jù)非常稀疏,并且特征的頻率大為不同,那么不應該對所有的特征使用相同的學習率,而應對出現(xiàn)頻率低的特征使用相對較大的學習率以保障學習充分,對出現(xiàn)頻率高的特征使用相對較小的學習率以防止過度學習。(4)很難避免鞍點(saddle point)。因此解決辦法是使用自適應學習率的優(yōu)化算法(adaptive learning rate optimization algorithm)。
AdaGrad[9]就是最基本的自適應學習率優(yōu)化算法,其更新方式如下:
(11)
r←r+g⊙g
(12)
(13)
θ←θ+Δθ
(14)
該算法利用變量r累積二階動量,從而使得更新頻繁的維度擁有較大的累積動量平方值,因此實際更新的學習率較小,從而避免了過度更新;而總是得不到更新的維度對應有較小的累積動量平方值,因此實際更新時會執(zhí)行較大的學習率,從而保障了充分更新。
該算法雖然實現(xiàn)了不同維度上學習率自適應地調(diào)節(jié),但是存在一個嚴重的問題:訓練后期更新速度停滯不前甚至終止更新。因為隨著動量平方的不斷累積,每一個維度r的對應值都不斷增大,導致每一個維度的學習率逐漸變小,從而當訓練到后期階段時,由于學習率過小使得訓練停滯甚至提前終止。因此為了解決這個問題,之后又出現(xiàn)了更為智能的優(yōu)化算法,使得在任意特定維度上,隨著訓練階段的變換,學習率也可以進行增大縮小的自適應調(diào)節(jié)。
RMSProp[10]優(yōu)化算法是對AdaGrad算法最直接的改進,參考于動量方法在累積動量上采用滑動平均,RMSProp在累積動量平方上采取滑動平均,從而避免了累積動量平方越來越大的問題,因此該算法只是將式(12)替換為了如下形式:
r←ρr+(1-ρ)g⊙g
(15)
于是該變量相當于累積過去最近1/(1-p)個迭代的動量,如果某一維度上變量相較于過去一直沒有得到有效充分的更新,那么其對應的累積動量平方值將會變小,因此學習率將會變大,這就是RMSProp算法可以使同一維度在不同時間段進行學習率自適應調(diào)節(jié)的原因。
Adam[11]算法為集大成于一身的優(yōu)化方式,其對于優(yōu)化方向的選擇采取了Momentum動量法的方式,對于學習率的選擇采取了RMSProp的方式。在此基礎上,該算法還對一階動量累積和二階動量累積進行了校正,近似為對期望的無偏估計。算法的迭代更新公式如下:
(16)
t←t+1
(17)
s←ρ1s+(1-ρ1)g
(18)
r←ρ2r+(1-ρ2)g⊙g
(19)
(20)
(21)
(22)
θ←θ+Δθ
(23)
實際應用算法時有以下選擇策略:
(1)算法孰優(yōu)孰劣尚無定論。一般而言入門建議選擇Nesterov優(yōu)化算法或Adam優(yōu)化算法。
(2)選擇自身熟練的優(yōu)化算法。這樣在優(yōu)化過程中可以更熟練地利用經(jīng)驗進行超參數(shù)調(diào)優(yōu),大大減少模型優(yōu)化過程帶來的意外性和不確定性。
(3)在訓練前期選擇較大批數(shù)據(jù)量,在訓練后期選擇較小批數(shù)據(jù)量。批數(shù)據(jù)量較大時,數(shù)據(jù)方差理論上較小,因此計算所得梯度更加穩(wěn)定,從而使得在前期的訓練優(yōu)化中少走彎路,以較為平穩(wěn)的方式到達最優(yōu)點附近;在訓練后期選擇相對較小的批數(shù)據(jù)量可以充分利用數(shù)據(jù)的不穩(wěn)定性,增強隨機震蕩的程度,從而更有可能跳出鞍點。
(4)在選擇優(yōu)化算法前需要先充分了解數(shù)據(jù),如果數(shù)據(jù)維度之間的分布均勻,那么推薦使用譬如SGD的非自適應的算法;而當數(shù)據(jù)非常稀疏時,則需優(yōu)先考慮譬如Adam等自適應優(yōu)化算法。
(5)需要根據(jù)階段需求選擇優(yōu)化算法。在模型設計實驗階段,因為需要快速驗證新模型的效果,所以可先使用Adam算法進行快速實驗;而在模型上線或待發(fā)布階段,因為需要追求極致的效果,所以可用精調(diào)的SGD優(yōu)化算法或動量算法進行模型的極致優(yōu)化。
(6)先用小數(shù)據(jù)集進行實驗。因為一般而言數(shù)據(jù)都是從原始特征空間中抽樣而得到的,因此優(yōu)化算法的收斂速度與數(shù)據(jù)集的大小關系不大[12]。因此可以先利用一個具有代表性的小數(shù)據(jù)集進行實驗,測試得到最好的優(yōu)化算法,并通過參數(shù)搜索尋找最優(yōu)的優(yōu)化超參數(shù)。
(7)考慮不同算法的組合。實際優(yōu)化的時候,可以先采取Adam優(yōu)化算法進行快速逼近收斂,而后在某個特定條件下切換至SGD算法進行精確搜索。
(8)訓練數(shù)據(jù)集一定要充分打散。這樣在使用自適應算法時,可以避免因為學習過度或不足,導致優(yōu)化方向出現(xiàn)偏差的問題。
(9)訓練過程中需要持續(xù)監(jiān)控訓練集和驗證集。具體是監(jiān)控目標函數(shù)值以及一系列評價指標。其中監(jiān)控訓練集是為了保障模型進行充分、正確的訓練,即優(yōu)化方向正確,學習率適宜充足;而監(jiān)控驗證集是為了避免模型訓練過擬合,當出現(xiàn)訓練集上得分很好而驗證集上評價準則得分過低時,需要及時終止訓練過程,重新評估數(shù)據(jù)、模型、目標函數(shù)和優(yōu)化算法,制定新的學習策略。
(10)為訓練過程制定合適的學習率衰減策略。因為需要保證訓練前期的學習率足夠大,快速收斂,而后期學習率相對較小,從而避免不收斂甚至發(fā)散的問題。具體的制定策略有很多,譬如每遍歷N遍數(shù)據(jù)集就衰減一次。一般采取余弦周期學習率衰減策略,有助于跳出鞍點。
實驗中使用MNIST[13]數(shù)據(jù)集,該數(shù)據(jù)集為全球最權威的手寫體識別數(shù)據(jù)集,由美國郵政系統(tǒng)開發(fā),手寫內(nèi)容為0~9阿拉伯數(shù)字,內(nèi)容采集于美國人口統(tǒng)計局的員工和高中生。
實驗選取其中的37 000張圖片作為訓練集,5 000 張圖片作為測試集,模型選擇經(jīng)典的LeNet[14],所有優(yōu)化算法的初始學習率均設置為0.001 5。
訓練階段,數(shù)據(jù)在進入訓練前均已充分打散,同時在所有優(yōu)化算法的訓練中批次讀入順序相同。每種優(yōu)化算法對應的模型使用相同的初始化方式和種子,每300步迭代記錄一次訓練集上的損失函數(shù)值,所有模型總訓練迭代次數(shù)均為6 000步。
測試階段,選擇針對所有類別的準確率作為評價指標,利用每種優(yōu)化算法對應的訓練好的模型,分別在相同測試集上進行測試,得到對應的準確率評分。
4.3.1 訓練集上交叉熵損失結果
六種優(yōu)化算法在訓練集上的交叉熵損失記錄如圖1所示,可見Adam優(yōu)化算法和RMSProp優(yōu)化算法擁有最快的收斂速度;SGD算法的收斂速度最慢。
圖1 算法訓練損失對比
4.3.2 測試集上準確率結果
六種優(yōu)化算法在相同測試集上的損失及準確率評價指標對比結果如表1所示。RMSProp優(yōu)化算法的泛化性能最佳;綜合在訓練集上的表現(xiàn),SGD算法存在欠擬合的問題,而AdaGrad存在易過擬合的問題。
根據(jù)上述實驗結果可得,SGD算法的收斂速度最慢;Momentum動量和Nesterov動量算法加速了SGD的收斂速度;AdaGrad算法由于梯度平方的不斷累積導致學習率不斷變小,影響了學習效率,因此收斂效果不如動量算法;RMSProp和Adam算法擁有最佳的收斂速度,同時RMSProp算法在測試集上擁有最佳的泛化效果。
表1 六種優(yōu)化算法驗證集評價指標對比
通過對深度學習各種常用優(yōu)化算法的理論分析和實驗,可得各種優(yōu)化算法針對學習率和更新方向進行了啟發(fā)式設置。動量算法對更新方向進行了優(yōu)化,提升了收斂速度,但需要精細設置超參數(shù);自適應優(yōu)化算法對學習率和方向均進行了優(yōu)化,超參數(shù)設置相對簡單,擁有較快的收斂速度,普遍作為首選優(yōu)化算法,且特別適用于稀疏數(shù)據(jù)。