其它機器學習、深度學習演算法的全面系統講解可以閱讀

《機器學習-原理、演算法與應用》

,清華大學出版社,

雷明著

,由SIGAI公眾號作者傾力打造。

書的購買連結

書的勘誤,最佳化,原始碼資源

導言

最最佳化問題在機器學習中有非常重要的地位,很多機器學習演算法最後都歸結為求解最最佳化問題。在各種最

最佳化演算法中,梯度下降法是最簡單、最常見的一種,在深度學習的訓練中被廣為使用。在本文中,SIGAI

將為大家系統的講述梯度下降法的原理和實現細節問題

最最佳化問題

理解梯度下降法

最最佳化問題是求解函式極值的問題,包括極大值和極小值。相信所有的讀者對這個問題都不陌生,在初中時我們就學會了求解二次函式的極值(拋物線的頂點),高中時學習了冪函式,指數函式,對數函式,三角函式,反三角函式等各種型別的函式,求函式極值的題更是頻頻出現。這些方法都採用了各種各樣的技巧,沒有一個統一的方案。

真正的飛躍發生在大學時,微積分為我們求函式的極值提供了一個統一的思路:找函式的導數等於0的點,因為在極值點處,導數必定為0。這樣,只要函式的可導的,我們就可以用這個萬能的方法解決問題,幸運的是,在實際應用中我們遇到的函式基本上都是可導的。

在機器學習之類的實際應用中,我們一般將最最佳化問題統一表述為求解函式的極小值問題,即:

理解梯度下降法

理解梯度下降法

其中x稱為最佳化變數,f稱為目標函式。極大值問題可以轉換成極小值問題來求解,只需要將目標函式加上負號即可:

理解梯度下降法

有些時候會對最佳化變數x有約束,包括等式約束和不等式約束,它們定義了最佳化變數的可行域,即滿足約束條件的點構成的集合。在這裡我們先不考慮帶約束條件的問題。

一個最佳化問題的全域性極小值

x^{*}

是指對於可行域裡所有的x,有:

理解梯度下降法

即全域性極小值點處的函式值不大於任意一點處的函式值。區域性極小值

x^{*}

定義為存在一個

\delta

鄰域,對於在鄰域內:

理解梯度下降法

並且在可行域內的所有x,有:

理解梯度下降法

即區域性極小值點處的函式值比一個區域性返回內所有點的函式值都小。在這裡,我們的目標是找到全域性極小值。不幸的是,有些函式可能有多個區域性極小值點,因此即使找到了導數等於0的所有點,還需要比較這些點處的函式值。

導數與梯度

由於實際應用中一般都是多元函式,因此我們跳過一元函式,直接介紹多元函式的情況。梯度是導數對多元函式的推廣,它是多元函式對各個自變數偏導數形成的向量。多元函式的梯度定義為:

理解梯度下降法

其中∇ 稱為梯度運算元,它作用於一個多元函式,得到一個向量。下面是計算函式梯度的一個例子:

理解梯度下降法

可導函式在某一點處取得極值的必要條件是梯度為0,梯度為0的點稱為函式的駐點,這是疑似極值點。需要注意的是,梯度為0只是函式取極值的必要條件而不是充分條件,即梯度為0的點可能不是極值點。

至於是極大值還是極小值,要看二階導數/Hessian矩陣,Hessian矩陣我們將在後面的文章中介紹,這是由函式的二階偏導數構成的矩陣。這分為下面幾種情況:

如果Hessian矩陣正定,函式有極小值

如果Hessian矩陣負定,函式有極大值

如果Hessian矩陣不定,則不是極值點(鞍點)

這和一元函式的結果類似,Hessian矩陣可以看做是一元函式的二階導數對多元函式的推廣。一元函式的極值判別法為,假設在某點處導數等於0,則:

如果二階導數大於0,函式有極小值

如果二階導數小於0,函式有極大值

如果二階導數等於0,情況不定

在這裡我們可能會問:直接求函式的導數/梯度,然後令導數/梯度為0,解方程,問題不就解決了嗎?事實上沒這麼簡單,因為這個方程可能很難解。比如下面的函式:

理解梯度下降法

我們分別對x和y求偏導數,並令它們為0,得到下面的方程組:

理解梯度下降法

