吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

Mini-batch 梯度下降(Mini-batch gradient descent)

本週將學習優化算法,這能讓你的神經網絡運行得更快。

機器學習的應用是一個高度依賴經驗的過程,伴隨著大量迭代的過程,你需要訓練諸多模型,才能找到合適的那一個,所以,優化算法能夠幫助你快速訓練模型。

其中一個難點在於,深度學習沒有在大數據領域發揮最大的效果,我們可以利用一個巨大的數據集來訓練神經網絡,而在巨大的數據集基礎上進行訓練速度很慢。

因此,你會發現,使用快速的優化算法,使用好用的優化算法能夠大大提高你和團隊的效率,那麼,我們首先來談談mini-batch梯度下降法。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

你之前學過,向量化能夠讓你有效地對所有m個樣本進行計算,允許你處理整個訓練集,而無需某個明確的公式。

所以我們要把訓練樣本放大巨大的矩陣X當中去,X=[x^((1) ) x^((2) ) x^((3) )……x^((m) ) ]。

Y也是如此,Y=[y^((1) ) y^((2) ) y^((3) )……y^((m) ) ]。

所以X的維數是(n_x,m),Y的維數是(1,m),向量化能夠讓你相對較快地處理所有m個樣本。如果m很大的話,處理速度仍然緩慢。比如說,如果m是500萬或5000萬或者更大的一個數,在對整個訓練集執行梯度下降法時,你要做的是,你必須處理整個訓練集,然後才能進行一步梯度下降法,然後你需要再重新處理500萬個訓練樣本,才能進行下一步梯度下降法。所以如果你在處理完整個500萬個樣本的訓練集之前,先讓梯度下降法處理一部分,你的算法速度會更快,準確地說,這是你可以做的一些事情。

你可以把訓練集分割為小一點的子集訓練,這些子集被取名為mini-batch,假設每一個子集中只有1000個樣本,那麼把其中的x^((1))到x^((1000))取出來,將其稱為第一個子訓練集,也叫做mini-batch,然後你再取出接下來的1000個樣本,從x^((1001))到x^((2000)),然後再取1000個樣本,以此類推。

接下來我要說一個新的符號,把x^((1))到x^((1000))稱為X^({1}),x^((1001))到x^((2000))稱為X^({2}),如果你的訓練樣本一共有500萬個,每個mini-batch都有1000個樣本,也就是說,你有5000個mini-batch,因為5000乘以1000就是5000萬。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

你共有5000個mini-batch,所以最後得到是X^{5000}

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

對Y也要進行相同處理,你也要相應地拆分Y的訓練集,所以這是Y^({1}),然後從y^((1001))到y^((2000)),這個叫Y^({2}),一直到Y^({5000})。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

mini-batch的數量t組成了X^({t})和Y^({t}),這就是1000個訓練樣本,包含相應的輸入輸出對。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

在繼續課程之前,先確定一下我的符號,之前我們使用了上角小括號(i)表示訓練集裡的值,所以x^((i))是第i個訓練樣本。我們用了上角中括號[l]來表示神經網絡的層數,z^([l])表示神經網絡中第l層的z值,我們現在引入了大括號t來代表不同的mini-batch,所以我們有X^({t})和Y^({t}),檢查一下自己是否理解無誤。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

X^({t})和Y^({t})的維數:如果X^({1})是一個有1000個樣本的訓練集,或者說是1000個樣本的x值,所以維數應該是(n_x,1000),X^({2})的維數應該是(n_x,1000),以此類推。因此所有的子集維數都是(n_x,1000),而這些(Y^({t}))的維數都是(1,1000)。

解釋一下這個算法的名稱,batch梯度下降法指的是我們之前講過的梯度下降法算法,就是同時處理整個訓練集,這個名字就是來源於能夠同時看到整個batch訓練集的樣本被處理,這個名字不怎麼樣,但就是這樣叫它。

相比之下,mini-batch梯度下降法,指的是我們在下一張幻燈片中會講到的算法,你每次同時處理的單個的mini-batch X^({t})和Y^({t}),而不是同時處理全部的X和Y訓練集。

那麼究竟mini-batch梯度下降法的原理是什麼?

在訓練集上運行mini-batch梯度下降法,你運行for t=1……5000,因為我們有5000個各有1000個樣本的組,在for循環裡你要做得基本就是對X^({t})和Y^({t})執行一步梯度下降法。假設你有一個擁有1000個樣本的訓練集,而且假設你已經很熟悉一次性處理完的方法,你要用向量化去幾乎同時處理1000個樣本。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

首先對輸入也就是X^({t}),執行前向傳播,然後執行z^([1])=W^([1]) X+b^([1]),之前我們這裡只有,但是現在你正在處理整個訓練集,你在處理第一個mini-batch,在處理mini-batch時它變成了X^({t}),即z^([1])=W^([1]) X^({t})+b^([1]),然後執行A^([1]k)=g^([1]) (Z^([1])),之所以用大寫的Z是因為這是一個向量內涵,以此類推,直到A^([L])=g^[L] (Z^([L])),這就是你的預測值。

注意這裡你需要用到一個向量化的執行命令,這個向量化的執行命令,一次性處理1000個而不是500萬個樣本。

接下來你要計算損失成本函數J,因為子集規模是1000,J=1/1000

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

,說明一下,這(L(^y^((i)),y^((i))))指的是來自於mini-batchX^({t})和Y^({t})中的樣本。

如果你用到了正則化,你也可以使用正則化的術語:

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

,因為這是一個mini-batch的損失,所以我將J損失記為上角標t,放在大括號裡

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

你也會注意到,我們做的一切似曾相識,其實跟之前我們執行梯度下降法如出一轍,除了你現在的對象不是X,Y,而是X^({t})和Y^({t})。接下來,你執行反向傳播來計算J^({t})的梯度,你只是使用X^({t})和Y^({t}),然後你更新加權值,

W實際上是W^([l]),更新為W^([l]):=W^([l])-adW^([l]),

對b做相同處理,b^([l]):=b^([l])-adb^([l])。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

這是使用mini-batch梯度下降法訓練樣本的一步,我寫下的代碼也可被稱為進行“一代”(1 epoch)的訓練。一代這個詞意味著只是一次遍歷了訓練集。

吳恩達深度學習筆記(38)-優化算法(Optimization algorithms)

使用batch梯度下降法,一次遍歷訓練集只能讓你做一個梯度下降,使用mini-batch梯度下降法,一次遍歷訓練集,能讓你做5000個梯度下降。

當然正常來說你想要多次遍歷訓練集,還需要為另一個while循環設置另一個for循環。所以你可以一直處理遍歷訓練集,直到最後你能收斂到一個合適的精度。

如果你有一個丟失的訓練集,mini-batch梯度下降法比batch梯度下降法運行地更快

所以幾乎每個研習深度學習的人在訓練巨大的數據集時都會用到,下一個筆記中,我們將進一步深度討論mini-batch梯度下降法,你也會因此更好地理解它的作用和原理。


分享到:


相關文章: