1. 程式人生 > >深度學習中常見優化演算法學習筆記

深度學習中常見優化演算法學習筆記

最近系統學習了神經網路訓練中常見的gradient descent系列優化演算法,現將學習筆記整理如下,主要包括:

1.深度學習與單純的最優化有何不同
2.基礎的graident descent演算法
3.基於momentum的改進演算法
4.基於adaptive learning rate的改進演算法
5.總結

1. 深度學習與單純的優化有何不同

深度學習可以簡單理解為減小(優化)損失函式的過程,這與單純的最優化一個函式十分相似,但深度學習並不是單純的最優化,主要區別是目標不同.深度學習的目標是模型在測試集上的performance,也就是減小泛化誤差.而訓練過程中我們只可以利用訓練集,因此深度學習的優化目標是間接的.對於單純的最優化而言,優化目標往往是直接的,例如,如果將優化目標定為最小化訓練集上的損失函式,則深度學習在訓練集上的訓練過程,就可以視為單純的最優化過程.

2. 基礎的gradient descent演算法

根據一次迭代(更新一次模型引數)所使用的資料量,可以分為Batch gradient descent(BGD)、 Stochastic gradient descent(SGD)和Mini-batch gradient descent(MBGD).BGD一次迭代使用整個訓練集的資料,SGD一次迭代使用1個訓練樣本,MBGD是前兩種方法的trade-off,一次使用一小批樣本(如32,64,128等).其更新公式可以統一描述如下:

   x += -learning_rate * dx

x為模型引數,dx為x的梯度大小.三種演算法的區別在於計算dx所使用的訓練樣本數目.

  • BGD方法因為使用整個訓練集計算梯度,得到的梯度是損失函式在該位置真實的梯度,所以能夠保證收斂到全域性最優點(凸函式)或區域性最優點(非凸函式).缺點是時間和空間複雜度較高,因為BGD計算所有訓練樣本才能更新一次模型引數,更新依次模型引數需要花費更多的時間.同時如果利用向量化的方式實現BGD,需要快取整個訓練樣本集,對於大規模訓練集也難以實現.
  • SGD方法利用單個樣本的梯度估計整個訓練接的梯度,得到的梯度具有較高的誤差,因此利用該梯度更新模型引數不一定會使得損失函式減小,往往隨著迭代的過程,損失函式會出現波動的現象,並且SGD最終也難以在區域性最優點附近停止,而是在其周圍震盪,如果隨著迭代減小learning_rate,SGD也可以同BGD一樣收斂到最優點.SGD雖然更新模型引數的頻率更快,但是更新引數使用的梯度帶有較高的噪聲.
  • MBGD方法是介於前面兩種方法之間,每次從訓練集中隨機抽取一小批訓練樣本,用於計算梯度完成一次模型引數更新,相比於BGD,MBGD方法迭代頻率更高,訓練速度更快.相比於SGD,迭代使用的梯度更加準確,訓練過程更加穩健,利用向量化實現過程也可以實現較快的運算.

上述三種方法中,Mini-batch gradient descent是目前最常採用的訓練方式,一般提到的SGD也代指的是MBGD方法,Mini-batch的訓練方式也是後續momentum gd等改進方法的訓練模式.
基礎的gradient descent方法具有一些共有的弱點,主要包括:

  • learning_rate選擇的問題,基礎的gd方法需要人工設定合適的超引數learning_rate,學習率過小會使得訓練非常緩慢,學習率過大會導致訓練難以收斂甚至發散.
  • learning_rate對於每個維度的特徵都是相同的,但是對於不同出現頻率的特徵或者曲率相差很大的特徵(損失函式的Hessian矩陣病態,特徵值大小相差很大),我們往往希望它們具有不同的學習率.
  • 無法逃逸大量存在的鞍點的問題.(大型神經網路中收斂到一個不錯的區域性最優點也是可以接受的,真正帶來麻煩的是大量存在的鞍點,而鞍點周圍往往存在梯度很小的平原,該問題會在總結部分進行展開論述).

針對基礎的gd存在的上述挑戰,大牛們對gd演算法進行了魔改,主要有兩條線路,改進發展如下圖,下面兩節分別介紹兩類改進方法.

3. 基於momentum的改進演算法

3.1 指數加權滑動平均方法

兩類改進基礎gradient descent的方法都使用了指數加權滑動平均的方法,相比於算數平均運算,該方法時間複雜度和空間複雜度都有較大優勢.定義如下:
\[v_t = \beta v_{t-1}+(1-\beta)\theta_t\]
其中,\(\theta_t\)為指數加權平均的資料,\(v_t\)為指數加權平均的結果,\(\beta\)為指數加權引數,一般設定\(v_0=0\).

  • \(\frac{1}{1-\beta}\)近似為指數加權平均的資料個數,例如,\(\beta=0.9\),則\(v_{20}\)則代表這\(\theta_{20}\)到\(\theta_{11}\)的指數加權平均結果,在\(\theta_{11}\)之前的資料也對結果有影響,但影響十分有限,可以忽略.
  • 上面迭代求解的過程,在運算初期會有明顯的偏差,糾正方法是令\(v_t = \frac{v_t}{1-\beta^t}\)

