1. 程式人生 > 其它 >程式碼筆記4 一個batch-size中的資料是怎麼在神經網路中計算的

程式碼筆記4 一個batch-size中的資料是怎麼在神經網路中計算的

1 問題產生

 今天突然被問到了這個問題。在做神經網路訓練中根據訓練計算的方式等等,有epoch,batch,iteration的區別。epoch代表對所有訓練集進行一次迭代的過程,batch代表輸入網路資料一次的資料量大小,iteration代表一次迭代(也可以指進行一次梯度下降的過程)。可能有些人會覺得奇怪,batch和iteration的區別在哪裡呢,一般來說一個batch不就會進行一次梯度下降嗎。因為有梯度累加(Gradient Accumulation)[1]這個概念存在,這是為了我們這些沒那麼大視訊記憶體顯示卡的人準備的trick哈哈哈。為了通過梯度累加的方式增加batch-size的大小,在每一次反向傳播計算完梯度後並不馬上進行梯度下降,也不對梯度圖進行歸零,而是直接進行下一個batch的梯度計算。將幾次batch的梯度累加後,再進行梯度下降。舉一個例子,一個有1000張圖的資料集,batch-size為8,gradient -accumulation累加次數為4.當我們通過一次次的梯度下降完成對1000張圖的遍歷後,我們稱之為一個epoch。當我們將一個batch-size大小的資料傳遞進網路時,這個過程被稱為輸入一個batch。我那個是我們通過累計4次batch的梯度後,乘以學習率進行梯度下降後,這個過程被稱為一個iteration。
 但是一個batch內的資料是如何在網路裡傳遞的呢?我們的網路都是根據一張圖所涉及的,一個batch資料的處理是並行的還是序列的呢。如果是並行,那顯然需要載入多個重複的模型,這樣對視訊記憶體的要求顯然太高了,我們平時訓練也不會因為稍微調大一點batch-size就增大很多視訊記憶體。如果是序列,那這個過程就類似於梯度累加了,為何不直接用梯度累加呢,而且通過這樣的方式,如何去進行BatchNormalization的操作呢?

2 一種解釋

 神經網路的每一層,會一次性算完這N張圖。[2]我覺得這個是有道理的,這樣也不會影響BatchNormalization的計算。至於究竟是怎麼樣,以後再探究。

References

[1]https://www.cnblogs.com/sddai/p/14598018.html
[2]https://www.zhihu.com/question/362913743/answer/958443460