深度机器学习中的batch的大小对学习效果有何影响?
生活随笔
收集整理的這篇文章主要介紹了
深度机器学习中的batch的大小对学习效果有何影响?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
深度機器學(xué)習(xí)中的batch的大小對學(xué)習(xí)效果有何影響?
如題,在深度學(xué)習(xí)中,剛?cè)腴T的小弟一直聽聞一個batch中同時訓(xùn)練多個數(shù)據(jù)可以得到較好的效果,于是小弟在caffe上跑deepID的網(wǎng)絡(luò)時對如何選取batchsize頗具困惑。懇求萬能的知友給予指點~~ 添加評論 分享 默認排序按時間排序14 個回答
425贊同 反對,不會顯示你的姓名 程引 愛折騰 425?人贊同 談?wù)勆疃葘W(xué)習(xí)中的 Batch_Size Batch_Size(批尺寸)是機器學(xué)習(xí)中一個重要參數(shù),涉及諸多矛盾,下面逐一展開。 首先,為什么需要有 Batch_Size 這個參數(shù)? Batch 的選擇,首先決定的是下降的方向。如果數(shù)據(jù)集比較小,完全可以采用全數(shù)據(jù)集 ( Full Batch Lea… 顯示全部 談?wù)勆疃葘W(xué)習(xí)中的 Batch_SizeBatch_Size(批尺寸)是機器學(xué)習(xí)中一個重要參數(shù),涉及諸多矛盾,下面逐一展開。
首先,為什么需要有 Batch_Size 這個參數(shù)?
Batch 的選擇,首先決定的是下降的方向。如果數(shù)據(jù)集比較小,完全可以采用全數(shù)據(jù)集 ( Full Batch Learning )的形式,這樣做至少有 2 個好處:其一,由全數(shù)據(jù)集確定的方向能夠更好地代表樣本總體,從而更準(zhǔn)確地朝向極值所在的方向。其二,由于不同權(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í),每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。
<img src="https://pic2.zhimg.com/f5a6d3b5c4b5a91851f0f8b8735f162d_b.png" data-rawwidth="952" data-rawheight="662" class="origin_image zh-lightbox-thumb" width="952" data-original="https://pic2.zhimg.com/f5a6d3b5c4b5a91851f0f8b8735f162d_r.png">
可不可以選擇一個適中的 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 越大,其確定的下降方向越準(zhǔn),引起訓(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 是一個手寫體標(biāo)準(zhǔn)庫,我使用的是 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)化算法。
<img src="https://pic1.zhimg.com/8182178facd79a8828e31966e0c4587c_b.png" data-rawwidth="753" data-rawheight="176" class="origin_image zh-lightbox-thumb" width="753" data-original="https://pic1.zhimg.com/8182178facd79a8828e31966e0c4587c_r.png">
<img src="https://pic1.zhimg.com/d6fb7abbaeef80e739d824582a0fa384_b.png" data-rawwidth="1558" data-rawheight="344" class="origin_image zh-lightbox-thumb" width="1558" data-original="https://pic1.zhimg.com/d6fb7abbaeef80e739d824582a0fa384_r.png">
運行結(jié)果如上圖所示,其中絕對時間做了標(biāo)幺化處理。運行結(jié)果與上文分析相印證:
- Batch_Size 太小,算法在 200 epoches 內(nèi)不收斂。
- 隨著 Batch_Size 增大,處理相同數(shù)據(jù)量的速度越快。
- 隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數(shù)量越來越多。
- 由于上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優(yōu)。
- 由于最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優(yōu)。
歡迎一起討論。 編輯于 2015-11-08 30 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 禁止轉(zhuǎn)載 收起 20贊同 反對,不會顯示你的姓名 知乎用戶 理論物理跳深度學(xué)習(xí)...60%概率失業(yè) 20?人贊同 批訓(xùn)練的引入最大好處是針對非凸損失函數(shù)來做的, 畢竟非凸的情況下, 全樣本就算工程上算的動, 也會卡在局部優(yōu)上, 批表示了全樣本的部分抽樣實現(xiàn), 相當(dāng)于人為引入修正梯度上的采樣噪聲,使“一路不通找別路”更有可能搜索最優(yōu)值。 樓上很多說到隨機梯度… 顯示全部 批訓(xùn)練的引入最大好處是針對非凸損失函數(shù)來做的, 畢竟非凸的情況下, 全樣本就算工程上算的動, 也會卡在局部優(yōu)上, 批表示了全樣本的部分抽樣實現(xiàn), 相當(dāng)于人為引入修正梯度上的采樣噪聲,使“一路不通找別路”更有可能搜索最優(yōu)值。
樓上很多說到隨機梯度收斂問題,物理上是這樣的理解,
- 增加噪音擴大了你的行動范圍,不會受限于局部。
- 然而過大的行動范圍使得你的選擇過多而”迷?!?。
- 這是一個損失函數(shù)局部優(yōu)有“多坑人”和局部優(yōu)“數(shù)目太多好難選”之間的競爭,競爭平衡點才是你最終的訓(xùn)練值。故此,最終的訓(xùn)練值是一個分布,大伙們一般取平均來證明自己的模型多牛逼。
- 物理上,就是能量(坑好深)和熵(選擇多)的競爭結(jié)果,而且復(fù)雜系統(tǒng)中,能量和熵一輩子都在競爭,討論自由能最小值在非凸問題上的意義,比直接討論損失函數(shù)的最小值更有意義。
這些觀點在大部分復(fù)雜物理系統(tǒng)的采樣,自旋玻璃的研究,蛋白質(zhì)折疊構(gòu)象搜索上,都有廣泛的認識。但是工業(yè)界被凸優(yōu)化影響過多了,除了特征選擇和防止過擬合外可以通過直覺建立,遇到非凸優(yōu)化問題,基本不可能拍腦袋調(diào)出一個通用的(如果數(shù)學(xué)上可以,物理上應(yīng)該最先發(fā)現(xiàn),然而并沒有)。于是,即便在物理上遇到這種問題,目前很low,而且節(jié)省成本的方法就是燒錢增加計算蠻力點。矛盾到我笑尿了。
關(guān)于深度學(xué)習(xí)中的非凸優(yōu)化,可以參考LeCun今年來對深度學(xué)習(xí)和自旋玻璃之間的聯(lián)系,以及隨機微分方程同增強采樣之間的研究。 發(fā)布于 2015-11-10 7 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 22贊同 反對,不會顯示你的姓名 Yinghong li 重新出發(fā)干實事 22?人贊同 caffe小菜鳥也來答一下,感覺就是大batch size在顯存能允許的情況下收斂速度是比較快的但有時的確會有陷入局部最小的情況,小batch size引入的隨機性會更大些,有時候能有更好的效果,但是就是收斂速度慢一些…… 還有就是除了batch size這個參數(shù)外,如果在… 顯示全部 caffe小菜鳥也來答一下,感覺就是大batch size在顯存能允許的情況下收斂速度是比較快的但有時的確會有陷入局部最小的情況,小batch size引入的隨機性會更大些,有時候能有更好的效果,但是就是收斂速度慢一些……
還有就是除了batch size這個參數(shù)外,如果在solver setting中有momentum這個參數(shù)的話也要注意batch size的選取,具體參考一下caffe的tutorial
關(guān)于訓(xùn)練參數(shù)怎么選取可以參考以下一些文章:
Bengio的 Practical recommendations for gradient-based learning
http://link.springer.com/chapter/10.1007/978-3-642-35289-8_26
Lecun 和 Bottou的 Efficient Backprop
http://link.springer.com/chapter/10.1007/978-3-642-35289-8_3
還有一個代碼上的細節(jié),就是caffe的代碼實現(xiàn)上選取一個batch的時候似乎是按著數(shù)據(jù)庫的圖片順序選取輸入圖片的,所以在生成數(shù)據(jù)庫的時候切記要shuffle一下圖片順序~
供題主參考,求大神指正~ 發(fā)布于 2015-07-25 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 4贊同 反對,不會顯示你的姓名 匿名用戶 4?人贊同 搞機器學(xué)習(xí)大忌就是不做實驗想當(dāng)然,話說這種問題題主跑幾組不同的batch不就知道了...調(diào)參調(diào)參不調(diào)哪來的參~ 另外,運用在不同的領(lǐng)域,不同的網(wǎng)絡(luò)結(jié)構(gòu),不同的訓(xùn)練方法,batch的取法,用法和影響也不一樣。不知道題主問的是哪種batch? 顯示全部 搞機器學(xué)習(xí)大忌就是不做實驗想當(dāng)然,話說這種問題題主跑幾組不同的batch不就知道了...調(diào)參調(diào)參不調(diào)哪來的參~
另外,運用在不同的領(lǐng)域,不同的網(wǎng)絡(luò)結(jié)構(gòu),不同的訓(xùn)練方法,batch的取法,用法和影響也不一樣。不知道題主問的是哪種batch? 發(fā)布于 2015-11-30 7 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 0贊同 反對,不會顯示你的姓名 知乎用戶 我是認真的 我也看到過說理論上batchsize=1是最好的,不過實際上調(diào)的時候,可能因為我調(diào)參的能力比較有限,確實batchsize太小會出現(xiàn)網(wǎng)絡(luò)收斂不穩(wěn)定,最后結(jié)果比較差的情況,這個在ImageNet和其他數(shù)據(jù)庫上都遇到過,而batchsize太大確實也會影響隨機性的引入。目前一般… 顯示全部 我也看到過說理論上batchsize=1是最好的,不過實際上調(diào)的時候,可能因為我調(diào)參的能力比較有限,確實batchsize太小會出現(xiàn)網(wǎng)絡(luò)收斂不穩(wěn)定,最后結(jié)果比較差的情況,這個在ImageNet和其他數(shù)據(jù)庫上都遇到過,而batchsize太大確實也會影響隨機性的引入。目前一般調(diào)ImageNet的時候,大家都喜歡把顯存占滿,不過小一些的庫,個人感覺還是應(yīng)該大大小小都嘗試一下。不知道各路大神有沒有什么好辦法指點一下。。 發(fā)布于 2015-07-28 添加評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 23贊同 反對,不會顯示你的姓名 匿名用戶 23?人贊同 看你GPU顯存,顯存大就把batch size設(shè)大點,反之亦然。一般情況下對學(xué)習(xí)效果沒影響。 補充點細節(jié): 事實上從優(yōu)化的角度來說最快的是純stochastic,即batch size為1。 關(guān)于這一點參見Leon Bottou的分析:http://leon.bottou.org/publications/pdf/compstat-2010.pdf。當(dāng)然,文中的分析適用于large … 顯示全部 看你GPU顯存,顯存大就把batch size設(shè)大點,反之亦然。一般情況下對學(xué)習(xí)效果沒影響。
補充點細節(jié):
事實上從優(yōu)化的角度來說最快的是純stochastic,即batch size為1。
關(guān)于這一點參見Leon Bottou的分析:http://leon.bottou.org/publications/pdf/compstat-2010.pdf。當(dāng)然,文中的分析適用于large scale的情況下,但deep neural net適用的條件之一就是有大量數(shù)據(jù)。另外http://cilvr.nyu.edu/lib/exe/fetch.php?media=deeplearning:dl-optimization.pdf 的第11頁也有比較stochastic和batch的優(yōu)劣。
拿Yann Lecun在上述第二個鏈接第10頁中舉的toy example來說,如果事實上只有100個數(shù)據(jù)點,但有人各復(fù)制了10遍拿給你,你不知道。這時候你如果做batch gradient descent,更只用了100個點效果一樣;而做stochastic gradient descent則相當(dāng)于做了10個epoch。相近的計算量后者效果顯然更好。至于mini batch,要你取的每個mini batch都很diverse的情況才會效果好。
當(dāng)然你會說,現(xiàn)實中哪會有100個數(shù)據(jù)各重復(fù)10遍就直接拿來用的?沒錯,是不會,但現(xiàn)實中的數(shù)據(jù),尤其是large scale的數(shù)據(jù)中,必然有大量的redundancy,不然你也很難學(xué)出有較好泛化性的model。因此stochastic在large scale總是優(yōu)于batch。
那為什么還要用mini batch呢?這是由于GPU并行運算的性質(zhì),同時把多組數(shù)據(jù)傳過去一起運算比一條一條運算來的快,因而mini batch只是為了充分利用GPU memory而做出的妥協(xié)。既然如此,batch size也調(diào)到剛好能塞進顯存就差不多了。 編輯于 2015-07-21 4 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 2贊同 反對,不會顯示你的姓名 司徒功源 非典型程序猿 2?人贊同 簡而言之,步子太大容易扯著蛋... 顯示全部 簡而言之,步子太大容易扯著蛋... 發(fā)布于 2016-01-14 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利 9贊同 反對,不會顯示你的姓名 匿名用戶 9?人贊同 其實是有影響的。batch數(shù)太小,而類別又比較多的時候,真的可能會導(dǎo)致loss函數(shù)震蕩而不收斂,尤其是在你的網(wǎng)絡(luò)比較復(fù)雜的時候。這個做過幾個實驗,但是沒有詳細的做,主要是針對googlenet,alexnet以及vgg幾個模型(實驗結(jié)果就是batch為32的時候,alex開始… 顯示全部 其實是有影響的。batch數(shù)太小,而類別又比較多的時候,真的可能會導(dǎo)致loss函數(shù)震蕩而不收斂,尤其是在你的網(wǎng)絡(luò)比較復(fù)雜的時候。這個做過幾個實驗,但是沒有詳細的做,主要是針對googlenet,alexnet以及vgg幾個模型(實驗結(jié)果就是batch為32的時候,alex開始收斂,但是googlenet不收斂;提高batch size,googlenet開始收斂)。
就像lecun[note](http://cilvr.nyu.edu/lib/exe/fetch.php?media=deeplearning:dl-optimization.pdf)里說的一樣,隨機梯度下降不能像full batch那樣明顯的保證收斂。一般而言,根據(jù)你的GPU顯存,設(shè)置為最大,而且一般要求是8的倍數(shù)(比如32,128),這樣,GPU內(nèi)部的并行運算效率最高。
那么怎么選擇batch number呢?就像剛才說的,8的倍數(shù),然后是稍微大一點(一般而言)。另外一個方法,就是選擇一部分數(shù)據(jù),跑幾個batch看看你的loss是不是在變小,選擇一個合適的就可以了。 編輯于 2015-07-21 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權(quán)利
總結(jié)
以上是生活随笔為你收集整理的深度机器学习中的batch的大小对学习效果有何影响?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梯度下降和随机梯度下降为什么能下降?
- 下一篇: 深度学习-最优化笔记