参考资料:
- 参考1: Accurate, Large Minibatch SGD: training imagenet in 1 hour
- 参考2: Imagenet training in minutes
- 参考3: Don't decay the learning rate, increase the batch size
- 参考4: Bag of tricks for Image Classification with Convolutional Neural Networks
- 参考5: MegDet: A Large Mini-Batch Object Detector
- 参考6: Width of Minima Reached by Stochastic Gradient Descent is Influenced by Learning Rate to Batch Size Ratio
- 参考7: One weird trick for parallelizing convolutional neural networks
使用大batch有哪些优势?(即小batch的劣势)
- 训练速度快, 提高并行度
- 针对检测任务, 大batch正负样本更均衡
- 可以有效更新BN层参数(网络使用BN的情况下)
- 精度更高(后续会进一步解释)
使用大batch有哪些劣势?
- 存在拟合问题, batch size越大, 拟合程度更低 -> 精度会低(一个可能原因是大batch训练, 不加任何trick, 会难以收敛, 只能调低learning rate, 但是降低learning rate后, 会导致精度变低)
- 存在优化问题
- 如何调整学习率?
- 多卡BN如何同步?
如何解决大batch训练带来的问题?
参考4提出了以下方法:
- linear scaling learning rate: 增大batch size虽然不能改变随机梯度的期望,但是可以降低它的方差 -> 降低了噪声的梯度 -> 因此可以使用一个更大的学习率, 随着batch size增大, 线性提高learning rate, ex: lr=0.1, batch_size=256 -> batch_size=b, lr=0.1xb/256
- learning rate warmup: 训练初始阶段, 使用一个大的lr会导致数值不稳定(针对分类任务, 网络权值都是随机值, 检测任务一般使用finetune, 数值相对稳定), 在一开始训练时,使用一个小的lr, 当训练稳定后, 逐步恢复到initial lr(恢复方式也比较多, 有线性增大等方式)
- zero γ: 针对residual block中有BN的情况, 对于residual block中最后1个conv的BN层, 将 γ参数初始化为0, 在网络刚开始训练阶段, 所有的residual block只会返回inputs -> 相当于减少了网络的层数, 在初始阶段更容易训练
- no bias decay: 首先针对conv + BN的情况, conv可以不设bias(此bias会在BN过程中被消掉), 论文Training imagenet in four minutes(此论文我没有看, 就不分析了哈)推荐只在conv weights, FC weights使用正则化, 其它参数包括bias, BN层中的gamma, beta都不使用正则化
我们重点讨论学习率如何调整
- 大家一般都有这样的默认, 调大batch size就要增大学习率, 这是为什么呢?
在比较大batch和小batch时,一般默认都是相同epoch去比较,这样大batch训练iteration次数会更少, 此时如果学习率不做任何调整, 大batch训练更少iteration, 导致拟合程度较低, 精度也会低, 因此需要对学习率做调整, 一个大batch包含样本更多, 避免了小batch包含极端样本的情况, 方差更小, 意味着使用大batch计算下来的梯度方向更可信, 因此可以使用一个更大的learning rate
2. 增大学习率有哪些方法(针对sgd优化方法)?
a. lr = base_lr * sqrt(k)
b. lr = base_lr * k在梯度相等的假设下, batch size为N, lr为0.1, 当增大batch size为3 x N, 这一个大batch需要走完之前3个小batch的step, lr为3 x 0.1, 此处借用下参考5的一句话:
Since one step in large mini-batch N should match the effectiveness of k accumulative steps in small mini-batch N
在梯度方差相等的假设下, 也可以得出这样的结论
mini-batch N梯度方差:
mini-batch
large mini-batch
将上面公式化简得到:
多卡BN同步
从上图可以看出, 先计算每个GPU设备上的Sum值, 得到S1, S2... Sn, 再进行求平均得到当前batch size(单卡上batch size x GPUs)的mean value, 计算方差类似, 最后再将