这篇文章在各处都有很广泛的讨论,作为实验经验并不多的小白,将文中tricks只做些记录。
Linear Scaling Rule
进行大批量的Minibatch SGD时会有批量越大,误差越大的问题。本文提出的Linear Scaling Rule正是试图解决这一问题。
Motivation
设想两个情景:一是在一次参数更新中使用kn个样本梯度,二是分为k次更新,每次取n个样本梯度。
第一种情景的参数更新公式:
$$w_t+1^{(1)} = w_t^{(1)} - \mu^{(1)} \frac{1}{kn} \sum_{j \leq k} \sum \bigtriangledown l(x, w_t)$$
第二种情景的参数更新公式:
$$w_t+k^{(2)} = w_t^{(2)} - \mu^{(2)} \frac{1}{n} \sum_{j \leq k} \sum \bigtriangledown l(x, w_t+j)$$
由上面可以看出,主要的区别是梯度平均时批量的大小不同,前者为kn,后者为每次n,更新k次。
再假设双重求和号内项变化不大时,为使情景二更新k次(即使用同样数量的样本)之后参数与情景一类似,我们自然要将学习速率$\mu$线性提升。
Gradual Warmup
上面提到的Linear Scaling Rule使用的假设是梯度变化不大。但在训练初期,参数随机初始化,梯度变化很大,因而Linear Scaling Rule不再适用。在实践中,可以使学习速率在初始时较小,在经过几个epoch训练后再升至与kn批量相应的大小。
BN statistics
在分布式训练的系统中,对于BN中要估计的均值和方差,文中给出的建议是对所有worker上的样本计算均值和方差,而不是每个worker单独计算。
Weight Decay
由于weight decay的存在,Linear Scaling Rule最好用于学习速率,而非用于Loss Function
Momentum Correction
加入Linear Scaling Rule之后,适用动量加速的SGD需要进行动量更正。
Data Shuffling
在分布式的系统中,先进行Data Shuffling,再分配数据到每个worker上。
论文链接:Accurate, Large Minibatch SGD: Training ImageNet in One Hour