1. 程式人生 > >深度學習中的梯度下降優化演算法綜述

深度學習中的梯度下降優化演算法綜述

1 簡介

梯度下降演算法是最常用的神經網路優化演算法。常見的深度學習庫也都包含了多種演算法進行梯度下降的優化。但是,一般情況下,大家都是把梯度下降系列演算法當作是一個用於進行優化的黑盒子,不瞭解它們的優勢和劣勢。

本文旨在幫助讀者構建各種優化演算法的直觀理解,以幫助你在訓練神經網路的過程中更好的使用它們。本文第二部分先簡單敘述了常見的梯度下降優化演算法;第三部分敘述了神經網路訓練過程中存在的挑戰;第四部分,我們將討論一系列常見的優化演算法,研究它們解決這些挑戰的動機及如何推匯出更新準則;第五部分,我們將探討如何在並行和分散式環境下如何優化梯度下降的演算法和結構;第六部分,我們將探討其他有助於優化梯度下降法的策略。

梯度下降法,目的是最小化目標函式 J ( θ ) J(\theta) θ R

d \theta \in R^d 表示一個模型的引數,核心思想是沿著目標函式相對於引數的梯度 θ J ( θ
) \nabla_{\theta}J(\theta)
的反方向持續移動以更新引數。學習率 η \eta 表示每次更新時的移動步長。總之,梯度下降可以想象成在由目標函式形成的“山峰”(超平面)上,沿著各點處下降最快的方向持續前進,直到我們遇到由超平面構成的“谷底”。

2 梯度下降變體

常見的有三種梯度下降的變體演算法,相互之間的區別是每次使用多少樣本計算目標函式相對於引數的梯度。根據每次更新時使用的樣本數量,我們其實是在引數更新的準確性和每次引數更新的耗時之間進行權衡。

2.1 批梯度下降演算法

批梯度下降,每次基於全部的訓練樣本集計算損失函式相對於引數的梯度。公式為:
θ = θ η . θ J ( θ ) \theta = \theta - \eta . \nabla_{\theta}J(\theta)
每次更新時都需要使用全部的訓練樣本計算梯度,好處是梯度計算準確,劣勢是梯度計算量大,更新速度慢。特別是對於太大的無法全部載入到記憶體中的資料集,無法使用批梯度下降法進行更新。批梯度下降法也無法進行引數的線上更新,這是因為不能在執行中加入新的樣本進行計算。

批梯度下降法的虛擬碼為:

for i in range(nb_epochs):
    param_grad = evaluate_gradient(loss_function,data,param)
    params = params - learning_rate * param_grad

對於預先定義的epoch數量,我們首先計算整個訓練樣本集的損失函式相對於引數param的梯度向量param_grad。注意,在最新的深度學習庫中,提供了自動求導功能,可以高效、快速地求得函式對於特定引數的梯度。如果自己實現求梯度的程式碼,則需要進行“梯度檢查”(注:CS231n中給出了關於梯度檢查的指導)。

計算出梯度之後,沿著梯度的反方向,以學習率乘梯度為步長,進行梯度的更新。

批梯度下降法可以保證凸函式收斂到全域性最小值,或者是非凸函式收斂到區域性極小值。當然在深度學習中,損失函式一般是一個非凸函式,目前學者們猜想,對於足夠大的神經網路而言,大部分區域性極小值都具有很小的代價函式,我們能不能找到真正的全域性最小點並不重要,而是需要在引數空間中找到一個代價很小(但不是最小)的點,因此收斂到一個區域性最小值也是一個可以接受的結果。(摘抄自 《深度學習》)

2.2 隨機梯度下降演算法

隨機梯度下降(SGD)和批梯度下降演算法相反,每次只使用單個樣本進行進行引數更新。使用單個樣本對 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) ,首先計算出損失函式值,然後按照下式進行引數更新:
θ = θ η . θ J ( θ ; x ( i ) ; y ( i ) ) \theta = \theta - \eta.\nabla_{\theta}J(\theta;x^{(i)};y^{(i)})
因此批梯度下降法在每次更新引數前,會對相似的樣本計算梯度,因此在較大資料集上計算會有些冗餘。而SGD每次更新僅對單個樣本求梯度,去除了這些冗餘,因而更新速度較快並可進行線上學習。

