之前文章提到過梯度下降(Gradient descent),在每次計算誤差後會做偏微分來更新權重,這邊我放個公式方便回想:
更新的程度會由 ∇E(Gradient)乘上一個「 η(Learning rate)」來決定,而這邊的 ∇E 會受到一次丟給神經網路做運算的資料量影響,所以 Batch size 會影響神經網路收斂過程中,往 Minima 前進的速度與方向。
接下來沿用之前 Gradient descent 文章的實作來呈現 Batch size 對於收斂過程的影響。
這次的設定與之前些微不同,差異之處在於資料集總共有 2 筆資料,這樣才能比較 Batch size 數值大小所產生的差異。
我先在每次 Iteration 運算整個資料集,然後訓練 25 個 Epoch,結果像這個樣子:
結果並不意外,與之前只有1筆資料的收斂過程類似。
接著來看 Batch size = 1 的樣子,因為每個Iteration從運算 2 筆資料變成 1 筆,為了讓運算量接近,將 Epoch 調整成 50,結果像這樣子:
先以運算時間相同為前提來說明:
Batch size 大的時候,因為考量了比較多的數據,修正的方向會比較準確,但因為每次 Iteration 要算比較久,往 Minima 前進的次數就相對小。
Batch size 相對小的時候,因為只有考量局部數據,所以修正的方向會出現偏差,但因為每次 Iteration 要計算的資料量比較少,就有機會在同樣的時間成本下,修正比較多次。
Batch size = 1,又被稱為 Incremental mode,因為一次 Iteration 只需要算一筆資料,所以權重會被非常頻繁地更新,但因為方向較不準確,就會像是橫衝直撞一般,雖然快速但就整體而言不見得比較有效率,很多時候可能只是走冤枉路。
那我們回到真實訓練模型的過程,要花多少時間訓練模型其實沒有一定的標準,都是開發者自己要去決定的。我可以用較大的 Batch size 搭配較大的 η,那結果可能是不用那麼多的 Epoch 就能達到我的期望。
相對的,如果我想用 Batch size = 1 的條件下去訓練,那可能就要配置較小的 η ,才不會在接近 Minima 的時候來回走動,也就不用走太多冤枉路。但也因為 η 較小,我可能就需要比較多的 Epoch 才會走到 Minima。