Batch and Momentum

Small batch vs Large Batch

ILOKH.png
左边是选取所有的资料,右边是每次选一个
batch如果很大更新参数就比较慢,需要很长时间才能更新一次参数,而batch小的话更新参数就比较快,但是他的每一步都是不稳的。
如果有并行运算,那么左边所花的时间也不一定很长。
如果批次很大,gpu的平行运算能力是有限的,所以花费的时间也会有个极限。
批次很小的话,就会丧失平行运算的能力。需要很长时间跑完全部的数据集。所花费的时间就会更长。
IL7RV.png
但是如果批次很大的话,training会比较差。这是optimization的问题,而小的batch_seize的训练结果就会比较好。

“Noisy” update is better for training

Alt text
每次更新参数的时候,批次大是沿着一个函数下来的,而小批次是更新参数有差异的,L1不走了,L2可能就会走。

“Noisy” update is better for generalization

小的批次对testing也有帮助。原理就细讲。
ILMFy.png
总得来说batch_size要选取一个合适大小,一般就是64,128,256.

Momentum

IL1xZ.png
动量就是延着上一次梯度更新的方向走,加上栋梁就会使这一次的参数更新与上一次有关联。如果这一次梯度是0的话还是有办法继续走下去的,如果影响力很大的话可能就是翻过山丘走到更好的局部最小值。