SGD的缺點是每次更新值的方差很大,在頻繁更新下,目標函式值存在著劇烈的波動,如下圖所示。
圖1圖 1
通俗解釋下上圖,假如當前選中的樣本在當前引數下預測label和真實label很接近,損失函式值很小,那麼本次的引數更新就不需要大幅度的變動;但是,假如當前選中的樣本在更新後的引數下預測label和真實label差距很大,損失函式值很大,那麼就需要進行大幅度的引數更新。表現出來就是損失函式值無法持續的穩定下降,而是存在大範圍的波動。

相比於批梯度下降有可能會收斂到一個區域性極小值,SGD收斂過程中的波動,有可能會幫助目標函式跳到一個可能更小的區域性極小值。但是,SGD也會使得收斂的過程變得複雜,因為該方法可能持續的波動而不會停止。實驗結果也表明,當慢慢減小學習率時,SGD可以取得和批梯度下降同樣的收斂效果,使得非凸函式收斂到區域性極小值、凸函式收斂到全域性最小值。

下面的虛擬碼也表明了SGD是在批梯度下降的基礎上加了一個對每個樣本的遍歷,計算每個樣本的損失函式,然後使用損失函式相對於引數的梯度進行更新。不過要注意的是在開始每個epoch的更新之前,先對樣本集進行了shuffle操作。

for i in range(nb_epochs):
    np.random.shuffle(data)
    for example in data:
        param_grad = evaluate_gradient(loss_function,example,param)
        params = params - learning_rate * param_grad

2.3 Mini-Batch梯度下降

mini-batch梯度下降每次使用大小為n的小批次訓練樣本進行引數更新。更新公式為:
θ = θ η . θ J ( θ ; x ( i : i + n ) ; y ( i : i + n ) ) \theta = \theta - \eta.\nabla_{\theta}J(\theta;x^{(i:i+n)};y^{(i:i+n)})

好處是:

  • 減少了引數更新中的方差,可以取得較穩定的收斂效果;
  • 可以使用目前常用的深度學習庫中高度優化的矩陣乘法操作提升梯度計算的效率。

常用的mini-batch大小為50-256,但是也可以根據具體的應用進行調整。

小批量梯度下降演算法,通常是我們訓練神經網路的首選演算法。現在,我們一般就用SGD來表示小批量梯度下降演算法。下文對於隨機梯度下降演算法的介紹中,為方便起見,就省略了子式中的引數x(i:i+n),y(i:i+n)。

小批量梯度下降演算法的虛擬碼為:

for i in range(nb_epochs):
    np.random.shuffle(data)
    for batch in get_batchs(data,batch_size = 50):
        param_grad = evaluate_gradient(loss_function,batch,param)
        params = params - learning_rate * param_grad

2.4 小結

目前經常使用小批量梯度下降演算法,而不是批量梯度下降演算法的原因是:n個樣本均值的標準差是 σ n \frac{\sigma}{\sqrt n} ,其中 σ \sigma 是樣本值真實的標準差。分母 n \sqrt n 表明使用更多樣本來估計梯度的方法的回報是低於線性的。比較兩個假象的梯度計算,一個基於100個樣本,另一個基於10000個樣本,後者需要的計算量是前者的100倍,但卻只降低了10倍的均值標準差。如果能夠快速地計算出梯度估計值,而不是緩慢地計算準確值,那麼大多數優化演算法會收斂地更快。

