RepVGG

  • 论文总览
  • 方法
  • 多分支训练
  • 结构重参数化
  • 网络架构
  • 实验
  • 局限性


efficientnet resnet 对比 resnet vgg对比_卷积核

CVPR2021
Paper : https://arxiv.org/abs/2101.03697

Code : https://github.com/DingXiaoH/RepVGG

MegEngine : https://github.com/megvii-model/RepVGG

论文总览

efficientnet resnet 对比 resnet vgg对比_深度学习_02

本文通过结构重参数化,只使用 3x3 卷积和 ReLU 激活函数的单路极简架构在速度和性能上达到 SOTA 水平。

尽管许多复杂的卷积网络都比简单的卷积网络提供更高的准确性,但缺点很明显:

  1. 复杂的多分支设计(例如 ResNet 的残差连接和 Inception 的分支拼接)让模型更难实现和定制,并且降低了推理速度,减少了内存利用
  2. 一些组件(例如 Xception 和 MobileNets 的深度卷积,ShuffleNet 的通道洗牌)增加了内存访问成本,并且缺乏设备的支持。

由于影响推理速度的因素太多,浮点运算(FLOP)的数量不能准确反映实际速度。

而简单架构是快速、节省内存并且具有灵活性的

  • 快速:efficientnet resnet 对比 resnet vgg对比_卷积_03
  • 节省内存。单路架构节省内存。
  • 灵活性好,容易改变更层的宽度

所以本文提出通过结构重参数化将多分支训练和简单架构推理分离,也就是通过转换网络的参数将架构从一种架构转换为另一种架构,如下图所示,使用(B)网络训练,然后通过结构重参数化转换为(C)网络进行推理。具体来说,如果某个结构的参数可以转换为由另一种结构的另一组参数,就可以用后者等效地替换前者,从而改变整个网络体系结构。

这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。

efficientnet resnet 对比 resnet vgg对比_卷积_04

方法

多分支训练

在训练时,为每一个 3x3 卷积层添加平行的 1x1 卷积分支和 identity 分支,构成一个 RepVGG Block(如上图)。这种设计是借鉴 ResNet 的做法,区别在于 ResNet 是每隔两层或三层加一分支,而本文是每层都加。

结构重参数化

怎么样把多分支训练网络重参数化为简单网络进行推理,也就是怎样将 efficientnet resnet 对比 resnet vgg对比_计算机视觉_05 和 identity 转换为一个 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06

方法描述

efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积相当于一个特殊的 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 卷积(卷积核中有很多 0),而 identity 是一个特殊的 efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积(单位矩阵),因此也是一个特殊的 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 卷积。所以,把 identity 转换为 efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积,只要构造出一个以单位矩阵为卷积核的 efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积即可,把 efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积等价转换为 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06

原理详解

使用 efficientnet resnet 对比 resnet vgg对比_参数化_15 表示 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 的卷积核,输入通道为 efficientnet resnet 对比 resnet vgg对比_深度学习_17,输出通道为 efficientnet resnet 对比 resnet vgg对比_计算机视觉_18 。使用 efficientnet resnet 对比 resnet vgg对比_卷积_19 表示 efficientnet resnet 对比 resnet vgg对比_卷积核_07 的卷积核。使用 efficientnet resnet 对比 resnet vgg对比_参数化_21 表示 efficientnet resnet 对比 resnet vgg对比_深度学习_22 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 efficientnet resnet 对比 resnet vgg对比_参数化_23 表示 efficientnet resnet 对比 resnet vgg对比_卷积核_24 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。用 efficientnet resnet 对比 resnet vgg对比_深度学习_25 表示 efficientnet resnet 对比 resnet vgg对比_卷积核_24 卷积层后的 BN 层的均值,标准差,缩放因子和偏置。使用 efficientnet resnet 对比 resnet vgg对比_卷积_27 表示输入和输出,efficientnet resnet 对比 resnet vgg对比_计算机视觉_28 表示卷积操作。如果 efficientnet resnet 对比 resnet vgg对比_计算机视觉_29 ,则可以有:
efficientnet resnet 对比 resnet vgg对比_参数化_30
不相等的话,不用恒等分支,因此上式只有前两项。对于 BN 的公式为:
efficientnet resnet 对比 resnet vgg对比_参数化_31
首先可以把每个 BN 和它前边的卷积层转换为一个带有偏置限量的卷积。使用 efficientnet resnet 对比 resnet vgg对比_卷积核_32 表示转换后的卷积核和偏置,则:
efficientnet resnet 对比 resnet vgg对比_参数化_33
因此
efficientnet resnet 对比 resnet vgg对比_计算机视觉_34
举例说明

efficientnet resnet 对比 resnet vgg对比_参数化_35

上图描述了这一转换过程,输入和输出通道都是2,则 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 卷积的参数是 4 个 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 矩阵,efficientnet resnet 对比 resnet vgg对比_卷积核_07 卷积的参数是一个 efficientnet resnet 对比 resnet vgg对比_参数化_39 矩阵。根据以上公式可以将它们及其 BN 层分别转换为 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06 卷积及其偏置,然后将它们分别相加即可。这样,每个 RepVGG Block 转换前后的输出完全相同,因而训练好的模型可以等价转换为只有 efficientnet resnet 对比 resnet vgg对比_计算机视觉_06

网络架构

efficientnet resnet 对比 resnet vgg对比_深度学习_42


a, b 为缩放系数

对于图像分类,使用全局平均池化和一个全连接网络分类。对于其他的任务,可以使用任意层的特征图。

遵循三个简单的准则来决定每个 stage 的层数。

  1. 第一个 stage 具有高分辨率,很耗时,因此仅使用了一层
  2. 最后一个 stage 具有更多通道,因此仅使用一层来保存参数
  3. 将最多的层放到倒数第二个 stage(ImageNet上的输出分辨率为14×14)

使用 RepVGG-A 与其他轻型和中等模型比较,包括 ResNet-18/34/50,而 RepVGG-B 与高性能模型比较。

实验

efficientnet resnet 对比 resnet vgg对比_卷积核_43

efficientnet resnet 对比 resnet vgg对比_计算机视觉_44

efficientnet resnet 对比 resnet vgg对比_深度学习_45

局限性

RepVGG 是为 GPU 和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如 MobileNet 和 ShuffleNet 系列适用。


参考文章:

RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)