日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

深度机器学习中的batch的大小对学习效果有何影响?

發布時間:2025/3/21 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度机器学习中的batch的大小对学习效果有何影响? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度機器學習中的batch的大小對學習效果有何影響?

如題,在深度學習中,剛入門的小弟一直聽聞一個batch中同時訓練多個數據可以得到較好的效果,于是小弟在caffe上跑deepID的網絡時對如何選取batchsize頗具困惑。懇求萬能的知友給予指點~~ 添加評論 分享 默認排序按時間排序

14 個回答

425贊同 反對,不會顯示你的姓名 程引 愛折騰 425?人贊同 談談深度學習中的 Batch_Size Batch_Size(批尺寸)是機器學習中一個重要參數,涉及諸多矛盾,下面逐一展開。 首先,為什么需要有 Batch_Size 這個參數? Batch 的選擇,首先決定的是下降的方向。如果數據集比較小,完全可以采用全數據集Full Batch Lea… 顯示全部 談談深度學習中的 Batch_Size
Batch_Size(批尺寸)是機器學習中一個重要參數,涉及諸多矛盾,下面逐一展開。

首先,為什么需要有 Batch_Size 這個參數?
Batch 的選擇,首先決定的是下降的方向。如果數據集比較小,完全可以采用全數據集 Full Batch Learning )的形式,這樣做至少有 2 個好處:其一,由全數據集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。其二,由于不同權重的梯度值差別巨大,因此選取一個全局的學習率很困難。 Full Batch Learning 可以使用Rprop 只基于梯度符號并且針對性單獨更新各權值。

對于更大的數據集,以上 2 個好處又變成了 2 個壞處:其一,隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。其二,以 Rprop 的方式迭代,會由于各個 Batch 之間的采樣差異性,各次梯度修正值相互抵消,無法修正。這才有了后來 RMSProp 的妥協方案。

既然 Full Batch Learning 并不適用大數據集,那么走向另一個極端怎么樣?
所謂另一個極端,就是每次只訓練一個樣本,即 Batch_Size = 1。這就是在線學習(Online Learning)。線性神經元在均方誤差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對于多層神經元、非線性網絡,在局部依然近似是拋物面。使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂

<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 值呢?
當然可以,這就是批梯度下降法(Mini-batches Learning)。因為如果數據集足夠充分,那么用一半(甚至少得多)的數據訓練算出來的梯度與用全部數據訓練出來的梯度是幾乎一樣的。

在合理范圍內,增大 Batch_Size 有何好處?
  • 內存利用率提高了,大矩陣乘法的并行化效率提高。
  • 跑完一次 epoch(全數據集)所需的迭代次數減少,對于相同數據量的處理速度進一步加快。
  • 在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震蕩越小。

盲目增大 Batch_Size 有何壞處?
  • 內存利用率提高了,但是內存容量可能撐不住了。
  • 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
  • Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

調節 Batch_Size 對訓練效果影響到底如何?
這里跑一個 LeNet 在 MNIST 數據集上的效果。MNIST 是一個手寫體標準庫,我使用的是 Theano 框架。這是一個 Python 的深度學習庫。安裝方便(幾行命令而已),調試簡單(自帶 Profile),GPU / CPU 通吃,官方教程相當完備,支持模塊十分豐富(除了 CNNs,更是支持 RBM / DBN / LSTM / RBM-RNN / SdA / MLPs)。在其上層有 Keras 封裝,支持 GRU / JZS1, JZS2, JZS3 等較新結構,支持 Adagrad / Adadelta / RMSprop / Adam 等優化算法。

<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">
運行結果如上圖所示,其中絕對時間做了標幺化處理。運行結果與上文分析相印證:
  • Batch_Size 太小,算法在 200 epoches 內不收斂。
  • 隨著 Batch_Size 增大,處理相同數據量的速度越快。
  • 隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
  • 由于上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
  • 由于最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。

歡迎一起討論。 編輯于 2015-11-08 30 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 禁止轉載 收起 20贊同 反對,不會顯示你的姓名 知乎用戶 理論物理跳深度學習...60%概率失業 20?人贊同 批訓練的引入最大好處是針對非凸損失函數來做的, 畢竟非凸的情況下, 全樣本就算工程上算的動, 也會卡在局部優上, 批表示了全樣本的部分抽樣實現, 相當于人為引入修正梯度上的采樣噪聲,使“一路不通找別路”更有可能搜索最優值。 樓上很多說到隨機梯度… 顯示全部 批訓練的引入最大好處是針對非凸損失函數來做的, 畢竟非凸的情況下, 全樣本就算工程上算的動, 也會卡在局部優上, 批表示了全樣本的部分抽樣實現, 相當于人為引入修正梯度上的采樣噪聲,使“一路不通找別路”更有可能搜索最優值。

