如何步入深度学习刷榜第一重境界
实际上笔者也没多少刷榜经验,毕竟不擅长,之前老大也没有任务指派,今年10月份得闲了个把月,没那么多事就参加了一个场景分类的比赛,链接如下,https://challenger.ai/competition/scene/leaderboard/test_a
刷了一个月之后最好成绩也就杀进前15然后就接着干项目去了。
与第一名差一个点,7000张测试图,80类,基本上每一类差1张图。到比赛结束的时候排在第20名左右,与第一名还是差一个点。说出去好像是有点不太好意思,但是作为第一次刷比赛,一个月也不能白费,毕竟绩效打在那里。现在的比赛听说还有专业刷榜团队的,也是666。
下面也简单分享一下。
0 刷的是什么比赛?
场景分类,80类日常生活中比较多的场景,这个在以后的社交应用中还是有需求的,相关最大的比赛是place365,有兴趣可以去看。眼下这个,是创新工场,今日头条,搜狗等一起搞的比赛,train数据集就不大,只有50000+,测试数据集7000+。
下面举10类吧
0/航站楼:airport_terminal
1/停机坪:landing_field
2/机舱:airplane_cabin
3/游乐场:amusement_park
4/冰场:skating_rink
5/舞台:arena/performance
6/艺术室:art_room
7/流水线:assembly_line
8/棒球场:baseball_field
9/橄榄球场:football_field
10/足球场:soccer_field
1 为什么叫第一境界?
我觉得怎么着刷榜这事也得有个三个境界,像笔者这样,一个人拿现有的模型,4块K40,兼职刷上一个月,最后提交也只融合了两个模型的,怎么看都是处于刚入门的第一境界,大部分人其实也就是这个境界。
而到了第二三境界,至少得有个集群,得有一群人来尝试各种方案,而顶尖的团队对网络结构肯定是需要调优设计的,历年夺冠的那些网络alexnet,googlenet,resnet,senet无一例外。
不过设计强大的网络结构从时间代价,计算资源代价和算法能力都有比较高的要求,大部分人可能就是从数据层面做文章了,比如清洗数据,数据增强,搞搞不均衡样本等。
2 怎么一步刷到比较优的单模型?
这是最关键的第一步。
有几点一定是要形成共识的。
(1) 由于我是只有4个卡,用caffe或者tensorflow都是不可能的,我用了mxnet,并且在训练的过程中都放开了所有参数,实际上也做过固定某些参数的实验,但是效果并不好。224的尺度,放开全部训练的话,4块卡resnet152 batchsize可以到96。在实验的过程中,batchsize越大,指标就越高,几个网络都能观测到相关结论。
(2) 由于训练数据少,使用当前数据从头训练大模型不太现实,所以,先找到相关数据集比赛finetune过的大网络,resnet系列找了一个resnet152,dpn系列找了一个dpn92,各自先训练。
(3) 从尽量大的模型开始,机器啃得动的就行,毕竟这个任务里面有很多类还是很难的,小网络搞不定,resnet系至少得50层以上。
在刷这个比赛的时候,从imagenet mxnetmodel的模型fine-tune过来,链接在下面。
http://data.mxnet.io/models/
实验了18,50,152层的网络,使用本比赛50000+的数据进行简单的参数调优,
解释一下,lr是学习率,Lr=0.01(10)代表在10个epochs后下降一个数量级,从0.01到0.001,实际上在10个epoch以后都收敛了,所以后面没有做更多step lr的比较,大家感兴趣可以去尝试。w是weight decay,m是momentum,bs是batch size,单个k40 gpu。
从上面可以看出,从18层到152层精度毫无疑问是提升的。虽然参数没有调到各自最优,但基本能反应问题。尤其注意的是res18我加了weight decay来增加模型复杂度,不然没有上90%的可能。从resent152到resent200指标就没什么提升了,而且res200远远没有res152参数好调。单模型单个crop 94%的精度已经差不多了,
(4) 理论上随着训练尺度增加,在一定范围内性能也会增加,但是训练尺度的增加会导致能使用的batchsize减小,所以笔者最后统一采用224这个尺度。听说有人用到了700以上的尺度,只能说,真土豪也。
(5) 单个模型,多个crop会对结果有所提升,有的团队用到了上百个crop,笔者最后用了10个crop,没有去尝试更多,毕竟测试也是很花时间,这点资源一个人搞不过来。
有了以上的共识后,那就开始干起来,过段时间我会重新整理把项目git传上去,前段时间服务器意外格式化丢了全部训练文件,一时还没有恢复。如果对此感兴趣,请持续关注。
总结:单模型,以resent152为例。
训练尺度224*224,数据增强采用了水平flip和随机crop,randomresize参数照搬googlenet那套,放开所有参数,使用resnet152-place365,即在place365数据集上进行训练过的模型,然后使用当前的训练数据集进行finetune,validation数据集进行测试。
数据增强参数偷懒截个图,实际上这些mxnet全部都已经集成好了,直接设置开关即可。
训练参数,lr=0.01,分别在10,20,40个epoch时下调学习率,最后采用10个crop,分别为四个角,中心以及水平翻转。在试用了多个batchsize之后,最大的能用的batchsize取得最优,resnet152单个模型能到97%。
在测试的时候有trick,采纳dpn的思想,使用较小的尺度训练,使用较大的尺度测试,最终在略大于224的尺度上,有微小的提升,对于刷榜来说还有很重要的,毕竟0.5%可以干掉10个人。
3 怎么做模型融合?
不同网络架构,但能力相当的模型进行融合,结果会稳定提升。笔者单模型10个crop,resnet152得到0.971,dpn92得到0.965,两者融合后即到0.978。要想得到最优,需采用不同的epoch进行融合,这个需要花时间去测试;所以就会出现两个单模型最优,融合之后缺不是最优的情况。这个时候,需要把各自错误样本拿出来分析,我当时没有太多时间和耐心去尝试各种方案。
这就是提交比赛的最后结果,两个现有的模型在224尺度用4张卡训练,融合之后,在比赛结束前的一个月,能排在15名左右,比赛结束后我回去一看,test_a也在20名以内,test_b也差不多,由于test_b比较难,所有参赛队伍的成绩都下降了4个点左右。
4 哪些trick比较关键
虽然提交的结果非常简单,笔者还是实验过很多参数的,稍微有些经验拿出来分享下,有些参数是不能乱调的,有些则不需要调。
(1) finetune很关键
从相关大数据集上训练好的模型开始finetune,基本上可以肯定会比从不相关大数据集上训练的模型,或者从头开始训练更好,这个大家应该是通识了。
(2) 学习率lr和batchsize
学习率和batch size是成对的参数,batch size增大N倍,相当于将梯度的方差减少N倍,也就是梯度方差更小了,更加准确,更加容易跳出局部最优,带来的后果就是收敛更慢,这时候为了提高训练速度,可以将lr增加sqrt(N)倍。
学习率是最关键的参数了,没得说,只能自己从大到小开始尝试。
笔者列举一个例子:dpn92, lr_step_epochs='10,20,30,40',w=0,m=0,bs=64,
lr取0.001,0.005,0.01,0.01,分别看train和val的acc。
从小到大,从欠拟合到过拟合,很明显。
batch size相对来说没有lr那么敏感,但是对结果也是至关重要的。
下面是resnet152的batchsize的实验,mul_val是多个crop
下面是dpn92的batchsize的实验,mul_val是多个crop
看的出来,指标有所上升。
当然了,还是那句话,单个最优的模型融合起来并不能保证结果最优。
(3) weight decay和momentum
这两个参数,对于小模型的训练是比较关键的,不过越大越不敏感。
下面是res18的训练结果,从结果看来差异是很大的。
Res50,差距就不明显了。
Senet50也是。
我的结论是这个参数可以去调一调,不过对于大模型可能不是很必要,我都用的是0
(4) 测试网络
下面是单个crop和10个crop的比较
很明显,不管是什么网络,多个crop会有很明显的提升,上面稳定提升2%以上,更多的crop笔者没尝试,因为实在是太慢了。
另一方面,借鉴dpn的思想,用小尺度训练,大尺度测试可能也有微小的点提升,下面是一个比较。
(5) 数据增强
本任务中复杂的数据增强没怎么用,使用的是mxnet level=1的数据增强,估计是因为模型已经在大数据库上训练过,au=1就是基本的crop,flip,randomresize,au=2会做图像旋转,au=3会再加上颜色扰动,实际的项目中我们还是会做一点的。
就这么多,不知道你对是否有用,下回搞点机器搞点时间去刷个大榜试试。
话说有个问题,刷比赛的各位觉得这个好玩吗?