模型压缩——重参数化
模型压缩主要的方法有:重参数化、剪枝、量化等,本章主要讲重参数化
在解决恒等映射时对卷积核插值或者重新生成一个卷积核时有些会直接使用Dirac初始化增加的权重。
Dirac初始化看这里:https://www.e-learn.cn/topic/1523429
重参数化
重参数化有并行合并和串行合并(主要是为了合并模块成一个卷积),要想合成只有一条,那要先串行再并行,而且串行合并的那一块不能有ReLU,sigmoid、tanh这种公式只有一种的可以,ReLU为在x>0和x<0的公式不同所以不行。
优点:训练时采用多分支的网络使模型获取更好的特征表达,测试时将并行融合成串行,从而降低计算量和参数量,提升速度(融合后理论上和融合前识别效果一样,实际基本都是稍微降低一点点)
RepVGG 和ACNe的重参数化方法
ACNet
在add中: w 1 ⋅ x + w 2 ⋅ x = ( w 1 + w 2 ) ⋅ x w1\cdot x+w_2\cdot x=(w_1+w_2)\cdot x w1⋅x+w2⋅x=(w1+w2)⋅x
在这里,1x3 Conv等于第二行和第三行权值为0的3x3 Conv,3x1 Conv等于第二列和第三列权值为0的3x3 Conv。
那么,此时图中的3个尺寸不同Conv就可以等价于3个尺寸都相同的卷积了,也就可以应用上面add的公式了。
实际上Conv后会后BN,BN和Conv的融合看底下的RepVGG
RepVGG
RepVGG和ACNet很像,主要概念的在训练的时候采用原来多分支的复杂网络,在测试的使用将多分支合并成一条支路进行测试,不再训练,从而提升速度。(并行和并,对支路是有限制的,如下图这样的支路,每一条支路可以先合并成一个卷积,然后再支路合并)
RepVGG的重参数化过程:
- 将所有的Conv和BN合并,参数融合公式: w i , : , : , : ′ = γ i σ i w i , : , : , : , b i ′ = − μ i γ i σ i + β i w_{i,:,:,:}'=\frac{\gamma_i}{\sigma_i}w_{i,:,:,:},b_i'=-\frac{\mu_i\gamma_i}{\sigma_i}+\beta_i wi,:,:,:′=σiγiwi,:,:,:,bi′=−σiμiγi+βi,其中 w i w_i wi