隨機梯度下降算法是什麼?

用戶65969511


因為覺得之前的回答都不是很直接和全面,在下回答一波:

理解隨機梯度下降,首先要知道梯度下降法,故先介紹梯度下降法:

梯度下降法

大多數機器學習或者深度學習算法都涉及某種形式的優化。 優化指的是改變 以最小化或最大化某個函數 的任務。 我們通常以最小化 指代大多數最優化問題。 最大化可經由最小化算法最小化 來實現。

我們把要最小化或最大化的函數稱為目標函數或準則。 當我們對其進行最小化時,我們也把它稱為代價函數、損失函數或誤差函數。

下面,我們假設一個損失函數為 ,其中 然後要使得最小化它。

注意:這裡只是假設,不用知道這個目標函數就是平方損失函數等等,然後肯定有人問既然要最小化它,那求個導數,然後使得導數等於0求出不就好了嗎?Emmmm...是的,有這樣的解法,可以去了解正規方程組求解。說下這裡不講的原因,主要是那樣的方式太難求解,然後在高維的時候,可能不可解,但機器學習或深度學習中,很多都是超高維的,所以也一般不用那種方法。總之,梯度下降是另一種優化的不錯方式,比直接求導好很多。

梯度下降:我們知道曲面上方向導數的最大值的方向就代表了梯度的方向,因此我們在做梯度下降的時候,應該是沿著梯度的反方向進行權重的更新,可以有效的找到全局的最優解。這個 的更新過程可以描述為

[a表示的是步長或者說是學習率(learning rate)]

好了,怎麼理解?在直觀上,我們可以這樣理解,看下圖,一開始的時候我們隨機站在一個點,把他看成一座山,每一步,我們都以下降最多的路線來下山,那麼,在這個過程中我們到達山底(最優點)是最快的,而上面的a,它決定了我們“向下山走”時每一步的大小,過小的話收斂太慢,過大的話可能錯過最小值,扯到蛋...)。這是一種很自然的算法,每一步總是尋找使J下降最“陡”的方向(就像找最快下山的路一樣)。

當然了,我們直觀上理解了之後,接下來肯定是從數學的角度,我們可以這樣想,先想在低維的時候,比如二維,我們要找到最小值,其實可以是這樣的方法,具體化到1元函數中時,梯度方向首先是沿著曲線的切線的,然後取切線向上增長的方向為梯度方向,2元或者多元函數中,梯度向量為函數值f對每個變量的導數,該向量的方向就是梯度的方向,當然向量的大小也就是梯度的大小。現在假設我們要求函數的最值,採用梯度下降法,結合如圖所示:

如圖所示,我們假設函數是 ,那麼如何使得這個函數達到最小值呢,簡單的理解,就是對x求導,得到 ,然後用梯度下降的方式,如果初始值是(0的左邊)負值,那麼這是導數也是負值,用梯度下降的公式,使得x更加的靠近0,如果是正值的時候同理。注意:這裡的梯度也就是一元函數的導數,高維的可以直接類推之

然後是優缺點,這裡比較對象是批量梯度和mini-batch梯度下降,先看下他們三者:

  • 批量梯度下降:在每次更新時用所有樣本,要留意,在梯度下降中,對於 的更新,所有的樣本都有貢獻,也就是參與調整 .其計算得到的是一個標準梯度,對於最優化問題,凸問題,也肯定可以達到一個全局最優。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會更快啦。但是很多時候,樣本很多,更新一次要很久,這樣的方法就不合適啦。下圖是其更新公式

  • 隨機梯度下降:在每次更新時用1個樣本,可以看到多了隨機兩個字,隨機也就是說我們用樣本中的一個例子來近似我所有的樣本,來調整θ,因而隨機梯度下降是會帶來一定的問題,因為計算得到的並不是準確的一個梯度,對於最優化問題,凸問題,雖然不是每次迭代得到的損失函數都向著全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近。但是相比於批量梯度,這樣的方法更快,更快收斂,雖然不是全局最優,但很多時候是我們可以接受的,所以這個方法用的也比上面的多。下圖是其更新公式:

  • mini-batch梯度下降:在每次更新時用b個樣本,其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,其本質就是我1個指不定不太準,那我用個30個50個樣本那比隨機的要準不少了吧,而且批量的話還是非常可以反映樣本的一個分佈情況的。在深度學習中,這種方法用的是最多的,因為這個方法收斂也不會很慢,收斂的局部最優也是更多的可以接受!

}

