版权声明:本文为博主原创文章,未经博主允许不得转载
论文:Inverted Residuals and Linear Bottlenecks Mobile Networks for Classification, Detection and Segmentation
链接:https://arxiv.org/abs/1801.04381
Tensorflow源码:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet
2018CVPR的文章,提出的MobileNet V2是对MobileNetV1的改进。
1.Inverted resdual block。传统的Residual block是先经过一个1*1的Conv layer,把feature map的通道数缩减下来,减少3*3Conv layer的计算量,最后在经过1*1扩增并和输入相加。
而现在我们中间的3*3卷积变Depthwise,计算量急剧缩减,提升通道数会使得结果更好,固先通过1*1卷积提升通道数,在Depthwise 3*3Conv,最后经过1*1卷积降低维度并和输入相加(如果dwise 的stride不为1,不采用shoutcut).
2.Linear Bottlenecks。去掉了Elitwise sum之前1*1conv的非线性激活层(relu6,以便于移动端设备低精度的时候),减少了对特征的破环。MobileNet V1是很早之前的工作,一直没有人占坑,google就挂了出去,所以并没有去掉Relu。Xception验证了Depthwise卷积后面加Relu效果会变差,作者猜想可能是Depthwise的输出太浅容易带来信息丢失。
Related Work:
先是提到了 manual architecture search 和improvements in training algorithms,接着提到parmaeter optimization、various methods of network pruning、connectivity learning(稀疏连接),最后又提到将遗传算法和强化学习等优化算法引入结构搜素(非常复杂)。
Preliminaries, discussion and intuition:
Depthwise Separable Convolution:
Linear Bottlenecks:这部分有点难懂,如有错误请指正。
In other words, when we look at all individual d-channel pixels of a deep convolutional layer, the information
encoded in those values actually lie in some manifold,which in turn is embeddable into a low-dimensional subspace。
每个通道的值编码着manifold,感兴趣的manifold可以压缩到低维空间。
MobileNetV1通过Width multiplier parameter把感兴趣的manifold压缩到低维空间,也就是说压缩了特征信息,然而此时加上非线性激活层,那么就会存在丢失信息。
Relu会破环信息,如果层数足够的话,信息可能会保留在其他通道里,我的理解就是层数多的话,信息会冗余,那么Relu破坏的信息可能存在于其他channel。如果信息可以压缩到低维中,Relu在保留信息的同时引入所需的复杂(非线性)。
作者总结了两点:
1. If the manifold of interest remains non-zero volume after ReLU transformation, it corresponds to a linear transformation.
2. ReLU is capable of preserving complete information about the input manifold, but only if the input manifold lies in a low-dimensional subspace of the input space.
如果感兴趣的manifold经过ReLU变换后仍保持非零,则它对应于一个线性变换。
ReLU层可以保留input manifold的信息,但是只有当input manifold是输入空间的一个低维子空间时才有效。这点我不是特别明白,我理解成降维的时候,input manifold如果可以贯穿在低维空间中,那么Relu可能会保留感兴趣的manifold。经验来说,线性操作可以防止非线性破坏太多的信息。
Inverted residuals:
大致意思MobileNet V2通过提高Inputdim缓解了dwise后面接非线性激活层带来的影响。
shoutcut使得网络更深了。
Memory efficient inference:
这一块我不是特别明白,就简单讲下,有错误请指正。
看了知乎的一个大神的解释,假设我们把旁路的多个卷积on the fly去做, 那么读写的带宽需求是:eltwise加的时候主路feature读, 以及eltwise 输出写。 v2的特点是eltwise部分channel少, 所以省带宽。
t-way split:看了源码,理解就是split,然后在concat,我认为add比较合适(借鉴ResNeXt)。假设我最后层的通道数为c,c比较小,所以split的各个拓扑在最后输出的时候都为c,那么add 既可以用到所有层的信息,也有了split的效果,高效利用了内存。按照源码,最后各个拓扑输出c/t,t个拓扑concat输出c,这样就会存在输出只跟某部分输入有关,信息交流就差了很多,文章初衷可能是提速。那么为什么传统的ResNet效果对带宽不友好呢?个人认为即使旁路的计算量很小,但eltwise+ 的特征很大,只有bottleneck这块带宽,所以带宽上就比较吃紧。
Inverted resdual block
MobileNet V1主要是引入了depthwise separable convolution来实现spatial和channel的解耦,减少了参数量以及运算量,而在网络结构上采用了vgg堆叠的方式。MobileNet V2采用了Resnet,DenseNet等网络结构,复用图像特征,使用concat/eltwise等操作进行融合,提高网络的性价比。
Depthwise conv确确实实大大降低了计算量,但同时引来了特征退化问题。Group加上Relu的影响,使得神经元很容易输出为0(无法恢复),在文章中,google也解释了特征/神经元退化问题,对特征可视化。
Inverted residual block的优点:
复用特征。
缓解了特征退化问题:通过1*1升维提高Inputdim来缓解特征的退化情况。MobileNet v1中提到用width multiplier来缩减模型通道的缩减,这样特征信息更加集中在缩减后的特征通道,经过Relu会有更大的损失,MobileNet V2就是通过提高Inputdim缓解了dwise后面接非线性激活层带来的影响。论文中提到的一个合理解释是:对于Dwise conv,其特征是单channle的,所以非线性有害,可能造成了信息丢失。
提高了网络效率:这一点我没没太看懂。具体就看上面的吧。
左边图(a)是关于non-linearity的效果(蓝色曲线),证明了Linear Bottlenecks的有效性.右边图(b)是关于inverted residual(蓝色曲线)和传统residual(绿色曲线)的差别,证明了inverted residual的有效性.
其中:t表示扩张倍数,c表示输出通道,n表示重复次数,s表示步长。