目标分类算法优化的tricks

目标分类算法优化的tricks

这篇paper是李沐大神他们组总结的,感觉总结的非常好,因为通常在paper中即使别人公开了代码,但是其训练的细节,是基本上都没有的,比如学习率,甚至有的网络在实现的时候和paper中是不一致的,比如目前resnet就有好几个版本,这个paper从多个角度分析了一些tricks,可以说对于以后做这类任务的时候提供了一个很好的参考。

batch_size与学习率的关系

batch_size越大,从数学上来讲,数据就会越平稳,可以理解为更加地贴近整个数据集,这时候可以把学习率调大一些,会减少学习的时间,调的时候一般是成比例的调,即batch_size增大多少倍,对应的学习率就减少多少倍。

学习率warm up

有一种训练技巧是warm-up,这种想法感觉挺合理的,即刚开始以非常小的学习率让网络预热一下,等训练几个epochs之后再慢慢地增大学习率,之后再慢慢地降下来,感觉这种想法很符合自然规律,即从0开始学习一个东西的时候,刚开始肯定是最慢的,然后学了一段时间之后中间应该是学得最快的,然后再学一段时间之后可能需要对之前知识的综合理解才能学到更深的东西,所以学习的速度又会变慢。

cos学习率变化

上次总结了几种学习率的变化方式,这次又学到一个cos变化的,其实这种函数自己就可以构造,有许多的函数是满足这种变化方式的,甚至可以是几种函数的组合。当看到这的时候,意识到其实自适应的优化方式感觉应该是很好的,相当于根据学习的内容的不同自己来决定快慢。

Resnet

作者在Resnet这里讲了很多的内容,把几种resnet之间的进化讲得比较清晰,并且还提出了一种新的结构叫’Resnet-D’.

avator

最原始的是上图的,(其实,现在我也搞不清晰到底最初的resnet是哪一个了,现在我了解的resnet有v1,v2,short-cut的那里的变化,还有basic-block里的变化。),这里说在进行residual 模块之前是有一个downsample的操作,这一点我把torch内部的resnet18打出来之后也发现是有这个的,这个downsample的作用像是调节shape来用的, 有pathA和pathB,其中pathA(bottle-neck)后面深化成了resnet-B,

avator

这种改变,作者的解释是上面的pathA从输入的1-1的步长为2的卷积里面差不多丢失了四分之三的信息(因为步长为2的话,是跳着走的,这时候kernerlsize=1),而采用resnet-B的这种方式就不会出现这种情况。

  • Resnet-C

avator

这种网络结构在很多里面都出现过,比如SENet, PSPNet, DeepLabV3, ShuffleNetV2,

这个改变是起源于原始的resnet的前期是(看最上面的图)是先经过一个7-7的步长为2的卷积,但是相比于3-3的卷积,7-7的卷积计算代价大于是5.4倍,所以就用三个连着的3-3的卷积来取代了7-7的卷积,之前我看到过这种,当时以为是为了增加深度而采用的操作。这种现在也非常见,我在写torch-cifar10的时候前期就用的这个。

  • resnet-D

avator

作者在resnet-B的基础上提出了resnet-D的结构,因为和最初的pathA是同样的道理用1-1的卷积步长为2的时候会丢信息,那么如果把步长改为1的话shape上面没有减半,所以为了让shape减半就在卷积前面加了一个average pooling的步长为2的操作,其中average-pooling是充分利用到每个像素点的信息的。

Mixup Training

作者在这里提到了一个增强的技巧,即 avator

即把两个样本进行加权,得到一个新的样本,这样就会增加许多的训练样本,其中y指的应该是one-hot的label,比如第一个样本的label是(1,0)第二个的是(0,1), 那么加权样本的label是(u, 1-u), 这样也是可以去和预测的概率(p1, p2)去做ce的。(注:这些是自己的理解。)

总结

我从这个paper里学到的最多的是关于学习率的,之前其实就没有怎么深入思考过学习率的事情,包括初始学习率的设置,学习率之后怎么选择让其变化,让其以什么样的方式进行变化。

目前用到的学习率的方式基本上都是’step’的方式的,作者在这里给出了cos学习率和’step’之间的比较

avator

从图上可以看出cos的学习率的前期是warm-up阶段,这个时候是以线性增长的方式增长到初始学习率,然后开始执行cos的学习率变化,最终两种学习率达到一致,而从准确性的角度来看,使用step的方式似乎学习的更快一些,而且其变化的拐点和其学习率的拐点是对应着的,即学习率降了之后,验证的准确性也跟着开始提升,而cos学习率的整个过程中准确性都很平稳,最终两者的准确性也是一致。相当于上面两种不同的学习方式经过了一定的时间之后,二者学习到的东西是一样的,区别在于中间的学习过程。而且step的方式有一定的随机性,不知道要以多大的step来改变学习率,如果这个’step’可以根据某种方式量化出来就好了。这样就让网络自己去调整学习率。这一点可以思考思考。

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