2.1 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
| 1.15 總結(jié) | 回到目錄 | 2.2 理解 mini-batch 梯度下降法 |
Mini-batch 梯度下降 (Mini-batch Gradient Descent)
本周將學(xué)習(xí)優(yōu)化算法,這能讓你的神經(jīng)網(wǎng)絡(luò)運(yùn)行得更快。機(jī)器學(xué)習(xí)的應(yīng)用是一個高度依賴經(jīng)驗(yàn)的過程,伴隨著大量迭代的過程,你需要訓(xùn)練諸多模型,才能找到合適的那一個,所以,優(yōu)化算法能夠幫助你快速訓(xùn)練模型。
其中一個難點(diǎn)在于,深度學(xué)習(xí)沒有在大數(shù)據(jù)領(lǐng)域發(fā)揮最大的效果,我們可以利用一個巨大的數(shù)據(jù)集來訓(xùn)練神經(jīng)網(wǎng)絡(luò),而在巨大的數(shù)據(jù)集基礎(chǔ)上進(jìn)行訓(xùn)練速度很慢。因此,你會發(fā)現(xiàn),使用快速的優(yōu)化算法,使用好用的優(yōu)化算法能夠大大提高你和團(tuán)隊(duì)的效率,那么,我們首先來談?wù)?strong>mini-batch梯度下降法。
你之前學(xué)過,向量化能夠讓你有效地對所有 mmm 個樣本進(jìn)行計(jì)算,允許你處理整個訓(xùn)練集,而無需某個明確的公式。所以我們要把訓(xùn)練樣本放大巨大的矩陣 XXX 當(dāng)中去, X=[x(1)x(2)x(3)?x(m)]X=[x^{(1)}x^{(2)}x^{(3)}\cdots x^{(m)}]X=[x(1)x(2)x(3)?x(m)] , YYY 也是如此, Y=[y(1)y(2)y(3)?y(m)]Y=[y^{(1)}y^{(2)}y^{(3)}\cdots y^{(m)}]Y=[y(1)y(2)y(3)?y(m)] ,所以 XXX 的維數(shù)是 (nx,m)(n_x,m)(nx?,m) , YYY 的維數(shù)是 (1,m)(1,m)(1,m) ,向量化能夠讓你相對較快地處理所有 mmm 個樣本。如果 mmm 很大的話,處理速度仍然緩慢。比如說,如果 mmm 是500萬或5000萬或者更大的一個數(shù),在對整個訓(xùn)練集執(zhí)行梯度下降法時,你要做的是,你必須處理整個訓(xùn)練集,然后才能進(jìn)行一步梯度下降法,然后你需要再重新處理500萬個訓(xùn)練樣本,才能進(jìn)行下一步梯度下降法。所以如果你在處理完整個500萬個樣本的訓(xùn)練集之前,先讓梯度下降法處理一部分,你的算法速度會更快,準(zhǔn)確地說,這是你可以做的一些事情。
你可以把訓(xùn)練集分割為小一點(diǎn)的子集訓(xùn)練,這些子集被取名為mini-batch,假設(shè)每一個子集中只有1000個樣本,那么把其中的 x(1)x^{(1)}x(1) 到 x(1000)x^{(1000)}x(1000) 取出來,將其稱為第一個子訓(xùn)練集,也叫做mini-batch,然后你再取出接下來的1000個樣本,從 x(1001)x^{(1001)}x(1001) 到 x(2000)x^{(2000)}x(2000) ,然后再取1000個樣本,以此類推。
接下來我要說一個新的符號,把 x(1)x^{(1)}x(1) 到 x(1000)x^{(1000)}x(1000) 稱為 X(1)X^{(1)}X(1) , x(1001)x^{(1001)}x(1001) 到 x(2000)x^{(2000)}x(2000) 稱為 X(2)X^{(2)}X(2) ,如果你的訓(xùn)練樣本一共有500萬個,每個mini-batch都有1000個樣本,也就是說,你有5000個mini-batch,因?yàn)?000乘以1000就是5000萬。
你共有5000個mini-batch,所以最后得到是 X(5000)X^{(5000)}X(5000)
對 YYY 也要進(jìn)行相同處理,你也要相應(yīng)地拆分 YYY 的訓(xùn)練集,所以這是 Y(1)Y^{(1)}Y(1) ,然后從 y(1001)y^{(1001)}y(1001) 到 y(2000)y^{(2000)}y(2000) ,這個叫 Y(2)Y^{(2)}Y(2) ,一直到 Y(5000)Y^{(5000)}Y(5000) 。
mini-batch的數(shù)量 ttt 組成了 X(t)X^{(t)}X(t) 和 Y(t)Y^{(t)}Y(t) ,這就是1000個訓(xùn)練樣本,包含相應(yīng)的輸入輸出對。
在繼續(xù)課程之前,先確定一下我的符號,之前我們使用了上角小括號 (i)(i)(i) 表示訓(xùn)練集里的值,所以 x(i)x^{(i)}x(i) 是第 iii 個訓(xùn)練樣本。我們用了上角中括號 [l][l][l] 來表示神經(jīng)網(wǎng)絡(luò)的層數(shù), z[l]z^{[l]}z[l] 表示神經(jīng)網(wǎng)絡(luò)中第 lll 層的 zzz 值,我們現(xiàn)在引入了大括號 ttt 來代表不同的mini-batch,所以我們有 X(t)X^{(t)}X(t) 和 Y(t)Y^{(t)}Y(t) ,檢查一下自己是否理解無誤。
X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 的維數(shù):如果 X{1}X^{\{1\}}X{1} 是一個有1000個樣本的訓(xùn)練集,或者說是1000個樣本的 xxx 值,所以維數(shù)應(yīng)該是 (nx,1000)(n_x,1000)(nx?,1000) , X{2}X^{\{2\}}X{2} 的維數(shù)應(yīng)該是 (nx,1000)(n_x,1000)(nx?,1000) ,以此類推。因此所有的子集維數(shù)都是 (nx,1000)(n_x,1000)(nx?,1000) ,而這些( Y{t}Y^{\{t\}}Y{t} )的維數(shù)都是 (1,1000)(1,1000)(1,1000) 。
解釋一下這個算法的名稱,batch梯度下降法指的是我們之前講過的梯度下降法算法,就是同時處理整個訓(xùn)練集,這個名字就是來源于能夠同時看到整個batch訓(xùn)練集的樣本被處理,這個名字不怎么樣,但就是這樣叫它。
相比之下,mini-batch梯度下降法,指的是我們在下一張幻燈片中會講到的算法,你每次同時處理的單個的mini-batch X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} ,而不是同時處理全部的 XXX 和 YYY 訓(xùn)練集。
那么究竟mini-batch梯度下降法的原理是什么?在訓(xùn)練集上運(yùn)行mini-batch梯度下降法,你運(yùn)行for t=1……5000,因?yàn)槲覀冇?000個各有1000個樣本的組,在for循環(huán)里你要做得基本就是對 X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 執(zhí)行一步梯度下降法。假設(shè)你有一個擁有1000個樣本的訓(xùn)練集,而且假設(shè)你已經(jīng)很熟悉一次性處理完的方法,你要用向量化去幾乎同時處理1000個樣本。
首先對輸入也就是 X{t}X^{\{t\}}X{t} ,執(zhí)行前向傳播,然后執(zhí)行 z[1]=W[1]X+b[1]z^{[1]}=W^{[1]}X+b^{[1]}z[1]=W[1]X+b[1] ,之前我們這里只有,但是現(xiàn)在你正在處理整個訓(xùn)練集,你在處理第一個mini-batch,在處理mini-batch時它變成了 X{t}X^{\{t\}}X{t} ,即 z[1]=W[1]X{t}+b[1]z^{[1]}=W^{[1]}X^{\{t\}}+b^{[1]}z[1]=W[1]X{t}+b[1] ,然后執(zhí)行 A[1]k=g[1](Z[1])A^{[1]k}=g^{[1]}(Z^{[1]})A[1]k=g[1](Z[1]) ,之所以用大寫的 ZZZ 是因?yàn)檫@是一個向量內(nèi)涵,以此類推,直到 A[L]=g[L](Z[L])A^{[L]}=g^{[L]}(Z^{[L]})A[L]=g[L](Z[L]) ,這就是你的預(yù)測值。注意這里你需要用到一個向量化的執(zhí)行命令,這個向量化的執(zhí)行命令,一次性處理1000個而不是500萬個樣本。接下來你要計(jì)算損失成本函數(shù) JJJ ,因?yàn)樽蛹?guī)模是1000, J=11000∑i=1lL(y^(i),y(i))J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})J=10001?∑i=1l?L(y^?(i),y(i)) ,說明一下,這( L(y^(i),y(i))L(\hat{y}^{(i)},y^{(i)})L(y^?(i),y(i)) )指的是來自于mini-batch X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 中的樣本。
如果你用到了正則化,你也可以使用正則化的術(shù)語, J=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_FJ=10001?∑i=1l?L(y^?(i),y(i))+21000λ?∑l?∣∣w[l]∣∣F2? ,因?yàn)檫@是一個mini-batch的損失,所以我將 JJJ 損失記為上角標(biāo) ttt ,放在大括號里( J{t}=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J^{\{t\}}=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_FJ{t}=10001?∑i=1l?L(y^?(i),y(i))+21000λ?∑l?∣∣w[l]∣∣F2? )。
你也會注意到,我們做的一切似曾相識,其實(shí)跟之前我們執(zhí)行梯度下降法如出一轍,除了你現(xiàn)在的對象不是 XXX , YYY ,而是 X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} 。接下來,你執(zhí)行反向傳播來計(jì)算 J{t}J^{\{t\}}J{t} 的梯度,你只是使用 X{t}X^{\{t\}}X{t} 和 Y{t}Y^{\{t\}}Y{t} ,然后你更新加權(quán)值, WWW 實(shí)際上是 W[l]W^{[l]}W[l] ,更新為 W[l]:=W[l]?αdW[l]W^{[l]}:=W^{[l]}-\alpha dW^{[l]}W[l]:=W[l]?αdW[l] ,對 bbb 做相同處理, b[l]:=b[l]?αdb[l]b^{[l]}:=b^{[l]}-\alpha db^{[l]}b[l]:=b[l]?αdb[l] 。這是使用mini-batch梯度下降法訓(xùn)練樣本的一步,我寫下的代碼也可被稱為進(jìn)行“一代”(1 epoch)的訓(xùn)練。一代這個詞意味著只是一次遍歷了訓(xùn)練集。
使用batch梯度下降法,一次遍歷訓(xùn)練集只能讓你做一個梯度下降,使用mini-batch梯度下降法,一次遍歷訓(xùn)練集,能讓你做5000個梯度下降。當(dāng)然正常來說你想要多次遍歷訓(xùn)練集,還需要為另一個while循環(huán)設(shè)置另一個for循環(huán)。所以你可以一直處理遍歷訓(xùn)練集,直到最后你能收斂到一個合適的精度。
如果你有一個丟失的訓(xùn)練集,mini-batch梯度下降法比batch梯度下降法運(yùn)行地更快,所以幾乎每個研習(xí)深度學(xué)習(xí)的人在訓(xùn)練巨大的數(shù)據(jù)集時都會用到,下一個視頻中,我們將進(jìn)一步深度討論mini-batch梯度下降法,你也會因此更好地理解它的作用和原理。
課后PPT
| 1.15 總結(jié) | 回到目錄 | 2.2 理解 mini-batch 梯度下降法 |
總結(jié)
以上是生活随笔為你收集整理的2.1 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.15 总结-深度学习第二课《改善深层
- 下一篇: 2.2 理解 Mini-batch 梯度