实验内容
- ImageNet 上验证简化RepVGG效果
- 应用于提升其他网络结构效果
ImageNet 上验证简化RepVGG效果
- 以下为基于 RepVGG_A0 结构使用简化RepVGG的效果在 ImageNet 上的结果。
- RepVGG 的结构为
- 简化RepVGG的结构为
其中竖着的实心矩形为 Multiplication Layer, 作用为给每个 Channel 乘上一个Parameter。相当于仅保留BN的输出中Scale UP部分。而加法后的BN是为了保证网络不出现梯度爆炸而增加的。与RepVGG不同,这里的BN本身不是必要的,可以被替换为其他稳定训练的方式。
这部分实验要论证 RepVGG 的训练方式能够提点的本质原因在于碰巧撞上了 BN 输出中的 Scale UP而提升了训练效果。如果我们能够在只保留BN的Scale UP(后面都简化为一个Multiplication Layer),并得到和RepVGG 接近的训练结果和特性,那么就可以近似证明这两个是等效的。
(一个小插曲,我去问了问RepVGG的作者,为什么拆三个训练就能比直接训更好,他也不知道,干脆简单解释为Training Dynamics 不同这样的万金油理由。啥时候AI算法才能所有改进都有理有据呢)
6倍bias 学习率
是对应于 RepVGG 中会有三个BN,而三个都有Bias且相同,则每次SGD迭代的时候,现对于单个Bias,相当于3倍学习率。而由于本身ImageNet训练的时候,会设置Bias具有2倍学习率,则 RepVGG 原版代码相当于拥有 6 倍 Bias 的学习率。这里简化版RepVGG中 Bias 默认只有2倍学习率,所以测试 6倍Bias学习率对于训练结果是否有提升。2倍 Scale UP
,因为 RepVGG 的输出为三个分支加和,所以会比一个BN输出的结果初始的时候大三倍。虽然训练一会儿之后,这个严格的三倍关系并不存在。所以这里直接在输出上放大2倍看看这里是否会导致一些训练结果提升。
6倍bias 学习率 | 2倍 Scale UP | 1x1 分支 | ID 分支 | ImageNet 120 Epoch 准确率 |
---|---|---|---|---|
o | 71.10 | |||
o | o | o | 71.86 | |
o | o | o | o | 71.94 |
o | o | o | 72.01 | |
o | o | 71.79 | ||
o | 72.02 | |||
o | o | 71.55 |
就最终训练结果而言,
2倍 Scale UP
并没有什么显著提升。但是为为何 RepVGG 的一些分支权重会一开始突然下跌然后逐渐回归正常的原因提供了思路。以下为有和没有2倍 Scale UP
ImageNet 120 Epoch 训练曲线差异。
* Identity 分支
![]()
![]()
* 1x1 分支
![]()
![]()
* 3x3 分支
![]()
这些曲线和 RepVGG 三个分支的曲线差异有一定程度类似。然而这里开始突然下跌,完全是因为每一层x2,并且在网络初始的时候 BN 的Scale UP 默认为1,从而导致初始状态下输出会随层数增长而指数级增长。网络开始几步直接快速降低输出模长完全合理。
- RepVGG_B0 采用简化 RepVGG 结构,只有3x3和ID分支,在3x3上使用了乘法系数,ID为Identity,准确率 74.19%。
- RepVGG_B0 采用简化 RepVGG 结构,只有3x3和ID分支,在3x3及1x1上都使用了乘法系数,准确率 74.13%。
- RepVGG_B0 采用简化 RepVGG 结构,有3x3,1x1,ID分支,在3x3,1x1,ID上都使用了乘法系数,准确率 74.6%。
RepVGG_B0 采用简化 RepVGG 结构,有3x3,1x1,ID分支,在3x3,1x1上使用了乘法系数,准确率 74.55%。
对比 RepVGG 的ablation study
上面第一个实验对标 RepVGG ablation study 中
Identity w/o BN
且只有 ID 分支 和 3x3 分支。 在这种情况下,效果与 RepVGG 有ID,1x1,3x3一致。
上面第二个实验对标 RepVGG ablation study 中只有 ID 分支 和 3x3 分支。这里我还没想通为何降低了0.6%
在只保留 ID 和 3x3 的情况下,效果已经和 RepVGG 一致了,且优势在于 RepVGG 的模块需要替代一组 Conv+BN,而简化版 RepVGG 只需要替代 Conv,应用范围可能更广。
但目前最令人疑惑的问题是,在RepVGG 中添加 1x1 是一个优化,而在简化版 RepVGG 中添加 1x1 是个负优化。难道 1x1 分支必须要 Normalize 后才能 Scale UP?
应用于提升其他网络结构效果
这里测试了把一些网络的Conv替代为简化RepVGG 中的ID分支+3x3分支。
- CIFAR 100, ResNet 20
- CIFAR 100, ResNet 32, rep version: 69.45%, normal version: 还没跑
- CIFAR 100, ResNet 110, rep version: 69.5%, normal version: 还没跑
- CIFAR 100, WideResNet40x4, rep version: 77.0%, normal version: 还没跑
看起来在 ResNet 上面做替换效果不太行,不过好像没有测试更大学习率版本的,毕竟 RepVGG 的最适学习率比 VGG 最适学习率大10倍。
RepVGG 的可解释性部分基本可以说完结了:RepVGG 能训练更好的原因主要来自于——
1.初始化带有一个ID分支的初始权重,对于一些过深的网络可以有效避开过拟合的问题。
2.对于卷积核的每一个 Output Channel 增加了一组乘法系数,由于 SGD 是一步一步所有参数同时迭代的,增加这组系数后会使得网络迭代时对于整组 Channel 输出大小的调整更加容易,而对于零散的一个kernel内部相对关系调整更少一些。
如果要做到发论文的程度,还需要提升性的部分:增加其他维度的乘法调整方式,实现提升准确率
or摸索出使用这套组何方式替代多数常见 Conv 卷积核的方式,能够通用的提升训练结果
。
其他方向探索
由于 RepVGG 这边只剩下想想怎么用于其他地方和魔改结构提升准确率了,缺的不是工作量是Idea了。
打算同时开始一些需要工作量不太需要Idea的事情,比如 去帮下朱子健解决展宏那边AdderNet部分的工作,或者做超分、插帧GAN的压缩(其实还想顺带了解一下GAN压缩做到什么程度了,边缘设备部署GAN到底是受限于算力、显存还是功耗)。
没有帐号? 立即注册