這個方程非常難以求解,對於有指數函式,對數函式,三角函式的方程,我們稱為超越方程,求解的難度並不比求極值本身小。

精確的求解不太可能,因此只能求近似解,這稱為數值計算。工程上實現時通常採用的是迭代法,它從一個初始點

X_{0}

開始,反覆使用某種規則從

X_{k}

移動到下一個點

X_{k+1}

,構造這樣一個數列,直到收斂到梯度為0的點處。即有下面的極限成立:

理解梯度下降法

這些規則一般會利用一階導數資訊即梯度;或者二階導數資訊即Hessian矩陣。這樣迭代法的核心是得到這樣的由上一個點確定下一個點的迭代公式:

理解梯度下降法

這個過程就像我們處於山上的某一位置,要到山底找水喝,因此我們必須到達最低點處:

理解梯度下降法

此時我們沒有全域性資訊,根本就不知道哪裡是地勢最低的點,只能想辦法往山下走,走 一步看一步。剛開始我們在山上的某一點處,每一步,我們都往地勢更低的點走,以期望能走到山底。

推導過程

首先我們來看一元函式的泰勒展開,以便於更好的理解多元函式的泰勒展開。如果一個一元函式n階可導,它的泰勒展開公式為:

理解梯度下降法

如果在某一點處導數值大於0(+),則函式在此處是增函式,加大x的值函式值會增加,減小x的值(-)函式會減小。相反的,如果在某一點處導數值小於0(-),則函式是減函式,增加x的值函式值會減小(+),減小x的值函式會增加。因此我們可以得出一個結論:如果x的變化很小,並且變化值與導數值反號,則函式值下降。對於一元函式,x的變化只有兩個方向,要麼朝左,要麼朝右。

下面我們把這一結論推廣到多元函式的情況。多元函式

f(x)

在x點處的泰勒展開為:

理解梯度下降法

這裡我們忽略了二次及更高的項。其中,一次項是梯度向量∇

f(x)

與自變數增量

\Delta X

的內積

(∇ f(x))^{T}\Delta x

,這等價於一元函式的

f

。這樣,函式的增量與自變數的增量

\Delta x

、函式梯度的關係可以表示為:

理解梯度下降法

如果

\Delta x

足夠小,在x的某一鄰域內,則我們可以忽略二次及以上的項,有:

理解梯度下降法

這裡的情況比一元函式複雜多了,是一個向量,

\Delta x

有無窮多種方向,該往哪個方向走呢?如果能保證:

理解梯度下降法

則有:

理解梯度下降法

即函式值遞減,這就是下山的正確方向。因為有:

理解梯度下降法

在這裡,||·||表示向量的模,

\theta

是向量

∇ f(x)

\Delta x

的夾角。因為向量的模一定大於等於0,如果:

理解梯度下降法

則能保證:

理解梯度下降法

即選擇合適的增量

\Delta x

,就能保證函式值下降,要達到這一目的,只要保證梯度和

\Delta x

的夾角的餘弦值小於等於0就可以了。由於有:

理解梯度下降法

只有當:

理解梯度下降法

cos\theta

有極小值-1,此時梯度和

 \Delta x

反向,即夾角為180度。因此當向量

\Delta x

的模大小一定時,當:

理解梯度下降法

即在梯度相反的方向函式值下降的最快。此時有:

理解梯度下降法

函式的下降值為:

理解梯度下降法

只要梯度不為0,往梯度的反方向走函式值一定是下降的。直接用

Δx = −∇f (x )

可能會有問題,因為

X+\Delta X

可能會超出x的鄰域範圍之外,此時是不能忽略泰勒展開中的二次及以上的項的,因此步伐不能太大。一般設:

理解梯度下降法

其中

\alpha

為一個接近於0的正數,稱為步長,由人工設定,用於保證

X+\Delta X

在x的鄰域內,從而可以忽略泰勒展開中二次及更高的項,則有:

理解梯度下降法

從初始點

X_{0}

開始,使用如下迭代公式:

理解梯度下降法

只要沒有到達梯度為0的點,則函式值會沿著序列

X_{k}

遞減,最終會收斂到梯度為0的點,這就是梯度下降法。迭代終止的條件是函式的梯度值為0(實際實現時是接近於0),此時認為已經達到極值點。注意我們找到的是梯度為0的點,這不一定就是極值點,後面會說明。梯度下降法只需要計算函式在某些點處的梯度,實現簡單,計算量小。