瞭解之後,總的來說,隨機梯度下降一般來說效率高,收斂到的路線曲折,但一般得到的解是我們能夠接受的,在深度學習中,用的比較多的是mini-batch梯度下降。

最後是收斂性,能收斂嗎?收斂到什麼地方?

對於收斂性的問題,總的來說就是從expected loss用特卡洛(monte carlo)來表示計算,那batch GD, mini-batch GD, SGD都可以看成SGD的範疇。因為大家都是在一個真實的分佈中得到的樣本,對於分佈的擬合都是近似的。那這個時候三種方式的梯度下降就都是可以看成用樣本來近似分佈的過程,都是可以收斂的!

對於收斂到什麼地方:

能到的地方:最小值,極小值,鞍點。這些都是能收斂到的地方,也就是梯度為0的點。

當然,幾乎不存在找到鞍點的可能,除非很碰巧,因為梯度下降是對損失函數每個維度分別求極小值,即分別求 關於 極小值。

然後是最小值和極小值,如果是凸函數,梯度下降會收斂到最小值,因為只有一個極小值,它就是最小值。


對於理論支持:

Optimization Methods for Large-Scale Machine Learning:這論文之前的問答也看到了,貼下知友的翻譯。為什麼我們更寵愛“隨機”梯度下降?

ROBUST STOCHASTIC APPROXIMATION APPROACH TO STOCHASTIC PROGRAMMING

An Introduction to optimization

以上三個關於優化的文章,一切問題,自然隨之而解。值得一看!


AI遇見機器學習


隨機梯度下降算法是基於梯度下降法中最原始的方法——批量梯度下降法(BGD)的缺點而演變出的改良。

在訓練過程中常見的損失函數為:

批量梯度下降法(Batch Gradient Descent,簡稱BGD)的方法是先求偏導,再用每個θ各自的梯度負方向依次更新每個θ:

它的效果如圖:

可以看出是一種思路簡單、易於實現的算法,並且在較少迭代次數的情況下就可以得到全局最優解,但是每次迭代都要調用全部數據,如果樣本數量(上面式子中的m)較大,將會導致計算極其慢。基於這一缺點,隨機梯度下降法(Stochastic Gradient Descent,簡稱SGD)被提出。它不再每次迭代都用上所有樣本,而是每次迭代僅僅對一個樣本進行更新,從而達到對於數量龐大的樣本只需使用其中的相對少量就把θ最優化的目的。它的方法是在改寫損失函數之後,θ的更新是基於每個樣本對theta求偏導後所得梯度:

相比BGD算法SGD算法速度大幅提升,幾十萬條樣本基本只需要用上萬或者只要上千條樣本就餓可以得到結果。但是SGD伴隨更多噪音、最優化方向準確度下降的問題。效果如下圖,可以看出相比於BGD,SGD迭代次數顯著增加,並且並不是每一次迭代都是向著最優化方向。同時,SGD算法在實現難度上不如BGD算法簡單。

雖然理論上BGD比SGD得到全局最優,但是在生產場景中,並不是每一個最優化問題中的目標函數都是單峰的,反而是sgd更容易跳出局部最優。


ICMLL實驗室


是最小化風險函數、損失函數的一種常用方法,隨機梯度下降和批量梯度下降是兩種迭代求解思路。隨機梯度下降損失函數對應的是訓練集中每個樣本的粒度,最小化每條樣本的損失函數,雖然不是每次迭代得到的損失函數都向著全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近。


分享到:


相關文章: