RepOpt-VGG:梯度参数化的开创
本文来自公众号“AI大道理”
YOLov6的量化问题:
yolov6在结构中大量使用了重参数结构,导致数据分布过差,PTQ精度急剧下降。另外,重参数化结构网络无法直接使用QAT进行微调提升量化性能。
因为Deploy部署的模型无BN,不利于训练;Train模式进行QAT之后无法进行分支融合。
尝试从以下几个方面看能否走出一条路来。
1、Train模式训练中真的无法量化吗?能否量化后跟踪参数,从而进行融合?看起来不太现实。
2、Deploy部署的模型无BN,仅仅是不利于训练,还是能训练,能否从这里进行改善。看起来可行。
3、从后量化着手,不断降低这个损失度了。这个方向看起来比较实际一点。
YOLOv6又是怎么做的呢?
![](https://pic1.zhimg.com/80/v2-12b8a882ee75c461a58593094b709fe0_720w.png)
添加图片注释,不超过 140 字(可选)
1、RepOpt-VGG
思路一:RepVGG推理的时候由于速度的要求采用单路网络,训练的时候能否将推理模型的单路网络训练的效果拔高呢?(Deploy部署的模型无BN,仅仅是不利于训练,还是能训练,能否从这里进行改善。看起来可行。)
YOLOv6用了RepOpt-VGG 网络,这个工作与 RepVGG 相当于是两个不同的改进方向,一个是单网络变多分支来提高训练效果,另一个则是还是单网络通过训练手段提高训练效果。即:
RepVGG + 常规的优化器=VGG + RepOptimizer。
RepOpt 特性:
1) RepVGG加入了结构先验(如1x1,identity分支),并使用常规优化器训练。而RepOptVGG则是将这种先验知识加入到优化器实现中。
2) RepVGG 虽然在推理时拥有极简的 VGG 类型架构,但是训练时却是一个较为复杂的模型,并且需要更多的时间和内存来训练。相比之下,RepOpt-VGG 在训练时也是一个极简的 VGG 类型架构。
3) RepOpt 扩展和深化了结构重参数化技术,即使训练时候的模型也是一个极简的 VGG 类型架构,依然能够通过定制的优化器实现等效的训练动态。这就意味着:当输入和其他训练的设置相同时,RepVGG 和 RepOpt 在训练过程中的任何迭代中产生理论上相同的输出。
![](https://picx.zhimg.com/80/v2-275c811e2f64ff0c10ec65874903945f_720w.png)
添加图片注释,不超过 140 字(可选)
RepVGG是实际搭建出多分支网络,而RepOpt-VGG则是假想多分支网络。
实际搭建出多分支网络训练后自然得出对应的参数,而假想(imaginary)多分支网络则是通过参数转化得出前置的参数。
RepOPT结果改善了数据分布,有效提升了PTQ量化精度。
![](https://picx.zhimg.com/80/v2-12b8a882ee75c461a58593094b709fe0_720w.png)
添加图片注释,不超过 140 字(可选)
2、梯度重参数化。
定义:通过根据一组特定于模型的超参数修改梯度来添加先验知识,称为梯度重新参数化,优化器称为重新优化器。
RepOptimizer是一种针对 SGD 型优化器的方法:SGD 的核心是用梯度更新参数,在更新可训练参数之前,通过一组特定于模型的超参数 "修改" 梯度,使得优化器成为 model-specific 的。为了获得这样的超参数,提出了一种叫做超参数搜索的方法。
VGG 风格的架构,只使用 3×3 卷积这一种操作,经过梯度重参数化的 RepOptimizer 训练之后,得到的 RepOpt-VGG 模型的精度可以与 RegNet 和 EfficientNet 这种有更丰富的结构先验模型的精度相媲美。
![](https://pic1.zhimg.com/80/v2-4da1e1d53921fcf418f7fda73c0edc33_720w.png)
添加图片注释,不超过 140 字(可选)
![](https://pic1.zhimg.com/80/v2-60455380c79fc6bb7e9a6b1c11eb6c2c_720w.jpg)
添加图片注释,不超过 140 字(可选)
RepOpt唯一计算开销是梯度与预先计算的乘数 Grad Mult的逐元素乘法。
需要注意的是训练网络中没有BN层。
量化问题的解决:
推理时间 RepVGG 难以通过训练后量化(PTQ)来量化。RepOpt- VGG 对量化是友好的,并从训练模型的结构转换揭示量化 RepVGG 结果的问题。因为 RepOpt-VGG 根本没有进行结构转换。
RepOpt 步骤:
步骤1:定义先验知识并想象一个复杂的结构来反映知识。
步骤2:用更简单的目标结构实现等效的训练动态,该目标结构的梯度根据一些超参数而被修改,通过超搜索获得超参数。
步骤3:建立再优化器,使用 RepOpt 进行训练。
![](https://picx.zhimg.com/80/v2-12b8a882ee75c461a58593094b709fe0_720w.png)
添加图片注释,不超过 140 字(可选)
3、如何将结构先验知识引入优化器中
CSLA:在特殊情况下,每个分支包含一个线性可训练参数,加一个常量缩放值,只要该缩放值设置合理,则模型性能依旧会很高。我们将这个线性块称为恒定比例线性加法Constant-Scale Linear Addition(CSLA)。
可以用单个算子代替 CSLA 块,并通过将梯度乘以一些常数实现等效的训练动态,即在给定相同训练数据的情况下,在任意数量的训练迭代之后,它们总是产生相同的输出。
这种乘数称为 Grad Mult,用Grad Mult 修改梯度可以看作是 优化器重参数化(GR)的具体实现。
CSLA 块+常规优化器=单个运算符+带 GR的优化器。
一个简单的CSLA示例入手:
考虑一个输入,经过2个卷积分支+线性缩放,并加到一个输出中。
设 αA,αB 是两个常数标量,W(A),W(B)是相同尺寸的卷积核,X 和 Y 是输入和输出,*表示卷积,CSLA 块的计算流程:
![](https://pic1.zhimg.com/80/v2-47bd95410d88049b7baf21fa6d774542_720w.png)
添加图片注释,不超过 140 字(可选)
对应 GR ,直接训练用 W’参数化的目标结构,使得
![](https://picx.zhimg.com/80/v2-89992838f0514e2ddc234a1f88f3d37a_720w.png)
添加图片注释,不超过 140 字(可选)
可证明
![](https://picx.zhimg.com/80/v2-5c6f9779532a25ba6cc79e2110ab7af0_720w.png)
添加图片注释,不超过 140 字(可选)
其中,i为训练的迭代次数。
![](https://picx.zhimg.com/80/v2-d278fbfb14d6145dddfbe1c2ab0a34de_720w.png)
添加图片注释,不超过 140 字(可选)
单路网络训练想要得到对应的CSLA参数,只需要根据CSLA的卷积核进行参数初始化,然后在更新参数的时候乘一个比例系数即可。
这个比例系数为:
![](https://picx.zhimg.com/80/v2-c233d003215f774a67840692cf622324_720w.png)
添加图片注释,不超过 140 字(可选)
在RepOpt-VGG中:
对应的CSLA块则是将RepVGG块中的3x3卷积,1x1卷积,bn层替换为带可学习缩放参数的3x3卷积,1x1卷积。此外一个恒等映射也可以单做一个单位1的1*1卷积,而1*1卷积可以补0扩张为3*3卷积。
进一步拓展到多分支中,假设s,t分别是3x3卷积,1x1卷积的缩放系数,那么对应的更新规则,即比例系数为:
![](https://picx.zhimg.com/80/v2-6bd86c64633d06bc8f4aba082a160229_720w.png)
添加图片注释,不超过 140 字(可选)
第一条公式,此时一共有3个分支,分别是identity,conv3x3, conv1x1。
第二条公式,此时只有conv3x3, conv1x1两个分支。
第三条公式对应其他情况。
![](https://pic1.zhimg.com/80/v2-66567e3b7c8dd29e817f1bd7746ebcd3_720w.png)
添加图片注释,不超过 140 字(可选)
由于可训练的信道方向缩放可以被视为“深度1×1 conv”,然后是常数缩放因子1,因此在“对角线”位置向Grad Mult添加1。(缩放比例即1*1卷积)
对于恒等映射,缩放因子就是1,对应的Grad Mult就是(输入2通道,输出2通道,1*1卷积周围补0):
![](https://picx.zhimg.com/80/v2-ef1986a2aafae7f2b477b24c7830c883_720w.png)
添加图片注释,不超过 140 字(可选)
因为恒等变换可以看做单位1的1*1卷积:
![](https://pic1.zhimg.com/80/v2-52f24043134b0418d2733e7246f06a1f_720w.png)
添加图片注释,不超过 140 字(可选)
需要注意的是CSLA没有BN这种训练期间非线性算子(training-time nonlinearity),也没有非顺序性(non sequential)可训练参数,CSLA在这里只是一个描述RepOptimizer的间接工具。
那么剩下一个问题,即如何确定这个缩放系数?
![](https://pic1.zhimg.com/80/v2-12b8a882ee75c461a58593094b709fe0_720w.png)
添加图片注释,不超过 140 字(可选)
4、超搜索(HyperSearch)
将CSLA中的常数缩放系数,替换成可训练参数。
在一个小数据集(如CIFAR100)上进行训练,在小数据上训练完毕后,将这些可训练参数固定为常数。
将优化器的超参数与辅助模型和搜索的可训练参数相关联,因此称为超搜索(HS)。具体地,给定一个再优化器,通过用可训练的尺度替换再优化器的相应 CSLA 模型中的常数来构建辅助超搜索模型。可训练参数的最终值是模型期望它们变成的值,因此可训练标度的最终值被视为假想 CSLA 模型中的期望常数值。由于 CSLA = GR,CSLA 模型中的预期常数正是我们构建再优化器的预期梯度乘法所需的常数。
在超搜索之后,使用搜索到的常数标度为每个算子(在 RepOpt-VGG 的情况下,每个3×3 conv 层)构建报告优化器的梯度乘子,包括 4 个阶段的 3×3 conv 层数和通道数,以及理论推断-时间 FLOPs 和参数数。
![](https://picx.zhimg.com/80/v2-8f9b665516fe65f86e9ade96c02bceab_720w.png)
添加图片注释,不超过 140 字(可选)
重新优化器是特定于模型的,但与数据集无关,在 CIFAR-100 上搜索的超参数可转移到 ImageNet。
在 ImageNet 上搜索并不意味着在ImageNet 上对同一个模型进行两次训练,因为第二次训练仅将 HS 模型的训练比例继承到重新优化器中,而不会继承其他训练参数。
在目标数据集上搜索的再优化器的超参数并不比在不同数据集上获得的结果更好。
对于不同的超参数源,再优化器在目标数据集上提供相似的结果,这表明再优化器是数据集不可知的。
灵魂的拷问:为什么需要超搜索得出参数?
(答:梯度重参数化这个方法只适用于线性变换,但是BN这个操作本身不是线性的,而直接去掉又不好训练。所以会在一个小数据集带上bn训练,得到一个合适的线性缩放值(就当作是起到BN的作用),然后将这个线性缩放值作为可学习参数的初始化值,来进行完整训练。)
因为bn不是一个linear scale操作,不能直接参与repoptimizer使用。 所以是先按照常规的训练方式在小数据集找到一个合适的scale,在repoptimizer里,这个scale固定住,充当bn的功能。
RepOpt-VGG是多个卷积融合但是解决了训练过程中BN层融合的问题。
目标数据集上的目标模型的初始化独立于 HS 模型中的 conv 核的初始值。
换句话说,从 HS 模型继承的唯一知识是经过训练的量表,我们不需要记录 HS 模型的任何其他初始信息。
![](https://pic1.zhimg.com/80/v2-12b8a882ee75c461a58593094b709fe0_720w.png)
添加图片注释,不超过 140 字(可选)
5、总结
RepOpt-VGG将模型的先验知识转移到优化器中。但该方法是经验验证的。
另一个主要限制是,这个实现依赖于运算的线性,因为要将单个算子的训练动态等效为一个复杂的块。
重新优化器是特定于模型的,但与数据集无关,在其他数据集上得出超参数,可以用到目标数据集上。
RepOpt-VGG将参数乘一个比例因子,本质上超参数(比例因子)在替代BN的作用。
添加图片注释,不超过 140 字(可选)
——————
浅谈则止,细致入微AI大道理
扫描下方“AI大道理”,选择“关注”公众号
—————————————————————
—————————————————————
公众号《AI大道理》征稿函mp.weixin.qq.com/s?__biz=MzU5NTg2MzIxMw==&mid=2247489802&idx=1&sn=228c18ad3a11e731e8f325821c184a82&chksm=fe6a2ac8c91da3dec311bcde280ad7ee760c0c3e08795604e0f221ff23c89c43a86c6355390f&scene=21#wechat_redirect
|
留言吧mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=77&appmsgid=100008532&isMul=1&replaceScene=0&isSend=0&isFreePublish=0&token=655411939&lang=zh_CN
萍水相逢逢萍水,浮萍之水水浮萍!