實現細節問題

下面我們介紹梯度下降法實現時的一些細節問題,包括初始值的設定,學習率的設定,下面分別進行介紹。

初始值的設定

一般的,對於不帶約束條件的最佳化問題,我們可以將初始值設定為0,或者設定為隨機數,對於神經網路的訓練,一般設定為隨機數,這對演算法的收斂至關重要[1]。

學習率的設定

學習率設定為多少,也是實現時需要考慮的問題。最簡單的,我們可以將學習率設定為一個很小的正數,如0。001。另外,可以採用更復雜的策略,在迭代的過程中動態的調整學習率的值。比如前1萬次迭代為0。001,接下來1萬次迭代時設定為0。0001。

面臨的問題

在實現時,梯度下降法可能會遇到一些問題,典型的是區域性極小值和鞍點問題,下面分別進行介紹。

區域性極小值

有些函式可能有多個區域性極小值點,下面是一個例子:

理解梯度下降法

這張圖中的函式有3個區域性極值點,分別是A,B和C,但只有A才是全域性極小值,梯度下降法可能迭代到B或者C點處就終止。

鞍點

鞍點是指梯度為0,Hessian矩陣既不是正定也不是負定,即不定的點。下面是鞍點的一個例子,假設有函式:

理解梯度下降法

顯然在(0, 0)這點處不是極值點,但梯度為0,下面是梯度下降法的執行結果:

理解梯度下降法

在這裡,梯度下降法遇到了鞍點,認為已經找到了極值點,從而終止迭代過程,而這根本不是極值點。

對於怎麼逃離區域性極小值點和鞍點,有一些解決方案,在這裡我們暫時不細講,以後有機會再專門寫文章介紹。對於凸最佳化問題,不會遇到上面的區域性極小值與鞍點問題,即梯度下降法一定能找到全域性最優解。凸最佳化的概念將在SIGAI後續的文章中介紹。

變種

梯度下降法有大量的變種,它們都只利用之前迭代時的梯度資訊來構造每次的更新值,下面我們分別進行介紹。最直接的改進是為迭代公式加上動量項,動量項累積了之前的權重更新值,加上此項之後的引數更新公式為:

理解梯度下降法

其中

V_{t+1}

是動量項,它取代了之前的梯度項。動量項的計算公式為:

理解梯度下降法

動量項累積了之前的梯度資訊,類似於保持行走時的慣性,以避免來回震盪,加快收斂速度。

AdaGrad的為自適應梯度,即adaptive gradient演算法[2],是梯度下降法最直接的改進。唯一不同的是,AdaGrad根據前幾輪迭代時的歷史梯度值來調整學習率,引數更新公式為:

理解梯度下降法

其中

\alpha

是學習因子,

g_{t}

是第t次迭代時的引數梯度向量,

\varepsilon

是一個很小的正數,為了避免除0操作,下標

i

表示向量的分量。和標準梯度下降法唯一不同的是多了分母中的這一項,它累積了到本次迭代為止梯度的歷史值資訊用於生成梯度下降的係數值。

AdaDelta演算法[3]也是梯度下降法的變種,在每次迭代時也利用梯度值構造引數的更新值。假設要最佳化的引數為x,梯度下降法第t次迭代時計算出來的引數梯度值為

g_{t}

。演算法首先初始化如下兩個向量為0向量:

理解梯度下降法

其中

E[g^{2}]

是梯度平方(對每個分量分別平分)的累計值,更新公式為:

理解梯度下降法

在這裡

g^{2}

是向量每個元素分別計算平方,後面所有的計算公式都是對向量的每個分量進行。接下來計算如下RMS量:

理解梯度下降法

這也是一個向量,計算時分別對向量的每個分量進行。然後計算引數的更新值:

理解梯度下降法

RMS[\Delta X]_{t-1}

的計算公式和這個類似。這個更新值同樣透過梯度來構造,只不過學習率是透過梯度的歷史值確定的。更新公式為:

理解梯度下降法

引數更新的迭代公式為:

理解梯度下降法

和帶動量項的梯度下降法不同的是這裡用歷史梯度值來構造學習率,包括了梯度的平方值。

Adam演算法[4]全稱為adaptive moment estimation,它由梯度項構造了兩個向量m和v,它們的初始值為0,更新公式為:

