0. 前言
- 相关资料:
- arxiv
- github
- 论文解读(作者本人解读,其实已经说得很清楚了):本文很多内容直接复制这一片。其实更建议大家看作者人本的文章,嘿嘿。
- 论文基本信息
- 领域:图像分类
- 作者单位:清华&旷视科技
- 发表时间:2021.1
- 一句话总结:解耦模型训练与模型部署,训练分支模型,经过等价转换变为单路模型,最终部署单路模型
1. 要解决什么问题
-
先定义下单路结构与分支结构
- 单路结构,也就是作者所谓的“VGG式”,主要特点是:没有分支结构,只使用3x3卷积,仅使用relu作为激活函数。
- 分支结构,也就是resnet中提出的skip结构。
-
现在分支结构几乎成为所有结构的标配,但是,分支结构也存在一些问题:
- 虽然不怎么增加计算量,但占用显存不少,且降低模型的并行度。
- 复现较困难且降低了模型推理时的运行速度以及内存利用率。
- 复杂的分支结构不能很好的支持所有硬件设备。
- 分支结构中,FLOPs不能很好的反映模型的推理速度。现在最常用的模型中还是包括了VGG以及ResNet
-
现在backbone的另外一种事先方式是用神经网络搜索,一般也都是用分支结构。
2. 用了什么方法
- 使用VGG式结构有什么好处(好处基本上都是部署上的)
- 不存在skip的缺陷,即减少显存占用、提高模型并行能力。显存占用如下图
- 3x3卷积比其他形式卷积的计算效率高,给出了实验结果
- 灵活性高,容易改变各层的宽度
- 为什么之前VGG式结构用得少、分支结构用得多?(VGG式的缺陷基本上就是在训练上的)
- 主要认为VGG式性能差。
- 分支结构产生了大量子模型的隐式ensemble。
- 本文提出的解决方案
- 解耦训练和推理的架构
- 训练一个多分支模型
- 将多分支模型等价转换为单路模型。
- 部署单路模型。
- 那具体如何实现呢
- 左边是原始ResNet结构
- 中间是RepVGG训练时使用(每个3x3卷积配上一个1x1卷积,stride为1的都配上skip结构)
- 右图是转换后的VGG式结构,用于RegVGG模型推理。
- 那从训练网络如何转换为推理网络呢(等价转换如何实现)
- 1x1卷积以及skip结构其实就是特殊的3x3卷积结构。
- 卷积的可叠加性(卷积的结构是多个卷积核分别卷积操作然后累加得到的),可以使得 3x3+1x1+skip 合成一个3x3卷积
- 下图就是一次等价转换的举例:
- 第一行是转换前的结构,即RegVGG训练结构
- 第二行是转换后的结构,即RegVGG推理结构
- 左边是网络结构示意图,右边是参数结构示意图
- 注意,输入、输出的channel数量都是2
3. 效果如何
- 作者在1080ti上测试的结果非常好:
- 在公平的训练设定下,同精度的RepVGG速度是ResNet-50的183%,ResNet-101的201%,EfficientNet的259%,RegNet的131%。注意,RepVGG取得超过EfficientNet和RegNet的性能并没有使用任何的NAS或繁重的人工迭代设计。
4. 还存在什么问题&可借鉴之处
- 不知道对于类似于mobilenet这些对比起来如何,最小的网络不知道用到边缘设备上效果如何。
- 属于参数多但推理速度快。参数多可能算个缺陷?