批量梯度下降(BGD)、隨機梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

轉載自鏈接:https://www.cnblogs.com/lliuye/p/9451903.html

梯度下降法作為機器學習中較常使用的優化算法,其有著三種不同的形式:批量梯度下降(Batch Gradient Descent)、隨機梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。其中小批量梯度下降法也常用在深度學習中進行模型的訓練。接下來,我們將對這三種不同的梯度下降法進行理解。

為了便于理解,這里我們將使用只含有一個特征的線性回歸來展開。此時線性回歸的假設函數為:

hθ(x(i))=θ1x(i)+θ0hθ(x(i))=θ1x(i)+θ0

其中?i=1,2,...,mi=1,2,...,m?表示樣本數。

對應的目標函數(代價函數)即為:

J(θ0,θ1)=12m∑i=1m(hθ(x(i))?y(i))2J(θ0,θ1)=12m∑i=1m(hθ(x(i))?y(i))2

下圖為?J(θ0,θ1)J(θ0,θ1)?與參數?θ0,θ1θ0,θ1?的關系的圖:

1、批量梯度下降(Batch Gradient Descent,BGD)

批量梯度下降法是最原始的形式,它是指在每一次迭代時使用所有樣本來進行梯度的更新。從數學上理解如下:

(1)對目標函數求偏導:

ΔJ(θ0,θ1)Δθj=1m∑i=1m(hθ(x(i))?y(i))x(i)jΔJ(θ0,θ1)Δθj=1m∑i=1m(hθ(x(i))?y(i))xj(i)

其中?i=1,2,...,mi=1,2,...,m?表示樣本數,?j=0,1j=0,1?表示特征數,這里我們使用了偏置項?x(i)0=1x0(i)=1?。

(2)每次迭代對參數進行更新:

θj:=θj?α1m∑i=1m(hθ(x(i))?y(i))x(i)jθj:=θj?α1m∑i=1m(hθ(x(i))?y(i))xj(i)

注意這里更新時存在一個求和函數,即為對所有樣本進行計算處理,可與下文SGD法進行比較。

偽代碼形式為:

repeat{

?θj:=θj?α1m∑mi=1(hθ(x(i))?y(i))x(i)jθj:=θj?α1m∑i=1m(hθ(x(i))?y(i))xj(i)

(for j =0,1)

}

優點:

(1)一次迭代是對所有樣本進行計算,此時利用矩陣進行操作,實現了并行。

(2)由全數據集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。當目標函數為凸函數時,BGD一定能夠得到全局最優。

缺點:

(1)當樣本數目?mm?很大時,每迭代一步都需要對所有樣本計算,訓練過程會很慢。

從迭代的次數上來看,BGD迭代的次數相對較少。其迭代的收斂曲線示意圖可以表示如下:

2、隨機梯度下降(Stochastic Gradient Descent,SGD)

隨機梯度下降法不同于批量梯度下降,隨機梯度下降是每次迭代使用一個樣本來對參數進行更新。使得訓練速度加快。

對于一個樣本的目標函數為:

J(i)(θ0,θ1)=12(hθ(x(i))?y(i))2J(i)(θ0,θ1)=12(hθ(x(i))?y(i))2

(1)對目標函數求偏導:

ΔJ(i)(θ0,θ1)θj=(hθ(x(i))?y(i))x(i)jΔJ(i)(θ0,θ1)θj=(hθ(x(i))?y(i))xj(i)

(2)參數更新:

θj:=θj?α(hθ(x(i))?y(i))x(i)jθj:=θj?α(hθ(x(i))?y(i))xj(i)

注意,這里不再有求和符號

偽代碼形式為:

repeat{

for i=1,...,m{

?θj:=θj?α(hθ(x(i))?y(i))x(i)jθj:=θj?α(hθ(x(i))?y(i))xj(i)

(for j =0,1)

}

}

優點:

(1)由于不是在全部訓練數據上的損失函數,而是在每輪迭代中,隨機優化某一條訓練數據上的損失函數,這樣每一輪參數的更新速度大大加快。

缺點:

(1)準確度下降。由于即使在目標函數為強凸函數的情況下,SGD仍舊無法做到線性收斂。

(2)可能會收斂到局部最優,由于單個樣本并不能代表全體樣本的趨勢。

(3)不易于并行實現。

解釋一下為什么SGD收斂速度比BGD要快:

答:這里我們假設有30W個樣本,對于BGD而言,每次迭代需要計算30W個樣本才能對參數進行一次更新,需要求得最小值可能需要多次迭代(假設這里是10);而對于SGD,每次更新參數只需要一個樣本,因此若使用這30W個樣本進行參數更新,則參數會被更新(迭代)30W次,而這期間,SGD就能保證能夠收斂到一個合適的最小值上了。也就是說,在收斂時,BGD計算了?10×30W10×30W?次,而SGD只計算了?1×30W1×30W?次。

從迭代的次數上來看,SGD迭代的次數較多,在解空間的搜索過程看起來很盲目。其迭代的收斂曲線示意圖可以表示如下:

3、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

小批量梯度下降,是對批量梯度下降以及隨機梯度下降的一個折中辦法。其思想是:每次迭代?使用 ** batch_size** 個樣本來對參數進行更新。

這里我們假設?batchsize=10batchsize=10?,樣本數?m=1000m=1000?。

偽代碼形式為:

repeat{

for i=1,11,21,31,...,991{

?θj:=θj?α110∑(i+9)k=i(hθ(x(k))?y(k))x(k)jθj:=θj?α110∑k=i(i+9)(hθ(x(k))?y(k))xj(k)

(for j =0,1)

}

}

優點:

(1)通過矩陣運算,每次在一個batch上優化神經網絡參數并不會比單個數據慢太多。

(2)每次使用一個batch可以大大減小收斂所需要的迭代次數,同時可以使收斂到的結果更加接近梯度下降的效果。(比如上例中的30W,設置batch_size=100時,需要迭代3000次,遠小于SGD的30W次)

(3)可實現并行化。

缺點:

(1)batch_size的不當選擇可能會帶來一些問題。

batcha_size的選擇帶來的影響:

(1)在合理地范圍內,增大batch_size的好處:

a. 內存利用率提高了,大矩陣乘法的并行化效率提高。

b. 跑完一次 epoch(全數據集)所需的迭代次數減少,對于相同數據量的處理速度進一步加快。

c. 在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震蕩越小。

(2)盲目增大batch_size的壞處:

a. 內存利用率提高了,但是內存容量可能撐不住了。

b. 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。

c. Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

下圖顯示了三種梯度下降算法的收斂過程:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。