轉(zhuǎn)載自鏈接:https://www.cnblogs.com/lliuye/p/9451903.html
梯度下降法作為機(jī)器學(xué)習(xí)中較常使用的優(yōu)化算法,其有著三種不同的形式:批量梯度下降(Batch Gradient Descent)、隨機(jī)梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。其中小批量梯度下降法也常用在深度學(xué)習(xí)中進(jìn)行模型的訓(xùn)練。接下來(lái),我們將對(duì)這三種不同的梯度下降法進(jìn)行理解。
為了便于理解,這里我們將使用只含有一個(gè)特征的線性回歸來(lái)展開(kāi)。此時(shí)線性回歸的假設(shè)函數(shù)為:
hθ(x(i))=θ1x(i)+θ0hθ(x(i))=θ1x(i)+θ0
其中?i=1,2,...,mi=1,2,...,m?表示樣本數(shù)。
對(duì)應(yīng)的目標(biāo)函數(shù)(代價(jià)函數(shù))即為:
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)?與參數(shù)?θ0,θ1θ0,θ1?的關(guān)系的圖:

1、批量梯度下降(Batch Gradient Descent,BGD)
批量梯度下降法是最原始的形式,它是指在每一次迭代時(shí)使用所有樣本來(lái)進(jìn)行梯度的更新。從數(shù)學(xué)上理解如下:
(1)對(duì)目標(biāo)函數(shù)求偏導(dǎo):
Δ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?表示樣本數(shù),?j=0,1j=0,1?表示特征數(shù),這里我們使用了偏置項(xiàng)?x(i)0=1x0(i)=1?。
(2)每次迭代對(duì)參數(shù)進(jìn)行更新:
θ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)
注意這里更新時(shí)存在一個(gè)求和函數(shù),即為對(duì)所有樣本進(jìn)行計(jì)算處理,可與下文SGD法進(jìn)行比較。
偽代碼形式為:
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)
}
優(yōu)點(diǎn):
(1)一次迭代是對(duì)所有樣本進(jìn)行計(jì)算,此時(shí)利用矩陣進(jìn)行操作,實(shí)現(xiàn)了并行。
(2)由全數(shù)據(jù)集確定的方向能夠更好地代表樣本總體,從而更準(zhǔn)確地朝向極值所在的方向。當(dāng)目標(biāo)函數(shù)為凸函數(shù)時(shí),BGD一定能夠得到全局最優(yōu)。
缺點(diǎn):
(1)當(dāng)樣本數(shù)目?mm?很大時(shí),每迭代一步都需要對(duì)所有樣本計(jì)算,訓(xùn)練過(guò)程會(huì)很慢。
從迭代的次數(shù)上來(lái)看,BGD迭代的次數(shù)相對(duì)較少。其迭代的收斂曲線示意圖可以表示如下:

2、隨機(jī)梯度下降(Stochastic Gradient Descent,SGD)
隨機(jī)梯度下降法不同于批量梯度下降,隨機(jī)梯度下降是每次迭代使用一個(gè)樣本來(lái)對(duì)參數(shù)進(jìn)行更新。使得訓(xùn)練速度加快。
對(duì)于一個(gè)樣本的目標(biāo)函數(shù)為:
J(i)(θ0,θ1)=12(hθ(x(i))?y(i))2J(i)(θ0,θ1)=12(hθ(x(i))?y(i))2
(1)對(duì)目標(biāo)函數(shù)求偏導(dǎo):
Δ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)參數(shù)更新:
θj:=θj?α(hθ(x(i))?y(i))x(i)jθj:=θj?α(hθ(x(i))?y(i))xj(i)
注意,這里不再有求和符號(hào)
偽代碼形式為:
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)
}
}
優(yōu)點(diǎn):
(1)由于不是在全部訓(xùn)練數(shù)據(jù)上的損失函數(shù),而是在每輪迭代中,隨機(jī)優(yōu)化某一條訓(xùn)練數(shù)據(jù)上的損失函數(shù),這樣每一輪參數(shù)的更新速度大大加快。
缺點(diǎn):
(1)準(zhǔn)確度下降。由于即使在目標(biāo)函數(shù)為強(qiáng)凸函數(shù)的情況下,SGD仍舊無(wú)法做到線性收斂。
(2)可能會(huì)收斂到局部最優(yōu),由于單個(gè)樣本并不能代表全體樣本的趨勢(shì)。
(3)不易于并行實(shí)現(xiàn)。
解釋一下為什么SGD收斂速度比BGD要快:
答:這里我們假設(shè)有30W個(gè)樣本,對(duì)于BGD而言,每次迭代需要計(jì)算30W個(gè)樣本才能對(duì)參數(shù)進(jìn)行一次更新,需要求得最小值可能需要多次迭代(假設(shè)這里是10);而對(duì)于SGD,每次更新參數(shù)只需要一個(gè)樣本,因此若使用這30W個(gè)樣本進(jìn)行參數(shù)更新,則參數(shù)會(huì)被更新(迭代)30W次,而這期間,SGD就能保證能夠收斂到一個(gè)合適的最小值上了。也就是說(shuō),在收斂時(shí),BGD計(jì)算了?10×30W10×30W?次,而SGD只計(jì)算了?1×30W1×30W?次。
從迭代的次數(shù)上來(lái)看,SGD迭代的次數(shù)較多,在解空間的搜索過(guò)程看起來(lái)很盲目。其迭代的收斂曲線示意圖可以表示如下:

3、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)
小批量梯度下降,是對(duì)批量梯度下降以及隨機(jī)梯度下降的一個(gè)折中辦法。其思想是:每次迭代?使用 ** batch_size** 個(gè)樣本來(lái)對(duì)參數(shù)進(jìn)行更新。
這里我們假設(shè)?batchsize=10batchsize=10?,樣本數(shù)?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)
}
}
優(yōu)點(diǎn):
(1)通過(guò)矩陣運(yùn)算,每次在一個(gè)batch上優(yōu)化神經(jīng)網(wǎng)絡(luò)參數(shù)并不會(huì)比單個(gè)數(shù)據(jù)慢太多。
(2)每次使用一個(gè)batch可以大大減小收斂所需要的迭代次數(shù),同時(shí)可以使收斂到的結(jié)果更加接近梯度下降的效果。(比如上例中的30W,設(shè)置batch_size=100時(shí),需要迭代3000次,遠(yuǎn)小于SGD的30W次)
(3)可實(shí)現(xiàn)并行化。
缺點(diǎn):
(1)batch_size的不當(dāng)選擇可能會(huì)帶來(lái)一些問(wèn)題。
batcha_size的選擇帶來(lái)的影響:
(1)在合理地范圍內(nèi),增大batch_size的好處:
a. 內(nèi)存利用率提高了,大矩陣乘法的并行化效率提高。
b. 跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,對(duì)于相同數(shù)據(jù)量的處理速度進(jìn)一步加快。
c. 在一定范圍內(nèi),一般來(lái)說(shuō) Batch_Size 越大,其確定的下降方向越準(zhǔn),引起訓(xùn)練震蕩越小。
(2)盲目增大batch_size的壞處:
a. 內(nèi)存利用率提高了,但是內(nèi)存容量可能撐不住了。
b. 跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,要想達(dá)到相同的精度,其所花費(fèi)的時(shí)間大大增加了,從而對(duì)參數(shù)的修正也就顯得更加緩慢。
c. Batch_Size 增大到一定程度,其確定的下降方向已經(jīng)基本不再變化。
下圖顯示了三種梯度下降算法的收斂過(guò)程:
