1. Introduction
1.1 Mathematical Operation
1.1.1 Winograd
Winograd方法早在1980年数字信号处理针对一维信号处理中就提出了。它的原理就是将乘法运算转换为多个加法运算,达到加速的目的。通常只会在小的卷积核(2×2、3×3、4×4)进行卷积运算中使用。
![](https://i-blog.csdnimg.cn/blog_migrate/078a284d67bfdd1eb43a5a5b6eae3f47.png)
1.1.2 Low rank factorization
低秩矩阵的因式分解方法,可以加速网络的计算。通常会用SVD方法进行矩阵分解,大多应用在卷积层和全连接层。
1.2 Network Design
1.2.1 MobileNets Series
1)MobileNet v1
Depthwise Conv
MobileNet v1最大的贡献是提出来Depthwise Convolution,可以在模型精度损失较小的情况下,大大加快卷积的运算速率。
传统的卷积运算操作如下图所示,我们有尺寸大小,Channel维度是M的feature map,采用N个kernel size为
,Channel维度是M的卷积核进行卷积操作。最后输出
’尺寸大小,Channel维度是N的feature map。
![](https://i-blog.csdnimg.cn/blog_migrate/13b319a0ac19fb34bca2564f1ff583df.png)
这样,卷积运算的操作数为:
Depthwise Convolution的原理是将原卷积运算操作分为两步进行。第一步,先采用个kernel size为
,Channel维度是1的卷积核进行卷积操作。先输出
尺寸大小,Channel维度是
的feature map。第二步,采用
个kernel size为
,Channel维度是
的卷积核进行卷积操作。最后输出的也是
尺寸大小,Channel维度是
的feature map。
![](https://i-blog.csdnimg.cn/blog_migrate/e74facd79cd2caa68a15f555e4685743.png)
这样,Depthwise Convolution运算的操作数为:
Depthwise Conv与原卷积运算相比,计算操作数减小为原来的:
为Channel维度,通常取32~512;
为卷积核的kernel size,通常为3。因此,Depthwise Conv理论上的运算速度能比原卷积运算快8~9倍。而且经过实验,采用Depthwise Conv得到结果的精度只比原卷积结果的精度下降1%左右。
2)MobileNet v2
Inverted Residuals + Linear Bottleneck
MobileNet v2采用了Inverted Residuals + Linear Bottleneck来改进了Residual结构。
原始ResNet的Residual结构是先进行降维,卷积后,再升维回原来的维度,并有shortcut进行融合,如下图右所示。
![](https://i-blog.csdnimg.cn/blog_migrate/4e63cd2ecb7e7ff981630ca25992f825.png)
而Inverted Residuals,顾名思义将Residual的操作反了过来。先进行升维,经过Depthwise Conv卷积后,再降维回原来的维度。并且,在与shortcut进行了相加融合之后,不再进行ReLU,使得Bottleneck结构变成了线性的Linear Bottleneck。这就是Inverted Residuals + Linear Bottleneck的基本原理。
![](https://i-blog.csdnimg.cn/blog_migrate/e2a2a3b7fcf5a0c2b4ad1a789e1d5df2.png)
使用Inverted Residuals + Linear Bottleneck结构的原因是:
人话版:
MobileNet是个轻量化的网络结构,本身channel数较少,没有多少数据信息。但是如果像ResNet那样先压缩channel,又会有较大的信息损失,所以不如先增大再减少。ReLU让负半轴为0,也有较大的信息损失。本来MobileNet参数就不多,学习能力就有限,再让一些参数为0就更学不着什么东西了,于是在shortcut那里不要ReLU了。
原文版:
Inverted Residuals作用是uncompress数据,使得我们感兴趣的低维流形MOI (manifold of interest) 能够包含于我们的高维空间中;Linear Bottlenecks
神经网络被认为可以使MOI嵌入低维空间。如果当前激活空间MOI完整度较高,ReLU会让空间坍塌,丢失信息;并且ReLU非0部分是做线性变换,实为一个线性分类器。因而不如采用Linear Bottleneck。
Block
MobileNet v2还有一个细节是当Stride步长不同时,用到的Block是不一样的。当Stride = 1时才用到上文提到的Inverted Residuals+Linear Bottleneck结构的Block,如下图左;当Stride = 2时,删掉了shortcut分支,如下图右。
![](https://i-blog.csdnimg.cn/blog_migrate/dbbed1ea83ce2cf8d797288f2f98dd46.png)
MobileNet v2结构
![](https://i-blog.csdnimg.cn/blog_migrate/97c04cebb161d782ac425d89c5d1d21e.png)
3)MobileNet v3
MNasNet + NetAdapt
MobileNet v3的网络结构是以MNasNet为基础,采用NetAdapt的网络搜索方法,在Block-wise和layer-wise上进行搜索,得到了网络的最优结构。
SENet中的SE-Block
MobileNet v3,在Backbone上运用了SENet的结构。实际上卷积运算是对图片空间信息的简缩操作,而feature map上还有很多Channel维度的信息没有被利用上。SENet的提出就是用于提取卷积过程中Channel维度的重要性信息。
![](https://i-blog.csdnimg.cn/blog_migrate/083a7b6c18bf6f48f3900be392434f9f.png)
SENet通过Squeeze-Excitation Block来提取Channel维度的信息。如上图,首先进行Squeeze操作,也就是对Feature Map的每个Channel进行Global Average Pooling计算,得到一个维度的向量;然后进行Excitation操作,即
的组合操作,这样就得到了Channel维度的权重,代表了Channel维度的重要性信息,通常
是降维操作,将
维度的向量变成
,实验结果表明
时效果最好,
是升维操作,将向量还原回
维度;最后通过Scale操作就是将原Feature Map的每个Channel与得到的Channel维度的权重进行相乘,就得到了带Channel维度信息的Feature Map。
通过公式表达以上计算为:
MobileNet v3在Block中融合了Squeeze-Excitation Block,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e0264b88147015f315fc6f152d1eda75.png)
h-swish
MobileNet v3使用了h-swish激活函数,用于加速网络的计算,h-swish的公式如下:
h-swish没有使用Sigmod而使用了ReLU6,在量化上可以加速网络的计算。
![](https://i-blog.csdnimg.cn/blog_migrate/5de110467a0d3cb7165d8c3780f921ad.png)
Lite R-ASPP (Lite Reduced Atrous Spatial Pyramid Pooling)
在Segmentation Head中,Lite R-ASPP主要将Mobilenet v3的最后一个block中不同resolution的信息,通过与SE-net,skip-connection相结合,实现移动端的图像分割。
![](https://i-blog.csdnimg.cn/blog_migrate/305cf1aa5c6e91aa105c16ce61d1a480.png)
Last Stage
此外,Mobilenet v3还优化了网络最后几层的输出结构,解决了Mobilenet v2的时延问题。
![](https://i-blog.csdnimg.cn/blog_migrate/f04b2ae20322e349519872b797607e4d.png)
1.2.2 ShuffleNet Series
1)ShuffleNet v1
Group Conv
ShuffleNet提出了Group Convolution方法来加速卷积计算,它将Feature Map分为组,每组Feature Map与各自的kernel进行卷积得到Group Conv的结果,能让卷积运算比原来快
倍。
![](https://i-blog.csdnimg.cn/blog_migrate/e1d32251929db2137dfb0d2e7a5c0b3c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03d7009fb85da1f961a6ded67ef3cdc0.png)
Channel Shuffle
由于使用了Group Conv,原来每组之间的信息就被打断了。Channel Shuffle提出用于解决这个问题。
如下图,在进行GConv之后,将会对Feature Map进行shuffle,就是将每组间的channel进行洗牌打乱,使得Channel Shuffle后每个组中的Feature Map都有包含原来各个组的信息。
![](https://i-blog.csdnimg.cn/blog_migrate/7a214731772d3b98323046f9ff5863dc.png)
2)ShuffleNet v2
ShuffleNet v2的论文中提出了4点设计轻量化网络的方针,并以此为基础提出来ShuffleNet v2。
4 Guidelines
a. Equal channel width minimizes memory access cost(MAC)
当input和output的tensor size是相同的时候,MAC访存的消耗是最少的。公式证明如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9e2812bb7c5e5faf528f7f767d771192.png)
b. Excessive GConv increases MAC
过多的Group Convolution会增加MAC的消耗。
![](https://i-blog.csdnimg.cn/blog_migrate/3e22f22f0c7c7b7bccd4f8ddd8e3855f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b251486e97857ae09cae556f0cfff6e.png)
c. Network fragmentation reduces degree of parallelism
网络的碎片化会降低网络并行度。作者设计了下图中的实验,其中有5个网络结构,实验证明越多的fragmentation会导致网络速度变慢,且并行结构比串行结构更慢。
![](https://i-blog.csdnimg.cn/blog_migrate/66f0538095e55fd2b0bbef318b6e3358.png)
d. Eltwise operations are non-negligible
Element-wise的操作是不能忽略不计的。作者实验发现ShuffleNet v1和MobileNet v2的Element-wise的计算上所花费的时间都是占比较多且不能忽略的。因此在设计网络的时候应该尽量少使用Element-wise的操作。
![](https://i-blog.csdnimg.cn/blog_migrate/ce8cb4c1173cd940ac59cc98f630a3c7.png)
ShuffleNet v2结构
同样ShuffleNet v2也针对不同的stride采用了不同的结构,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/5222151d023fe820d93f96546bd6fd4e.png)
ShuffleNet v2结构如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0077f63dd686b2efa0d01efed28566d6.png)
1.2.3 EfficientNet
EfficientNet是一个用神经网络来搜索出的最优神经网络结构的网络。它提出了复合模型扩张方法结合神经网络结构搜索技术,搜索出的EfficientNet不仅比别的网络快很多,而且精度也更高。
Compound Model Scaling 复合模型扩张
作者从depth, width, resolution 这三个维度去缩放模型。
![](https://i-blog.csdnimg.cn/blog_migrate/855645c1dd308813da9e4e13da1f0914.png)
根据NAS数学公式如下,代表了stage的id,
分别代表了每个stage中的Layer数和每个Layer中feature map的高、宽、通道数。
代表着卷积操作,
代表着每个stage的concat连接操作。Compound Model Scaling就是要搜索网络中每个stage中的
这几个参数分别是多少。
![](https://i-blog.csdnimg.cn/blog_migrate/010e3fc9d8499a969b96b4401af421aa.png)
Compound Model Scaling搜索的约束和目标如下,用于搜索网络结构的全局最优解。约束为;目标为在满足Memory和FLOP的要求下求使得Accuracy最大的网络结构。
![](https://i-blog.csdnimg.cn/blog_migrate/0442fabc6fc1d91c809cd341f705207c.png)
求解方式:
固定公式中的
,然后通过网格搜索(grid search)得出最优的
,得出最基本的模型EfficientNet-B0。
固定
的值,使用不同的Φ,得到EfficientNet-B1, …, EfficientNet-B7
其中,Φ是一个超参数,Φ的大小对应着消耗资源的大小,相当于:
当
时,得出了一个最小的最优基础模型;
增大Φ 时,相当于对基模型三个维度同时扩展,模型变大,性能也会提升,资源消耗也变大。
对于神经网络搜索,作者使用了和MnasNet一样的搜索空间和优化目标,最后得到了EfficientNet-B0。
B0-Network
Compound Model Scaling首先搜索到了B0版本作为Baseline,网络结构如下,参考了MobileNet v2和SE-Block的结构:
![](https://i-blog.csdnimg.cn/blog_migrate/e47d4a04da63276a5579fc8b3e3d83a9.png)
之后训练出的EfficientNet-B1~EfficientNet-B7在ImageNet数据集上也有着非常不错的表现。
![](https://i-blog.csdnimg.cn/blog_migrate/ea77fd82ead5aee973c0969cd54c46a1.png)
1.3 Model
1.3.1 Model/Parameter prune
模型的剪枝有很多种方法,它可以省去网络模型中一些不重要或者对结果影响不大的结构或参数,达到模型推理加速的目的,常用的方法有:
Remove connections
Remove kernels
Different rules to remove
![](https://i-blog.csdnimg.cn/blog_migrate/1fc5c2c3f79ea6ca9e3707cf8fc80fec.png)
1.3.2 Model Quantization
模型量化就是将训练好的模型参数,通过映射关系进行量化,达到较小或者不损失模型的精度的同时,减小模型的访存和加快模型的计算速度,如从32位的float浮点型量化成8位的int整型,映射关系如下图。因为CNN对噪声不敏感,所以量化在模型加速中非常有用。通常CNN模型都很大太大,而每个层的weights范围基本都是确定的,且波动不大,适合量化压缩。
![](https://i-blog.csdnimg.cn/blog_migrate/e308767107b07299f23b2808fa7c3495.png)
上图是当weight均匀分布时的映射,但通常weight的分布都不是很均匀,会采用如下图的映射方法,将不均匀的部分统一映射成最大或者最小值,而不均匀的部分通常数量不是很多,对模型精度的影响不大。
![](https://i-blog.csdnimg.cn/blog_migrate/706e080b54cde68493b281c1ba894703.png)
量化方法:将其他模型模型转成TensorRT。
具体操作:
Method2: PyTorch →TensorRT
2. Network Slimming
Network Slimming是一个Layer-Prune的方法。它的思想是对每个Layer中,把不重要的Channel直接扔掉,不参与后面的计算。
![](https://i-blog.csdnimg.cn/blog_migrate/660d33cc3ca57fe13d3caae8aff3fda1.png)
如何找到每个Channel的weight
实际上,在做Batch Normalization的时候,就已经计算出了BN层的缩放因子γ。通常BN层会归一化后的结果做个线性变换(Scale and Shift),即乘上一个γ加上一个β,如下图左的公式,能给网络一定的自由度能使BN发挥出效果。可以利用γ作为每个Channel的权重。
![](https://i-blog.csdnimg.cn/blog_migrate/ebc13797d884f31bcfc15344b657290d.png)
通常,会在ResNet进入Residual Block时先经过一次BN层,得到每个Channel的权重后就进行Prune(即上图中黄色的Select步骤),经过Residual Block运算后,升维回与shortcut相同的Channel数,再进入到下一个Layer。最后,在进入FC层之前,也会经过一个BN层后Prune。
进行Prune的时候分为四步:
a. 将BN层按照γ大小排序;
b. 设置Prune的比例,即保留多少的Channel;
c. 创建一个遮罩mask,使得
;
d. 保留
的Channel。
整体的Network Slimming分为三步:
a. 训练一个原始模型;
b. 加载原始模型并进行Prune Layer;
c. 对裁剪过后的模型进行Fine-tune;
3. Knowledge Distillation[2015, Hinton]
知识蒸馏的加速方法从2015年就开始提出,但是这两年才开始逐渐兴起,主要用于分类领域。
知识蒸馏的原理如下图,首先,先训练出一个大模型;然后,通过调整Softmax中Temperature参数,对输出的结果进行平滑处理;接着,设计一个小模型来学习大模型输出的平滑结果(Softmax要设置Temperature参数),同时学习原数据(Softmax不设置Temperature参数),将平滑结果和原数据分别产生的Loss通过λ进行加权求和,得到小模型的Loss进行训练;最后,使用小模型进行分类预测,可以得到跟大模型差不多的效果。这样就达到了模型轻量化和加速的目的。
![](https://i-blog.csdnimg.cn/blog_migrate/984255d9bfced6ded6dd348a16ae5044.png)