樓上很多說到隨機梯度收斂問題,物理上是這樣的理解,
  • 增加噪音擴大了你的行動范圍,不會受限于局部。
  • 然而過大的行動范圍使得你的選擇過多而”迷茫“。
  • 這是一個損失函數局部優有“多坑人”和局部優“數目太多好難選”之間的競爭,競爭平衡點才是你最終的訓練值。故此,最終的訓練值是一個分布,大伙們一般取平均來證明自己的模型多牛逼。
  • 物理上,就是能量(坑好深)和熵(選擇多)的競爭結果,而且復雜系統中,能量和熵一輩子都在競爭,討論自由能最小值在非凸問題上的意義,比直接討論損失函數的最小值更有意義。
然而,這種牛逼,不僅依賴模型,而且依賴數據本身。調參需要預先建立競爭平衡的理論模型,單純用軟件刷指標只能用在某個數據集上,不具有轉移性。純浪費電!
這些觀點在大部分復雜物理系統的采樣,自旋玻璃的研究,蛋白質折疊構象搜索上,都有廣泛的認識。但是工業界被凸優化影響過多了,除了特征選擇和防止過擬合外可以通過直覺建立,遇到非凸優化問題,基本不可能拍腦袋調出一個通用的(如果數學上可以,物理上應該最先發現,然而并沒有)。于是,即便在物理上遇到這種問題,目前很low,而且節省成本的方法就是燒錢增加計算蠻力點。矛盾到我笑尿了。

關于深度學習中的非凸優化,可以參考LeCun今年來對深度學習和自旋玻璃之間的聯系,以及隨機微分方程同增強采樣之間的研究。 發布于 2015-11-10 7 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 22贊同 反對,不會顯示你的姓名 Yinghong li 重新出發干實事 22?人贊同 caffe小菜鳥也來答一下,感覺就是大batch size在顯存能允許的情況下收斂速度是比較快的但有時的確會有陷入局部最小的情況,小batch size引入的隨機性會更大些,有時候能有更好的效果,但是就是收斂速度慢一些…… 還有就是除了batch size這個參數外,如果在… 顯示全部 caffe小菜鳥也來答一下,感覺就是大batch size在顯存能允許的情況下收斂速度是比較快的但有時的確會有陷入局部最小的情況,小batch size引入的隨機性會更大些,有時候能有更好的效果,但是就是收斂速度慢一些……
還有就是除了batch size這個參數外,如果在solver setting中有momentum這個參數的話也要注意batch size的選取,具體參考一下caffe的tutorial

關于訓練參數怎么選取可以參考以下一些文章:
Bengio的 Practical recommendations for gradient-based learning
link.springer.com/chapt

Lecun 和 Bottou的 Efficient Backprop
link.springer.com/chapt

還有一個代碼上的細節,就是caffe的代碼實現上選取一個batch的時候似乎是按著數據庫的圖片順序選取輸入圖片的,所以在生成數據庫的時候切記要shuffle一下圖片順序~

供題主參考,求大神指正~ 發布于 2015-07-25 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 4贊同 反對,不會顯示你的姓名 匿名用戶 4?人贊同 搞機器學習大忌就是不做實驗想當然,話說這種問題題主跑幾組不同的batch不就知道了...調參調參不調哪來的參~ 另外,運用在不同的領域,不同的網絡結構,不同的訓練方法,batch的取法,用法和影響也不一樣。不知道題主問的是哪種batch? 顯示全部 搞機器學習大忌就是不做實驗想當然,話說這種問題題主跑幾組不同的batch不就知道了...調參調參不調哪來的參~

