CVPR2022 | 在线Re-Param | OREPA让AI训练速度进一步加快,精度略胜RepVGG!(一)

简介: CVPR2022 | 在线Re-Param | OREPA让AI训练速度进一步加快,精度略胜RepVGG!(一)

1简介


卷积神经网络(CNNs)已经在许多计算机视觉任务的应用成功,包括图像分类、目标检测、语义分割等。精度和模型效率之间的权衡也已被广泛讨论。

一般来说,一个精度较高的模型通常需要一个更复杂的块,一个更宽或更深的结构。然而,这样的模型总是太重,无法部署,特别是在硬件性能有限、需要实时推理的场景下。考虑到效率,更小、更紧凑和更快的模型自然是首选。

为了获得一个部署友好且高精度的模型,有研究者提出了基于结构重参数化的方法来释放性能。在这些方法中,模型在训练阶段和推理阶段有不同的结构。具体来说,使用复杂的训练阶段拓扑,即重参数化的块,来提高性能。训练结束后,通过等效变换将一个复杂的块重参为成一个单一的线性层。重参后的模型通常具有一个整洁架构模型,例如,通常是一个类似VGG的或一个类似ResNet的结构。从这个角度来看,重参化策略可以在不引入额外的推理时间成本的情况下提高模型的性能。

BN层是重构模型的关键组成部分。在一个重新解析块(图1(b))中,在每个卷积层之后立即添加一个BN层。可以观察到,去除这些BN层会导致的性能退化。然而,当考虑到效率时,这种BN层的使用出乎意料地在训练阶段带来了巨大的计算开销。在推理阶段,复杂的块可以被压缩成一个卷积层。但是,在训练过程中,BN层是非线性的,也就是说,它们将特征映射除以它的标准差,这就阻止了合并整个块。因此,存在大量的中间计算操作(large FLOPS)和缓冲特征映射(high memory usage)。更糟糕的是,这么高的训练预算使得很难探索更复杂和可能更强的重参块。很自然地,下面的问题就出现了:

为什么标准化在重参中这么重要?

通过分析和实验,作者认为BN层中的尺度因子最重要,因为它们能够使不同分支的优化方向多样化。

基于观察结果,作者提出了在线重参化(OREPA)(图1(c)),这是一个两阶段的pipeline,使之能够简化复杂的training-time re-param block

在第一阶段,block linearization,去除所有的非线性BN层,并引入线性缩放层。这些层与BN层具有相似的性质,因此它们使不同分支的优化多样化。此外,这些层都是线性的,可以在训练过程中合并成卷积层。

第二阶段,block squeezing,将复杂的线性块简化为单一的卷积层。OREPA通过减少由中间计算层引起的计算和存储开销,显著降低了训练成本,对性能只有非常小的影响。

此外,高效化使得探索更复杂的重参化拓扑成为可能。为了验证这一点,作者进一步提出了几个重参化的组件,以获得更好的性能。

在ImageNet分类任务上评估了所提出的OREPA。与最先进的修复模型相比,OREPA将额外的训练时间GPU内存成本降低了65%到75%,并将训练过程加快了1.5-2.3倍。同时,OREPA-ResNet和OREPA-VGG的性能始终优于+0.2%∼+0.6%之前的DBB和RepVGG方法。同时作者还评估了在下游任务上的OREPA,即目标检测和语义分割。作者发现OREPA可以在这些任务上也可以带来性能的提高。

本文主要贡献:

  1. 提出了在线卷积重参化(OREPA)策略,这极大地提高了重参化模型的训练效率,并使探索更强的重参化块成为可能;
  2. 通过对重参化模型工作机制的分析,用引入的线性尺度层代替BN层,这仍然提供了不同的优化方向,并保持了表示能力;
  3. 在各种视觉任务上的实验表明,OREPA在准确性和训练效率方面都优于以前的重参化模型(DBB/RepVGG)。

2相关工作


2.1 结构重参化

结构重参化最近被重视并应用于许多计算机视觉任务,如紧凑模型设计、架构搜索和剪枝。重参化意味着不同的架构可以通过参数的等价转换来相互转换。例如,1×1卷积的一个分支和3×3卷积的一个分支,可以转移到3×3卷积的单个分支中。在训练阶段,设计了多分支和多层拓扑来取代普通的线性层(如conv或全连接层)来增强模型。Cao等讨论了如何在训练过程中合并深度可分离卷积核。然后在推理过程中,将训练时间的复杂模型转移到简单模型中,以便于更快的推理。

