1. 程式人生 > >誰擋了我的神經網路?(二)—— 優化演算法

誰擋了我的神經網路?(二)—— 優化演算法

誰擋了我的神經網路?(二)—— 優化演算法

這一系列文章介紹了在神經網路的設計和訓練過程中,可能提升網路效果的一些小技巧。前文介紹了在訓練過程中的一系列經驗,這篇文章將重點關注其中的優化演算法部分。更新於2018.11.1。

文章目錄

前言

在訓練的過程中,選擇的優化演算法是否合適,很大程度上影響了神經網路的結果是否收斂、收斂到的精度和收斂的速度。因此,學會為當前的訓練情境選擇合適的優化演算法是神經網路設計者們必備的技能之一。

考慮到傳統的梯度下降法、隨機梯度下降法等都已經非常成熟,可供學習的資料也很多,演算法本身也並不複雜,而且由於演算法的侷限性,現在很少會用到了,因此這裡只總結當前效果比較好、更受歡迎的Adam優化演算法,至於其他幾種演算法可以從參考文獻中找到介紹。

Adam

Adam是隨機梯度下降法的一個延伸,也是目前最流行的優化演算法,其中涉及到了非常多的引數。

引數

首先,上引數介紹和推薦引數,這些是與實驗最相關的部分。至於理論,可以根據具體需要是否看下去。

  • alpha:也稱作學習率(learning rate)或步長(step size),表示權重被更新的比例(如0.001);大一點的數值(如0.3)會導致在權重更新前較快的學習,而小一點的數值(如1.0e-5)會導致學習過程的減慢。
  • beta1:第一動量的指數衰減率(如0.9)。
  • beta2:第二動量的指數衰減率(如0.999)。對於NLP和計算及視覺等稀疏梯度問題,這個數值應當在1.0附近。
  • epsilon:是一個很小的數值(如1.0E-8),以防止在應用過程中出現除以0的情況。

除此以外,Adam也適用學習率衰減的方法。比如論文中用到了alpha=alpha/sqrt(t)。

根據論文,推薦的預設引數設定為alpha=0.001, beta1=0.9, beta2=0.999, epsilon=10-8。

TensorFlow上面推薦了epsilon的調參:1e-8並不一定對所有情況都適用,比如對於ImageNet,目前最好的選擇是1.0或0.1。

儘管如此,目前流行的深度學習庫都預設使用論文推薦的引數:

  • TensorFlow: learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08.
  • Keras: lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0.
  • Blocks: learning_rate=0.002, beta1=0.9, beta2=0.999, epsilon=1e-08, decay_factor=1.
  • Lasagne: learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
  • Caffe: learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08
  • MxNet: learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8
  • Torch: learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8

什麼是Adam演算法

Adam演算法是Diederik Kingma(OpenAI)和Jimmy Ba(多倫多大學)在2015年的ICLR上發表的論文《Adam: A Method for Stochastic Optimization》中提出的。(注意:Adam演算法是一個名字,而不是縮寫,因此不要寫成ADAM)

作者在論文中指出,Adam演算法在解決非凸優化問題時有這樣幾點優勢:

  • 應用簡潔;
  • 計算效率高;
  • 所需記憶體小;
  • 對於梯度的對角尺寸變化(diagnoal rescale)具有不變性;
  • 適合有大量資料或(/和)引數的問題;
  • 適合非靜態目標(non-stationary objectives);
  • 適合梯度噪聲較大或稀疏梯度的問題;
  • 超引數具有直觀解釋(intuitive interpretation)且在一般情況下幾乎不用調參。

Adam的工作原理

與隨機梯度下降法不同的是,Adam演算法會根據梯度的第一和第二動量的估計,為不同的引數習得不同的學習率。

作者形容,Adam演算法結合了下面兩種SGD的演化演算法,並具有它們的優勢:

  • Adaptive Gradient Algorithm (AdaGrad):這種演算法中每個引數都有自己的學習率,從而提升了在稀疏梯度問題(如自然語言問題和計算及視覺問題)上的表現。
  • Root Mean Square Propagation(RMSProp):這個演算法也保持了每個引數都有專屬的學習率,並且學習率是根據最近這個權重的梯度幅值的平均值決定的(如其變化的速度),這也意味著,這個演算法能很好地適應線上問題和非靜態問題(如噪聲)。

與RMSProp不同的是,Adam不是依據第一動量(first moment estimates)的平均值(mean)調整學習率的,其也會考慮梯度第第二動量的平均值(uncentered variance)。具體來講,Adam計算梯度和梯度的平方的指數移動平均數(moving average),並且依靠引數beta1和beta2控制這些移動平均數的衰減率。運動平均數、beta1和beta2的推薦初始值是1.0附近,從而使得動量偏置趨向0。偏置的估計方式是首先計算得到偏置的估計,隨後不斷更正估計。

Adam的有效性

在這裡插入圖片描述

參考文獻

  1. Adam演算法介紹:https://machinelearningmastery.com/adam-optimization-algorithm-for-deep-learning/
  2. Momentum、RMSProp、Adam介紹:https://blog.paperspace.com/intro-to-optimization-momentum-rmsprop-adam/(中文版:https://www.jqr.com/article/000505)
  3. keras提供的幾種優化演算法和引數介紹:https://keras.io/optimizers/