3.2 momentum演算法

momentum演算法的更新公式如下:

   v = mu*v - learning_rate * dx
   x += v

其中,v是指數加權滑動平均累加量(該公式與2.2節計算公式形式不同,但指數加權滑動平均的思想一致),mu是momentum引入的超引數(一般設定為0.9).

momentum演算法可以借用物理概念很好的理解,想象一個小球從山頂滾落,mu*v這一項相等於速度項(忽略其符號),後面一項相當於加速度項,小球在滾落過程中,不僅受到當前時刻的加速度影響,而且收到積累起來的速度影響(momentum相較於基礎gd多出來的部分),類似於加了慣性作用,而mu引數是一個decay引數,類似與摩擦力的作用,隨著迭代進行,時間久遠的累加值起到的作用將越來越微弱.

當特徵間曲率差異大時,基礎的GD方法會產生zigzag現象,會在曲率大的方向上有較大的震盪,而曲率小的方向上前進較慢,momentum演算法可以有效抑制這種現象.訓練對比影象如下所示(圖片來自"花書")

圖中橢圓為損失函式等高線,顯然45°方向上特徵具有更大的曲率.紅色實線為momentum訓練過程,黑絲箭頭表示基礎GD在該位置將要迭代的位置.比較可見momentum有效減小了訓練過程中曲率較大方向上的震盪,增加了曲率較小方向上的迭代步長.這是因為在指數加權滑動平均的過程中,曲率較大方向上的梯度由於正負交替出現,進行了抵消,而曲率較小方向上的梯度符號一致,累加的過程中增大了梯度,等效於增加了迭代步長.

momentum方法使得訓練過程帶有慣性,好的方面是可能便於訓練逃逸損失函式的鞍點或者平坦區域,不好的方面是在到達最低點時,由於帶有慣性不能立刻停止,會發生overshoot最低點的現象.

3.3 Nesterov momentum演算法

前面提到Momentum演算法在最低點會發生overshoot現象,能不能在快到底最低點前減小梯度,就能減弱該現象,Nesterov momentum正式基於這個考慮改進momentum演算法的.其更新公式如下:
\[v_{t} = \mu v_{t-1} - \alpha \nabla(\theta_{t-1}+\mu v_{t-1})\]
\[\theta_t = \theta_{t-1} + v_t\]
比較momentum演算法可見,唯一的區別是計算梯度部分,Nesterov相較於momentum計算的是引數\(\theta_{t-1}\)更新\(\mu v_{t-1}\)之後的梯度.Nesterov的思想是既然我們已經知道了引數\(\theta_t\)要更新\(\mu v_{t-1}\)這一部分,為什麼不先用\(\mu v_{t-1}\)更新引數,然後在計算梯度呢,這樣用\(\theta_{t-1}+\mu v_{t-1}\)近似模擬了\(\theta_t\),起到了前瞻梯度的效果.至於Nesterov為什麼要比momentum效果好,而已這樣理解,當前瞻到的梯度比當前梯度大時,這一步更新的梯度會更大,反之,當前瞻到的梯度比當前梯度小時,這一步更新的梯度會更小.

例如小球從山頂向山底滾落,開始階段,當山坡的斜率越來越大時,由於前瞻到的梯度比當前梯度要大,所以更新步幅越來越大,可以加快訓練.當小球接近山底時,山坡梯度越來越小,則更新歩幅會提前縮小,可以見減小overshoot現象.

4. 基於adaptive learning rate的改進演算法

前面介紹了基於momentum的改進演算法,這一類改進演算法能夠加速gd的收斂過程,並且對於不同曲率的特徵起到了很好的平衡效果.本節主要介紹給予自適應學習速率的改進方法,這一類方法能夠自適應地賦予不同頻率(泛指的)的特徵以不同的學習速率.

4.1 Adagrad演算法

Adagrad演算法是這一類改進演算法的鼻祖,更新公式如下:

   cache += dx**2
   x += -learning_rate * dx / np.sqrt(cache + 1e-7) 

Adagrad演算法對各個引數的梯度平方進行了累加,並將當前的梯度用累加值進行了加權,可以發現某個引數的梯度較大,則其累加和比較大,則最終更新引數時其權重越低,也就是學習率越小.而某個引數的梯度較小,則其累加和也比較小,則其學習率衰減的比較慢.

