数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
- 线性模型
- 支持向量机
- 朴素贝叶斯
- 决策树
- knn
- 集成学习
- 梯度提升树
- 数据预处理
- 模型评估
- 降维
- 聚类
- 半监督学习
- EM 算法
- 最大熵算法
- 隐马尔可夫模型
- 概率图与条件随机场
- 边际概率推断
- 主题模型
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- CRF ++
- lightgbm
- xgboost
- xgboost 使用指南
- scikit-learn
- spark
- numpy
- matplotlib
- matplotlib 使用指南
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
九、小型网络
-
目前神经网络领域的研究基本可以概括为两个方向:探索模型更好的预测能力,关注模型在实际应用中的难点。
事实上卷积神经网络在图像识别领域超越了人类的表现,但是这些先进的网络需要较高的计算资源。这些资源需求超出了很多移动设备和嵌入式设备的能力(如:无人驾驶),导致实际应用中难以在这些设备上应用。
小型网络就是为解决这个难点来设计的。
-
小型网络的设计和优化目标并不是模型的准确率,而是在满足一定准确率的条件下,尽可能的使得模型小,从而降低对计算资源的需求,降低计算延迟。
-
小型高效的神经网络的构建方法大致可以归为两类:对已经训练好的网络进行压缩,直接训练小网络模型。
-
模型参数的数量决定了模型的大小,所谓的
小型网络
指的是网络的参数数量较少。小型网络具有至少以下三个优势:
-
较小的模型具有更高效的分布式训练效率。
Worker
与PS
以及Worker
与Worker
之间的通信是神经网络分布式训练的重要限制因素。在分布式数据并行训练中,通信开销与模型的参数数量成正比。较小的模型需要更少的通信,从而可以更快的训练。 -
较小的模型在模型导出时开销更低。
当在
tensorflow
等框架中训练好模型并准备部署时,需要将模型导出。如:将训练好的模型导出到自动驾驶汽车上。模型越小,则数据导出需要传输的数据量越少,这样可以支持更频繁的模型更新。 -
较小的模型可以在
FPGA
和嵌入式硬件上部署。FPGA
通常只有小于10MB
的片上内存,并且没有外部存储。因此如果希望在FPGA
上部署模型,则要求模型足够小从而满足内存限制。
-
9.1 SqueezeNet 系列
9.1.1 SqueezeNet
-
squeezenet
提出了Fire
模块,并通过该模型构成一种小型CNN
网络,在满足AlexNet
级别准确率的条件下大幅度降低参数数量。 -
CNN
结构设计三个主要策略:-
策略 1:部分的使用
1x1
卷积替换3x3
卷积。因为1x1
卷积的参数数量比3x3
卷积的参数数量少了9
倍。 -
策略 2:减少
3x3
卷积输入通道的数量。这会进一步降低网络的参数数量。 -
策略 3:将网络中下采样的时机推迟到网络的后面。这会使得网络整体具有尺寸较大的
feature map
。其直觉是:在其它不变的情况下,尺寸大的
feature map
具有更高的分类准确率。
策略
1、2
是关于在尽可能保持模型准确率的条件下减少模型的参数数量,策略3
是关于在有限的参数数量下最大化准确率。 -
9.1.1.1 Fire 模块
-
一个
Fire
模块由一个squeeze
层和一个expand
层组成。-
squeeze
层:一个1x1
卷积层,输出通道数为超参数 $ MathJax-Element-446 $ 。- 通常选择超参数 $ MathJax-Element-446 $ 满足: $ MathJax-Element-447 $ 。
- 它用于减少
expand
层的输入通道数,即:应用策略2 。
-
expand
层:一个1x1
卷积层和一个3x3
卷积层,它们卷积的结果沿着深度进行拼接。1x1
卷积输出通道数为超参数 $ MathJax-Element-448 $ ,3x3
卷积输出通道数为超参数 $ MathJax-Element-455 $ 。- 选择
1x1
卷积是应用了策略1 。
-
9.1.1.2 网络性能
-
网络设计:
SqueezeNet
从一个独立的卷积层(conv1
)开始,后跟 8 个Fire
模块(fire2~9
),最后连接卷积层conv10
、全局平均池化层、softmax
输出层。- 从网络开始到末尾,每个
Fire
模块的输出通道数逐渐增加。 - 在
conv1、fire4、fire8
之后执行最大池化,步长为2。这种相对较晚的执行池化操作是采用了策略3。 - 在
expand
层中的3x3
执行的是same
卷积,即:在原始输入上下左右各添加一个像素,使得输出的feature map
尺寸不变。 - 在
fire9
之后使用Dropout
,遗忘比例为 0.5 。
-
网络参数:
- $ MathJax-Element-451 $
(#1x1 squeeze)
列给出了超参数 $ MathJax-Element-451 $ , $ MathJax-Element-453 $(#1x1 expand)
列给出了超参数 $ MathJax-Element-453 $ , $ MathJax-Element-455 $(#3x3 expand)
列给出了超参数 $ MathJax-Element-455 $ 。 - $ MathJax-Element-456 $ , $ MathJax-Element-457 $ , $ MathJax-Element-458 $ , $ MathJax-Element-459 $ 这四列给出了模型裁剪的参数。
# parameter before pruning
列给出了模型裁剪之前的参数数量。# parameter after pruning
列给出了模型裁剪之后的参数数量。
- $ MathJax-Element-451 $
-
模型性能:
- 网络压缩方法列:给出了网络裁剪方法,包括
SVD(Denton et al. 2014)
、Network pruning (Han et al. 2015b)
、Deep compression (Han et al. 2015a)
。 - 数据类型列:给出了计算精度。
- 模型压缩比例列:给出了模型相对于原始
AlexNet
的模型大小压缩的比例。 top-1 Accuracy/top-5 Accuracy
列:给出了模型在ImageNet
测试集上的评估结果。
可以看到,
SqueezeNet
在满足同样准确率的情况下,模型大小比AlexNet
压缩了 50 倍。如果使用Deep Compression
以及6 bit
精度的情况下,模型大小比AlexNet
压缩了 510 倍。CNN 网络结构 网络压缩方法 数据类型 模型大小 模型压缩比例 top-1 Accuracy top-5 Accuracy AlexNet None 32 bit 240 MB 1x 57.2% 80.3% AlexNet SVD 32 bit 48 MB 5x 56.0% 79.4% AlexNet Network Pruning 32 bit 27 MB 9x 57.2% 80.3% AlexNet Deep Compression 5-8 bit 6.9 MB 35x 57.2% 80.3% SqueezeNet None 32 bit 4.8 MB 50x 57.5% 80.3% SqueezeNet Deep Compression 8 bit 0.66 MB 363x 57.5% 80.3% SqueezeNet Deep Compression 6 bit 0.47 MB 510x 57.5% 80.3% - 网络压缩方法列:给出了网络裁剪方法,包括
a. 超参数设计
-
定义 $ MathJax-Element-460 $ 为地一个
$ \text{base}_e,\text{base}_e,\text{base}_e+\text{incr}_e,\text{base}_e+\text{incr}_e,\text{base}_e+2*\text{incr}_e,\text{base}_e+2*\text{incr}_e,\cdots $fire
模块的输出通道数,假设每 $ MathJax-Element-461 $ 个fire
模块将fire
模块的输出通道数增加 $ MathJax-Element-462 $ 。如: $ MathJax-Element-463 $ ,则网络中所有fire
模块的输出通道数依次为:因此第 $ MathJax-Element-619 $ 个
fire
模块的输出通道数为: $ MathJax-Element-465 $ 。由于fire
模块的输出就是fire
模块中expand
层的输出,因此 $ MathJax-Element-466 $ 也就是第 $ MathJax-Element-619 $ 个fire
模块中expand
层的输出通道数。-
定义 $ MathJax-Element-483 $ 为所有
fire
模块的expand
层中,3x3
卷积数量的比例。这意味着:不同fire
模块的expand
层中3x3
卷积数量的占比都是同一个比例。则有:- 第 $ MathJax-Element-619 $ 个
fire
模块的expand
层中的1x1
卷积数量 $ MathJax-Element-470 $ 。 - 第 $ MathJax-Element-619 $ 个
fire
模块的expand
层中的3x3
卷积数量 $ MathJax-Element-472 $ 。
- 第 $ MathJax-Element-619 $ 个
-
定义 $ MathJax-Element-479 $ (
squeeze ratio
)为所有fire
模块中,squeeze
层的输出通道数与expand
层的输出通道数的比例,称作压缩比。这意味着:不同fire
模块的压缩比都相同。则有:第 $ MathJax-Element-619 $ 个
fire
模块的squeeze
层的输出通道数为 $ MathJax-Element-475 $ 。
-
-
对于前面给到的
SqueezeNet
有: $ MathJax-Element-476 $ 。 -
评估超参数 $ MathJax-Element-479 $ : $ MathJax-Element-478 $ , $ MathJax-Element-479 $ 从
0.15~1.0
。在 $ MathJax-Element-480 $ 时,
ImageNet top-5
准确率达到峰值86.0%
,此时模型大小为19MB
。此后进一步增加SR
只会增加模型大小而不会提高模型准确率。 -
评估超参数 $ MathJax-Element-483 $ : $ MathJax-Element-482 $ , $ MathJax-Element-483 $ 从
1%~99%
。在
3x3
卷积占比(相对于expand
层的卷积数量的占比)为50%
时,ImageNet top-5
准确率达到85.3%
。此后进一步增加3x3
卷积的占比只会增加模型大小而几乎不会提高模型准确率。
b. 旁路连接
-
采用
ResNet
的思想,可以在SqueezeNet
中添加旁路连接。下图中,左图为标准的SqueezeNet
,中图为引入简单旁路连接的SqueezeNet
,右图为引入复杂旁路连接的SqueezeNet
。- 简单旁路连接:就是一个恒等映射。此时要求输入
feature map
和残差feature map
的通道数相等。 - 复杂旁路连接:针对输入
feature map
和残差feature map
的通道数不等的情况,旁路采用一个1x1
卷积来调整旁路的输出通道数。
它们在
ImageNet
测试集上的表现:模型结构 top-1 准确率 top-5 准确率 model size SqueezeNet 57.5% 80.3% 4.8MB SqueezeNet + 简单旁路连接 60.4% 82.5% 4.8MB SqueezeNet + 复杂旁路连接 58.8% 82.0% 7.7MB 因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。
- 简单旁路连接:就是一个恒等映射。此时要求输入
9.1.2 SqueezeNext
- 现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,
SqueezeNext
针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。
9.1.2.1 SqueezeNext Block
-
SqueezeNext
块是在Fire
块的基础进行修改:- 将
expand
层的3x3
卷积替换为1x3 + 3x1
卷积,同时移除了expand
层的拼接1x1
卷积、添加了1x1
卷积来恢复通道数。 - 通过两阶段的
squeeze
得到更激进的通道缩减,每个阶段的squeeze
都将通道数减半。
- 将
-
SqueezeNext
块也采用类似ResNet
的旁路连接,从而可以训练更深的网络。下图中,左图为
ResNet
块,中图为SqueezeNet
的Fire
块,右图为SqueezeNext
块。
9.1.2.2 网络性能
-
网络结构:如下为一个23层的
SqueezeNext
网络(记做SqueezeNext-23
)。- 相同颜色的
SqueezeNext
块具有相同的输入feature map
尺寸和通道数。 - 该网络结构描述为
[6,6,8,1]
,意思是:在第一个conv/pooling
层之后有四组SqueezeNext
块,每组SqueezeNext
分别有6个、6个、8个、1个SqueezeNext
块。 - 在全连接层之前插入一个
1x1
卷积层来降低全连接层的输入通道数,从而大幅降低全连接层的参数数量。
23层
SqueezeNext
网络的另一种结构(记做SqueezeNext-23v5
):结构描述为[2,4,14,1]
。 - 相同颜色的
-
SqueezeNext
网络在ImageNet
上的预测准确率:- 参数降低倍数是相对于
AlexNet
网络的参数而言。 G-SqueezeNext-23
是SqueezeNext-23
采用分组卷积的版本。
模型 top-1 准确率 top-5 准确率 参数数量(百万) 参数降低倍数 AlexNet 57.10% 80.30% 60.9 1x SqueezeNet 57.50% 80.30% 1.2 51x SqueezeNext-23 59.05% 82.60% 0.72 84x G-SqueezeNext-23 57.16% 80.23% 0.54 112x SqueezeNext-34 61.39% 84.31% 1.0 61x SqueezeNext-44 62.64% 85.15% 1.2 51x - 参数降低倍数是相对于
-
更宽和更深版本的
SqueezeNext
网络在ImageNet
上的预测准确率:1.5/2.0
分别表示将网络拓宽1.5/2
倍。拓宽指的增加网络的feature map
的通道数,做法是增加第一个conv
的输出通道数。- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
模型 top-1 准确率 top-5 准确率 参数数量(百万) 1.5-SqueezeNext-23 63.52% 85.66% 1.4 1.5-SqueezeNext-34 66.00% 87.40% 2.1 1.5-SqueezeNext-44 67.28% 88.15% 2.6 VGG-19 68.50% 88.50% 138 2.0-SqueezeNext-23 67.18% 88.17% 2.4 2.0-SqueezeNext-34 68.46% 88.78% 3.8 2.0-SqueezeNext-44 69.59% 89.53% 4.4 MobileNet 67.50%(70.9%) 86.59%(89.9%) 4.2 2.0-SqueezeNext-23v5 67.44%(69.8%) 88.20%(89.5%) 3.2 -
硬件仿真结果:
-
括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
-
Time
表示模型的推断时间(相对耗时),Energy
表示模型的推断功耗。 -
8x8,32KB
和16x16,128KB
表示仿真硬件的配置:NxN
表示硬件具有NxN
个PE
阵列。processing element:PE
是单个计算单元。32KB/128KB
表示全局缓存。
-
-
深度可分离卷积的计算密集性较差,因为其
计算/带宽
比例较低,所以在某些移动设备上表现较差。一个可分离卷积的计算需要多次
IO
和计算才能完成,相比而言普通卷积只需要一次IO
和计算。
9.2 MobileNet 系列
9.2.1 MobileNet
-
MobileNet
应用了Depthwise
深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。 -
MobileNet
不仅产生了小型网络,还重点优化了预测延迟。与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大。
9.2.1.1 深度可分离卷积
-
对于传统的卷积层,单个输出
feature
这样产生:-
首先由一组滤波器对输入的各通道执行滤波,生成滤波
feature
。这一步仅仅考虑空间相关性。 -
然后计算各通道的滤波
feature
的加权和,得到单个feature
。这里不同位置处的通道加权和的权重不同,这意味着在空间相关性的基础上,叠加了通道相关性。
Depthwise
深度可分离卷积打破了空间相关性和通道相关性的混合:-
首先由一组滤波器对输入的各通道执行滤波,生成滤波
feature
。这一步仅仅考虑空间相关性。 -
然后执行
1x1
卷积来组合不同滤波feature
。这里不同位置处的通道加权和的权重都相同,这意味着这一步仅仅考虑通道相关性。
-
-
假设:输入
feature map
是一个尺寸为 $ MathJax-Element-484 $ 、输入通道数为 $ MathJax-Element-663 $ 的张量 $ MathJax-Element-486 $ ,输出feature map
是一个尺寸为 $ MathJax-Element-502 $ 、输出通道数为 $ MathJax-Element-677 $ 的张量 $ MathJax-Element-489 $ 。假设核张量为 $ MathJax-Element-499 $ ,其形状为 $ MathJax-Element-497 $ 。则对于标准卷积过程,有: $ MathJax-Element-492 $ 。其中: $ MathJax-Element-619 $ 为输入通道的索引; $ MathJax-Element-620 $ 为输出通道的索引; $ MathJax-Element-495 $ 为空间索引, $ MathJax-Element-496 $ 分别为对应空间方向上的遍历变量。
其参数数量为: $ MathJax-Element-497 $ ;其计算代价为: $ MathJax-Element-498 $ 。
-
depthwise
深度可分离卷积中,假设核张量为 $ MathJax-Element-499 $ ,其形状为: $ MathJax-Element-504 $ 。则对于depthwise
深度可分离卷积过程:-
首先对输入的各通道执行滤波,有: $ MathJax-Element-501 $ 。输出尺寸为 $ MathJax-Element-502 $ 、输出通道数为 $ MathJax-Element-663 $ 。
其参数数量为: $ MathJax-Element-504 $ ;其计算代价为: $ MathJax-Element-505 $ 。
-
然后对每个通道得到的滤波
feature
执行1x1
卷积,有: $ MathJax-Element-506 $ 。其中 $ MathJax-Element-507 $ 为1x1
卷积的核张量。其参数数量为: $ MathJax-Element-508 $ ;其计算代价为: $ MathJax-Element-509 $ 。
-
总的参数数量为: $ MathJax-Element-510 $ ,约为标准卷积的 $ MathJax-Element-511 $ 。
总的计算代价为: $ MathJax-Element-512 $ ,约为标准卷积的 $ MathJax-Element-513 $ 。
通常卷积核采用
3x3
卷积,而 $ MathJax-Element-514 $ ,因此depthwise
卷积的参数数量和计算代价都是常规卷积的 $ MathJax-Element-515 $ 到 $ MathJax-Element-516 $ 。
-
-
常规卷积和
Depthwise
可分离卷积的结构区别(带BN
和ReLU
):(左图为常规卷积,右图为Depthwise
可分离卷积)
9.2.1.2 网络结构
-
MobileNeet
网络结构如下表所示。其中:Conv
表示标准卷积,Conv dw
表示深度可分离卷积。- 所有层之后都跟随
BN
和ReLU
(除了最后的全连接层,该层的输出直接送入到softmax
层进行分类)。
-
MobileNet
大量的参数和计算量都被消耗在1x1
卷积上:Conv 1x1
包含了所有的1x1
卷积层,包括可分离卷积中的1x1
卷积。Conv DW 3x3
仅包括可分离卷积中的3x3
卷积。
层类型 乘-加运算 参数数量 Conv 1x1 94.86% 74.59% Conv DW 3x3 3.06% 1.06% Conv 3x3 1.19% 0.02% 全连接层 0.18% 24.33% -
与训练大模型相反,训练
MobileNet
时较少的采用正则化和数据集增强技术,因为MobileNet
是小模型,而小模型不容易过拟合。论文特别提到:在
depthwise
滤波器上使用很少或者不使用L2
正则化,因为它们的参数很少。
9.2.1.3 宽度乘子 & 分辨率乘子
-
尽管基本的
MobileNet
架构已经很小,延迟很低,但特定应用需要更快的模型。为此MobileNet
引入了两个超参数:宽度乘子、分辨率乘子 -
宽度乘子
width multiplier
,记做 $ MathJax-Element-721 $ 。其作用是:在每层均匀的缩减网络(实际上是减小每层网络的输入、输出feature map
的通道数量)。-
宽度乘子应用于第一层(是一个全卷积层)的输出通道数上。这也影响了后续所有
Depthwise
可分离卷积层的输入feature map
通道数、输出feature map
通道数。这可以通过直接调整第一层的输出通道数来实现。
-
它大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,降低了计算量。
-
通常将其设置为:0.25、0.5、0.75、1.0 四档。
-
-
分辨率乘子
resolution multiplier
,记做 $ MathJax-Element-528 $ 。其作用是:降低输出的feature map
的尺寸。-
分辨率乘子应用于输入图片上,改变了输入图片的尺寸。这也影响了后续所有
Depthwise
可分离卷积层的输入feature map
尺寸、输出feature map
尺寸。这可以通过直接调整网络的输入尺寸来实现。
-
它不会改变模型的参数数量,但是大概以 $ MathJax-Element-520 $ 的比例降低计算量。
-
-
如果模型同时实施了宽度乘子和分辨率乘子,则模型大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,大概以 $ MathJax-Element-522 $ 的比例降低了计算量。
假设输入
feature map
尺寸为14x14
,通道数为512
;卷积尺寸为3x3
;输出feature map
尺寸为14x14
,通道数为512
。层类型 乘-加操作(百万) 参数数量(百万) 常规卷积 462 2.36 深度可分离卷积 52.3 0.27 $ MathJax-Element-525 $ 的深度可分离卷积 29.6 0.15 $ MathJax-Element-524 $ 的深度可分离卷积 15.1 0.15
9.2.1.4 网络性能
-
常规卷积和深度可分离卷积的比较:使用深度可分离卷积在
ImageNet
上只会降低 1% 的准确率,但是计算量和参数数量大幅度降低。模型 ImageNet Accuracy 乘-加操作(百万) 参数数量(百万) 常规卷积的MobileNet 71.7% 4866 29.3 MobileNet 70.6% 569 4.2 -
更瘦的模型和更浅的模型的比较:在计算量和参数数量相差无几的情况下,采用更瘦的
MobileNet
比采用更浅的MobileNet
更好。- 更瘦的模型:采用 $ MathJax-Element-525 $ 宽度乘子(
瘦
表示模型的通道数更小)。 - 更浅的模型:删除了
MobileNet
中5x Conv dw/s
部分(即:5层feature size=14x14@512
的深度可分离卷积)。
模型 ImageNet Accuracy 乘-加操作(百万) 参数数量(百万) 更瘦的MobileNet 68.4% 325 2.6 更浅的MobileNet 65.3% 307 2.9 - 更瘦的模型:采用 $ MathJax-Element-525 $ 宽度乘子(
-
不同宽度乘子的比较:随着 $ MathJax-Element-721 $ 降低,模型的准确率一直下降( $ MathJax-Element-527 $ 表示基准
MobileNet
)。- 输入分辨率:224x224。
with multiplier ImageNet Accuracy 乘-加 操作(百万) 参数数量(百万) 1.0 70.6% 569 4.2 0.75 68.4% 325 2.6 0.5 63.7% 149 1.3 0.25 50.6% 41 0.5 -
不同分辨率乘子的比较:随着 $ MathJax-Element-528 $ 的降低,模型的准确率一直下降( $ MathJax-Element-529 $ 表示基准
MobileNet
)。- 宽度乘子:1.0 。
- $ MathJax-Element-530 $ 对应 $ MathJax-Element-531 $ , $ MathJax-Element-532 $ 对应 $ MathJax-Element-533 $ , $ MathJax-Element-534 $ 对应 $ MathJax-Element-542 $ , $ MathJax-Element-536 $ 对应 $ MathJax-Element-537 $ 。
resolution ImageNet Accuracy 乘-加 操作(百万) 参数数量(百万) 224x224 70.6% 569 4.2 192x192 69.1% 418 4.2 160x160 67.2% 290 4.2 128x128 64.4% 186 4.2 -
根据 $ MathJax-Element-538 $ 和 分辨率为 $ MathJax-Element-539 $ 两两组合得到 16 个模型。
-
绘制这16个模型的
accuracy
和计算量的关系:近似于log
关系,但是在 $ MathJax-Element-540 $ 有一个显著降低。 -
绘制这16个模型的
accuracy
和参数数量的关系:
-
-
MobileNet
和其它模型的比较:MobileNet
和VGG 16
准确率相近,但是模型大小小了32倍,计算量小了27倍。- 瘦身的
MobileNet
(宽度乘子 $ MathJax-Element-541 $ ,分辨率乘子 $ MathJax-Element-542 $ )和Squeezenet
模型大小差不多,但是准确率更高,计算量小了 22 倍。
模型 ImageNet Accuracy 乘-加 操作(百万) 参数数量(百万) 1.0 MobileNet-224 70.6% 569 4.2 GoogleNet 69.8% 1550 6.8 VGG 16 71.5% 15300 138 0.50 MobileNet-160 60.2% 76 1.32 Squeezenet 57.5% 1700 1.25 AlexNet 57.2% 720 60
9.2.2 MobileNet V2
-
MobileNet V2
创新性的提出了具有线性bottleneck
的Inverted
残差块。这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的内存需求。
9.2.2.1 线性bottleneck
-
一直以来,人们认为与任务相关的信息是嵌入到
feature map
中的一个低维子空间。因此feature map
事实上有一定的信息冗余。如果缩减feature map
的通道数量(相当于降维),则可以降低计算量。MobileNet V1
就是采用宽度乘子,从而在计算复杂度和准确率之间平衡。 -
由于
ReLU
非线性激活的存在,缩减输入feature map
的通道数量可能会产生不良的影响。输入
$ \mathbf P = \begin{bmatrix} P_{1,1}&P_{1,2}&\cdots&P_{1,n}\\ P_{2,1}&P_{2,2}&\cdots&P_{2,n}\\ \vdots&\vdots&\ddots&\vdots\\ P_{N,1}&P_{N,2}&\cdots&P_{N,n}\\ \end{bmatrix} $feature map
中每个元素值代表某个特征,将所有图片在该feature map
上的取值扩成为矩阵:其中 $ MathJax-Element-543 $ 为样本的数量, $ MathJax-Element-544 $ 。即:行索引代表样本,列索引代表特征。所有特征由
feature map
展平成一维得到。通常 $ MathJax-Element-545 $ ,则输入矩阵 $ MathJax-Element-546 $ 的秩 $ MathJax-Element-547 $ 。
-
对于
$ \mathbf P^* = \begin{bmatrix} P^*_{1,1}&P^*_{1,2}&\cdots&P^*_{1,n^*}\\ P^*_{2,1}&P^*_{2,2}&\cdots&P^*_{2,n^*}\\ \vdots&\vdots&\ddots&\vdots\\ P^*_{N,1}&P^*_{N,2}&\cdots&P^*_{N,n^*}\\ \end{bmatrix} $1x1
卷积(不考虑ReLU
),则1x1
卷积是输入特征的线性组合。输出featuremap
以矩阵描述为:其中 $ MathJax-Element-548 $ , $ MathJax-Element-561 $ 为输出通道数。
-
如果考虑
$ \mathbf P^{**} = ReLU(\mathbf P^*) = \begin{bmatrix} ReLU(P^*_{1,1})&ReLU(P^*_{1,2})&\cdots&ReLU(P^*_{1,n^*})\\ ReLU(P^*_{2,1})&ReLU(P^*_{2,2})&\cdots&ReLU(P^*_{2,n^*})\\ \vdots&\vdots&\ddots&\vdots\\ ReLU(P^*_{N,1})&ReLU(P^*_{N,2})&\cdots&ReLU(P^*_{N,n^*})\\ \end{bmatrix} $ReLU
,则输出featuremap
为: -
对于输出的维度 $ MathJax-Element-550 $ ,如果 $ MathJax-Element-564 $ 在维度 $ MathJax-Element-620 $ 上的取值均小于 0 ,则由于 $ MathJax-Element-553 $ 的作用, $ MathJax-Element-559 $ 在维度 $ MathJax-Element-620 $ 上取值均为 0 ,此时可能发生信息不可逆的丢失。
-
如果
1x1
卷积的输出通道数很小(即 $ MathJax-Element-561 $ 较小),使得 $ MathJax-Element-557 $ ,则 $ MathJax-Element-564 $ 的每个维度都非常重要。一旦经过
ReLU
之后 $ MathJax-Element-559 $ 的信息有效维度降低(即 $ MathJax-Element-560 $ ),则发生信息的丢失。且这种信息丢失是不可逆的。这使得输出
feature map
的有效容量降低,从而降低了模型的表征能力。 -
如果
1x1
卷积的输出通道数较大(即 $ MathJax-Element-561 $ 较大),使得 $ MathJax-Element-562 $ ,则 $ MathJax-Element-564 $ 的维度出现冗余。即使 $ MathJax-Element-564 $ 的某个维度被丢失,该维度的信息仍然可以从其它维度得到。
-
-
如果
1x1
卷积的输出通道数非常小,使得 $ MathJax-Element-565 $ ,则信息压缩的过程中就发生信息不可逆的丢失。上面的讨论的是
ReLU
的非线性导致信息的不可逆丢失。
-
-
实验表明:
bootleneck
中使用线性是非常重要的。虽然引入非线性会提升模型的表达能力,但是引入非线性会破坏太多信息,会引起准确率的下降。在
Imagenet
测试集上的表现如下图:
9.2.2.2 bottleneck block
-
bottleneck block
:输入feature map
首先经过线性bottleneck
来扩张通道数,然后经过深度可分离卷积,最后通过线性bottleneck
来缩小通道数。输入
bootleneck
输出通道数与输入通道数的比例称作膨胀比。- 通常较小的网络使用略小的膨胀比效果更好,较大的网络使用略大的膨胀比效果更好。
- 如果膨胀比小于 1 ,这就是一个典型的
resnet
残差块。
-
可以在
bottleneck block
中引入旁路连接,这种bottleneck block
称作Inverted
残差块,其结构类似ResNet
残差块。-
在
ResNeXt
残差块中,首先对输入feature map
执行1x1
卷积来压缩通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入
feature map
通道数先压缩、后扩张的过程。 -
在
Inverted
残差块中,首先对输入feature map
执行1x1
卷积来扩张通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入
feature map
通道数先扩张、后压缩的过程。这也是Inverted
残差块取名为Inverted
的原因。
-
-
当深度可分离卷积的步长为
1
时,bottleneck block
包含了旁路连接。当深度可分离卷积的步长不为
1
时,bottleneck block
不包含旁路连接。这是因为:输入feature map
的尺寸与块输出feature map
的尺寸不相同,二者无法简单拼接。虽然可以将旁路连接通过一个同样步长的池化层来解决,但是根据
ResNet
的研究,破坏旁路连接会引起网络性能的下降。 -
事实上旁路连接有两个插入的位置:在两个
1x1
卷积的前后,或者在两个Dwise
卷积的前后。通过实验证明:在两个
1x1
卷积的前后使用旁路连接的效果最好。在Imagenet
测试集上的表现如下图: -
bottleneck block
可以看作是对信息的两阶段处理过程:- 阶段一:对输入
feature map
进行降维,这一部分代表了信息的容量。 - 阶段二:对信息进行非线性处理,这一部分代表了信息的表达。
在
MobileNet v2
中这二者是独立的,而传统网络中这二者是相互纠缠的。 - 阶段一:对输入
9.2.2.3 网络性能
-
MobileNet V2
的设计基于MobileNet v1
,其结构如下:-
每一行代表一个或者一组相同结构的层,层的数量由 $ MathJax-Element-566 $ 给定。
-
相同结构指的是:
- 同一行内的层的类型相同,由
Operator
指定。其中bottleneck
指的是bottleneck block
。 - 同一行内的层的膨胀比相同,由
t
指定。 - 同一行内的层的输出通道数相同,由
c
指定。 - 同一行内的层:第一层采用步幅
s
,其它层采用步幅1
。
- 同一行内的层的类型相同,由
-
采用
ReLU6
激活函数,因为它在低精度浮点运算的环境下表现较好。 -
训练过程中采用
dropout
和BN
。
-
-
与
MobileNet V1
类似,MobileNet V2
也可以引入宽度乘子、分辨率乘子这两个超参数。 -
网络推断期间最大内存需求(
通道数/内存消耗(Kb)
):采用 16 bit 的浮点运算。 -
网络在
ImageNet
测试集上的表现:- 最后一列给出了预测单张图片的推断时间。
网络 Top 1 Params(百万) 乘-加 数量(百万) CPU MobileNet V1 70.6 4.2 575 113ms ShuffleNet (1.5) 71.5 3.4 292 - ShuffleNet (x2) 73.7 5.4 524 - NasNet-A 74.0 5.3 564 183ms MobileNet V2 72.0 3.4 300 75ms MobileNet V2(1.4) 74.7 6.9 585 143ms
9.3 ShuffleNet 系列
9.3.1 ShuffleNet
-
ShuffleNet
提出了1x1分组卷积+通道混洗
的策略,在保证准确率的同时大幅降低计算成本。ShuffleNet
专为计算能力有限的设备(如:10~150MFLOPs
)设计。在基于ARM
的移动设备上,ShuffleNet
与AlexNet
相比,在保持相当的准确率的同时,大约 13 倍的加速。
9.3.1.1 ShuffleNet block
-
在
Xception
和ResNeXt
中,有大量的1x1
卷积,所以整体而言1x1
卷积的计算开销较大。如ResNeXt
的每个残差块中,1x1
卷积占据了乘-加
运算的 93.4% (基数为32时)。在小型网络中,为了满足计算性能的约束(因为计算资源不够)需要控制计算量。虽然限制通道数量可以降低计算量,但这也可能会严重降低准确率。
解决办法是:对
1x1
卷积应用分组卷积,将每个1x1
卷积仅仅在相应的通道分组上操作,这样就可以降低每个1x1
卷积的计算代价。 -
1x1
卷积仅在相应的通道分组上操作会带来一个副作用:每个通道的输出仅仅与该通道所在分组的输入(一般占总输入的比例较小)有关,与其它分组的输入(一般占总输入的比例较大)无关。这会阻止通道之间的信息流动,降低网络的表达能力。解决办法是:采用通道混洗,允许分组卷积从不同分组中获取输入。
- 如下图所示:
(a)
表示没有通道混洗的分组卷积;(b)
表示进行通道混洗的分组卷积;(c)
为(b)
的等效表示。 - 由于通道混洗是可微的,因此它可以嵌入到网络中以进行端到端的训练。
- 如下图所示:
-
ShuffleNet
块的结构从ResNeXt
块改进而来:下图中(a)
是一个ResNeXt
块,(b)
是一个ShuffleNet
块,(c)
是一个步长为2
的ShuffleNet
块。在
ShuffleNet
块中:-
第一个
1x1
卷积替换为1x1
分组卷积+通道随机混洗。 -
第二个
1x1
卷积替换为1x1
分组卷积,但是并没有附加通道随机混洗。这是为了简单起见,因为不附加通道随机混洗已经有了很好的结果。 -
在
3x3 depthwise
卷积之后只有BN
而没有ReLU
。 -
当步长为2时:
-
恒等映射直连替换为一个尺寸为
3x3
、步长为2
的平均池化。 -
3x3 depthwise
卷积的步长为2
。 -
将残差部分与直连部分的
feature map
拼接,而不是相加。因为当
feature map
减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。
-
-
9.3.1.2 网络性能
-
在
Shufflenet
中,depthwise
卷积仅仅在1x1
卷积的输出feature map
上执行。这是因为depthwise
很难在移动设备上高效的实现,因为移动设备的计算/内存访问
比率较低,所以仅仅在1x1
卷积的输出feature map
上执行从而降低开销。 -
ShuffleNet
网络由ShuffleNet
块组成。-
网络主要由三个
Stage
组成。- 每个
Stage
的第一个块的步长为 2 ,stage
内的块在其它参数上相同。 - 每个
Stage
的输出通道数翻倍。
- 每个
-
在
Stage2
的第一个1x1
卷积并不执行分组卷积,因此此时的输入通道数相对较小。 -
每个
ShuffleNet
块中的第一个1x1
分组卷积的输出通道数为:该块的输出通道数的1/4
。 -
使用较少的数据集增强,因为这一类小模型更多的是遇到欠拟合而不是过拟合。
-
复杂度给出了计算量(
乘-加运算
),KSize
给出了卷积核的尺寸,Stride
给出了ShuffleNet block
的步长,Repeat
给出了ShuffleNet block
重复的次数,g
控制了ShuffleNet block
分组的数量。g=1
时,1x1
的通道分组卷积退化回原始的1x1
卷积。
-
-
超参数
g
会影响模型的准确率和计算量。在ImageNet
测试集上的表现如下:-
ShuffleNet sx
表示对ShuffleNet
的通道数增加到s
倍。这通过控制Conv1
卷积的输出通道数来实现。 -
g
越大,则计算量越小,模型越准确。其背后的原理是:小模型的表达能力不足,通道数量越大,则小模型的表达能力越强。
g
越大,则准确率越高。这是因为对于ShuffleNet
,分组越大则生成的feature map
通道数量越多,模型表达能力越强。- 网络的通道数越小(如
ShuffleNet 0.25x
),则这种增益越大。
-
随着分组越来越大,准确率饱和甚至下降。
这是因为随着分组数量增大,每个组内的通道数量变少。虽然总体通道数增加,但是每个分组提取有效信息的能力变弱,降低了模型整体的表征能力。
-
虽然较大
g
的ShuffleNet
通常具有更好的准确率。但是由于它的实现效率较低,会带来较大的推断时间。
-
-
通道随机混洗的效果要比不混洗好。在
ImageNet
测试集上的表现如下:- 通道混洗使得分组卷积中,信息能够跨分组流动。
- 分组数
g
越大,这种混洗带来的好处越大。
-
多种模型在
ImageNet
测试集上的表现:比较分为三组,每一组都有相差无几的计算量。 $ MathJax-Element-567 $ 给出了在该组中,模型相对于
MobileNet
的预测能力的提升。MFLOPs
表示乘-加
运算量(百万),错误率表示top-1 error
。ShuffleNet 0.5x(shallow,g=3)
是一个更浅的ShuffleNet
。考虑到MobileNet
只有 28 层,而ShuffleNet
有 50 层,因此去掉了Stage 2-4
中一半的块,得到一个教浅的、只有 26 层的ShuffleNet
。
-
在移动设备上的推断时间(
Qualcomm Snapdragon 820 processor
,单线程):
9.3.2 ShuffleNet V2
ShuffleNet V2
基于一系列对照实验提出了高效网络设计的几个通用准则,并提出了ShuffleNet V2
的网络结构。
9.3.2.1 小型网络通用设计准则
-
目前衡量模型推断速度的一个通用指标是
FLOPs
(即乘-加
计算量)。事实上这是一个间接指标,因为它不完全等同于推断速度。如:MobileNet V2
和NASNET-A
的FLOPs
相差无几,但是MobileNet V2
的推断速度要快得多。如下所示为几种模型在
GPU
和ARM
上的准确率(在ImageNet
验证集上的测试结果)、模型推断速度(通过Batch/秒
来衡量)、计算复杂度(通过FLOPs
衡量)的关系。-
在
ARM
平台上batchsize=1
, 在GPU
平台上batchsize=8
。 -
准确率与模型容量成正比,而模型容量与模型计算复杂度成成比、计算复杂度与推断速度成反比。
因此:模型准确率越高,则推断速度越低;模型计算复杂度越高,则推断速度越低。
-
-
FLOPs
和推断速度之间的差异有两个原因:-
除了
FLOPs
之外,还有几个因素对推断速度有重要的影响。- 内存访问量(
memory access cost:MAC
):在某些操作(如分组卷积)中,其时间开销占相当大比例。因此它可能是GPU
这种具有强大计算能力设备的瓶颈。 - 模型并行度:相同
FLOPs
的情况下,高并行度的模型比低并行度的模型快得多。
- 内存访问量(
-
即使相同的操作、相同的
FLOPs
,在不同的硬件设备上、不同的库上,其推断速度也可能不同。
-
-
MobileNet V2
和ShuffleNet V1
这两个网络非常具有代表性,它们分别采用了group
卷积和depth-wise
卷积。这两个操作广泛应用于其它的先进网络。利用实验分析它们的推断速度(以推断时间开销来衡量)。其中:宽度乘子均为1,
ShuffleNet V1
的分组数g=3
。从实验结果可知:
FLOPs
指标仅仅考虑了卷积部分的计算量。虽然这部分消耗时间最多,但是其它操作包括数据IO
、数据混洗、逐元素操作(ReLU
、逐元素相加)等等时间开销也较大。 -
小型网络通用设计准则:
-
准则一:输入通道数和输出通道数相等时,
MAC
指标最小。假设输入
feature map
尺寸为 $ MathJax-Element-601 $ 、通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ 。假设为1x1
卷积,则FLOPs
为: $ MathJax-Element-571 $ 。其内存访问量为:输入
featuremap
内存访问量+输出featuremap
内存访问量+卷积核内存访问量。因此有: $ MathJax-Element-572 $ 。根据不等式 $ MathJax-Element-573 $ ,以及 $ MathJax-Element-574 $ ,则有: $ MathJax-Element-575 $ 。当 $ MathJax-Element-579 $ 时等式成立。
-
准则二:大量使用分组卷积会增加
MAC
。分组卷积可以降低
FLOPs
。换言之,它可以在FLOPs
固定的情况下,增大featuremap
的通道数从而提高模型的容量。但是采用分组卷积可能增加MAC
。对于
1x1
卷积,设分组数为g
,则FLOPs
数为 $ MathJax-Element-577 $ ,内存访问量为$ MathJax-Element-578 $ 。
当 $ MathJax-Element-579 $ 时, $ MathJax-Element-580 $ 最小。因此 $ MathJax-Element-581 $ 随着 $ MathJax-Element-582 $ 的增加而增加。
-
准则三:网络分支会降低并行度。
虽然网络中采用分支(如
Inception
系列、ResNet
系列)有利于提高模型的准确率,但是它对GPU
等具有高并行计算能力的设备不友好,因此会降低计算效率。另外它还带来了卷积核的
lauching
以及计算的同步等问题,这也是推断时间的开销。 -
准则四:不能忽视元素级操作的影响。
元素级操作包括
ReLU、AddTensor、AddBias
等,它们的FLOPs
很小但是MAC
很大。在ResNet
中,实验发现如果去掉ReLU
和旁路连接,则在GPU
和ARM
上大约有 20% 的推断速度的提升。
-
9.3.2.2 ShuffleNet V2 block
-
ShuffleNet V1 block
的分组卷积违反了准则二,1x1
卷积违反了准则一,旁路连接的元素级加法违反了准则四。而ShuffleNet V2 block
修正了这些违背的地方。 -
ShuffleNet V2 block
在ShuffleNet V1 block
的基础上修改。(a),(b)
表示ShuffleNet V1 block
(步长分别为1、2),(c),(d)
表示ShuffleNet V2 block
(步长分别为1、2)。其中GConv
表示分组卷积,DWConv
表示depthwise
卷积。-
当步长为1 时,
ShuffleNet V2 block
首先将输入feature map
沿着通道进行拆分。设输入通道数为 $ MathJax-Element-663 $ ,则拆分为 $ MathJax-Element-584 $ 和 $ MathJax-Element-585 $ 。-
根据准则三,左路分支保持不变,右路分支执行各种卷积操作。
-
根据准则一,右路的三个卷积操作都保持通道数不变。
-
根据准则二,右路的两个
1x1
卷积不再是分组卷积,而是标准的卷积操作。因为分组已经由通道拆分操作执行了。 -
根据准则四,左右两路的
featuremap
不再执行相加,而是执行特征拼接。可以将
Concat、Channel Shuffle、Channel Split
融合到一个element-wise
操作中,这可以进一步降低element-wise
的操作数量。
-
-
当步长为2时,
ShuffleNet V2 block
不再拆分通道,因为通道数量需要翻倍从而保证模型的有效容量。 -
在执行通道
Concat
之后再进行通道混洗,这一点也与ShuffleNet V1 block
不同。
-
9.3.2.3 网络性能
-
ShuffleNet V2
的网络结构类似ShuffleNet V1
,主要有两个不同:- 用
ShuffleNet v2 block
代替ShuffleNet v1 block
。 - 在
Global Pool
之前加入一个1x1
卷积。
- 用
-
ShuffleNet V2
可以结合SENet
的思想,也可以增加层数从而由小网络变身为大网络。下表为几个模型在
ImageNet
验证集上的表现(single-crop
)。 -
ShuffleNet V2
和其它模型的比较:- 根据计算复杂度分成
40,140,300,500+
等四组,单位:MFLOPs
。 - 准确率指标为模型在
ImageNet
验证集上的表现(single-crop
)。 GPU
上的batchsize=8
,ARM
上的batchsize=1
。- 默认图片尺寸为
224x224
,标记为*
的图片尺寸为160x160
,标记为**
的图片尺寸为192x192
。
- 根据计算复杂度分成
-
ShuffleNet V2
准确率更高。有两个原因:-
ShuffleNet V2 block
的构建效率更高,因此可以使用更多的通道从而提升模型的容量。 -
在每个
ShuffleNet V2 block
,有一半通道的数据( $ MathJax-Element-586 $ )直接进入下一层。这可以视作某种特征重用,类似于DenseNet
。但是
ShuffleNet v2 block
在特征Concat
之后又执行通道混洗,这又不同于DenseNet
。
-
9.4 IGCV 系列
-
设计小型化网络目前有两个代表性的方向,并且都取得了成功:
- 通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用
1x3 +3x1
卷积去替代3x3
卷积 。 - 使用一系列稀疏卷积核去组成一个密集卷积核。如:交错卷积中采用一系列分组卷积去替代一个密集卷积。
- 通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用
9.4.1 IGCV
-
简化神经网络结构的一个主要方法是消除结构里的冗余。目前大家都认为现在深度神经网络结构里有很强的冗余性。
冗余可能来自与两个地方:
- 卷积核空间方向的冗余。通过小卷积核替代(如,采用
3x3
、1x3
、3x1
卷积核)可以降低这种冗余。 - 卷积核通道方向的冗余。通过分组卷积、
depth-wise
卷积可以降低这种冗余。
IGCV
通过研究卷积核通道方向的冗余,从而减少网络的冗余性。 - 卷积核空间方向的冗余。通过小卷积核替代(如,采用
-
事实上解决冗余性的方法有多种:
-
二元化:将卷积核变成二值的
-1
和+1
,此时卷积运算的乘加
操作变成了加减
操作。这样计算量就下降很多,存储需求也降低很多(模型变小)。 -
浮点数转整数:将卷积核的
32
位浮点数转换成16
位整数。此时存储需求会下降(模型变小)。除了将卷积核进行二元化或者整数化之外,也可以将
feature map
进行二元化/整数化。 -
卷积核低秩分解:将大卷积核分解为两个小卷积核 ,如:将
100x100
分解为100x10
和10x100
、将5x5
分解为两个3x3
。 -
稀疏卷积分解:将一个密集的卷积核分解为多个稀疏卷积核。如分组卷积、
depth-wise
卷积。
-
9.4.1.1 IGCV block
-
IGCV
提出了一种交错卷积模块,每个模块由相连的两层分组卷积组成,分别称作第一层分组卷积primary group conv
、第二层分组卷积secondary group conv
。-
第一层分组卷积采用
3x3
分组卷积,主要用于处理空间相关性;第二层分组卷积采用1x1
分组卷积,主要用于处理通道相关性。 -
每层分组卷积的每个组内执行的都是标准的卷积,而不是
depth-wise
卷积。 -
这两层分组卷积的分组是交错进行的。假设第一层分组卷积有
L
个分组、每个分组M
个通道,则第二层分组卷积有M
个分组、每个分组L
个通道。-
第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中。
第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
-
这两层分组卷积是互补的、交错的,因此称作交错卷积
Interleaved Group Convolution:IGCV
。
-
-
这种严格意义上的互补需要对每层分组卷积的输出
feature map
根据通道数重新排列Permutation
。这不等于混洗,因为混洗不能保证严格意义上的通道互补。
-
-
由于分组卷积等价于稀疏卷积核的常规卷积,该稀疏卷积核是
block-diagonal
(即:只有对角线的块上有非零,其它位置均为 0 )。因此
IGCV
块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。 -
假设第一层分组卷积的卷积核尺寸为 $ MathJax-Element-601 $ ,则
$ T_{igc} = L\times M\times W\times H\times M +M\times L\times 1\times 1\times L=LM(WHM+L) $IGCV
块的参数数量为:令 $ MathJax-Element-588 $ 为
IGCV
块 的输入feature map
通道数量,则 $ MathJax-Element-589 $ 。对于常规卷积,假设卷积核的尺寸为 $ MathJax-Element-601 $ ,输入输出通道数均为 $ MathJax-Element-712 $ ,则参数数量为: $ MathJax-Element-592 $ 。当参数数量相等,即 $ MathJax-Element-593 $ 时,则有: $ MathJax-Element-594 $ 。
当 $ MathJax-Element-595 $ 时,有 $ MathJax-Element-596 $ 。通常选择 $ MathJax-Element-597 $ ,考虑到 $ MathJax-Element-598 $ ,因此该不等式几乎总是成立。于是
IGCV
块总是比同样参数数量的常规卷积块更宽(即:通道数更多)。 -
在相同参数数量/计算量的条件下,
IGCV
块(除了L=1
的极端情况)比常规卷积更宽,因此IGCV
块更高效。-
采用
IGCV
块堆叠而成的IGCV
网络在同样参数数量/计算量的条件下,预测能力更强。 -
Xception
块、带有加法融合的分组卷积块都是IGCV
块的特殊情况。-
当
M=1
,L
等于IGCV
块输入feature map
的输入通道数时,IGCV
块退化为Xception
块。 -
当
L=1
,M
等于IGCV
块输入feature map
的输入通道数时,IGCV
块退化为采用Summation
融合的Deeply-Fused Nets block
。
-
-
9.4.1.2 网络性能
-
IGCV
网络结构如下表所示,其中:RegConv-Wc
表示常规卷积,W
表示卷积核的尺寸为WxW
,c
表示通道数量;Summation
表示加法融合层(即常规的1x1
卷积,而不是1x1
分组卷积)。- 在
IGCV
块之后紧跟BN
和ReLU
,即结构为:IGC block+BN+ReLU
。 4x(3x3,8)
表示分成4组,每组的卷积核尺寸为3x3
输出通道数为 8 。- 网络主要包含3个
stage
,B
表示每个stage
的块的数量。 - 某些
stage
的输出通道数翻倍(对应于Output size
减半),此时该stage
的最后一个block
的步长为2(即该block
中的3x3
卷积的步长为2) 。
- 在
-
IGCV
网络的模型复杂度如下所示。SumFusion
的参数和计算复杂度类似RegConv-W16
,因此没有给出。 -
IGCV
模型在CIFAR-10
和CIFAR-100
上的表现:-
如果增加恒等映射,则结果为:
-
所有的模型比较:
-
-
IGCV
模型在ImageNet
上的表现:(输入224x224
,验证集,single-crop
) -
超参数
L
和M
的选取:通过
IGCV
在CIFAR100
上的表现可以发现:L
占据统治地位,随着 $ MathJax-Element-696 $ 的增加模型准确率先上升到最大值然后缓缓下降。
9.4.2 IGCV2
IGCV2 block
的主要设计思想是:将IGCV block
两个结构化的稀疏卷积核组成的交错卷积推广到更多个结构化的稀疏卷积核组成的交错卷积,从而进一步消除冗余性。
9.4.2.1 IGCV2 block
-
假设输入
feature map
的通道数为 $ MathJax-Element-663 $ ,卷积核尺寸为 $ MathJax-Element-601 $ ,输出通道数为 $ MathJax-Element-677 $ 。考虑输入feature map
的一个patch
(对应卷积核大小) $ MathJax-Element-698 $ ,该patch
经过卷积之后的结果为: $ MathJax-Element-604 $ 。其中 $ MathJax-Element-698 $ 是一个长度为 $ MathJax-Element-606 $ 的向量, $ MathJax-Element-607 $ 是一个长度为 $ MathJax-Element-677 $ 的向量, $ MathJax-Element-622 $ 是一个 $ MathJax-Element-677 $ 行、 $ MathJax-Element-611 $ 列的矩阵。-
$ \mathbf{\vec y} =\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 \mathbf{\vec x},\quad \mathbf W=\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 $Xception、deep roots、IGCV1
的思想是:将卷积核 $ MathJax-Element-622 $ 分解为多个稀疏卷积的乘积:其中 $ MathJax-Element-613 $ 至少有一个为块稀疏
block-wise sparse
矩阵; $ MathJax-Element-700 $ 为置换矩阵,用于重新调整通道顺序; $ MathJax-Element-615 $ 为一个密集矩阵。 -
对于
$ \mathbf W^i=\begin{bmatrix} \mathbf W_1^i&\mathbf 0&\cdots&\mathbf 0\\ \mathbf 0&\mathbf W_2^i&\cdots&\mathbf 0\\ \vdots&\vdots&\ddots&\vdots\\ \mathbf 0&\mathbf 0&\cdots&\mathbf W_{G_i}^i\\ \end{bmatrix} $IGCV1
, 令 $ MathJax-Element-616 $ 为第 $ MathJax-Element-619 $ 层分组卷积的分组数,则:其中 $ MathJax-Element-618 $ 表示第 $ MathJax-Element-619 $ 层分组卷积的卷积核,它是一个
block-wise sparse
的矩阵,其中第 $ MathJax-Element-620 $ 组的卷积核矩阵为 $ MathJax-Element-621 $ 。
-
-
$ \mathbf{\vec y} =\mathbf P_L\mathbf W_L\mathbf P_{L-1}\mathbf W_{L-1}\cdots\mathbf P_1\mathbf W_1 \mathbf{\vec x}=\left(\prod_{l=L}^1\mathbf P_l\mathbf W_l\right)\mathbf{\vec x}\\ \mathbf W=\mathbf P_L\mathbf W_L\mathbf P_{L-1}\mathbf W_{L-1}\cdots\mathbf P_1\mathbf W_1=\prod_{l=L}^1\mathbf P_l\mathbf W_l $IGCV2
不是将 $ MathJax-Element-622 $ 分解为 2个block-wise sparse
矩阵的乘积(不考虑置换矩阵),而是进一步分解为 $ MathJax-Element-696 $ 个块稀疏矩阵的乘积:其中 $ MathJax-Element-630 $ 为块稀疏矩阵,它对应于第 $ MathJax-Element-642 $ 层分组卷积,即:
IGCV2
包含了 $ MathJax-Element-696 $ 层分组卷积; $ MathJax-Element-631 $ 为置换矩阵。- 为了设计简单,第 $ MathJax-Element-642 $ 层分组卷积中,每个分组的通道数都相等,设为 $ MathJax-Element-640 $ 。
- 如下所示为一个
IGCV2 block
。实线表示权重 $ MathJax-Element-630 $ ,虚线表示置换 $ MathJax-Element-631 $ ,加粗的线表示产生某个输出通道(灰色的那个通道)的路径。
9.4.2.2 互补条件 & 平衡条件
-
事实上并不是所有的 $ MathJax-Element-696 $ 个块稀疏矩阵的乘积一定就是密集矩阵,这其中要满足一定的条件,即互补条件
complementary condition
。互补条件用于保证:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。 -
要满足互补条件,则有以下准则:
对于任意 $ MathJax-Element-636 $ , $ MathJax-Element-634 $ 等价于一层分组卷积,且 $ MathJax-Element-635 $ 也等价于一层分组卷积。且这两层分组卷积是互补的:第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中;第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
- 其物理意义为:从任意位置 $ MathJax-Element-636 $ 截断,则前面一半等价于一层分组卷积,后面一半也等价于一层分组卷积。
- 可以证明
IGCV2 block
满足这种互补条件。
-
假设
IGCV2 block
的输入通道数为 $ MathJax-Element-712 $ ,输出通道数也为 $ MathJax-Element-712 $ ,其L
层分组卷积中第 $ MathJax-Element-642 $ 层分组卷积每组卷积的输入通道数为 $ MathJax-Element-640 $ 。现在考虑 $ MathJax-Element-641 $ 需要满足的约束条件。对于
IGCV2 block
的某个输入通道,考虑它能影响多少个IGCV2 block
的输出通道。-
设该输入通道影响了第 $ MathJax-Element-642 $ 层分组卷积的 $ MathJax-Element-646 $ 个输出通道。因为互补条件的限制,这 $ MathJax-Element-646 $ 个通道在第 $ MathJax-Element-645 $ 层进入不同的分组,因此分别归属于 $ MathJax-Element-646 $ 组。而每个分组影响了 $ MathJax-Element-647 $ 个输出通道,因此有递归公式:
$ C_{l+1} = K_l\times C_l $ -
考虑初始条件,在第
1
层分组卷积有: $ MathJax-Element-648 $ 。则最终该输入通道能够影响IGCV2 block
的输出通道的数量为: $ MathJax-Element-649 $ 。 -
由于互补条件的限制:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。因此每个输入通道必须能够影响所有的输出通道。因此有: $ MathJax-Element-650 $ 。
-
-
考虑仅仅使用尺寸为
1x1
和WxH
的卷积核。由于1x1
卷积核的参数数量更少,因此L
层分组卷积中使用1层尺寸为WxH
的卷积核、L-1
层尺寸为1x1
卷积核。-
假设第1层为
WxH
卷积核,后续层都是1x1
卷积核,则总的参数数量为: $ MathJax-Element-651 $ 。- 第一项来自于
1x1
分组卷积。对于第 $ MathJax-Element-668 $ 层的分组卷积,输入通道数为 $ MathJax-Element-712 $ 、分组数为 $ MathJax-Element-654 $ 、输出通道数为 $ MathJax-Element-712 $ 。则参数数量为: $ MathJax-Element-656 $ 。 - 第二项来自于
WxH
分组卷积。参数数量为: $ MathJax-Element-657 $ 。
- 第一项来自于
-
根据互补条件 $ MathJax-Element-658 $ ,以及
$ Q\ge CL(WHK_1\prod_{l=2}^LK_l)^{1/L}=CL(WHC)^{1/L} $Jensen
不等式有:等式成立时 $ MathJax-Element-659 $ 。这称作平衡条件
balance condition
。
-
-
考虑选择使得 $ MathJax-Element-673 $ 最小的 $ MathJax-Element-696 $ 。根据
$ \frac{d \log Q}{ dL} = \frac 1L-\frac 1{L^2}\log(WHC) = 0 $则有: $ MathJax-Element-662 $ 。
-
当
Block
的输出feature map
尺寸相对于输入feature map
尺寸减半(同时也意味着通道数翻倍)时,Block
的输出通道数不等于输入通道数。设输入通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ ,则有:
-
互补条件: $ MathJax-Element-665 $ 。
-
平衡条件:
设
feature map
的尺寸缩减发生在3x3
卷积,则后续所有的1x1
卷积的输入通道数为 $ MathJax-Element-677 $ 、输出通道数也为 $ MathJax-Element-677 $ 。- 对于第 $ MathJax-Element-668 $ 层的分组卷积,参数数量为: $ MathJax-Element-669 $ 。
- 对于第1层分组卷积,参数数量为: $ MathJax-Element-670 $ ,其中 $ MathJax-Element-671 $ 为分组数量。
则总的参数数量为: $ MathJax-Element-672 $ 。等式成立时有:
$ WHK_1=K_2=\cdots=(WHC_O)^{1/L} $ -
选择使得 $ MathJax-Element-673 $ 最小的 $ MathJax-Element-696 $ 有: $ MathJax-Element-675 $ 。
因此对于
feature map
尺寸发生缩减的IGCV2 Block
,互补条件&平衡条件仍然成立,只需要将 $ MathJax-Element-712 $ 替换为输出通道数 $ MathJax-Element-677 $ 。 -
9.4.2.3网络性能
-
IGCV2
网络结构如下表所示:其中 $ MathJax-Element-684 $ 为网络第一层的输出通道数量,也就是后面block
的输入通道数 $ MathJax-Element-712 $ 。-
网络主要包含3个
stage
,B
表示每个stage
的块的数量。 -
某些
stage
的输出通道数翻倍,此时该stage
的最后一个block
的步长为2(即该block
中的3x3
卷积的步长为2) 。 -
每2个
block
添加一个旁路连接,类似ResNet
。 即在 $ MathJax-Element-680 $ 这种结构添加旁路连接。 -
$ MathJax-Element-681 $ 表示输入通道数为 $ MathJax-Element-684 $ 的
3x3
卷积。 $ MathJax-Element-683 $ 表示输出通道数为 $ MathJax-Element-684 $ 的1x1
卷积。 -
$ MathJax-Element-696 $ 和 $ MathJax-Element-689 $ 为
IGCV2
的超参数。 $ MathJax-Element-687 $ 表示有 $ MathJax-Element-688 $ 层分组卷积,每个组都是 $ MathJax-Element-689 $ 个输入通道的1x1
卷积。事实上
IGCV2
每个stage
都是L
层,只是第一层的分组数为 1 。 -
对于
IGCV2(Cx)
, $ MathJax-Element-690 $ ;对于IGCV2*(Cx)
, $ MathJax-Element-691 $ 。IGCV2*
的(3x3,64)
应该修改为 $ MathJax-Element-692 $ 。
-
-
通过一个简化版的、没有
feature map
尺寸缩减(这意味着IGCV2 Block
的输入、输出通道数保持不变 )的IGCV2
网络来研究一些超参数的限制:-
IGCV2 block
最接近互补条件限制条件 时,表现最好。如下所示,红色表示互补条件限制满足条件最好的情况。其中匹配程度通过 $ MathJax-Element-693 $ 来衡量。
-
IGCV2 block
的 $ MathJax-Element-696 $ 最佳的情况是:网络的宽度(通过 $ MathJax-Element-712 $ 刻画)和稀疏性达到平衡,如下所示。- 下图中,每一种 $ MathJax-Element-696 $ 都选择了对应的
Width
(即 $ MathJax-Element-712 $ )使得其满足互补条件限制,以及平衡条件,从而使得参数保持相同。 Non-sparsity
指的是IGCV2 block
等效的密集矩阵中非零元素的比例。
- 下图中,每一种 $ MathJax-Element-696 $ 都选择了对应的
-
IGCV2
网络越深越好、越宽越好,但是加宽网络比加深网络性价比更高。如下图所示:采用IGCV2*
,深度用D
表示、宽度用C
表示。
-
-
IGCV2
网络与不同网络比较: -
IGCV2
网络与MobileNet
的比较:(ImageNet
)
9.4.3 IGCV3
IGCV3
结合了块稀疏的卷积核(如:交错卷积) 和低秩的卷积核(如:bottleneck
模块),并放松了互补条件。
9.4.3.1 IGCV3 block
-
IGCV3
的block
修改自IGCV2 block
,它将IGCV2 block
的分组卷积替换为低秩的分组卷积。- 首先对输入
feature map
进行分组,然后在每个分组中执行1x1
卷积来扩张通道数。 - 然后执行常规分组卷积,并对结果进行通道重排列。
- 最后执行分组卷积,在每个分组中执行
1x1
卷积来恢复通道数,并对结果进行通道重排。
按照
$ \mathbf{\vec y} =\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 \mathbf W^0\mathbf{\vec x} $IGCV2
的描述方式,输入feature map
的一个patch
$ MathJax-Element-698 $ ,经过IGCV3 block
之后的结果为:其中 $ MathJax-Element-699 $ 为低秩的块稀疏矩阵; $ MathJax-Element-700 $ 为置换矩阵,用于重新调整通道顺序 。
- 首先对输入
-
下图分别展示了
IGCV1 block
、Inverted
残差块、IGCV3 block
的区别。每个圆圈代表一个通道,箭头代表通道的数据流动。IGCV1
块中,两层分组卷积的卷积核都是稀疏的;在Inverted
残差块中,两层1x1
卷积的卷积核都是低秩的;在IGCV3
块中,两层1x1
卷积的卷积核是稀疏的,也都是低秩的。 -
设
IGCV3 block
第一层分组卷积(1x1
分组扩张卷积) 的分组数量为 $ MathJax-Element-726 $ ;第二层分组卷积(普通分组卷积)的分组数不变,也是 $ MathJax-Element-726 $ ;第三层分组卷积(1x1
分组压缩卷积)的分组数量为 $ MathJax-Element-727 $ 。则 $ MathJax-Element-725 $ 是非常重要的超参数。
9.4.3.2 loose 互补条件
-
实验中发现:如果
IGCV3 block
如果严格遵守互补条件会导致卷积核过于稀疏,从而导致更大的内存消耗而没有带来准确率的提升。因此
IGCV3 block
提出了宽松互补条件loose complementary condition
,从而允许输入通道到输出通道存在多条路径。 -
在
IGCV3 block
中定义了超级通道Super-Channel
,设为 $ MathJax-Element-717 $ 。在一个IGCV3 block
中,每个feature map
都具有同等数量的Super-Channel
。- 输入
feature map
的通道数假设为 $ MathJax-Element-712 $ ,因此每个输入超级通道包含 $ MathJax-Element-713 $ 条普通的输入通道。 - 经过
1x1
分组卷积扩张的输出通道数假设为 $ MathJax-Element-710 $ ,则这里的每个超级通道包含 $ MathJax-Element-711 $ 条普通的通道。 - 经过常规分组卷积的输出通道数也是 $ MathJax-Element-710 $ ,则这里的每个超级通道也包含 $ MathJax-Element-711 $ 条普通的通道。
- 最后经过
1x1
分组卷积压缩的输出通道数也是 $ MathJax-Element-712 $ ,因此每个输出超级通道包含 $ MathJax-Element-713 $ 条普通的输出通道。
- 输入
-
loose complementary condition
:第一层分组卷积中,同一个分组的不同超级通道会进入到第三层分组卷积的不同分组中;第三层分组卷积中,同一个分组的不同超级通道来自于第一层分组卷积的不同分组。由于超级通道中可能包含多个普通通道,因此输入通道到输出通道存在多条路径。
-
通常设置 $ MathJax-Element-714 $ ,即:超级通道数量等于输入通道数量。则每条超级通道包含的普通通道数量依次为: $ MathJax-Element-715 $ ,其中 $ MathJax-Element-716 $ 表示
1x1
分组卷积的通道扩张比例。也可以将 $ MathJax-Element-717 $ 设置为一个超参数,其取值越小,则互补条件放松的越厉害(即:输入通道到输出通道存在路径的数量越多)。
9.4.3.3 网络性能
-
IGCV3
网络通过叠加IGCV3 block
而成。因为论文中的对照实验是在网络参数数量差不多相同的条件下进行。为了保证IGCV3
网络与IGCV1/2,MobileNet,ShuffleNet
等网络的参数数量相同,需要加深或者加宽IGCV3
网络。论文中作者展示了两个版本:
- 网络更宽的版本,深度与对比的网络相等的同时,加宽网络的宽度,记做
IGCV3-W
。参数为: $ MathJax-Element-718 $ 。 - 网络更深的版本,宽度与对比的网络相等的同时,加深网络的深度,记做
IGCV3-D
。参数为: $ MathJax-Element-719 $ 。
- 网络更宽的版本,深度与对比的网络相等的同时,加宽网络的宽度,记做
-
IGCV3
与IGCV1/2
的对比:IGCV3
降低了参数冗余度,因此在相同的参数的条件下,其网络可以更深或者更宽,因此拥有比IGCV1/2
更好的准确率。 -
IGCV3
和其它网络的在ImageNet
上的对比:MAdds
用于刻画网络的计算量,单位是百万乘-加运算
。- $ MathJax-Element-720 $ 中的 $ MathJax-Element-721 $ 表示宽度乘子,它大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,降低了计算量。
-
更深的
IGCV
网络和更宽的IGCV
网络的比较:- 更深的网络带来的效果更好,这与人们一直以来追求网络的
深度
的理念相一致。 - 在宽度方向有冗余性,因此进一步增加网络宽度并不会带来额外的收益。
- 更深的网络带来的效果更好,这与人们一直以来追求网络的
-
ReLU
的位置比较:第一个
IGCV3 block
的ReLU
位置在两个1x1
卷积之后;第二个IGCV3 block
的ReLU
位置在3x3
卷积之后;第三个IGCV3 block
的ReLU
在整个block
之后(这等价于一个常规卷积+ReLU
)。 -
超参数 $ MathJax-Element-725 $ 的比较:
-
只要 $ MathJax-Element-725 $ 都是输入、输出通道数的公约数时,
loose
互补条件就能满足,因此存在 $ MathJax-Element-725 $ 的很多选择。 -
实验发现, $ MathJax-Element-726 $ 比较小、 $ MathJax-Element-727 $ 比较大时网络预测能力较好。但是这里的
IGCV3
网络采用的是同样的网络深度、宽度。如果采用同样的网络参数数量,则 $ MathJax-Element-728 $ 可以产生一个更深的、准确率更高的网络。
-
9.5 CondenseNet
-
CondenseNet
基于DenseNet
网络,它在训练的过程中自动学习一个稀疏的网络从而减少了Densenet
的冗余性。这种稀疏性类似于分组卷积,但是
CondenseNet
从数据中自动学到分组,而不是由人工硬性规定分组。 -
CondenseNet
网络在GPU
上具有高效的训练速度,在移动设备上具有高效的推断速度。 -
MobileNet、ShuffleNet、NASNet
都采用了深度可分离卷积,这种卷积在大多数深度学习库中没有实现。而CondenseNet
采用分组卷积,这种卷积被大多数深度学习库很好的支持。准确的说,
CondenseNet
在测试阶段采用分组卷积,在训练阶段采用的是常规卷积。
9.5.1 网络剪枝
-
有一些工作(
Compressing neural networks with the hashing trick
、Deep networks with stochastic depth
)表明:CNN
网络中存在大量的冗余。DenseNet
通过直接连接每个层的输出特征与之后的所有层来特征重用。但是如果该层的输出特征是冗余的或者不需要的,则这些连接会带来冗余。 -
CNN
网络可以通过权重剪枝从而在不牺牲模型准确率的条件下实现小型化。有不同粒度的剪枝技术:- 独立的权重剪枝:一种细粒度的剪枝,它可以带来高度稀疏的网络。但是它需要存储大量的索引来记录哪些连接被剪掉,并且依赖特定的硬件/软件设施。
filter
级别剪枝:一种粗粒度的剪枝,它得到更规则的网络,且易于实现。但是它带来的网络稀疏性较低。
-
CondenseNet
也可以认为是一种网络剪枝技术,它与以上的剪枝方法都不同:CondenseNet
的网络剪枝发生、且仅仅发生在训练的早期。这比在网络整个训练过程中都采用L1
正则化来获取稀疏权重更高效。CondenseNet
的网络剪枝能产生比filter
级别剪枝更高的网络稀疏性,而且网络结构也是规则的、易于实现的。
9.5.2 LGC
-
分组卷积在很多
CNN
网络中大量使用。在DenseNet
中,可以使用3x3
分组卷积来代替常规的3x3
卷积从而减小模型大小,同时保持模型的准确率下降不大。但是实验表明:在
DenseNet
中,1x1
分组卷积代替1x1
常规卷积时,会带来模型准确率的剧烈下降。对于一个具有 $ MathJax-Element-696 $ 层的
DenseNet Block
,1x1
卷积是第 $ MathJax-Element-775 $ 层的第一个操作。该卷积的输入是由当前DenseNet Block
内第 $ MathJax-Element-368 $ 层输出feature map
组成。因此采用1x1
分组卷积带来准确率剧烈下降的原因可能有两个:- 第 $ MathJax-Element-368 $ 层输出
feature
具有内在的顺序,难以决策哪些feature
应该位于同一组、哪些feature
应该位于不同组。 - 这些输出
feature
多样性较强,缺少任何一些feature
都会减小模型的表达能力。
因此将这些输出
feature
强制性的、固定的分配到不相交的分组里会影响特征重用。 - 第 $ MathJax-Element-368 $ 层输出
-
一种解决方案是:在
1x1
卷积之前,先对1x1
卷积操作的输入特征进行随机排列。这个策略会缓解模型准确率的下降,但是并不推荐。因为可以采用模型更小的
DenseNet
网络达到同样的准确率,而且二者计算代价相同。与之相比,特征混洗+1x1分组卷积
的方案并没有任何优势。 -
另一种解决方案是:通过训练来自动学习出
feature
的分组。考虑到第 $ MathJax-Element-368 $ 层输出
feature
中,很难预测哪些feature
对于第 $ MathJax-Element-642 $ 层有用,也很难预先对这些feature
执行合适的分组。因此通过训练数据来学习这种分组是合理的方案。这就是学习的分组卷积Learned Group Convolution:LGC
。 -
在
LGC
中:-
卷积操作被分为多组
filter
,每个组都会自主选择最相关的一批feature
作为输入。由于这组
filter
都采用同样的一批feature
作为输入,因此就构成了分组卷积。 -
允许某个
feature
被多个分组共享(如下图中的Input Feature 5、12
),也允许某个feature
被所有的分组忽略(如下图中的Input Feature 2、4
)。 -
即使某个
feature
被第 $ MathJax-Element-642 $ 层1x1
卷积操作的所有分组忽略,它也可能被第 $ MathJax-Element-645 $ 层1x1
卷积操作的分组用到。
-
9.5.3 训练和测试
-
CondenseNet
的训练、测试与常规网络不同。-
CondenseNet
的训练是一个多阶段的过程,分为浓缩阶段和优化阶段。-
浓缩阶段
condensing stage
:训练的前半部分为浓缩阶段,可以有多个condensing stage
(如下图所示有2个浓缩阶段)。每个
condensing stage
重复训练网络一个固定的iteration
,并在训练过程中:引入可以产生稀疏性的正则化、裁剪掉权重幅度较小的filter
。 -
优化阶段
optimization stage
:训练的后半部分为优化阶段,只有一个optimization stage
。在这个阶段,网络的
1x1
卷积的分组已经固定,此阶段在给定分组的条件下继续学习1x1
分组卷积。
-
-
CondenseNet
的测试需要重新排列裁剪后的filter
,使其重新组织成分组卷积的形式。因为分组卷积可以更高效的实现,并且节省大量计算。 -
通常所有的浓缩阶段和所有的优化阶段采取
1:1
的训练epoch
分配。假设需要训练 $ MathJax-Element-946 $ 个epoch
,有 $ MathJax-Element-543 $ 个浓缩阶段,则:- 所有的浓缩阶段消耗 $ MathJax-Element-957 $ 个
epoch
,每个浓缩阶段消耗 $ MathJax-Element-1034 $ 个epoch
。 - 所有的优化阶段也消耗 $ MathJax-Element-957 $ 个
epoch
。
- 所有的浓缩阶段消耗 $ MathJax-Element-957 $ 个
-
-
假设卷积核的尺寸为 $ MathJax-Element-601 $ ,输入通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ 。当采用
1x1
卷积核时4D
的核张量退化为一个矩阵,假设该矩阵表示为 $ MathJax-Element-1040 $ 。将该矩阵按行(即输出通道数)划分为同样大小的 $ MathJax-Element-1041 $ 个组,对应的权重为: $ MathJax-Element-1042 $ 。其中 $ MathJax-Element-1043 $ , $ MathJax-Element-1044 $ 对应第 $ MathJax-Element-582 $ 个分组的第 $ MathJax-Element-619 $ 个输出特征(对应于整体的第 $ MathJax-Element-1055 $ 个输出特征)和整体的第 $ MathJax-Element-620 $ 个输入特征的权重。
-
CondenseNet
在训练阶段对每个分组筛选出对其不太重要的特征子集。对于第 $ MathJax-Element-582 $ 个分组,第 $ MathJax-Element-620 $ 个输入特征的重要性由该特征在 $ MathJax-Element-582 $ 分组所有输出上的权重的绝对值均值来刻画: $ MathJax-Element-1083 $ 。如果 $ MathJax-Element-1085 $ 相对较小,则删除输入特征 $ MathJax-Element-620 $ ,这就产生了稀疏性。
-
为了缓解权重裁剪带来的准确率损失,这里引入
L1
正则化。因为L1
正则化可以得到更稀疏的解,从而使得删除 $ MathJax-Element-1085 $ 相对较小的连接带来的准确率损失较小(因为这些权重大多数为0 或者很小的值)。CondenseNet
中引入分组L1
正则化group-lasso
: $ MathJax-Element-1163 $ 。这倾向于将 $ MathJax-Element-1165 $ 的某一列 $ MathJax-Element-1190 $ 整体拉向 0 ,使得产生filter
级别的稀疏性(而不是权重级别的稀疏性)。
-
-
考虑到
LGC
中,某个feature
可以被多个分组分享,也可以不被任何分组使用,因此一个feature
被某个分组选取的概率不再是 $ MathJax-Element-1191 $ 。 定义浓缩因子 $ MathJax-Element-712 $ ,它表示每个分组包含 $ MathJax-Element-1293 $ 的输入。-
如果不经过裁剪,则每个分组包含 $ MathJax-Element-663 $ 个输入;经过裁剪之后,最终保留 $ MathJax-Element-1299 $ 比例的输入。
-
filter
裁剪融合于训练过程中。给定浓缩因子 $ MathJax-Element-712 $ ,则CondenseNet
包含 $ MathJax-Element-1301 $ 个condensing stage
(如上图中, $ MathJax-Element-1303 $ )。在每个
condensing stage
结束时,每个分组裁剪掉整体输入 $ MathJax-Element-1306 $ 比例的输入。经过 $ MathJax-Element-1301 $ 个condensing stage
之后,网络的每个分组仅仅保留 $ MathJax-Element-1293 $ 的输入。
-
-
在每个
condensing stage
结束前后,training loss
都会突然上升然后下降。这是因为权重裁剪带来的突变。最后一个浓缩阶段突变的最厉害,因为此时每个分组会损失
50%
的权重。但是随后的优化阶段会逐渐降低training loss
。下图中,学习率采用
cosine
学习率。 -
训练完成之后,
CondenseNet
引入index layer
来重新排列权重裁剪之后剩下的连接,使其成为一个1x1
分组卷积。- 训练时,
1x1
卷积是一个LGC
。 - 测试时,
1x1
卷积是一个index layer
加一个1x1
分组卷积。
下图中:左图为标准的
DenseNet Block
,中间为训练期间的CondenseNet Block
,右图为测试期间的CondenseNet Block
。 - 训练时,
-
在训练早期就裁剪了一些权重,而裁剪的原则是根据权重的大小。因此存在一个问题:裁剪的权重是否仅仅因为它们是用较小的值初始化?
论文通过实验证明网络的权重裁剪与权重初始化无关。
9.5.4 IGR 和 FDC
-
CondenseNet
对DenseNet
做了两个修改:-
递增的学习率
increasing growth rate:IGR
:原始的
DenseNet
对所有的DenseNet Block
使用相同的增长率。考虑到DenseNet
更深的层更多的依赖high-level
特征而不是low-level
特征,因此可以考虑使用递增的增长率,如指数增长的增长率: $ MathJax-Element-1404 $ ,其中 $ MathJax-Element-636 $ 为Block
编号。该策略会增加模型的参数,降低网络参数的效率,但是会大大提高计算效率。
-
全面的连接
fully dense connectivity:FDC
:原始的
DenseNet
中只有DenseNet Block
内部的层之间才存在连接。在CondenseNet
中,将每层的输出连接到后续所有层的输入,无论是否在同一个CondenseNet Block
中。如果有不同的
feature map
尺寸,则使用池化操作来降低分辨率。
-
-
对
LGC、LGR、FDC
的实验分析如下:(CIFAR-10
数据集)-
配置:默认 $ MathJax-Element-359 $ ,
3x3
卷积为分组数量为4的分组卷积。LGC:learned group convolution
:C=4
,1x1
卷积为LGC
。IGR:exponentially increasing learning rate
: $ MathJax-Element-1480 $ 。FDC:fully dense conectivity
。
-
相邻两条线之间的
gap
表示对应策略的增益。-
第二条线和第一条线之间的
gap
表示IGC
的增益。 -
第三条线和第二条线之间的
gap
表示IGR
的增益。 -
第四条线和第三条线之间的
gap
表示FDC
的增益。FDC
看起来增益不大,但是如果模型更大,根据现有曲线的趋势FDC
会起到效果。
-
-
9.5.5 网络性能
-
CondenseNet
与其它网络的比较:(*
表示使用cosine
学习率训练 600个 epoch) -
CondenseNet
与其它裁剪技术的比较: -
CondenseNet
的超参数的实验:(CIFAR-10
,DenseNet-50
为基准)-
裁剪策略:(
G=4
)Full Model
:不进行任何裁剪。Traditional Pruning
:在训练阶段(300个epoch)完成时执行裁剪(因此只裁剪一次),裁剪方法与LGC
一样。然后使用额外的300个 epoch 进行微调。
-
分组数量:(
C=8
)- 这里的分组值得是
3x3
分组卷积的分组数量。 - 随着分组数量的增加,测试误差逐渐降低。这表明
LGC
可以降低网络的冗余性。
- 这里的分组值得是
-
浓缩因子:(
G=4
)可以看到: $ MathJax-Element-1578 $ 可以带来更好的效益;但是 $ MathJax-Element-1580 $ 时,网络的准确率和网络的
FLOPs
呈现同一个函数关系。这表明裁剪网络权重会带来更小的模型,但是也会导致一定的准确率损失。
-
-
在
ImageNet
上的比较:-
网络结构:
为了降低参数,在
epoch 60
时(一共120
个epoch
)裁剪了全连接层FC layer
50% 的权重。思想与1x1
卷积的LGC
相同,只是 $ MathJax-Element-1613 $ 。 -
CondenseNet
与其它网络的比较: -
网络在
ARM
处理器上的推断时间(输入尺寸为224x224
):
-
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论