在受益于复杂的training-time拓扑,同时,当前的重参化方法训练使用不可忽略的额外计算成本。当块变得更复杂以变得更强的表示时,GPU内存利用率和训练时间将会越来越长,最终走向不可接受。与以往的重参化方法不同,本文更多地关注训练成本。提出了一种通用的在线卷积重参化策略,使training-time的结构重参化成为可能。

2.2 Normalization

BN被提出来缓解训练非常深度神经网络时的梯度消失问题。人们认为BN层是非常重要的,因为它们平滑了损失。最近关于无BN神经网络的研究声称,BN层并不是不可或缺的。通过良好的初始化和适当的正则化,可以优雅地去除BN层。

对于重参化模型,作者认为重参化块中的BN层是关键的。无BN的变体将会出现性能下降。然而,BN层是非线性的,也就是说,它们将特征图除以它的标准差,这阻止了在线合并块。为了使在线重参化可行,作者去掉了重参块中的所有BN层,并引入了BN层的线性替代方法,即线性缩放层

2.3 卷积分解

标准卷积层计算比较密集,导致大的FLOPs和参数量。因此,卷积分解方法被提出,并广泛应用于移动设备的轻量化模型中。重参化方法也可以看作是卷积分解的某种形式,但它更倾向于更复杂的拓扑结构。本文的方法的不同之处在于,在kernel-level上分解卷积,而不是在structure level。


3在线重参化


在本节中,首先,分析了关键组件,即重参化模型中的BN层,在此基础上提出了在线重参化(OREPA),旨在大大减少再参数化模型的训练时间预算。OREPA能够将复杂的训练时间块简化为一个卷积层,并保持了较高的精度。

OREPA的整体pipeline如图2所示,它包括一个Block Linearization阶段和一个Block Squeezing阶段

image.png

图2

作者通过分析多层和多分支结构的优化多样性,深入研究了重参化的有效性,并证明了所提出的线性缩放层和BN层具有相似的效果。

最后,随着训练预算的减少,进一步探索了更多的组件,以实现更强的重参化模型,成本略有增加。

3.1 重参化中的Normalization

作者认为中间BN层是重参化过程中多层和多分支结构的关键组成部分。以SoTA模型DBB和RepVGG为例,去除这些层会导致严重的性能下降,如表1所示。

image.png

这种观察结果也得到了Ding等人的实验支持。因此,作者认为中间的BN层对于重参化模型的性能是必不可少的。

然而,中间BN层的使用带来了更高的训练预算。作者注意到,在推理阶段,重参化块中的所有中间操作都是线性的,因此可以合并成一个卷积层,从而形成一个简单的结构。

但在训练过程中,BN层是非线性的,即它们将特征映射除以其标准差。因此,中间操作应该单独计算,这将导致更高的计算和内存成本。更糟糕的是,如此高的成本将阻止探索更强大的训练模块。

3.2 Block Linearization

如3.1中所述,中间的BN层阻止了在训练过程中合并单独的层。然而,由于性能问题,直接删除它们并不简单。为了解决这一困境,作者引入了channel级线性尺度操作作为BN的线性替代方法。

缩放层包含一个可学习的向量,它在通道维度中缩放特征映射。线性缩放层具有与BN层相似的效果,它们都促进多分支向不同的方向进行优化,这是重参化时性能提高的关键。除了对性能的影响外,线性缩放层还可以在训练过程中进行合并,使在线重参化成为可能。

基于线性缩放层,作者修改了重参化块,如图3所示。具体来说,块的线性化阶段由以下3个步骤组成:

  • 首先,删除了所有的非线性层,即重参化块中的BN层
  • 其次,为了保持优化的多样性,在每个分支的末尾添加了一个缩放层,这是BN的线性替代方法
  • 最后,为了稳定训练过程,在所有分支的添加后添加一个BN层。

一旦完成线性化阶段,在重参化块中只存在线性层,这意味着可以在训练阶段合并块中的所有组件。

3.3 Block Squeezing

Block Squeezing步骤将计算和内存昂贵的中间特征映射上的操作转换为更经济的kernel上的操作。这意味着在计算和内存方面从减少到,其中、是特征图和卷积核的空间尺寸。

一般来说,无论线性重参化块是多么复杂,以下2个属性始终成立:

  • Block中的所有线性层,例如深度卷积、平均池化和所提出的线性缩放,都可以用带有相应参数的退化卷积层来表示;
  • Block可以由一系列并行分支表示,每个分支由一系列卷积层组成。

有了上述两个特性,如果可以将

  1. 多层(即顺序结构)
  2. 多分支(即并行结构)

图4

