1. 程式人生 > >深度學習中常見的相關概念及TensorFlow中的batch和minibatch

深度學習中常見的相關概念及TensorFlow中的batch和minibatch

在剛開始學習使用TF的過程中,我不是很理解什麼是“batch”。也經常有人問,到底minibatch是幹什麼的?
然而這是一個在TensorFlow中,或者說很多DL的框架中很常見的詞。
這個解釋我覺得比較貼切也比較容易理解。引用如下:


深度學習的優化演算法,說白了就是梯度下降。每次的引數更新有兩種方式。


第一種,遍歷全部資料集算一次損失函式,然後算函式對各個引數的梯度,更新梯度。這種方法每更新一次引數都要把資料集裡的所有樣本都看一遍,計算量開銷大,計算速度慢,不支援線上學習,這稱為Batch gradient descent,批梯度下降。


另一種,每看一個數據就算一下損失函式,然後求梯度更新引數,這個稱為隨機梯度下降,stochastic gradient descent。這個方法速度比較快,但是收斂效能不太好,可能在最優點附近晃來晃去,hit不到最優點。兩次引數的更新也有可能互相抵消掉,造成目標函式震盪的比較劇烈。


為了克服兩種方法的缺點,現在一般採用的是一種折中手段,mini-batch gradient decent,小批的梯度下降,這種方法把資料分為若干個批,按批來更新引數,這樣,一個批中的一組資料共同決定了本次梯度的方向,下降起來就不容易跑偏,減少了隨機性。另一方面因為批的樣本數與整個資料集相比小了很多,計算量也不是很大。

談談深度學習中的 Batch_Size
Batch_Size(批尺寸)是機器學習中一個重要引數,涉及諸多矛盾,下面逐一展開。

首先,為什麼需要有 Batch_Size 這個引數?
Batch 的選擇,首先決定的是下降的方向。如果資料集比較小,完全可以採用全資料集Full Batch Learning )的形式,這樣做至少有 2 個好處:

  1. 由全資料集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向
  2. 由於不同權重的梯度值差別巨大,因此選取一個全域性的學習率很困難。 Full Batch Learning 可以使用Rprop 只基於梯度符號並且針對性單獨更新各權值。

對於更大的資料集,以上 2 個好處又變成了 2 個壞處:

  1. 隨著資料集的海量增長和記憶體限制,一次性載入所有的資料進來變得越來越不可行。
  2. 以 Rprop 的方式迭代,會由於各個 Batch 之間的取樣差異性,各次梯度修正值相互抵消,無法修正。這才有了後來 RMSProp 的妥協方案。

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


可不可以選擇一個適中的 Batch_Size 值呢?
當然可以,這就是批梯度下降法(Mini-batches Learning)。因為如果資料集足夠充分,那麼用一半(甚至少得多)的資料訓練算出來的梯度與用全部資料訓練出來的梯度是幾乎一樣的。

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

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

調節 Batch_Size 對訓練效果影響到底如何?

  • 隨著 Batch_Size 增大,處理相同資料量的速度越快。
  • 隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
  • 由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
  • 由於最終收斂精度會陷入不同的區域性極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。

 總結關於 epoch iterationbatchsize

深度學習中經常看到epoch iterationbatchsize,下面按自己的理解說說這三個的區別:

1batchsize:批大小。在深度學習中,一般採用SGD訓練,即每次訓練在訓練集中取batchsize個樣本訓練;

2iteration1iteration等於使用batchsize個樣本訓練一次;

3epoch1epoch等於使用訓練集中的全部樣本訓練一次;

舉個例子,訓練集有1000個樣本,batchsize=10,那麼:

訓練完整個樣本集需要:

100iteration1epoch