1. 程式人生 > >梯度下降、隨機梯度下降、批量梯度下降

梯度下降、隨機梯度下降、批量梯度下降

前言
最近實驗集體學習機器學習,其中涉及到梯度下降及其變體,不是很清楚,看了好多資料和部落格。在這裡整理總結一下。如果哪裡寫得不對,請大家指正。

一、批量梯度下降(BGD)

        梯度下降是機器學習中應用最廣泛的優化演算法,也是最常見的優化演算法。
        在機器學習中反覆出現的一個問題:好的泛化需要大的訓練集,但大的訓練集的計算代價也大。 一般來說,代價函式越小,就也意味著模型擬合得越好。所以梯度下降就是幫助我們最小化代價函式、損失函式的常用方法。
下面J(theta)是代價函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h(theta)就出來了。其中m是訓練集的記錄條數,i是引數的個數。用hθ(x)表示函式計算輸出的結果,用y表示期望的輸出值;則hθ(x)-y表示誤差

在這裡插入圖片描述


在這裡插入圖片描述

批量梯度下降的思路如下:

(1)若我們有m組訓練樣本,在訓練過程中,我們希望誤差越小越好,所以來調整引數theta使得代價函式J(θ)儘可能的小。

(2)將J(theta)對theta求偏導,得到每個theta對應的的梯度(J下降最快的方向).

在這裡插入圖片描述
(3)要最小化代價函式,那麼我們更新引數theta的時候,就要按每個引數theta梯度的負方向來更新引數,如下:

在這裡插入圖片描述

注意!!!

普通的梯度下降演算法在更新迴歸係數時要遍歷整個資料集,它是一種批處理方法,它得到的是一個全域性最優解,每迭代一步,都要用到訓練集中所有的資料,但是當訓練資料特別龐大時,可能收斂非常慢。所以,為了解決這一問題,我們引入了梯度下降的變體,隨機梯度下降(SGD)。

二、隨機梯度下降(SGD)


隨機梯度下降在計算下降最快的方向時時隨機選一個數據進行計算,而不是掃描全部訓練資料集,這樣就加快了迭代速度。
(1)對比批量梯度下降的代價函式,隨機梯度下降的代價函式可寫做如下:

在這裡插入圖片描述
(2)每個樣本的代價函式,對theta求偏導,得到其梯度。求解過程如下:

在這裡插入圖片描述
(3)更新引數theta
在這裡插入圖片描述
注意!!!這樣做不如完全梯度下降的精確度高,可能會走很多彎路,但整體趨勢是走向minmum,即隨機梯度下降並不是沿著J(θ)下降最快的方向收斂,而是震盪的方式趨向極小點。

三、區別


對比梯度下降和隨機梯度下降和批量梯度下降,這裡藉助[樓燚(yì)航的blog] (http://www.cnblogs.com/louyihang-loves-baiyan/)
1.梯度下降:在梯度下降中,對於θ的更新,所有的樣本都有貢獻,也就是參與調整θ.其計算得到的是一個標準梯度。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會更快啦~
2.隨機梯度下降:可以看到多了隨機兩個字,隨機也就是說我用樣本中的一個例子來近似我所有的樣本,來調整θ,因而隨機梯度下降是會帶來一定的問題,因為計算得到的並不是準確的一個梯度,容易陷入到區域性最優解中
從公式中我們也可以發現隨機梯度的權值更新公式裡調整項沒有累加符號,說明隨機梯度下降中只用到了訓練集的一個樣本,最後得到的可能是全域性最優解,也可能是區域性最優解。
3.批量梯度下降:其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,其本質就是我1個指不定不太準,那我用個30個50個樣本那比隨機的要準不少了吧,而且批量的話還是非常可以反映樣本的一個分佈情況的。
從公式中可以看出,批量梯度下降演算法每迭代一步,要用到訓練集的所有樣本,最後得到的是一個全域性最優解。

四、隨機梯度和批量梯度的實現(Python)差別