Gradient-Descent


title: Gradient Descent
date: 2020-01-12 12:41:33
tags: [Gradient Descent]
categories: Machine Learning

梯度下降(Gradient Descent)

1.1梯度下降概述(Overview of gradient descent)

梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出代價函數
J(θ0,θ1) J(\theta_0,\theta_1)
的最小值。

梯度下降的思想:開始我們隨機選擇一個參數的組合(θ0,θ1,......,θn)(\theta_0,\theta_1,......,\theta_n)計算代價函數,然後我們尋找下一個能讓代價函數值下降最多的參數組合。我們持續這麼做直到找到一個局部最小值(local minimum),因爲我們並沒有嘗試完所有的參數組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值。

在這裏插入圖片描述

想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上,在梯度下降算法中,我們要做的就是旋轉360度,看看我們的周圍,並問自己要在某個方向上,用小碎步儘快下山。這些小碎步需要朝什麼方向?如果我們站在山坡上的這一點,你看一下週圍,你會發現最佳的下山方向,你再看看周圍,然後再一次想想,我應該從什麼方向邁着小碎步下山?然後你按照自己的判斷又邁出一步,重複上面的步驟,從這個新的點,你環顧四周,並決定從什麼方向將會最快下山,然後又邁進了一小步,並依此類推,直到你接近局部最低點的位置。

梯度下降特點:越接近最小值,步長越小,下降速度越慢。

注意區分幾個常用函數

1.損失函數(Loss Function):定義在單個樣本上,計算的是一個樣本的誤差;

2.代價函數(Cost Function):定義在整個訓練集上,是所有樣本誤差的平均,也就是損失函數的平均;

3.目標函數(Object Function):最終要優化的函數,等於Cost Function+正則化項。

1.2 批量梯度下降(Batch gradient descent)

批量梯度下降(batch gradient descent)算法的公式爲:

在這裏插入圖片描述
其中是學習率(learning rate),它決定了我們沿着能讓代價函數下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數減去學習速率乘以代價函數的導數。

在這裏插入圖片描述

在梯度下降算法中,還有一個更微妙的問題,梯度下降中,我們要更新θ0\theta_0θ1\theta_1 ,當j=0j=0j=1j=1時,會產生更新,所以你將更新J(θ0)J(\theta_0)Jθ1J(\theta_1)。實現梯度下降算法的微妙之處是,在這個表達式中,如果你要更新這個等式,你需要同時更新θ0\theta_0θ1\theta_1,我的意思是在這個等式中,我們要這樣更新:

θ0\theta_0:=θ0\theta_0 ,並更新θ1\theta_1:=θ1\theta_1

實現方法是:你應該計算公式右邊的部分,通過那一部分計算出和的值,然後同時更新θ0\theta_0θ1\theta_1

在梯度下降算法中,這是正確實現同時更新的方法。這裏不打算解釋爲什麼你需要同時更新,同時更新是梯度下降中的一種常用方法。我們之後會講到,同步更新是更自然的實現方法。當人們談到梯度下降時,他們的意思就是同步更新。

如果你已經修過微積分課程,如果你熟悉偏導數和導數,這其實就是這個微分項:
αJ(θ0,θ1)θ0,αJ(θ0,θ1)θ1 \alpha \frac{\partial J(\theta_0,\theta_1)}{\partial\theta_0},\alpha \frac{\partial J(\theta_0,\theta_1)}{\partial\theta_1}

優點

對於凸目標函數,可以保證全局最優;對於非凸目標函數,可以保證一個局部最優。

缺點

速度慢;數據量大時不可行;無法在線優化,處理動態產生的新樣本。

1.3梯度下降的直觀理解(An intuitive understanding of gradient descent )

我們更深入研究一下,更直觀地感受一下這個算法是做什麼的,以及梯度下降算法的更新過程有什麼意義。梯度下降算法如下:
θj:=θjαJ(θ)θj \theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial\theta_j}
描述:對θ\theta賦值,使得J(θ)J(\theta)按梯度下降最快方向進行,一直迭代下去,最終得到局部最小值。其中α\alpha是學習率(learning rate),它決定了我們沿着能讓代價函數下降程度最大的方向向下邁出的步子有多大。

在這裏插入圖片描述

對於這個問題,求導的目的,基本上可以說取這個紅點的切線,就是這樣一條紅色的直線,剛好與函數相切於這一點,讓我們看看這條紅色直線的斜率,就是這條剛好與函數曲線相切的這條直線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,現在,這條線有一個正斜率,也就是說它有正導數,因此,我得到的新的θ1\theta_1θ1\theta_1更新後等於θ!\theta_!減去一個正數乘以α\alpha

這就是我梯度下降法的更新規則:θj:=θjαJ(θ)θj\theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial\theta_j}

讓我們來看看如果α\alpha太小或α\alpha太大會出現什麼情況:

如果α\alpha太小了,即我的學習速率太小,結果就是隻能這樣像小寶寶一樣一點點地挪動,去努力接近最低點,這樣就需要很多步才能到達最低點,所以如果α\alpha太小的話,可能會很慢,因爲它會一點點挪動,它會需要很多步才能到達全局最低點。

如果α\alpha太大,那麼梯度下降法可能會越過最低點,甚至可能無法收斂,下一次迭代又移動了一大步,越過一次,又越過一次,一次次越過最低點,直到你發現實際上離最低點越來越遠,所以,如果α\alpha太大,它會導致無法收斂,甚至發散。

現在,還有一個問題,當我第一次學習這個地方時,我花了很長一段時間才理解這個問題,如果我們預先把θ1\theta_1放在一個局部的最低點,你認爲下一步梯度下降法會怎樣工作?

假設你將θ1\theta_1初始化在局部最低點,在這兒,它已經在一個局部的最優處或局部最低點。結果是局部最優點的導數將等於零,因爲它是那條切線的斜率。這意味着你已經在局部最優點,它使得θ1\theta_1不再改變,也就是新的θ1\theta_1等於原來的θ1\theta_1,因此,如果你的參數已經處於局部最低點,那麼梯度下降法更新其實什麼都沒做,它不會改變參數的值。這也解釋了爲什麼即使學習速率α\alpha保持不變時,梯度下降也可以收斂到局部最低點。

我們來看一個例子,這是代價函數J(θ)J(\theta)

在這裏插入圖片描述
我想找到它的最小值,首先初始化我的梯度下降算法,在那個品紅色的點初始化,如果我更新一步梯度下降,也許它會帶我到這個點,因爲這個點的導數是相當陡的。現在,在這個綠色的點,如果我再更新一步,你會發現我的導數,也即斜率,是沒那麼陡的。隨着我接近最低點,我的導數越來越接近零,所以,梯度下降一步後,新的導數會變小一點點。然後我想再梯度下降一步,在這個綠點,我自然會用一個稍微跟剛纔在那個品紅點時比,再小一點的一步,到了新的紅色點,更接近全局最低點了,因此這點的導數會比在綠點時更小。所以,我再進行一步梯度下降時,我的導數項是更小的,θ1\theta_1更新的幅度就會更小。所以隨着梯度下降法的運行,你移動的幅度會自動變得越來越小,直到最終移動幅度非常小,你會發現,已經收斂到局部極小值。

回顧一下,在梯度下降算法中,當我們接近局部最低點時,梯度下降法會自動採取更小的幅度,這是因爲當我們接近局部最低點時,很顯然在局部最低時導數等於零,所以當我們接近局部最低時,導數值會自動變得越來越小,所以梯度下降將自動採取較小的幅度,這就是梯度下降的做法。所以實際上沒有必要再另外減小α\alpha

這就是梯度下降算法,你可以用它來最小化任何代價函數JJ,不只是線性迴歸中的代價函數JJ

1.4隨機梯度下降(Stochastic Gradient Descent)

如果我們一定需要一個大規模的訓練集,我們可以嘗試使用隨機梯度下降法來代替批量梯度下降法。

在隨機梯度下降法中,我們定義代價函數爲一個單一訓練實例的代價:

隨機梯度下降算法爲:首先對訓練集隨機“洗牌”,然後:

Repeat (usually anywhere between1-10){

for i=1:m{

(for j=0:n)

}}

隨機梯度下降算法在每一次計算之後便更新參數θ\theta ,而不需要首先將所有的訓練集求和,在梯度下降算法還沒有完成一次迭代時,隨機梯度下降算法便已經走出了很遠。但是這樣的算法存在的問題是,不是每一步都是朝着”正確”的方向邁出的。因此算法雖然會逐漸走向全局最小值的位置,但是可能無法站到那個最小值的那一點,而是在最小值點附近徘徊。
在這裏插入圖片描述
優點

更新頻次快,優化速度更快; 可以在線優化(可以無法處理動態產生的新樣本);一定的隨機性導致有機率跳出局部最優(隨機性來自於用一個樣本的梯度去代替整體樣本的梯度)。

缺點

隨機性可能導致收斂複雜化,即使到達最優點仍然會進行過度優化,因此SGD得優化過程相比BGD充滿動盪。

1.5小批量梯度下降(Mini-batch gradient descent)

小批量梯度下降算法是介於批量梯度下降算法和隨機梯度下降算法之間的算法,每計算常數b次訓練實例,便更新一次參數θ\theta

Repeat {

for i=1:m{

​ (for j=0:n )

​ i+=10

} }

通常我們會令 bb在 2-100 之間。這樣做的好處在於,我們可以用向量化的方式來循環bb個訓練實例,如果我們用的線性代數函數庫比較好,能夠支持平行處理,那麼算法的總體表現將不受影響(與隨機梯度下降相同)。

優點

參數更新時的動盪變小,收斂過程更穩定,降低收斂難度;可以利用現有的線性代數庫高效的計算多個樣本的梯度。

1.6優化算法

1、動量梯度下降法(Gradient descent with Momentum)

2、RMSprop algorithm(root mean square prop)

3、Adam優化算法(Adam optimization algorithm)

4、學習率衰減(Learning rate decay)
參考資料GitHub
參考GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章