理解梯度下降法

其中

\beta_{1},\beta_{2}

是人工指定的引數,

i

為向量的分量下標。依靠這兩個值構造引數的更新值,引數的更新公式為:

理解梯度下降法

在這裡,用m代替梯度,用v來構造學習率。

NAG演算法是一種凸最佳化方法,由Nesterov提出。和標準梯度下降法的權重更新公式類似,NAG演算法構造一個向量v,初始值為0。v的更新公式為:

理解梯度下降法

引數的更新公式為:

理解梯度下降法

與帶動量項的SGD相比NAG只是計算梯度時用的引數值不同,NAG計算誤差梯度時考慮了動量項,使用的是

X_{t}+\mu V_{t}

,其他都是一樣的。

RMSProp演算法[5]也是標準梯度下降法的變種,它由梯度值構造一個向量MS,初始化為0,更新公式為:

理解梯度下降法

引數更新公式為:

理解梯度下降法

其中

\delta

是人工設定的引數。這種方法透過梯度的歷史資訊來生成引數更新值的權重係數。

隨機梯度下降法

對於有些機器學習問題,我們的目標函式是對樣本的損失函式。假設訓練樣本集有N個樣本,訓練時最佳化的目標是這個資料集上的平均損失函式:

理解梯度下降法

其中

L(W,X_{i},Y_{i})

是對單個訓練樣本

(X_{i},Y_{i})

的損失函式,w是需要學習的引數。如果訓練時每次都用所有樣本計算梯度並更新,成本太高,作為改進可以在每次迭代時選取一批樣本,將損失函式定義在這些樣本上。

批次隨機梯度下降法在每次迭代中使用上面目標函式的隨機逼近值,即只使用

M\ll N

個樣本來近似計算損失函式。在每次迭代時要最佳化的目標函式變為:

理解梯度下降法

已經證明,隨機梯度下降法在數學期望的意義下收斂,即隨機取樣產生的梯度的期望值是真實的梯度。因為每次迭代時的目標函式實際上是不一樣的,因此隨機梯度下降法並不能保證每次迭代時函式值一定下降。

參考文獻

[1] I。 Sutskever, J。 Martens, G。 Dahl, and G。 Hinton。 On the Importance of Initialization and Momentum in Deep Learning。 Proceedings of the 30th International Conference on Machine Learning, 2013。

[2] Duchi, E。 Hazan, and Y。 Singer。 Adaptive Subgradient Methods for Online Learning and Stochastic Optimization。 The Journal of Machine Learning Research, 2011。

[3] M。 Zeiler。 ADADELTA: An Adaptive Learning Rate Method。 arXiv preprint, 2012。

[4] D。 Kingma, J。 Ba。 Adam: A Method for Stochastic Optimization。 International Conference for Learning Representations, 2015。

[5] T。 Tieleman, and G。 Hinton。 RMSProp: Divide the gradient by a running average of its recent magnitude。 COURSERA: Neural Networks for Machine Learning。Technical report, 2012。

[6] Rumelhart, David E。; Hinton, Geoffrey E。; Williams, Ronald J。 (8 October 1986)。 Learning representations by back-propagating errors。 Nature。 323 (6088): 533–536。

[7] L。 Bottou。 Stochastic Gradient Descent Tricks。 Neural Networks: Tricks of the Trade。 Springer, 2012。

推薦閱讀:

[1] 機器學習-波瀾壯闊40年 SIGAI 2018。4。13。

[2] 學好機器學習需要哪些數學知識?SIGAI 2018。4。17。

[3] 人臉識別演算法演化史 SIGAI 2018。4。20。

[4] 基於深度學習的目標檢測演算法綜述 SIGAI 2018。4。24。

[5] 卷積神經網路為什麼能夠稱霸計算機視覺領域? SIGAI 2018。4。26。

[6] 用一張圖理解SVM的脈絡 SIGAI 2018。4。28。

[7] 人臉檢測演算法綜述 SIGAI 2018。5。3。

[8] 理解神經網路的啟用函式 SIGAI 2018。5。5。

[9]深度卷積神經網路演化歷史及結構改進脈絡-40頁長文全面解讀 SIGAI 2018。5。8。

原創宣告

理解梯度下降法

更多幹貨請關注V X公眾號:SIGAI