批次(batch)与动量(momentum) - zs-collab/- GitHub Wiki

Batch

介紹
Batch是怎么做的?实际上在算微分时,是把Data分成一个个Batch,分別对这些资料算loss及update
不会拿所有的资料来训练,而是一个一个看Batch
看过所有Batch 1 次 = 1 Epoch
在分资料时会先Shuffle,常见的作法是在每一个Epoch开始时重新分一次Batch
屏幕截图 2025-06-05 100245

为什么训练时要用Batch?

两个例子:
左边:大的Batch,全部资料当一个Batch,看完所有资料才update一次,很久才能更新一次但更新的很稳
右边:小的Batch,1个资料当一个Batch,看完一个资料就update一次,很快就能更新一次但更新的不稳
但若考虑平行预算,左边的运算时间不一定比较长
屏幕截图 2025-06-05 102022

Small Batch v.s. Large Batch

Batch Size update一次的时间

Batch Size越大,代表里面的资料越多
Batch Size越小,代表里面资料越少
可以发现Batch Size为1至1000,所花的时间都差不多,这是因为GPU有平行运算的能力,因此Batch Size为1000的运算时间,不会比Batch Size为1的运算时间多1000倍
但是可以观察到当Batch Size很大很大的时候,时间还是会增加的
屏幕截图 2025-06-05 102755

Epoch一次的时间

Batch Size设1,要60000次update才能跑完一次Epoch  
Batch Size设1000,要60次update才能跑完一次Epoch  
因此Batch Size update一次的时间,和Epoch一次的时间,趋势图是相反的  
Batch Size越小:一次update很快,但因为要update次数多,跑一次Epoch越慢  
Batch Size越大:一次update很慢,但因为要update次数少,跑一次Epoch越快  
沒有考虑平行运算时,大的Batch比较慢  
有考虑平行运算时,大的Batch比较快  

屏幕截图 2025-06-05 103421

Noisy的Gradient有帮助

在两个不同的模型上做实验,发现在两者上都是当Batch Size越大,训练的结果越差。  
→同样的模型,所以Function是一样的,不是Model Bias问题  
→ 在Training上就有问题,所以不是Overfitting,是Optimization问题  

屏幕截图 2025-06-05 103848

为什么小的Batch Size会有比较好的结果?

Full Batch容易卡住    
Small Batch每一次update的LF都是有差异的,可能Batch1的LF卡住了,但Batch2的LF不会卡住  
→ Noisy的Gradient有帮助  

屏幕截图 2025-06-05 104107

Traning Loss有很多Local Minima,Loss都趋近于0
若Local Minima在平原上,就是好Local Minima,如果在峡谷里,就是坏Local Minima
为什么?假设训练资料跟测试资料使用的Function不一样,LF的曲线不一样,同样的Local Minima位置也不一样
而小Batch每次update的方向不一样,且频率很高,若在峡谷里很可能一下就逃脱(尚待研究)
屏幕截图 2025-06-05 104835

Momentum

介紹

有可能对抗一些Local Minima 和 Saddle Point 假设在物理世界,Error Surface是斜坡,参数是一颗球,把球从斜坡上滚下來,因为惯性够大且若动量够大,有可能不会卡在Local Minima和Saddle Point
屏幕截图 2025-06-05 105210

复习Vanilla Gradient Descent

从Θ0开始,计算其Gradient Descent g0,往g0的反方向update参数,重复以上步骤
屏幕截图 2025-06-05 105300

Gradient Descent + Momentum

原本:往Gradient的反方向
变成:往Gradient的反方向 + 前一步移动的方向
屏幕截图 2025-06-05 105633

可发现m可写成Gradient的weigted Sum

Momentum可解读成
1.Gradient的反方向 + 前一步移动的方向
2.考虑的Gradient是过去所有Gradient的总和