神经网络优化篇:详解Mini-batch 梯度下降(Mini-batch gradient descent)
Mini-batch 梯度下降
機器學習的應用是一個高度依賴經驗的過程,伴隨著大量迭代的過程,需要訓練諸多模型,才能找到合適的那一個,所以,優化算法能夠幫助快速訓練模型。
其中一個難點在于,深度學習沒有在大數據領域發揮最大的效果,可以利用一個巨大的數據集來訓練神經網絡,而在巨大的數據集基礎上進行訓練速度很慢。因此,會發現,使用快速的優化算法,使用好用的優化算法能夠大大提高和團隊的效率,那么,首先來談談mini-batch梯度下降法。
之前學過,向量化能夠讓有效地對所有\(m\)個樣本進行計算,允許處理整個訓練集,而無需某個明確的公式。所以要把訓練樣本放大巨大的矩陣\(X\)當中去,\(X= \lbrack x^{(1)}\ x^{(2)}\ x^{(3)}\ldots\ldots x^{(m)}\rbrack\),\(Y\)也是如此,\(Y= \lbrack y^{(1)}\ y^{(2)}\ y^{(3)}\ldots \ldots y^{(m)}\rbrack\),所以\(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萬。
共有5000個mini-batch,所以最后得到是\(X^{\left\{ 5000 \right\}}\)
對\(Y\)也要進行相同處理,也要相應地拆分\(Y\)的訓練集,所以這是\(Y^{\{1\}}\),然后從\(y^{(1001)}\)到\(y^{(2000)}\),這個叫\(Y^{\{2\}}\),一直到\(Y^{\{ 5000\}}\)。
mini-batch的數量\(t\)組成了\(X^{\{ t\}}\)和\(Y^{\{t\}}\),這就是1000個訓練樣本,包含相應的輸入輸出對。
先確定一下的符號,之前使用了上角小括號\((i)\)表示訓練集里的值,所以\(x^{(i)}\)是第\(i\)個訓練樣本。用了上角中括號\([l]\)來表示神經網絡的層數,\(z^{\lbrack l\rbrack}\)表示神經網絡中第\(l\)層的\(z\)值,現在引入了大括號\({t}\)來代表不同的mini-batch,所以有\(X^{\{ t\}}\)和\(Y^{\{ t\}}\),檢查一下自己是否理解無誤。
\(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個樣本。
首先對輸入也就是\(X^{\{ t\}}\),執行前向傳播,然后執行\(z^{\lbrack 1\rbrack} =W^{\lbrack 1\rbrack}X + b^{\lbrack 1\rbrack}\),之前這里只有,但是現在正在處理整個訓練集,在處理第一個mini-batch,在處理mini-batch時它變成了\(X^{\{ t\}}\),即\(z^{\lbrack 1\rbrack} = W^{\lbrack 1\rbrack}X^{\{ t\}} + b^{\lbrack1\rbrack}\),然后執行\(A^{[1]k} =g^{[1]}(Z^{[1]})\),之所以用大寫的\(Z\)是因為這是一個向量內涵,以此類推,直到\(A^{\lbrack L\rbrack} = g^{\left\lbrack L \right\rbrack}(Z^{\lbrack L\rbrack})\),這就是的預測值。注意這里需要用到一個向量化的執行命令,這個向量化的執行命令,一次性處理1000個而不是500萬個樣本。接下來要計算損失成本函數\(J\),因為子集規模是1000,\(J= \frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})}\),說明一下,這(\(L(\hat y^{(i)},y^{(i)})\))指的是來自于mini-batch\(X^{\{ t\}}\)和\(Y^{\{t\}}\)中的樣本。
如果用到了正則化,也可以使用正則化的術語,\(J =\frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})} +\frac{\lambda}{2 1000}\sum_{l}^{}{||w^{[l]}||}_{F}^{2}\),因為這是一個mini-batch的損失,所以將\(J\)損失記為上角標\(t\),放在大括號里(\(J^{\{t\}} = \frac{1}{1000}\sum_{i = 1}^{l}{L(\hat y^{(i)},y^{(i)})} +\frac{\lambda}{2 1000}\sum_{l}^{}{||w^{[l]}||}_{F}^{2}\))。
也會注意到,做的一切似曾相識,其實跟之前執行梯度下降法如出一轍,除了現在的對象不是\(X\),\(Y\),而是\(X^{\{t\}}\)和\(Y^{\{ t\}}\)。接下來,執行反向傳播來計算\(J^{\{t\}}\)的梯度,只是使用\(X^{\{ t\}}\)和\(Y^{\{t\}}\),然后更新加權值,\(W\)實際上是\(W^{\lbrack l\rbrack}\),更新為\(W^{[l]}:= W^{[l]} - adW^{[l]}\),對\(b\)做相同處理,\(b^{[l]}:= b^{[l]} - adb^{[l]}\)。這是使用mini-batch梯度下降法訓練樣本的一步,寫下的代碼也可被稱為進行“一代”(1 epoch)的訓練。一代這個詞意味著只是一次遍歷了訓練集。
使用batch梯度下降法,一次遍歷訓練集只能讓做一個梯度下降,使用mini-batch梯度下降法,一次遍歷訓練集,能讓做5000個梯度下降。當然正常來說想要多次遍歷訓練集,還需要為另一個while循環設置另一個for循環。所以可以一直處理遍歷訓練集,直到最后能收斂到一個合適的精度。
如果有一個丟失的訓練集,mini-batch梯度下降法比batch梯度下降法運行地更快,所以幾乎每個研習深度學習的人在訓練巨大的數據集時都會用到。
總結
以上是生活随笔為你收集整理的神经网络优化篇:详解Mini-batch 梯度下降(Mini-batch gradient descent)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TypeChat、JSONSchemaC
- 下一篇: MySQL优化:12种提升SQL执行效率