神经网络算法学习---mini-batch++++mini-batch和batch的区别
Batch_Size(批尺寸)是機器學(xué)習(xí)中一個重要參數(shù),涉及諸多矛盾,下面逐一展開。
首先,為什么需要有 Batch_Size 這個參數(shù)?
Batch 的選擇,首先決定的是下降的方向。如果數(shù)據(jù)集比較小,完全可以采用全數(shù)據(jù)集 ( Full Batch Learning )的形式,這樣做至少有 2 個好處:其一,由全數(shù)據(jù)集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。其二,由于不同權(quán)重的梯度值差別巨大,因此選取一個全局的學(xué)習(xí)率很困難。 Full Batch Learning 可以使用?Rprop?只基于梯度符號并且針對性單獨更新各權(quán)值。
對于更大的數(shù)據(jù)集,以上 2 個好處又變成了 2 個壞處:其一,隨著數(shù)據(jù)集的海量增長和內(nèi)存限制,一次性載入所有的數(shù)據(jù)進來變得越來越不可行。其二,以 Rprop 的方式迭代,會由于各個 Batch 之間的采樣差異性,各次梯度修正值相互抵消,無法修正。這才有了后來?RMSProp?的妥協(xié)方案。
既然 Full Batch Learning 并不適用大數(shù)據(jù)集,那么走向另一個極端怎么樣?
所謂另一個極端,就是每次只訓(xùn)練一個樣本,即 Batch_Size = 1。這就是在線學(xué)習(xí)(Online Learning)。線性神經(jīng)元在均方誤差代價函數(shù)的錯誤面是一個拋物面,橫截面是橢圓。對于多層神經(jīng)元、非線性網(wǎng)絡(luò),在局部依然近似是拋物面。使用在線學(xué)習(xí),每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。如圖所示:
?
可不可以選擇一個適中的 Batch_Size 值呢?
當(dāng)然可以,這就是批梯度下降法(Mini-batches Learning)。因為如果數(shù)據(jù)集足夠充分,那么用一半(甚至少得多)的數(shù)據(jù)訓(xùn)練算出來的梯度與用全部數(shù)據(jù)訓(xùn)練出來的梯度是幾乎一樣的。
在合理范圍內(nèi),增大 Batch_Size 有何好處?
- 內(nèi)存利用率提高了,大矩陣乘法的并行化效率提高。
- 跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,對于相同數(shù)據(jù)量的處理速度進一步加快。
- 在一定范圍內(nèi),一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓(xùn)練震蕩越小。
盲目增大 Batch_Size 有何壞處?
- 內(nèi)存利用率提高了,但是內(nèi)存容量可能撐不住了。
- 跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數(shù)的修正也就顯得更加緩慢。
- Batch_Size 增大到一定程度,其確定的下降方向已經(jīng)基本不再變化。
調(diào)節(jié) Batch_Size 對訓(xùn)練效果影響到底如何?
這里跑一個 LeNet 在 MNIST 數(shù)據(jù)集上的效果。MNIST 是一個手寫體標準庫,我使用的是?Theano?框架。這是一個?Python?的深度學(xué)習(xí)庫。安裝方便(幾行命令而已),調(diào)試簡單(自帶 Profile),GPU / CPU 通吃,官方教程相當(dāng)完備,支持模塊十分豐富(除了 CNNs,更是支持 RBM / DBN / LSTM / RBM-RNN / SdA / MLPs)。在其上層有?Keras?封裝,支持 GRU / JZS1, JZS2, JZS3 等較新結(jié)構(gòu),支持 Adagrad / Adadelta / RMSprop / Adam 等優(yōu)化算法。如圖所示:
?
運行結(jié)果如上圖所示,其中絕對時間做了標幺化處理。運行結(jié)果與上文分析相印證:
- Batch_Size 太小,算法在 200 epoches 內(nèi)不收斂。
- 隨著 Batch_Size 增大,處理相同數(shù)據(jù)量的速度越快。
- 隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數(shù)量越來越多。
- 由于上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優(yōu)。
- 由于最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優(yōu)。
歡迎一起討論。
本文轉(zhuǎn)自http://blog.csdn.net/ycheng_sjtu/article/details/49804041,感謝原作者的付出和分享。
總結(jié)
以上是生活随笔為你收集整理的神经网络算法学习---mini-batch++++mini-batch和batch的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研讨会 | 知识图谱大咖云集阿里,他们都
- 下一篇: 揭秘Python并发编程——协程