1 Star 0 Fork 0

FORK / HyperDL-Tutorial

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
README.md 5.10 KB
一键复制 编辑 原始数据 按行查看 历史
洪伟 提交于 2019-06-13 17:51 . add GAN Disting

你的神经网络真的收敛了么?

1、为什么小模型的作为backbone效果会差? 在深度学习目标检测(图像分割)领域,我们发现当我们使用层数越深,并且在imagenet上表现越好的分类网络作为backbone时,它的检测和分割效果越好效果越好。比如我们使用resnet101作为backbone时候,faster_rcnn在coco2017检测数据集上的mAP可以达到40.1,而使用resnet50作为backbone时候,mAP只达到37.1。而ssd使用resnet50作为backbone时候,mAP达到30.6,使用mobilenet作为backbone只达到21.7。参看gluoncv公布的训练结果。https://gluon-cv.mxnet.io/model_zoo/detection.html#faster-rcnn

那为什么使用mobilenet这种小网络会比resnet101这种大网络效果差这么多呢?主流的想法是小网络的容量小、表现效果差,等等。

**那到底是那么原因呢?**我们可以观察gluoncv官网的ssd_mobilenet[1]和ssd_resnet50[2]在coco上的训练log。我们发现ssd_resnet50[2]的CrossEntropy和SmoothL1最终收敛到2.14+,和1.22+左右,而ssdmobilenet 的CrossEntropy和SmoothL1最终收敛到2.84+,和3.29+左右。同样我们可以去观察gluoncv官网的faster_rcnn分别在resnet50和在resnet101上的训练loss,我们可以发现loss收敛的越小模型在coco 2017的验证集上的mAP越高。并且当backbone使用fpn的方法增大了模型的体积,模型的loss会将的更低,相应的mAP也越高。由此我个人认为使用小模型的作为backbone的迁移学习任务(尤其是目标检测任务)效果差的真正原因是模型欠拟合。

2、你的神经网络真的收敛了么?

既然知道小网络作为backbone效果差的真正原因是模型欠拟合,那如果我们要提高小网络的效果,最主要的任务就是降低小网络的loss(当然大网络的loss如果被进一步降低效果自然越好,比如可以观看faster_rcnn+fpn+resnet101就比faster_rcnn+resnet101的loss低一点点,当然效果也就提升一点点)。

**而我们不妨假设如果小网络最终”收敛“的loss如果可以达到大网络收敛的loss,那小网络能否达到大网络的效果呢?**可能由于小网络的容量小,参数少,很难收敛到大网络的最终收敛的loss。当然方法是人想的,不然怎么能发paper。

我个人认为降低小网络的loss主要有两种方式:

1、提高效果的模型体积,如FPN,DLA,shortcut,concat 等等。不过当模型体积增大到一定程度,他所能得到的收益也越小,比如可以观看gluoncv官网的log。faster_rcnn+fpn+resnet101就比faster_rcnn+resnet101的loss低一点点,当然效果也就提升一点点。而faster_rcnn+fpn+resnet50就比faster_rcnn+resnet50的loss低很多,当然效果也就提升也高了很多。

2、改变训练方式,比如很早提出的知识蒸馏,2018年的cascade rcnn和snip,以及2019年的各种anchor free,都是改变训练方式,虽然他们的动机各不相同,但是我觉得大部分都是进一步降低loss,提高模型的效果。

​ 第一种方式对于个人觉得对于做模型压缩的人来说不太可取,而第二种方式才是主要考虑方向。对于改变训练方式的方法,读者可以参看我的上一篇文章https://zhuanlan.zhihu.com/p/64138476对抗蒸馏,使用对抗生成网络和cosine attention的机制,将大网络的知识迁移到小网络,进一步降低小网络最终的收敛loss。目前开放的使用ssd_resnet50作为teacher net ssd_mobilenet作为student net在voc数据集上将ssd_mobilenetCrossEntropySmoothL1最终收敛到1.388+ 0.659+,mAP达到78.2+,而原始ssd_mobilenet在voc上的CrossEntropySmoothL1最终收敛到1.962+ 0.944+,mAP达到75.4,由于gpu资源限制目前在coco上还没训练完。训练log地址为,https://github.com/p517332051/GAN-Knowledge-Distillation-SSD/blob/master/ssd_512_mobilenet1_0_resnet50_v1_voc_g_d_new_train.log

​ 通过这种方法,我发现小网络并非不是不可以继续收敛,而是训练方式得到改善自然可以继续降低他的loss,而随之loss降低,网络的效果可以进一步提升。期望我的方法能起到抛砖引玉的效果,能推动学术界和工业界神经网络压缩的工作的进展。

知乎链接https://zhuanlan.zhihu.com/p/68563369

参考

  1. ^https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/logs/detection/ssd_512_mobilenet1_0_coco_train.log
  2. ^abhttps://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/logs/detection/ssd_512_resnet50_v1_coco_train.log
1
https://gitee.com/diven-fork/HyperDL-Tutorial.git
git@gitee.com:diven-fork/HyperDL-Tutorial.git
diven-fork
HyperDL-Tutorial
HyperDL-Tutorial
master

搜索帮助