简化为单一卷积,就可以压缩一个块。在下面的部分中,将展示如何简化顺序结构(图4(a))和并行结构(图4(b))。

首先定义卷积的符号。设表示一个大小的二维卷积核的输入和输出通道数。,表示输入和输出张量。在这里省略了偏差作为一种常见的做法,卷积过程被表示为:

image.png

1、简化顺序结构

考虑一堆卷积层,其表示为:

image.png

其中满足,。根据结合律,通过首先卷积核,可以将这些层压缩成一个层:

image.png

其中,为第层的权重。表示端到端映射矩阵。

2、简化并行结构

并行结构根据卷积的线性性,可以根据等式将多个分支合并成一个分支:

image.png

其中,为第个分支的权重,和(为统一的权重。值得注意的是,当合并不同大小的kernel时,需要对齐不同kernel的空间中心,例如,1×1 kernel应该与3×3 kernel的中心对齐(如RepVGG)。

3、训练开销:从特征到kernels。

无论这个Block有多复杂,它都必须仅仅由多分支和多层的子拓扑组成。因此,可以根据上述两个简化规则将其简化为一个单一的简化规则。最后,可以得到一体化的端到端映射权重,并且在训练期间只卷积一次。实际上将中间特征映射上的操作(卷积,加法)转换为卷积kernel上的操作。因此,在计算和内存方面将计算复杂度从减少到了。

3.4 多分支拓扑结构的梯度分析

为了理解为什么Block Linearization步骤是可行的?,即为什么缩放层是重要的?,作者对统一权重重参化的优化进行了分析。

结论是,对于去掉BN层的分支,利用缩放层可以使其优化方向多样化,并防止其退化为单一的优化方向

为了简化表示法,只取输出Y的单维。考虑一个缩放序列:

image.png

其中是滑动窗口内的向量化像素,,W是对应于特定输出通道的卷积核,是比例因子。假设所有参数都通过随机梯度下降更新,映射更新为:

image.png

其中,L为整个模型的损失函数,η为学习率。是多分支拓扑共享的,即:

image.png

端到端权重与等式(6)的权重同等优化(顺序结构可以得到):

image.png

使用相同的前传t-moment端到端矩阵。因此,没有引入优化变化。这一结论也得到了实验支持。相反,具有分支级的多分支拓扑提供了这样的变化:

image.png

端到端权重的更新与等式(6)不同:

image.png

满足相同的前提条件和条件1:

条件1:所有分支中至少有2个是活动的

image.png

条件2:每个活动分支的初始状态都是不同的

image.png

同时,当满足条件2时,多分支结构不会退化为单一结构,多个分支同时进行前向和反向传播。这也揭示了为什么比例因子是重要的。

注意,当每个分支的权值是随机初始化的,而缩放因子被初始化为1时,条件1和条件2都始终满足。

image.png

命题1:一个单分支线性映射,当通过超两层多分支拓扑重参化部分或全部时,整个端到端权重矩阵将得到不同的优化。如果映射的一层被重参化到多达一层的多分支拓扑,则优化将保持不变。

到目前为止,已经扩展了关于重参化如何影响优化的讨论。实际上,所有当前有效的重参化拓扑都可以通过命题1进行验证。

image.png

详细分析见论文附录部分

3.5 Block涉设计

由于所提出的OREPA节省了很大幅度的训练成本,它促使能够探索更复杂的训练块。为此,设计了一种新的重新参数化模型,即OREPA-ResNet,通过线性化最新的模型DBB,并插入以下组件(图5)。

1、频率先验滤波器

在DBB中,在块中使用了池化层。Qin等人认为,池化层是频率滤波器的一种特殊情况。为此,作者添加了一个Conv1×1-频率滤波器分支。

2、线性深度可分离卷积

通过去除中间的非线性激活层,对深度可分离的卷积进行了轻微的修改,使其在训练过程中可以进行合并。

3、重参化1×1卷积

以往的工作主要集中在3×3卷积层的重参上,而忽略了1×1卷积层的重参。作者建议重参化1×1层,因为它们在bottleneck结构中发挥着重要作用。具体来说,在Block添加了一个额外的Conv1×1-Conv1×1分支。

4、线性Stem

大的卷积核通常被放置在最开始的层,例如,7×7的Stem,目的是实现一个更大的感受野。Guo等人将堆叠的3×3卷积层替换7×7卷积,以获得更高的精度。然而,由于高分辨率,在最初始层堆叠需要更大的计算开销。需要注意的是,这里可以用提出的线性缩放层将stacked deep stem缩放到7×7conv层,这可以大大降低训练成本,同时保持高精度。

image.png

对于OREPA-ResNet中的每个块(图6):

  1. 添加了一个频率先验滤波器和一个线性的深度可分离卷积
  2. 将所有的Stem(即最初的7×7卷积)替换为所提出的线性deep stem层
  3. 在bottleneck中,除了1和2之外,进一步将所提出的rep 1×1块替换原来的1×1卷积分支
相关文章
|
3月前
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
|
1天前
|
机器学习/深度学习 存储 人工智能
【AI系统】谷歌 TPU v2 训练芯片
2017年,谷歌推出TPU v2,专为神经网络训练设计,标志着从推理转向训练的重大转变。TPU v2引入多项创新,包括Vector Memory、Vector Unit、MXU及HBM内存,以应对训练中数据并行、计算复杂度高等挑战。其高效互联技术构建了TPU v2超级计算机,显著提升大规模模型训练的效率和性能。
6 0
|
2月前
|
Python 机器学习/深度学习 人工智能
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
【10月更文挑战第1天】本文通过构建一个简单的强化学习环境,演示了如何创建和训练智能体以完成特定任务。我们使用Python、OpenAI Gym和PyTorch搭建了一个基础的智能体,使其学会在CartPole-v1环境中保持杆子不倒。文中详细介绍了环境设置、神经网络构建及训练过程。此实战案例有助于理解智能体的工作原理及基本训练方法,为更复杂应用奠定基础。首先需安装必要库: ```bash pip install gym torch ``` 接着定义环境并与之交互,实现智能体的训练。通过多个回合的试错学习,智能体逐步优化其策略。这一过程虽从基础做起,但为后续研究提供了良好起点。
138 4
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
|
3月前
|
人工智能 开发工具 计算机视觉
AI计算机视觉笔记三十:yolov8_obb旋转框训练
本文介绍了如何使用AUTODL环境搭建YOLOv8-obb的训练流程。首先创建虚拟环境并激活,然后通过指定清华源安装ultralytics库。接着下载YOLOv8源码,并使用指定命令开始训练,过程中可能会下载yolov8n.pt文件。训练完成后,可使用相应命令进行预测测试。
|
3月前
|
人工智能 PyTorch 算法框架/工具
AI计算机视觉笔记二十二:基于 LeNet5 的手写数字识别及训练
本文介绍了使用PyTorch复现LeNet5模型并检测手写数字的过程。通过搭建PyTorch环境、安装相关库和下载MNIST数据集,实现了模型训练与测试。训练过程涉及创建虚拟环境、安装PyTorch及依赖库、准备数据集,并编写训练代码。最终模型在测试集上的准确率达到0.986,满足预期要求。此项目为后续在RK3568平台上部署模型奠定了基础。
|
3月前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
3月前
|
存储 人工智能 数据可视化
AI计算机视觉笔记二十一:PaddleOCR训练自定义数据集
在完成PaddleOCR环境搭建与测试后,本文档详细介绍如何训练自定义的车牌检测模型。首先,在`PaddleOCR`目录下创建`train_data`文件夹存放数据集,并下载并解压缩车牌数据集。接着,复制并修改配置文件`ch_det_mv3_db_v2.0.yml`以适应训练需求,包括设置模型存储目录、训练可视化选项及数据集路径。随后,下载预训练权重文件并放置于`pretrain_models`目录下,以便进行预测与训练。最后,通过指定命令行参数执行训练、断点续训、测试及导出推理模型等操作。
|
3月前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
3月前
|
人工智能 计算机视觉 Python
AI计算机视觉笔记十九:Swin Transformer训练
本文介绍了使用自定义数据集训练和测试目标检测模型的步骤。首先,通过安装并使用标注工具labelme准备数据集;接着修改配置文件以适应自定义类别,并调整预训练模型;然后解决训练过程中遇到的依赖冲突问题并完成模型训练;最后利用测试命令验证模型效果。文中提供了具体命令及文件修改指导。
|
3月前
|
人工智能 PyTorch 算法框架/工具
AI计算机视觉笔记十二:基于 LeNet5 的手写数字识别及训练
本文档介绍了如何使用PyTorch框架复现经典的LeNet5模型,并通过MNIST数据集进行训练与测试。首先,创建虚拟环境并安装所需库,接着下载MNIST数据集。训练部分涉及四个主要文件:`LeNet5.py`、`myDatast.py`、`readMnist.py` 和 `train.py`。通过这些文件搭建模型并完成训练过程。最后,通过测试脚本验证模型准确性,结果显示准确率达到0.986,满足预期需求。文档还提供了详细的环境配置和代码实现细节。

热门文章

最新文章

下一篇
无影云桌面