1. 程式人生 > >梯度下降,隨機梯度下降,批量梯度下降,mini-batch 梯度下降

梯度下降,隨機梯度下降,批量梯度下降,mini-batch 梯度下降

最近在看到一些神經網路優化的問題,

再進行模型的訓練的時候,總是希望得到一個能較好的反映實際的模型,在對模型訓練的時候其實是在學習其中的引數,

其中主要使用的損失函式來模擬我們的目標,只要使得損失函式可以達到最小或是比較小(可以滿足對問題的求解)就行

在對損失函式進行學習時,其實就是找出函式的全域性最小解,在此由於問題的不同所產生的損失函式可以是不同的,常見

無非就是凸函式和非凸函式之分。

其中對凸函式一般是可以求得全域性最小值的。

對於非凸函式來說,其函式是抖動的,可能存在很多區域性解,而在對這類問題求解時可能不能有效地找出其全域性最小值,

就把問題的求解退而求其次找出其比較接近全域性最小的一個區域性最優解。(這一塊的理解欠缺,不知道是否正確)

在經過上述求出最優解的過程中,其實就是在不斷的迭代學習,將函式中的引數進行定位(值的大小的計算吧),以上jiu

是對整個問題的模型的求解大概過程。

那麼問題來了,怎樣來將最優解求出來呢?

查閱網上的資料談論的較多的是最小二乘法和梯度下降法

以下是參考網上的比較

1.本質相同:兩種方法都是在給定已知資料(independent & dependent variables)的前提下對dependent variables算出出一個一般性的估值函式。然後對給定新資料的dependent variables進行估算。
2.目標相同:都是在已知資料的框架內,使得估算值與實際值的總平方差儘量更小(事實上未必一定要使用平方),估算值與實際值的總平方差的公式為:
\Delta =\frac{1}{2} \sum_{i=1}^{m}{(f_{\beta }(\bar{x_{i}} )-y_{i})^{2} }
其中\bar{x_{i} }為第i組資料的independent variable,y_{i}為第i組資料的dependent variable,\beta為係數向量。

不同
1.實現方法和結果不同:最小二乘法是直接對\Delta求導找出全域性最小,是非迭代法。而梯度下降法是一種迭代法,先給定一個\beta,然後向\Delta下降最快的方向調整\beta,在若干次迭代之後找到區域性最小。梯度下降法的缺點是到最小點的時候收斂速度變慢,並且對初始點的選擇極為敏感,其改進大多是在這兩方面下功夫。
最小二乘法的目標:求誤差的最小平方和,對應有兩種:線性和非線性。線性最小二乘的解是closed-form即x=(A^T A)^{-1}A^Tb,而非線性最小二乘沒有closed-form,通常用迭代法求解。

迭代法,即在每一步update未知量逐漸逼近解,可以用於各種各樣的問題(包括最小二乘),比如求的不是誤差的最小平方和而是最小立方和。

梯度下降是迭代法的一種,可以用於求解最小二乘問題(線性和非線性都可以)。高斯-牛頓法是另一種經常用於求解非線性最小二乘的迭代法(一定程度上可視為標準非線性最小二乘求解方法)。

還有一種叫做Levenberg-Marquardt的迭代法用於求解非線性最小二乘問題,就結合了梯度下降和高斯-牛頓法。

所以如果把最小二乘看做是優化問題的話,那麼梯度下降是求解方法的一種,x=(A^T A)^{-1}A^Tb
是求解線性最小二乘的一種,高斯-牛頓法和Levenberg-Marquardt則能用於求解非線性最小二乘

下面來比較梯度下降 梯度下降法 梯度下降法是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜尋方向的,最速下降法越接近目標值,步長越小,前進越慢。

下面的h(x)是要擬合的函式,J(θ)損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h(θ)就出來了。

其中m是訓練集的記錄條數,j是引數的個數。



梯度下降法是按下面的流程進行的:

1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。

2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。

為了更清楚,給出下面的圖:

image 

這是一個表示引數θ與誤差函式J(θ)的關係圖,紅色的部分是表示J(θ)有著比較高的取值,我們需要的是,能夠讓J(θ)的值儘量的低。也就是深藍色的部分。θ0,θ1表示θ向量的兩個維度。

在上面提到梯度下降法的第一步是給θ給一個初值,假設隨機給的初值是在圖上的十字點。

然後我們將θ按照梯度下降的方向進行調整,就會使得J(θ)往更低的方向進行變化,如圖所示,演算法的結束將是在θ下降到無法繼續下降為止。

image 

當然,可能梯度下降的最終點並非是全域性最小點,可能是一個區域性最小點,可能是下面的情況:

image

上面這張圖就是描述的一個區域性最小點,這是我們重新選擇了一個初始點得到的,看來我們這個演算法將會在很大的程度上被初始點的選擇影響而陷入區域性最小點

下面我將用一個例子描述一下梯度減少的過程,對於我們的函式J(θ)求偏導J:(求導的過程如果不明白,可以溫習一下微積分)

image

下面是更新的過程,也就是θi會向著梯度最小的方向進行減少。θi表示更新之前的值,-後面的部分表示按梯度方向減少的量,α表示步長,也就是每次按照梯度減少的方向變化多少。

image 一個很重要的地方值得注意的是,梯度是有方向的,對於一個向量θ,每一維分量θi都可以求出一個梯度的方向,我們就可以找到一個整體的方向,在變化的時候,我們就朝著下降最多的方向進行變化就可以達到一個最小點,不管它是區域性的還是全域性的。

用更簡單的數學語言進行描述步驟2)是這樣的:

image 倒三角形表示梯度,按這種方式來表示,θi就不見了,


隨機梯度下降和批量梯度下降是兩種迭代求解思路 是在梯度下降的基礎之上增加了某一些限制來使得其快速運算的目的。
引入隨機梯度下降法與mini-batch梯度下降法是為了應對大資料量的計算而實現一種快速的求解。

下面的h(x)是要擬合的函式,J(θ)損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h(θ)就出來了。

其中m是訓練集的記錄條數,j是引數的個數。


1、批量梯度下降的求解思路如下:

(1)將J( θ)對theta求偏導,得到每個 θ對應的的梯度

   

(2)由於是要最小化風險函式,所以按每個引數theta的梯度負方向,來更新每個theta


(3)從上面公式可以注意到,它得到的是一個全域性最優解,但是每迭代一步,都要用到訓練集所有的資料,如果m很大,那麼可想而知這種方法的迭代速度!!所以,這就引入了另外一種方法,隨機梯度下降。

2、隨機梯度下降的求解思路如下:

(1)上面的風險函式可以寫成如下這種形式,損失函式對應的是訓練集中每個樣本的粒度,而上面批量梯度下降對應的是所有的訓練樣本:


(2)每個樣本的損失函式,對theta求偏導得到對應梯度,來更新theta

(3)隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那麼可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向。

mini-batch 梯度下降法

此演算法是將批量梯度下降法中m替換成mini-batch,在此將mini-bach的size遠小於m的大小 在吳恩達的機器學習課程中其介紹了一下將m使用b來代替 迴圈 m/b次直到收斂或是迴圈次數達到。

(1)將J( θ)對theta求偏導,得到每個 θ對應的的梯度

   

(2)由於是要最小化風險函式,所以按每個引數theta的梯度負方向,來更新每個theta


(3)從上面公式可以注意到,得到的是一個區域性近似解,但是其所計算的時間和效果要比隨機梯度下降法的好

但是在計算時候多了一個引數 b  即每批的大小需要去除錯。

所以很多的計算使用的是mini-batch梯度下降法來做的。