1. 程式人生 > >深度學習優化器 optimizer 的選擇

深度學習優化器 optimizer 的選擇

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢?

在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: 
https://keras.io/optimizers/

我們可以發現除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢,又該怎麼選擇呢?

本文將梳理:

  • 每個演算法的梯度更新規則和缺點
  • 為了應對這個不足而提出的下一個演算法
  • 超引數的一般設定值
  • 幾種演算法的效果比較
  • 選擇哪種演算法

優化器演算法簡述?

首先來看一下梯度下降最常見的三種變形 BGD,SGD,MBGD, 
這三種形式的區別就是取決於我們用多少資料來計算目標函式的梯度, 
這樣的話自然就涉及到一個 trade-off,即引數更新的準確率和執行時間。

1. Batch gradient descent
  • 1
  • 2

梯度更新規則
BGD 採用整個訓練集的資料來計算 cost function 對引數的梯度: 

θ=θαθJ(θ)θ=θ−α∇θJ(θ)

缺點
由於這種方法是在一次更新中,就對整個資料集計算梯度,所以計算起來非常慢,遇到很大量的資料集也會非常棘手,而且不能投入新資料實時更新模型

我們會事先定義一個迭代次數 epoch,首先計算梯度向量 params_grad,然後沿著梯度的方向更新引數 params,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對於凸函式可以收斂到全域性極小值,對於非凸函式可以收斂到區域性極小值。

2. Stochastic gradient descent
  • 1
  • 2

梯度更新規則
和 BGD 的一次用所有資料計算梯度相比,SGD 每次更新時對每個樣本進行梯度更新, 對於很大的資料集來說,可能會有相似的樣本,這樣 BGD 在計算梯度時會出現冗餘, 而 SGD 一次只進行一次更新,就沒有冗餘,而且比較快,並且可以新增樣本。

缺點
SGD 因為更新比較頻繁,會造成 cost function 有嚴重的震盪,此外SGD對噪聲比較敏感。

這裡寫圖片描述

BGD 可以收斂到區域性極小值,當然 SGD 的震盪可能會跳到更好的區域性極小值處。

當我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。

3. Mini-batch gradient descent
  • 1
  • 2

梯度更新規則
MBGD 每一次利用一小批樣本,即 n 個樣本進行計算, 這樣它可以降低引數更新時的方差,收斂更穩定, 另一方面可以充分地利用深度學習庫中高度優化的矩陣操作來進行更有效的梯度計算。 
和 SGD 的區別是每一次迴圈不是作用於每個樣本,而是具有 n 個樣本的Batch。

超引數設定值: 
n 一般取值在 50~200

缺點
Mini-batch gradient descent 不能保證很好的收斂性,

①learning rate 如果選擇的太小,收斂速度會很慢,如果太大,loss function 就會在極小值處不停地震盪甚至偏離。

②有一種措施是先設定大一點的學習率,當兩次迭代之間的變化低於某個閾值後,就減小 learning rate,不過這個閾值的設定需要提前寫好,這樣的話就不能夠適應資料集的特點。此外,這種方法是對所有引數更新時應用同樣的 learning rate,如果我們的資料是稀疏的,我們更希望對出現頻率低的特徵進行大一點的更新

③另外,對於非凸函式,還要避免陷於區域性極小值處,或者鞍點處,因為鞍點周圍的error 是一樣的,所有維度的梯度都接近於0,SGD 很容易被困在這裡。

鞍點:一個光滑函式的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。 
例如這個二維圖形,像個馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點就是(0,0)

這裡寫圖片描述

為了應對上面的三點挑戰就有了下面這些演算法。

[應對挑戰 1]

4. Momentum(動量法)
  • 1
  • 2

SGD 在 ravinesravines 的情況下容易被困住, ravinesravines就是曲面的一個方向比另一個方向更陡,這時 SGD 會發生震盪而遲遲不能接近極小值:

這裡寫圖片描述

梯度更新規則
Momentum 通過加入 γvt1γvt−1 ,可以加速 SGD, 並且抑制震盪 

vt=γvt1+αθJ(θ)vt=γvt−1+α∇θJ(θ)
θ=θvtθ=θ−vt
當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。 
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。

超引數設定值: 
一般 γγ取值 0.9 左右。

缺點: 
這種情況相當於小球從山上滾下來時是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時,就知道需要減速了的話,適應性會更好。

5. Nesterov accelerated gradient(NAG)
  • 1
  • 2

梯度更新規則
用 θγvt1θ−γvt−1來近似當做引數下一步會變成的值,則在計算梯度時,不是在當前位置,而是未來的位置上 

vt=γvt1+αθJ(θγvt1)vt=γvt−1+α∇θJ(θ−γvt−1)
θ=θvtθ=θ−vt
超引數設定值:
γγ仍然取值 0.9 左右。

效果比較: 
這裡寫圖片描述

藍色是 Momentum 的過程,會先計算當前的梯度,然後在更新後的累積梯度後會有一個大的跳躍。 
而 NAG 會先在前一步的累積梯度上(brown vector)有一個大的跳躍,然後衡量一下梯度做一下修正(red vector),這種預期的更新可以避免我們走的太快。

NAG 可以使 RNN 在很多工上有更好的表現。

目前為止,我們可以做到,在更新梯度時順應 loss function 的梯度來調整速度,並且對 SGD 進行加速。

我們還希望可以根據引數的重要性而對不同的引數進行不同程度的更新。

[應對挑戰 2]

6. Adagrad
  • 1
  • 2

這個演算法就可以對低頻的引數做較大的更新,對高頻的做較小的更新,也因此,對於稀疏的資料它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視訊裡面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特徵上有更大的更新。

梯度更新規則

θt+1,i=θt,iαGt,ii+ϵgt,iθt+1,i=θt,i−αGt,ii+ϵgt,i

其中

相關推薦

深度學習優化 optimizer 的原理及選擇

下面是 TensorFlow 中的優化器: 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等,詳情: 我們可以發現除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢

關於深度學習優化 optimizer選擇,你需要了解這些

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢? 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/ 我們可以發

深度學習優化 optimizer選擇

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢?在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/我們可以發現除了常見的梯度下降,還有 A

深度學習優化Optimizer總結-tensorflow-1原理篇

單純以演算法為論,深度學習從業者的演算法能力可能並不需要太大,因為很多時候,只需要構建合理的框架,直接使用框架是不需要太理解其中的演算法的。但是我們還是需要知道其中的很多原理,以便增加自身的知識強度,而優化器可能正是深度學習的演算法核心 官方文件所給的

深度學習——優化演算法Optimizer詳解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

在機器學習、深度學習中使用的優化演算法除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢,又該怎麼選擇呢? 在 Sebastian Ruder 的這篇論文中給出了常用優化器的比較,今天來學習一下:https://arxiv.org/pdf/160

如何選擇深度學習優化

from:https://blog.csdn.net/chenhaifeng2016/article/details/73382273 在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢? 下面是 TensorFlow 中的優化器, https://w

深度學習優化總結

深度學習(一般指深度神經網路DNN)有幾個關鍵的要素:訓練集,網路結構,損失函式(目標函式),優化方法。這裡記錄一下優化方法相關知識點吧。 1. why using optimizer? 訓練DNN時,我們的目標是更新網路引數以使得損失函式最小化,optimizer就是更新引數的方法。不同的

深度學習優化比較

    如圖所示: 經驗之談對於稀疏資料,儘量使用學習率可自適應的優化方法,不用手動調節,而且最好採用預設值SGD通常訓練時間更長,但是在好的初始化和學習率排程方案的情況下,結果更可靠如果在意更快的收斂,並且需要訓練較深較複雜的網路時,推薦使用學習率自適應的優化方法。Adadel

