鏈接:https://www.zhihu.com/question/61607442/answer/440944387
首先反對上面的盡可能調大batch size的說法,在現在較前沿的視角來看,這種觀點無疑是有些滯后的。
關於這個問題,我們來看下深度學習三巨頭之一的LeCun楊樂春同志怎么說(想看結論直接翻到最后):
Training with large minibatches is bad for your health. More importantly, it's bad for your test error. Friends don‘t let friends use minibatches larger than 32. Let's face it: the only people have switched to minibatch sizes larger than one since 2012 is because GPUs are inefficient for batch sizes smaller than 32. That's a terrible reason. It just means our hardware sucks.
翻譯過來就是:
使用 大的batch size有害身體健康。更重要的是,它對測試集的error不利。一個真正的朋友不會讓你使用大於32的batch size。直說了吧:2012年來人們開始轉而使用更大batch size的原因只是我們的GPU不夠強大,處理小於32的batch size時效率太低。這是個糟糕的理由,只說明了我們的硬件還很辣雞。
那是什么使得大牛LeCun同志對大於32的batch size如此深惡痛絕而發此論呢?
細究出處可以發現這些評論是他讀完Revisiting Small Batch Training for Deep Neural Networks 的感想,這篇論文對batch size(以及其他一些超參數)在深度學習中的選取做了詳盡的分析並提供了實驗數據。結果表明:
The best performance has been consistently obtained for mini-batch sizes between m=2 and m=32, which contrasts with recent work advocating the use of mini-batch sizes in the thousands.
也就是最好的實驗表現都是在batch size處於2~32之間得到的,這和最近深度學習界論文中習慣的動輒上千的batch size選取有很大的出入。
其實回想我們使用mini-batch技術的原因,無外乎是因為mini-batch有這幾個好處 :
- 提高了運行效率,相比batch-GD的每個epoch只更新一次參數,使用mini-batch可以在一個epoch中多次更新參數,加速收斂。
- 解決了某些任務中,訓練集過大,無法一次性讀入內存的問題。
- 雖然第一點是mini-batch提出的最初始的原因,但是后來人們發現,使用mini-batch還有個好處,即每次更新時由於沒有使用全量數據而僅僅使用batch內數據,從而人為給訓練帶來了噪聲,而這個操作卻往往能夠帶領算法走出局部最優(鞍點)。理論證明參見COLT的這篇論文Escaping From Saddle Points-Online Stochastic Gradient for Tensor Decomposition。也就是說,曾經我們使用mini-batch主要是為了加快收斂和節省內存,同時也帶來每次更新有些“不准”的副作用,但是現在的觀點來看,這些“副作用”反而對我們的訓練有着更多的增益,也變成mini-batch技術最主要的優點。(有點像偉哥西地那非,最早是被發明出來治療心血管疾病的,但是發現其副作用是容易使人勃起,最后反而是用來助勃,而不是用來治療心血管了)
綜上所述,我們選取batch size時不妨這樣操作:
- 當有足夠算力時,選取batch size為32或更小一些。
- 算力不夠時,在效率和泛化性之間做trade-off,盡量選擇更小的batch size。
- 當模型訓練到尾聲,想更精細化地提高成績(比如論文實驗/比賽到最后),有一個有用的trick,就是設置batch size為1,即做純SGD,慢慢把error磨低。
參考文獻:
[1] Dominic Masters, Carlo Luschi,Revisiting Small Batch Training for Deep Neural Networks, arXiv:1804.07612v1
[2] Ge, R., Huang, F., Jin, C., & Yuan, Y. (2015, June). Escaping From Saddle Points-Online Stochastic Gradient for Tensor Decomposition. In COLT (pp. 797-842).
[3] Bottou, L. (2010). Large-scale machine learning with stochastic gradient descent. In Proceedings of COMPSTAT'2010 (pp. 177-186). Physica-Verlag HD.
作者:Matt
鏈接:https://www.zhihu.com/question/61607442/answer/192204021
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
batch size 不是永遠越大越好。
更大的 batch size 更能准確地計算出梯度,mini-batch 只是用更少的計算來近似梯度。直覺上好像更大的 batch 更好因為更“准確”。
實踐結果比較反直覺,因為深度模型的代價函數非常不平整,完整的梯度也只能往局部極小值跑,所以大 batch size 帶來的准確的梯度可能也沒什么用。反而有時候小 batch size 帶來的噪聲可以更快的找到不錯的極小值。
但是,更大的 batch size 在並行計算上更占優勢,太小的 batch-size 發揮不了 gpu 的性能。所以當我們覺得 batch 要更大,主要是為了更好的並行,而不是為了更精確的梯度。
在深度學習里好像追求精確意義不大,比如更高精度的浮點數並沒有什么幫助,還不如減小精度來換取計算速度。比如調參時 ramdom search 居然不比 grid search 表現差,非常反直覺。
補充:
@dengdan在評論里指出,小batch訓練的穩定性較差。小batch確實有這個缺點,而且對設置學習速率有更高的要求,否則可能引起惡性的震盪無法收斂。但是小batch的優點仍然是顯著的,DL書里建議使用逐步增加的batch size來兼並兩者的優點。
作者:浣熊先生
鏈接:https://www.zhihu.com/question/61607442/answer/311502182
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
Batch size可能也不是越大越好,ICLR 2017 On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima 比較了一直用small batch(實驗設置的256,貌似也不小了...)和一直用large batch(整個數據集十分之一...)訓練,最后發現同樣訓練到最終收斂,在多個數據集上large batch比small batch泛化能力差。
前期用小batch引入噪聲,有利於跳出sharp minima,后期用大batch避免震盪,同樣目的也可以通過調小lrate做到,同比例地增大batch size和同比例地減小lrate能得到極相近的loss-epoch曲線,不過前者update次數會少很多~(Don't Decay the Learning Rate, Increase the Batch Size)
然鵝,我怎么知道訓練到什么時候該調大batch size,調大多少呢... 后來發現有研究自適應調節batch size的文章Small Batch or Large Batch?,實驗表明大致趨勢還是先小batch后面自己變大,是不是就不用在batch size這個超參上煉金了呢....
大batch size相當於小lr,反之亦然。可以根據收斂速度進行一定選擇。
另外如果用了batchnorm,batch size別太小(大於64?)
如果不用batchnorm,可以考慮用小batch size甚至1 來得到最優的結果。具體看deep learning那本書的相關段落(見下圖第一段),我自己做的實驗也可以驗證。

作者:Lin Sun
鏈接:https://www.zhihu.com/question/61607442/answer/204675996
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