小批量的大小通常由以下幾個因素決定:

  • 更大的批量會計算更精確的梯度估計,但是回報卻是小於線性的;
  • 極小批量通常難以充分利用多核架構。這促使我們使用一些絕對最小批量,低於這個值的小批量處理不會減少計算時間;
  • 如果批量處理中的所有樣本可以並行地處理(通常確是如此),那麼記憶體消耗和批量大小會正比。對於很多硬體設施,這是批量大小的限制因素;
  • 在某些硬體上使用特定大小的陣列時,執行時間會更少。尤其是在使用 GPU 時,通常使用 2 的冪數作為批量大小可以獲得更少的執行時間。一般, 2 的冪數的取值範圍是 32 到 256, 16 有時在嘗試大模型時使用;
  • 可能是由於小批量在學習過程中加入了噪聲,它們會有一些正則化效果 。 泛化誤差通常在批量大小為 1 時最好。因為梯度估計的高方差,小批量訓練需要較小的學習率以保持穩定性。因為降低的學習率和消耗更多步驟來遍歷整個訓練集都會產生更多的步驟,所以會導致總的執行時間非常大。

3 挑戰

小批量梯度下降演算法,也無法保證良好的收斂效果,同時也帶來了一系列需要解決的問題:

  • 選擇適當的學習率是一個難題。太小的學習率會導致較慢的收斂速度,而太大的學習率則會阻礙收斂,並會引起損失函式在最小值處震盪,甚至有可能導致結果發散;
  • 我們可以設定一個關於學習率的列表,如通過退火的方法,在學習過程中調整學習率 —— 按照一個預先定義的列表、或是當相鄰迭代epoch中損失函式的變化小於一定閾值時來降低學習率。但這些列表或閾值,需要根據資料集的特性,提前定義;
  • 此外,我們對所有的引數都採用了相同的學習率。但如果我們的資料比較稀疏,同時特徵有著不同的出現頻率,那麼我們不希望以相同的學習率來更新這些變數,我們希望對較少出現的特徵有更大的學習率;
  • 在對神經網路最優化非凸的罰函式時,另一個通常面臨的挑戰,是如何避免目標函式被困在無數的區域性最小值中,以導致的未完全優化的情況。Dauphin 認為,這個困難並不來自於區域性最小值,而是來自於“鞍點”,也就是在一個方向上斜率是正的、在一個方向上斜率是負的點。這些鞍點通常由一些函式值相同的面環繞,它們在各個方向的梯度值都為0,所以SGD很難從這些鞍點中逃離。

4 梯度下降優化演算法

下面介紹目前深度學習中常用的解決上述挑戰的優化演算法。這裡沒有介紹不適合於高維資料集的優化演算法,例如牛頓法等二階優化演算法。

4.1 動量

SGD很難在具有陡峭邊的峽谷 —— 一種在一個方向的彎曲程度遠大於其他方向的彎曲程度的區域中實現良好的優化,但是這種情況在區域性極小值處很常見。在峽谷中,如下圖黑線所示,SGD在峽谷的窄軸上震盪,向區域性極值處緩慢地前進。
在這裡插入圖片描述圖 2

動量法,如圖2中紅線所示,會幫助SGD在正確優化方向上加速前進,並減小震盪。實現上是通過在原有項前新增一個引數 γ \gamma ,迭代公式如下所示:
v t = γ . v t 1 + η . θ J ( θ ) θ = θ v t v_t = \gamma.v_{t-1} + \eta.\nabla_{\theta}J(\theta) \\ \\ \theta = \theta - v_t
動量引數 γ \gamma 一般會設定為0.9或其他差不多的值。

動量演算法累積了之前梯度指數級衰減的移動平均,並且繼續沿著該方向移動。在擬合一組含有噪聲但是有明顯分佈點的分佈趨勢時,可以用到指數加權平均這一方法,即每在第n次計算當前值時,都將前n-1的值通過加權的方式求和,使計算當前值能夠儲存前面的資料分佈趨勢,而又由於加權衰減,越早的資料影響越小,比直接用平均值的方式更優。

v 0 = 0 v t = γ . v t 1 + η . θ J ( θ ) v_0 = 0\\ v_t = \gamma.v_{t-1} + \eta.\nabla_{\theta}J(\theta)
假如 γ \gamma =0.9,則 v 1 = 0.9 v 0 + η . θ J ( θ ) , v 2 = 0.9 v 1 + η . θ J ( θ ) = ( 0.9 ) 2 v 0 + 0.9 v 1 + η . θ J ( θ ) , . . . v_1 = 0.9*v_0 + \eta.\nabla_{\theta}J(\theta),v_2=0.9*v_1 + \eta.\nabla_{\theta}J(\theta) = (0.9)^2*v_0 + 0.9*v_1 + \eta.\nabla_{\theta}J(\theta),...

