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