為什麼說Adagrad對不同出現頻率的特徵具有賦予不同的學習率,個人理解是,不同維度的特徵可以理解為不同引數的梯度(有很大的欠妥,但根據求導法則,特徵往往是模型引數梯度的重要影響因素,例如\(z = \theta_1x1+\theta_2x2\),引數\(\theta_1,\theta_2\)的梯度分別為x1和x2),則某些維度的特徵出現頻率很低,則其累加值會比較小,則其學習率就相對更大.

Adagrad演算法具有非常明顯的弱點,那就是梯度平方的累加會越大越大,各個引數的學習率會被衰減的越來越小,導致後期訓練越來越慢,可能難以到達最優點.後面的方法針對這一點進行了改進.

4.2 RMSProp演算法

RMSProp演算法不是公開發表論文中的演算法,而是大牛Geoff Hinton在一次授課中提出的演算法,主要思想是將指數加權滑動平均思想引入了Adagrad演算法,更新公式如下:

   cache = decay_rate * cache + (1 - decay_rate) * dx**2
   x += -learning_rate * dx / np.sqrt(cache + 1e-7) 

指數加權滑動平均思想的引入,使得cache發生指數衰減,緩解了Adagrad後期學習率衰減過小的問題.decay_rate是RMSProp演算法引入的超引數,一般設定為0.9.

4.3 Adadelta演算法

Adadelta演算法相較於RMSProp演算法,用另外一個指數加權平均替換掉了全域性learning_rate,其更新公式如下:

   cache = decay_rate1 * cache + (1 - decay_rate1) * dx**2
   dx^ = dx * np.sqrt(delta + 1e-7) / np.sqrt(cache + 1e-7)
   x += - dx^
   delta = decay_rate2 * delta + (1-decay_rate2) * dx^ ** 2

Adadelta快取了模型引數更新平方的指數加權平均,作為自適應的全域性learning_rate,因此我們完全不需要人為設定一個全域性學習率了.

4.4 Adam演算法

Adam演算法結合了momentum和RMSProp兩種演算法,並添加了指數加權滑動平均的偏差矯正,其更新公式如下:

   m = beta1 * m + (1 - beta1) * dx
   v = beta2 * v + (1 - beta2) * dx**2
   m /= 1 - beta1**t
   v /= 1 - beta2**t
   x += -learning_rate * m / (np.sqrt(v) + 1e-7)

其中引數t是迭代次數,beta1,beta2是Adam演算法引入的超引數,beta1,beta2的預設值為0.9和0.999.

5.總結

本篇筆記總結了深度學習中常見的優化演算法,主要包括基礎的Gradient descend演算法和兩類改進演算法,其中Adam演算法是兩類改進演算法的集大成者,兼具momentum系列演算法和adaptive learning rate演算法的優點,是受到普遍推薦的演算法.實際應用中,據說基礎的gd方法往往能夠達到更低的loss,所以有前段使用Adam演算法加速訓練,後期採用基礎gd收斂到更低點的做法.

上述內容之外,還有三個額外的內容.

5.1 關於優化方法的視覺化

本部分的動圖來源於Sebastian Ruder的綜述文章,可以形象的對比各個不同演算法的效能.圖中NAG演算法代指Nesterov momemtum演算法.

5.2 關於深度學習中區域性最優和鞍點的問題

在之前神經網路的優化過程中,人們非常擔心陷入區域性最優,而無法找到全域性最優的問題,而在深度神經網路中,我們更為關心的是優化演算法逃逸鞍點的問題,為什麼會這樣呢?主要是基於兩點考慮(理解自花書):

  • 對於深度神經網路而言,鞍點的數量遠大於區域性最優點的數量(遇到鞍點的額概率高得多),這是因為區域性最優點要求損失函式特徵值全部大於0(正定的),也就是所有特徵的曲率都是大於0的,這對於高維空間而言出現的概率遠低於鞍點(鞍點要求曲率有正有負).類似與丟擲大量的硬幣,要求硬幣都是同一面朝上的概率要低很多.
  • 對於深度神經網路而言,找到一個區域性最優點是可以接受的,因為大型神經網路中的區域性最優點也具有很小的損失函式.

5.3 關於選擇learning_rate的問題

learning_rate選擇的問題其實也屬於超引數訓練的範疇,實踐中是需要根據不同的任務和訓練樣本進行除錯的,對於基礎的gd方法,基於momentum的改進方法,往往需要decay learning_rate,使得訓練初期速度較快,而後期能夠收斂到最低點.對於adaptive learning rate演算法,理論上只需要設定一個全域性learning_rate就可以,演算法本身帶有學習率調整策略.

參考內容:

1.Deep Learning(花書,Ian Goodfellow and Yoshua Bengio and Aaron Courville)
2.An overview of gradient descent optimizationalgorithms
3.CS231n Convolutional Neural Networks for Visual Recognit