Bootstrap

神经网络中的1x1卷积核

本文参考自CVer公众号的文章"一文读懂神经网络中的1x1卷积核",但我在读他的文章时觉得作者对1x1卷积核的理解或阐述有失偏颇,特此记文来发表我的看法,文中图片都摘自CVer的博文。

在介绍卷积神经网络中的1x1卷积之前,首先回顾卷积网络的基本概念。

1. 卷积核(convolutional kernel):可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸(一般是奇数x奇数)。

卷积核的个数就对应输出的通道数(channels),这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(HxWxC,C代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积核总的个数(一般理解为,卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,所以这里是192x128个不同参数的卷积核)。 

 

2. 池化/汇合(pooling个人认为翻译成汇合更合理):卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。池化/汇合就是这样一个操作,对于每个卷积通道,将更大尺寸(以图片为例,就是整幅图片原始大小)上的卷积特征进行汇合(Average/Max pooling)就可以得到更有全局性的特征, 相当于是对一幅图片中不同部位(cross region)的特征进行了整合。

而1x1卷积可以看作一个cross channel的汇合操作,它可以跨通道组织信息,提高网络的表达能力,同事可以对输出通道升维和降维。

下面从一般卷积过程介绍1x1的卷积,下面图像来表示卷积的过程: 

 

 

1x1卷积核

说1x1卷积核,不得不提 ‘网中网(Network in Network)' , NIN摒弃了卷积层线性级联的做法,在卷积层后面连接多层MLP(后接非线性激活函数)来提高卷积层之间的非线性表示能力。

这里通过一个例子来直观地介绍1x1卷积。输入6x6x1的矩阵,这里的1x1卷积形式为1x1x1,即为元素2,输出也是6x6x1的矩阵。但输出矩阵中的每个元素值是输入矩阵中每个元素值x2的结果。

 

 

上述情况,并没有显示1x1卷积的特殊之处,那是因为上面输入的矩阵channel为1,所以1x1卷积的channel也为1,并不能体现1x1卷积的魅力所在。

让我们看一下真正work的示例。当输入为6x6x32时,1x1卷积的形式是1x1x32。若只有一个1x1卷积核,此时输出为6x6x1。此时便可以体会到1x1卷积的实质作用:降维。当1x1卷积核的个数小于输入channels数量时,即发生降维。

注意,下图中第二行左起第二幅图像中的黄色立方体即为1x1x32卷积核,而第二行左起第一幅图像中的黄色立方体即是要与1x1x32卷积核进行叠加运算的区域。

 

 

1x1卷积,可以看成一种全连接(full connection)

我们先来考虑kernel_size = [1,1,6,5] #h=1, w=1, n_in=6, n_out=5的1x1卷积核,我们将这6x5个卷积核以神经元的形式展现:第一层有6个神经元,分别是a1—a6,通过全连接之后变成5个,分别是b1—b5,第一层的六个神经元要和后面五个实现全连接,本图中只画了a1—a6连接到b1的示意,可以看到,在全连接层b1其实是前面6个神经元的加权和,权重对应的就是w1—w6,到这里就很清晰了,这w1——w6就是6个不同的1x1卷积核. 而要完成这个6x5的全连接层就需要6x5个不同的1x1卷积核。

到这里同学们应该就有疑惑了,普通的卷积核也是这样前向操作的啊不同输入通道的卷积结果对应相加然后堆叠形成输出通道。但是!1x1卷积核线性组合的是输入通道的信息,准确的说是输入通道的线性变换信息,1x1卷积核参数充当线性组合系数。而普通卷积核是将各输入通道的信息进行卷积后再累加,不是线性组合各通道信息。

 

 

注:1x1卷积一般只改变输出通道数(channels),而不改变输入数据的宽度和高度

 

1x1卷积核作用

简单总结下它的作用,原文用了几张张量动画图,反而把看官们给看晕了。

1、降维/升维:由于 1×1 并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。

2、增加非线性:1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数, 同学们应该都知道深度学习之所以有这么强的表示能力,很大程度上归功于这些action function).

3、跨通道信息交互(with respect to channel ): 使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合,例如 [3, 3, 64] 的卷积核后面添加一个 [1, 1, 28] 的卷积核,就变成了 [3, 3, 28] 的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。

 

1x1卷积应用

1、Google Inception

  1. 这一点孙琳钧童鞋讲的很清楚。1×1的卷积层引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,mlpconv=convolution+mlp(NIN结构中为2层的mlp, 在NIN的caffe中实现上,mlpconv=convolution+1×1convolution+1×1convolution. 
  2.  进行降维和升维引起人们重视的是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128, 5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。

 

3、ResNet

ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入的通道数减小,参数数量进一步减少,如下图的结构。

;