AWS李沐大佬的paper,主要是介绍了一些模型训练过程中的技巧。通过这些小技巧的堆叠,把ResNet-50’s top-1 在ImageNet上验证准确率从 75.3% 提升至 79.29%。
1.高效训练
1.1 large-batch-training
大的batch 可能会降低训练速度。用启发式的方法来解决
Linear scaling learning rate
增大batch-size之后,梯度的期望不变,但是方差变了,也就是说减少了梯度中的噪声,那么是不是就要减少一下学习率? 即如果之前是0.1 在256下 那么新的学习率可以设为 0.1×b/256
学习率热启动(learning rate warmup) 在训练初始阶段,参数都是很随机的,如果学习率过大就会导致数值不稳定。因此可以先使用一个较小的学习率然后等到稳定了在换回原来的学习率。一般好像就是前5个epoch这么用。前五个epoch线性增长。
zero γ 就是bn的使用把γ置零
No bias decay 就是weight decay的时候只对卷积和全连接里面的weighs
3.2Low-precision training
把fp32改成16 训练可以加速2到3倍,但是这样的话容易out-of-range,所以的话,可以存储和算梯度的时候用16,update的时候copy到32?
4.model tweaks
就是把resnet变形一下
下采样的时候 原始的是11的时候就stride reanet-b改到33的时候stride,各种变形的具体看图就ok,不用文字详述了。
5.training refinements
5.1 cosine learning rate decay 这个用了,但是会变成0,后期学习率会变得超级超级小,其实迭代的话不过十几个epoch,感觉对我这种机器比较渣的不是特别友好。感觉这里是不是换成用epoch来迭代好一些。这段的改动主要是参考了tensorflow object detection api 不过根据作者po出来的结果,对结果没啥影响。就是中途的时候变化平缓一些罢了。
5.2 label smooth
之前的话对label就是读取一个值,0,1,2等,这里对label进行了处理,类似使用概率分布,把他变成一个小数。 这个trick目前自己还没有用过,不清楚到底work 不work 查了一下tf的函数 有一个tf.losses.sotfmax_cross_entropy的,有这个选项,不过经常用的是tf.nn.softmax_cross_entropy,这个没有,改天试一下吧。顺便吐槽一下,tf真的有点乱
5.3 knowledge distillation
用resnet-152来指导resnet-50的训练 添加distillation loss来约束,没用过。
5.4 mixup training
感觉挺神奇的。也是一种数据增广的方式 据说特别好用,还可以先用这个,之后低lr在原数据上再训练一下,据说效果很好。就是对两个样本进行线性加权,同理,label也线性加权(这里的label是one-hot的形式)可以尝试一下 https://www.zhihu.com/question/67472285 知乎上的讨论 在tf中可以参考的实现https://becominghuman.ai/data-augmentation-on-gpu-in-tensorflow-13d14ecf2b19 不知道对检测会有什么样的影响 直觉觉得检测好像不能直接搬上去 毕竟是对bbox,这个图像中的bbox和下一个图像的相同位置的label 线性加权,有可能下一个图像都没有label。很尴尬。不过对分割倒是可以试一下。
6.transfer learning
就是pre-train model 一般都会用 说在分割的时候,预训练的时候cosine learning rate 有用,其他的话就gg.
网友评论