另外,運用在不同的領域,不同的網絡結構,不同的訓練方法,batch的取法,用法和影響也不一樣。不知道題主問的是哪種batch? 發布于 2015-11-30 7 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 0贊同 反對,不會顯示你的姓名 知乎用戶 我是認真的 我也看到過說理論上batchsize=1是最好的,不過實際上調的時候,可能因為我調參的能力比較有限,確實batchsize太小會出現網絡收斂不穩定,最后結果比較差的情況,這個在ImageNet和其他數據庫上都遇到過,而batchsize太大確實也會影響隨機性的引入。目前一般… 顯示全部 我也看到過說理論上batchsize=1是最好的,不過實際上調的時候,可能因為我調參的能力比較有限,確實batchsize太小會出現網絡收斂不穩定,最后結果比較差的情況,這個在ImageNet和其他數據庫上都遇到過,而batchsize太大確實也會影響隨機性的引入。目前一般調ImageNet的時候,大家都喜歡把顯存占滿,不過小一些的庫,個人感覺還是應該大大小小都嘗試一下。不知道各路大神有沒有什么好辦法指點一下。。 發布于 2015-07-28 添加評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 23贊同 反對,不會顯示你的姓名 匿名用戶 23?人贊同 看你GPU顯存,顯存大就把batch size設大點,反之亦然。一般情況下對學習效果沒影響。 補充點細節: 事實上從優化的角度來說最快的是純stochastic,即batch size為1。 關于這一點參見Leon Bottou的分析:leon.bottou.org/publica。當然,文中的分析適用于large … 顯示全部 看你GPU顯存,顯存大就把batch size設大點,反之亦然。一般情況下對學習效果沒影響。

補充點細節:

事實上從優化的角度來說最快的是純stochastic,即batch size為1。
關于這一點參見Leon Bottou的分析:leon.bottou.org/publica。當然,文中的分析適用于large scale的情況下,但deep neural net適用的條件之一就是有大量數據。另外cilvr.nyu.edu/lib/exe/f 的第11頁也有比較stochastic和batch的優劣。

拿Yann Lecun在上述第二個鏈接第10頁中舉的toy example來說,如果事實上只有100個數據點,但有人各復制了10遍拿給你,你不知道。這時候你如果做batch gradient descent,更只用了100個點效果一樣;而做stochastic gradient descent則相當于做了10個epoch。相近的計算量后者效果顯然更好。至于mini batch,要你取的每個mini batch都很diverse的情況才會效果好。

當然你會說,現實中哪會有100個數據各重復10遍就直接拿來用的?沒錯,是不會,但現實中的數據,尤其是large scale的數據中,必然有大量的redundancy,不然你也很難學出有較好泛化性的model。因此stochastic在large scale總是優于batch。

那為什么還要用mini batch呢?這是由于GPU并行運算的性質,同時把多組數據傳過去一起運算比一條一條運算來的快,因而mini batch只是為了充分利用GPU memory而做出的妥協。既然如此,batch size也調到剛好能塞進顯存就差不多了。 編輯于 2015-07-21 4 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 2贊同 反對,不會顯示你的姓名 司徒功源 非典型程序猿 2?人贊同 簡而言之,步子太大容易扯著蛋... 顯示全部 簡而言之,步子太大容易扯著蛋... 發布于 2016-01-14 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利 9贊同 反對,不會顯示你的姓名 匿名用戶 9?人贊同 其實是有影響的。batch數太小,而類別又比較多的時候,真的可能會導致loss函數震蕩而不收斂,尤其是在你的網絡比較復雜的時候。這個做過幾個實驗,但是沒有詳細的做,主要是針對googlenet,alexnet以及vgg幾個模型(實驗結果就是batch為32的時候,alex開始… 顯示全部 其實是有影響的。batch數太小,而類別又比較多的時候,真的可能會導致loss函數震蕩而不收斂,尤其是在你的網絡比較復雜的時候。這個做過幾個實驗,但是沒有詳細的做,主要是針對googlenet,alexnet以及vgg幾個模型(實驗結果就是batch為32的時候,alex開始收斂,但是googlenet不收斂;提高batch size,googlenet開始收斂)。
就像lecun[note](cilvr.nyu.edu/lib/exe/f)里說的一樣,隨機梯度下降不能像full batch那樣明顯的保證收斂。一般而言,根據你的GPU顯存,設置為最大,而且一般要求是8的倍數(比如32,128),這樣,GPU內部的并行運算效率最高。
那么怎么選擇batch number呢?就像剛才說的,8的倍數,然后是稍微大一點(一般而言)。另外一個方法,就是選擇一部分數據,跑幾個batch看看你的loss是不是在變小,選擇一個合適的就可以了。 編輯于 2015-07-21 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利

總結

以上是生活随笔為你收集整理的深度机器学习中的batch的大小对学习效果有何影响?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。