常永虎,李虎陽(yáng)
(遵義醫(yī)科大學(xué)醫(yī)學(xué)信息工程學(xué)院,遵義563000)
以往建立一個(gè)機(jī)器學(xué)習(xí)模型需要清洗數(shù)據(jù)、找特征、構(gòu)建模型并訓(xùn)練和應(yīng)用模型四個(gè)階段。在這個(gè)過程當(dāng)中,時(shí)間成本最高的環(huán)節(jié)是找特征。深度學(xué)習(xí)由于能夠自動(dòng)找特征,從而降低模型建立的人工時(shí)間成本而變得流行,它使工程師只需經(jīng)歷清洗數(shù)據(jù)、構(gòu)建模型、訓(xùn)練和應(yīng)用模型三個(gè)階段就可以完成一個(gè)任務(wù)。但不管機(jī)器學(xué)習(xí)算法還是深度學(xué)習(xí)算法,都需經(jīng)歷訓(xùn)練模型階段。此階段是計(jì)算復(fù)雜度最高的階段,甚至用幾百臺(tái)機(jī)器投入幾天到幾個(gè)月來解決模型訓(xùn)練問題也是很常見的。一個(gè)好的模型訓(xùn)練算法通??梢越档湍P陀?xùn)練的計(jì)算復(fù)雜度,也可以提高模型的精確度,使模型達(dá)到最優(yōu)結(jié)果。在此過程中使用到的算法通常叫做優(yōu)化算法,梯度下降類算法作為最流行的優(yōu)化算法之一,目前是神經(jīng)網(wǎng)絡(luò)問題中最常用的優(yōu)化算法。
機(jī)器學(xué)習(xí)類算法研究的熱潮不斷高漲,各類開源機(jī)器學(xué)習(xí)框架也層出不窮,其中包括Karas、Tensor-Flow、Caffe、MXNet、pandas、scipy 等。雖然這些框架中都已經(jīng)集成了常用的梯度下降類算法,但不同的梯度下降算法在不同的模型訓(xùn)練中會(huì)表現(xiàn)出不同的性能,也不是最先進(jìn)的梯度下降類算法在所有的模型中都表現(xiàn)最優(yōu)。因此,本文的目的是通過對(duì)比梯度下降類算法在不同模型中的表現(xiàn),為讀者直觀地呈現(xiàn)不同梯度下降類算法的效果,從而幫助讀者在實(shí)際模型訓(xùn)練過程中選擇更合適的梯度下降類算法
在微積分中,對(duì)多元函數(shù)的參數(shù)求解偏導(dǎo)數(shù),然后以向量的形式將各個(gè)參數(shù)的偏導(dǎo)數(shù)寫出來就是梯度。如函數(shù)f(x,y),分別對(duì)x 和y 求偏導(dǎo)數(shù),求得的偏導(dǎo)數(shù)組成的向量是(?f/?x,?f/?y)就是梯度。梯度下降算法是求解無約束優(yōu)化問題的最簡(jiǎn)單、最經(jīng)典的方法之一。它的目的是找到目標(biāo)函數(shù)J(θ)取極小值點(diǎn)時(shí)的θ值,其中參數(shù)θ屬于Rn空間。它的基本思想是沿著J(θ)的梯度反方向不斷的更新θ,并設(shè)置一個(gè)學(xué)習(xí)率η決定其每次更新的步長(zhǎng)直到J(θ)的結(jié)果足夠小。以此來達(dá)到最小化目標(biāo)函數(shù)的目的。
最原始的梯度下降法叫做批梯度下降法,此方法的基本思路是每次都在整個(gè)數(shù)據(jù)集上計(jì)算損失函數(shù)關(guān)于θ的梯度。然后不斷重復(fù)計(jì)算公式(1),直到梯度接近于0。
此方法是最初的梯度下降算法,通過此方法,可以使計(jì)算機(jī)通過迭代計(jì)算,求解任意具有一階導(dǎo)數(shù)的極值。但也有三類主要問題[1]。第一類問題是計(jì)算效率問題,主要表現(xiàn)有兩點(diǎn):①這種方法每更新一次,就需要在整個(gè)數(shù)據(jù)集上計(jì)算一次梯度。當(dāng)數(shù)據(jù)量非常大的時(shí)候,整個(gè)算法的就會(huì)非常慢且特別吃內(nèi)存。②每次更新的步長(zhǎng)是一個(gè)超參數(shù)。當(dāng)更新步長(zhǎng)太大時(shí),算法效果出現(xiàn)抖動(dòng),通常無法收斂到最佳效果。當(dāng)更新步長(zhǎng)太小時(shí),算法收斂速度較慢且容易陷入局部最小值。第二類問題是梯度計(jì)算問題:主要表現(xiàn)在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中。由于神經(jīng)網(wǎng)絡(luò)特征較多導(dǎo)致目標(biāo)函數(shù)有時(shí)是一個(gè)非凸的函數(shù),此時(shí)很難避免參數(shù)被困在極小值附近。這類情況常常導(dǎo)致梯度接近于零,所以普通梯度下降法很難從中逃脫。因此,無法收斂到全局最小值。第三類問題是:梯度下降法中的學(xué)習(xí)率η是一個(gè)固定值,常常很難確定η的取值。具體表現(xiàn)為:①如圖1 所示:過小的學(xué)習(xí)率導(dǎo)致目標(biāo)函數(shù)收斂緩慢,而過大的學(xué)習(xí)率會(huì)導(dǎo)致目標(biāo)函數(shù)在其極小值附近劇烈震蕩。②由于所有參數(shù)都使用相同的學(xué)習(xí)率,導(dǎo)致數(shù)據(jù)中出現(xiàn)頻率低的特征常常無法達(dá)到最優(yōu)效果。針對(duì)梯度下降算法這些問題,圖1 總結(jié)了相應(yīng)的三類改進(jìn)策略及相應(yīng)算法。
圖1 不同學(xué)習(xí)率收斂震蕩對(duì)比圖
在樣本量極大的時(shí)候,對(duì)大量相似樣本計(jì)算其梯度是沒必要的。因此,這部分主要通過調(diào)整每次迭代計(jì)算的樣本量提高計(jì)算效率。
(1)批梯度下降法
此算法先將所有樣本隨機(jī)排序,然后將樣本分組,每次計(jì)算只對(duì)其中一組數(shù)據(jù)做優(yōu)化計(jì)算,當(dāng)所有樣本都計(jì)算一遍后再重新分組重新計(jì)算。若樣本被分成N組,則此方法在所有樣本都計(jì)算完一遍后就進(jìn)行了N次梯度優(yōu)化,而原始梯度下降法只能優(yōu)化一次。因此提高了算法效率[2]。
(2)隨機(jī)梯度下降法
隨機(jī)梯度下降法簡(jiǎn)稱SGD(Stochastic Gradient Descent)[3]。SGD 在批梯度下降法的思想上更進(jìn)一步,它將批梯度下降法的每批數(shù)據(jù)量降到1,即每次梯度更新只用一個(gè)樣本。如圖2 所示。這種方法加快了收斂速度但同時(shí)由于頻繁更新參數(shù)導(dǎo)致目標(biāo)函數(shù)在劇烈震蕩中逐步下降。
圖2 SGC收斂波動(dòng)(來源:Wikipedia)
綜上所述,批梯度下降法和隨機(jī)梯度下降算法具有相同的優(yōu)化思路,即都取訓(xùn)練樣本的一個(gè)子集。因此,算法的好壞主要取決于子集的大小。通常,根據(jù)不同的應(yīng)用場(chǎng)景,小批量的大小取50 到256 較為合適。
由于本文主要討論深度學(xué)習(xí)中常用的優(yōu)化的梯度類算法,所以在此不再討論那些不適用于高維數(shù)據(jù)的方法,如類似于牛頓法的二階算法。
(1)動(dòng)量法
牛頓法[4]將目標(biāo)函數(shù)比作高低不平的地面或山坡,把優(yōu)化過程比作小球滾下坡的過程。這種方法主要應(yīng)對(duì)那些類似于峽谷形狀的函數(shù),可以避免其在峽谷兩邊震蕩而下降緩慢。動(dòng)量法是在更新向量(梯度向量)之前增加前一次的更新向量,從而在他們相同的方向上累加速度,在不同的方向上減小速度,以此減小震蕩,加快收斂速度。
其中:vt表示第t 次的下降動(dòng)量,vt-1表示t-1 次的下降動(dòng)量。γ為下降動(dòng)量的衰減值,通常取0.9。θ 表示要更新的向量。?θJ(θt)表示第t 次更新時(shí)的梯度值,η 表示學(xué)習(xí)速率。
這種方法能夠明顯加速SGD 的學(xué)習(xí)速率并且可以減小SGD 無謂的震蕩,但在下降到極值點(diǎn)附近的時(shí)候由于速度過快而無法及時(shí)停止。
(2)NAG 法
NAG[6]的全稱是Nesterov Accelerated Gradient。此方法主要為了解決動(dòng)量法無法及時(shí)停止的問題。NAG認(rèn)為在t 次更新中會(huì)用到動(dòng)量項(xiàng)γvt-1,所以θ-Vt-1就是參數(shù)向量下一個(gè)位置。所以,我們與其在當(dāng)前位置計(jì)算梯度還不如在當(dāng)前位置的下一個(gè)位置計(jì)算梯度。這樣既沒有增加計(jì)算量,又可以讓參數(shù)及時(shí)的根據(jù)梯度修正下降誤差。
公式中各符號(hào)含義與上文相同。從公式可以看出,NAG 法與動(dòng)量法的區(qū)別只在于計(jì)算梯度的位置不同。動(dòng)量項(xiàng)γ的參考值也是在0.9 附近取值效果最好。
圖3 SGD、動(dòng)量法和NAG下降對(duì)比
圖3 展示了不同梯度下降法在sixhump 函數(shù)中的收斂過程。左圖為SGD 收斂路徑圖,中圖為動(dòng)量法收斂路徑圖,右圖為NAG 收斂路徑圖。圖中的每個(gè)藍(lán)點(diǎn)代表每次梯度計(jì)算后下降的位置。所以,點(diǎn)越稠密表示下降速度越慢;點(diǎn)越稀疏表示下降速度越快。通過對(duì)比可看出,SGD 算法每次下降的點(diǎn)與相鄰點(diǎn)距離是固定的且非常近,NAG 和動(dòng)量法都有一段加速區(qū)域和震蕩區(qū)域,但NAG 的震蕩明顯比動(dòng)量法弱。
學(xué)習(xí)率對(duì)于梯度類優(yōu)化算法非常重要。尤其在稀疏性很強(qiáng)的數(shù)據(jù)集中,一個(gè)好的學(xué)習(xí)率調(diào)整算法不但能夠使目標(biāo)函數(shù)更快地找到極小值,而且可以優(yōu)化出更精確的目標(biāo)函數(shù)。
(1)AdaGrad 方法
AdaGrad[7]能夠根據(jù)參數(shù)的重要性調(diào)整學(xué)習(xí)率。它能夠根據(jù)參數(shù)更新的平凡程度自動(dòng)調(diào)整學(xué)習(xí)率。所以它非常適合稀疏性很強(qiáng)的數(shù)據(jù)集。Dean 等人[8]使用AdaGrad 實(shí)現(xiàn)了YouTube 中貓的識(shí)別算法。Pennington 等人[9]使用AdaGrad 算法對(duì)GloVe 詞嵌入網(wǎng)絡(luò)進(jìn)行訓(xùn)練并最終使不常出現(xiàn)的詞語得到了和經(jīng)常出現(xiàn)的詞語近似的學(xué)習(xí)率。這種方法在每次更新參數(shù)的同時(shí)更新學(xué)習(xí)率。更新方法如公式(6)。
公式(6)主要增加Gt,Gt表示前t 次更名梯度的平方和。通過增加這一項(xiàng),參數(shù)隨著更新頻率和更新幅度的大小逐漸變小而不影響稀疏屬性的更新。除此之外,AdaGrad 的另外一個(gè)優(yōu)點(diǎn)是不需要手動(dòng)調(diào)整學(xué)習(xí)率,一般直接使用就可以。同時(shí),也注意到公式的分母部分只增不減,使整個(gè)學(xué)習(xí)率隨之越來越小直到無限小。
(2)AdaDelta 方法
AdaDelta[10]方法是AdaGrad 方法的改進(jìn),主要解決了AdaGrad 方法單調(diào)遞減學(xué)習(xí)率的問題。AdaDelta 方法采用指數(shù)衰減移動(dòng)平均的方式來取代AdaGrad 里面將以往全部梯度值都平等納入平方和的做法。它將上面Gt 的計(jì)算方法替換成如下方法:
通過對(duì)比可以發(fā)現(xiàn),只要將公式中E[g2]t替換成Gt,AdaDelta 方法就會(huì)回退到AdaGrad 方法。這里的γ建議取0.9,而默認(rèn)的學(xué)習(xí)率為0.001。
(3)Adam 方法
Adam(Adaptive moment Estimation)[11]是另一種針對(duì)調(diào)整學(xué)習(xí)率的方法。這種方法不但像AdaDelta 一樣通過收集歷史梯度值逐步衰減學(xué)習(xí)率,還能像動(dòng)量法一樣記錄梯度本身的指數(shù)衰減值。
其中,mt和vt分別是梯度的一階和二階矩估計(jì)。
Adam 的更新規(guī)則是:
Adam 作者提出β1、β2和ε 的取值分別是0.9、0.999 和10-8。它的實(shí)驗(yàn)結(jié)果表明Adam 的實(shí)際收斂效果更好且對(duì)學(xué)習(xí)率的調(diào)整表現(xiàn)更好。
前一節(jié)提到了三類算法,這些算法在各自不同的角度表現(xiàn)出優(yōu)秀的效果。在模型訓(xùn)練過程中,影響其訓(xùn)練效果的主要是一些局部極值點(diǎn)。在高維模型中,這種局部極值點(diǎn)更多,各個(gè)特征值就可能會(huì)有更復(fù)雜的分布。一種最難處理的分布是所有維度都處于極值點(diǎn),但一些處于極大值,另一些處于極小值,這種點(diǎn)被稱作鞍點(diǎn)。那么在實(shí)際模型訓(xùn)練任務(wù)中,各個(gè)算法的在鞍點(diǎn)[12]附近的表現(xiàn)如何?
圖4 梯度類下降算法在按點(diǎn)附近的表現(xiàn)
從圖4 可以發(fā)現(xiàn)AdaDelta 首先擺脫鞍點(diǎn)并快速下降,Rmsprop 次之。而SGD 可緩慢擺脫鞍點(diǎn),動(dòng)量法處于RmsProp 和SGD 之間。究其原因,主要是AdaDelta方法不會(huì)出現(xiàn)擾動(dòng),能最先逃出鞍點(diǎn),SGD 方法在原始梯度下降法基礎(chǔ)上增加了隨機(jī)性,所以可以逃出鞍點(diǎn),動(dòng)量法由于保留了之前的優(yōu)化速率和方向,所以在最初出現(xiàn)震蕩區(qū)域而導(dǎo)致優(yōu)化速度比較慢,但逃離鞍點(diǎn)后優(yōu)化速度越來越快。
如果輸入的數(shù)據(jù)有稀疏性,動(dòng)態(tài)調(diào)整學(xué)習(xí)率的算法會(huì)比較好,因?yàn)槭褂谜卟恍枰{(diào)整學(xué)習(xí)率,直接使用默認(rèn)學(xué)習(xí)率就可以達(dá)到較好效果。但也有一些研究成果僅僅使用原始梯度下降算法就可以找到極小值。如果使用者關(guān)心算法的收斂速度或者訓(xùn)練的是一個(gè)參數(shù)較多或隱層較深的網(wǎng)絡(luò),就需要選取一個(gè)動(dòng)態(tài)調(diào)整學(xué)習(xí)率的算法,因?yàn)樗麄冇锌赡軙?huì)卡在鞍點(diǎn)附近[13]。
以上是對(duì)幾種梯度下降優(yōu)化算法的直觀展示與分析。為了驗(yàn)證其在深度學(xué)習(xí)算法中的表現(xiàn),本文將在minst 手寫數(shù)字識(shí)別數(shù)據(jù)集上構(gòu)建一個(gè)三層CNN 網(wǎng)絡(luò)[14]。網(wǎng)絡(luò)結(jié)構(gòu)如圖5 所示。第一個(gè)隱層有512 個(gè)神經(jīng)元,激活函數(shù)使用ReLU,Dropout 比例為0.2。第二個(gè)隱層有512 個(gè)神經(jīng)元,激活函數(shù)為ReLU,Dropout 比例為0.2。輸出層有10 個(gè)神經(jīng)元,激活函數(shù)使用Soft-Max,輸出結(jié)果使用onehot 方式表示。
圖5 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
分別使用SGD,動(dòng)量法、NAG、AdaGrad、AdaDelta、Adam 六種優(yōu)化方法訓(xùn)練網(wǎng)絡(luò),訓(xùn)練效果如圖6 所示。
圖6 手寫數(shù)字識(shí)別準(zhǔn)確率折線圖
從圖6 中可以看出:SGD、動(dòng)量法和NAG 的收斂折線基本重合,說明SGD、動(dòng)量法和NAG 三種方法的收斂速度基本相同;Adam、AdaGrad 和AdaDelta 的收斂折線基本重合,說明Adam、AdaGrad 和AdaDelta 三種方法的收斂速度基本相同。從收斂速度看,Adam 類方法的收斂速度更快;從最終的目標(biāo)函數(shù)準(zhǔn)確度看,Adam 類方法的收斂效果更好。
圖7 CIRAR-10數(shù)據(jù)集誤判折線圖(來源:文獻(xiàn)[20])
實(shí)驗(yàn)結(jié)果表明,調(diào)整學(xué)習(xí)率的Adam 類算法普遍比動(dòng)量法類的方法收斂速度快且收斂效果更好。究其原因,主要是因?yàn)樯疃葘W(xué)習(xí)類算法省略了特征提取步驟,將所有特征都作為參數(shù)進(jìn)行訓(xùn)練,這是深度學(xué)習(xí)提高精度的主要原因。但同時(shí),這也使深度學(xué)習(xí)訓(xùn)練數(shù)據(jù)變得稀疏。在學(xué)習(xí)過程中,SGD、動(dòng)量法和NAG 使用相同的學(xué)習(xí)率導(dǎo)致稀疏特征無法收斂。Adam 類方法在最初使用較大的學(xué)習(xí)率,這就使得稀疏特征能夠在有限的梯度計(jì)算過程中獲得更好的收斂效果。也正是由于Adam 類方法最初的大學(xué)習(xí)率,使得Adam 類方法能夠使目標(biāo)函數(shù)在訓(xùn)練之初就能獲得較高的準(zhǔn)確率。
Adam 類方法與動(dòng)量類方法相比,即可以擺脫鞍點(diǎn)的束縛又具有較快的收斂速度,那么Adam 類方法是否適用于所有深度學(xué)習(xí)場(chǎng)景?顯然不是。SGD 雖然收斂慢且對(duì)稀疏數(shù)據(jù)的收斂效果沒有Adam 好,但SGD方法的泛化能力強(qiáng),如果使用得當(dāng),可以訓(xùn)練出更低錯(cuò)誤率的目標(biāo)函數(shù)。文獻(xiàn)[20]在CIRAR-10[21]數(shù)據(jù)集上比較了SGD 和Adam 方法兩種方法的訓(xùn)練效果,訓(xùn)練效果如圖7。圖7 的橫坐標(biāo)表示迭代次數(shù),縱坐標(biāo)表示目標(biāo)函數(shù)的誤判率。從圖7 可以看出,雖然Adam 類方法在訓(xùn)練之初的收斂速度較快,且準(zhǔn)確率率高于SGD方法,但在第150 次訓(xùn)練后,SGD 的誤判率低于Adam方法。這個(gè)實(shí)驗(yàn)說明,SGD 方法的泛化能力強(qiáng)于Adam方法。
本文詳細(xì)介紹了不同類型的梯度下降算法,并比較了它們?cè)诓煌瑪?shù)據(jù)分布的情況下的收斂速度,同時(shí)也比較了它們?cè)谙∈钄?shù)據(jù)中的收斂速度和最終效果。通過比較,我們發(fā)現(xiàn):①對(duì)于稀疏數(shù)據(jù),自適應(yīng)學(xué)習(xí)率的算法表現(xiàn)基本相同且優(yōu)于其他算法,因此,盡量使用學(xué)習(xí)率可自適應(yīng)的優(yōu)化算法。②如果在意更快的收斂速度,并且訓(xùn)練的算法比較復(fù)雜的時(shí)候,自適應(yīng)學(xué)習(xí)率算法要優(yōu)于其他算法。③AdaDelta、RMSprop 和Adam是比較接近的算法,在收斂速度和收斂結(jié)果方面表現(xiàn)基本無差別。④原始無法跳出鞍點(diǎn),SGD 方法由于增加了隨機(jī)性而能夠逃出鞍點(diǎn)但收斂速度很慢。⑤SGD方法具有更好的泛化能力,通過優(yōu)化SGD 方法,并在訓(xùn)練過程中手動(dòng)調(diào)整不同的學(xué)習(xí)率,在一些非稀疏的數(shù)據(jù)集上能夠得到更好的收斂效果。
除本文著重介紹的SDG 優(yōu)化策略及其一些變體外,還可以從被訓(xùn)練的數(shù)據(jù)以及選擇模型特點(diǎn)的角度考慮,進(jìn)一步提高SGD 的性能和目標(biāo)函數(shù)的準(zhǔn)確度。例如,一些研究者[22-23]為了使學(xué)習(xí)過程更加無偏,可以在在每次迭代過程中打亂數(shù)據(jù)或?qū)?shù)據(jù)做有意義的排序;還有一些研究者[24]為了保證學(xué)習(xí)率在每次迭代過程之前先對(duì)數(shù)據(jù)做0 均值1 方差的標(biāo)準(zhǔn)化等操作;又或者根據(jù)梯度類算法的特點(diǎn),采用相結(jié)合的策略或混合策略,對(duì)訓(xùn)練集按照訓(xùn)練難度進(jìn)行遞增排序,在不同的時(shí)期使用不同的優(yōu)化算法。