由於對於小數 ε \varepsilon ,有 ( 1 ε ) 1 ε 0.35 1 e (1-\varepsilon)^{\frac 1 \varepsilon}\approx0.35\approx \frac 1e ,同時由於 v t v_t 實際上是由一個指數衰減函式和資料點做內積的結果,而當這個指數衰減減小到 1 e \frac 1e

相關推薦

深度學習梯度下降優化演算法綜述

1 簡介 梯度下降演算法是最常用的神經網路優化演算法。常見的深度學習庫也都包含了多種演算法進行梯度下降的優化。但是,一般情況下,大家都是把梯度下降系列演算法當作是一個用於進行優化的黑盒子,不瞭解它們的優勢和劣勢。 本文旨在幫助讀者構建各種優化演算法的直觀理解,以幫助你在訓練神經網

2017年深度學習--梯度下降 優化演算法研究

原文連結 【導讀】梯度下降演算法是機器學習中使用非常廣泛的優化演算法,也是眾多機器學習演算法中最常用的優化方法。幾乎當前每一個先進的(state-of-the-art)機器學習庫或者深度學習庫都會包括梯度下降演算法的不同變種實現。但是,它們就像一個黑盒優化器,

基於深度學習的影象語義分割演算法綜述(截止20180715)

這篇文章講述卷積神經網路在影象語義分割(semantic image segmentation)的應用。影象分割這項計算機視覺任務需要判定一張圖片中特定區域的所屬類別。 這個影象裡有什麼?它在影象中哪個位置? 更具體地說,影象語義分割的目標是將影象的每個畫素所

深度學習—加快梯度下降收斂速度(一):mini-batch、Stochastic gradient descent

在深層神經網路那篇部落格中講了,深層神經網路的區域性最優解問題,深層神經網路中存在區域性極小點的可能性比較小,大部分是鞍點。因為鞍面上的梯度接近於0,在鞍面上行走是非常緩慢的。因此,必須想辦法加速收斂速度,使其更快找到全域性最優解。本文將介紹mini-batch

基於深度學習的影象語義分割演算法綜述

   作者: 葉  虎            編輯:趙一帆           前  言本文翻譯

自問自答2——深度學習梯度消失/爆炸為什麼是一個問題?(待完善)

我們知道SGD只是用來求解優化問題的一種方法:沿著負梯度方向找到損失最小值。所以SGD的核心就是計算梯度以得到引數更新。而在深層神經網路中,反向傳播時很容易發生梯度消失或者梯度爆炸的問題,尤其是RNN網路中。我們認為這兩種情況是非常危險的,要極力避免。 無論梯

神經網路梯度下降優化演算法及初始化方法小結

An overview of gradient descent optimization algorithms and Weight initialization methods. 神經網路重要的一點就是調參煉丹,這裡複習一下網路的初始化方法及優

機器學習梯度下降法和牛頓法的比較

在機器學習的優化問題中,梯度下降法和牛頓法是常用的兩種凸函式求極值的方法,他們都是為了求得目標函式的近似解。在邏輯斯蒂迴歸模型的引數求解中,一般用改良的梯度下降法,也可以用牛頓法。由於兩種方法有些相似,我特地拿來簡單地對比一下。下面的內容需要讀者之前熟悉兩種演算

深度學習—加快梯度下降收斂速度(二):Monmentum、RMSprop、Adam

上篇部落格講的是利用處理(分組資料集)訓練資料集的方法,加快梯度下降法收斂速度,本文將介紹如何通過處理梯度的方法加快收斂速度。首先介紹Monmentum,再次介紹RMSprop,最後介紹兩種演算法的綜合體Adam。 1.Monmentum 在介紹Monmen

深度學習總結(五)——各優化演算法