深度學習】深入理解優化Optimizer演算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

1.http://doc.okbase.net/guoyaohua/archive/284335.html 2.https://www.cnblogs.com/guoyaohua/p/8780548.html   原文地址(英文論文):https://www.cnblogs.c

機器學習入門——常用優化(Optimizer)的種類與選擇

經過前面的學習我們已經瞭解人工神經網路的基本構造,並定義了評價神經網路優劣的指標——代價函式,接下來要做的就是通過優化器不斷改進神經網路來使代價函式最小,而TensorFlow已經為我們提供了幾種常用的優化器: tf.train.Optimizer tf.train.G

深度學習中各類優化選擇總結

Batch gradient descent 每次更新我們需要計算整個資料集的梯度,因此使用批量梯度下降進行優化時,計算速度很慢,而且對於不適合記憶體計算的資料將會非常棘手。批量梯度下降演算法不允許我們實時更新模型。 但是批量梯度下降演算法能確保收斂到凸平面的全域性最

如何選擇優化 optimizer

markdown 不能 是什麽 ram 挑戰 二維 另一個 初始化 geo 轉載自http://www.jianshu.com/p/d99b83f4c1a6 在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麽呢? 下面是 TensorFlow 中

tensorflow學習筆記(3):優化optimizer

Ⅰ.class tf.train.Optimizer 優化器(optimizers)類的基類。這個類定義了在訓練模型的時候新增一個操作的API。你基本上不會直接使用這個類,但是你會用到他的子類比如GradientDescentOptimizer, AdagradOptimi

機器學習pytorch平臺程式碼學習筆記(8)——優化 Optimizer

用Spyder中如果有列舉enumerate都要在程式碼開始的地方加if __name__ == '__main__':  原因參考連結最後:https://blog.csdn.net/u010327061/article/details/80218836以下包括以下幾種模式

【機器學習】TensorFlow (二)優化Optimizer

昨天整理了一下梯度下降演算法及其優化演算法,傳送門:https://blog.csdn.net/zxfhahaha/article/details/81385130 那麼在實戰中我們如何用到這些優化器,今天就整理一下TensorFlow中關於優化器Optimi

TensorFlow學習(四):優化Optimizer

更新時間: 2017.5.9 簡化了很多不需要的內容,關注重點。 反正是要學一些API的,不如直接從例子裡面學習怎麼使用API,這樣同時可以複習一下一些基本的機器學習知識。但是一開始開始和以前一樣,先直接講類和常用函式用法,然後舉例子。 這裡

深度學習服務環境配置: Ubuntu17.04+Nvidia GTX 1080+CUDA 9.0+cuDNN 7.0+TensorFlow 1.3

顯卡 right const andrew ng extra framework abi credit packages 本文來源地址:http://www.52nlp.cn/tag/cuda-9-0 一年前,我配置了一套“深度學習服務器”,並且寫過兩篇關於深度學習服務器環

中國地質大學(北京)Linux深度學習服務終端校園網關賬號密碼登錄問題——以ubuntu14.04server版本為例

lib mac地址 raw_input urllib 步驟 ifconf init ifconfig col 學院於2017年12月29日采購一臺深度學習服務器,操作系統為ubuntu14.04server,配置過程遇到各種坑,現就服務器終端命令行網絡配置過程心得分享如下:

深度學習優化算法Momentum RMSprop Adam

blog beta rop isp prop moment mom down pro 一、Momentum 1. 計算dw、db. 2. 定義v_db、v_dw \[ v_{dw}=\beta v_{dw}+(1-\beta)dw \] \[ v_{db}=\beta v_

Keras官方中文文檔:優化Optimizer

loss param compile 方法 clas xiv pos 後者 deep 優化器optimizers 優化器是編譯Keras模型必要的兩個參數之一 from keras import optimizers model = Sequential() model.