批次(batch)与动量(momentum) - zs-collab/- GitHub Wiki
Batch
介紹
Batch是怎么做的?实际上在算微分时,是把Data分成一个个Batch,分別对这些资料算loss及update
不会拿所有的资料来训练,而是一个一个看Batch
看过所有Batch 1 次 = 1 Epoch
在分资料时会先Shuffle,常见的作法是在每一个Epoch开始时重新分一次Batch
为什么训练时要用Batch?
两个例子:
左边:大的Batch,全部资料当一个Batch,看完所有资料才update一次,很久才能更新一次但更新的很稳
右边:小的Batch,1个资料当一个Batch,看完一个资料就update一次,很快就能更新一次但更新的不稳
但若考虑平行预算,左边的运算时间不一定比较长
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很大很大的时候,时间还是会增加的
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比较快
Noisy的Gradient有帮助
在两个不同的模型上做实验,发现在两者上都是当Batch Size越大,训练的结果越差。
→同样的模型,所以Function是一样的,不是Model Bias问题
→ 在Training上就有问题,所以不是Overfitting,是Optimization问题
为什么小的Batch Size会有比较好的结果?
Full Batch容易卡住
Small Batch每一次update的LF都是有差异的,可能Batch1的LF卡住了,但Batch2的LF不会卡住
→ Noisy的Gradient有帮助
Traning Loss有很多Local Minima,Loss都趋近于0
若Local Minima在平原上,就是好Local Minima,如果在峡谷里,就是坏Local Minima
为什么?假设训练资料跟测试资料使用的Function不一样,LF的曲线不一样,同样的Local Minima位置也不一样
而小Batch每次update的方向不一样,且频率很高,若在峡谷里很可能一下就逃脱(尚待研究)
Momentum
介紹
有可能对抗一些Local Minima 和 Saddle Point
假设在物理世界,Error Surface是斜坡,参数是一颗球,把球从斜坡上滚下來,因为惯性够大且若动量够大,有可能不会卡在Local Minima和Saddle Point
复习Vanilla Gradient Descent
从Θ0开始,计算其Gradient Descent g0,往g0的反方向update参数,重复以上步骤
Gradient Descent + Momentum
原本:往Gradient的反方向
变成:往Gradient的反方向 + 前一步移动的方向
可发现m可写成Gradient的weigted Sum
Momentum可解读成
1.Gradient的反方向 + 前一步移动的方向
2.考虑的Gradient是过去所有Gradient的总和