一、各優化演算法簡介 1. 批量梯度下降(Batch gradient descent,BGD) θ=θ−η⋅∇θJ(θ) 每迭代一步,都要用到訓練集所有的資料。 2. 隨機梯度下降(Stochastic Gradient Descent,S

機器學習梯度下降法原理及用其解決線性迴歸問題的C語言實現

本文講梯度下降(Gradient Descent)前先看看利用梯度下降法進行監督學習(例如分類、迴歸等)的一般步驟: 1, 定義損失函式(Loss Function) 2, 資訊流forward propagation,直到輸出端 3, 誤差訊號back propagation。採用“鏈式法則”,求損失函式關

深度學習優化演算法(待更)

    優化演算法可以使得神經網路執行的速度大大加快,機器學習的應用是一個高度依賴經驗的過程,伴隨著大量迭代的過程,需要訓練諸多的模型來找到最合適的那一個。其中的一個難點在於,深度學習沒有在大資料領域發揮最大的效果,我們可以利用一個巨大的資料集來訓練神經網路,

機器學習 (十) 優化演算法利器之梯度下降(Gradient Descend)

理解:機器學習各種演算法的求解最終出來的幾乎都是求解最優模型引數的優化問題。 前言        在優化問題領域有些很多優秀思想和演算法,從約束條件分類 分為無約束條件的優化和有約束條件的優化問題,有約束條

深度學習優化演算法

標準梯度下降法: 標準梯度下降先計算所有樣本彙總誤差,然後根據總誤差來更新權值 缺點:當訓練樣本比較大時,更新一次權值需要的時間比較長,因為要將所有的樣本都訓練一次才更新權值。 隨機梯度下降法: 隨機梯度下降隨機抽取一個樣本來計算誤差,然後更新權值 缺點:更新權值雖然非常快,

深度學習優化演算法概覽

一、發展背景及基本框架 梯度下降是目前神經網路中使用最為廣泛的優化演算法之一。為了彌補樸素梯度下降的種種缺陷,研究者們發明了一系列變種演算法,從最初的 SGD (隨機梯度下降) 逐步演進到 NAdam。然而,許多學術界最為前沿的文章中,都並沒有一味使用 Adam/NAdam 等公認“

人工智障學習筆記——梯度下降(2)優化演算法

四、優化 4-1 Momentum 如果我們把梯度下降法當作小球從山坡到山谷的一個過程,那麼在小球滾動時是帶有一定的初速度,在下落過程,小球積累的動能越來越大,小球的速度也會越滾越大,更快的奔向谷底,受此啟發就有了動量法 Momentum。 動量的引入是為了加速SG

深度學習的三種梯度下降方式:批量(batch),隨機(stochastic),小批量(mini-batch)

  1,批量梯度下降法(Batch Gradient Descent) :在更新引數時都使用所有的樣本來進行更新。   優點:全域性最優解,能保證每一次更新權值,都能降低損失函式;易於並行實現。   缺點:當樣本數目很多時,訓練過程會很慢。   2,隨機梯度下降法(Stoch

機器學習常見的優化方法:梯度下降法、牛頓法擬牛頓法、共軛梯度法、拉格朗日乘數法

機器學習中常見的優化方法: 梯度下降法、牛頓法擬牛頓法、共軛梯度法、拉格朗日乘數法 主要內容 梯度下降法 牛頓法擬牛頓法 共軛梯度法 拉格朗日乘數法   許多機器學習演算法,往往建立目標函式(損失函式+正則項),通過優化方法進行優化,根據訓練

【機器學習梯度下降演算法梯度優化演算法

用於評估機器學習模型的就是損失函式,我們訓練的目的基本上都是最小化損失,這個最小化的方式就要用優化演算法了,機器學習中最常用的就是梯度下降演算法。 導數、方向導數和梯度 要了解梯度下降演算法是什麼首要知道梯度是什麼,導數和方向導數又是瞭解梯度的前提。

深度學習優化演算法(SGD->Adam)

深度學習中優化演算法的總結 機器學習界有一群煉丹師,他們每天的日常是: 拿來藥材(資料),架起八卦爐(模型),點著六味真火(優化演