机器学习中各种卷积的来历及计算

0. 目的

这个问题确实挺迷惑人,在面试中也常被问到,因此做个人总结。
比起计算方法,各种卷积的来历及用处,更加重要。
参考:
各种卷积的计算上文的中文翻译
各种卷积的来历

1. 为什么DL中用互相关?

数学意义上的卷积: ( f ∗ g ) ( t ) = ∫ − ∞ ∞ f ( τ ) g ( t − τ ) d τ (f*g)(t)=\int_{-\infty}^\infty f(\tau)g(t-\tau)d\tau (fg)(t)=f(τ)g(tτ)dτ
DL中的卷积: f ( t ) # g ( t ) = ∫ − ∞ ∞ f ( τ ) g ( τ ) d τ f(t)\#g(t)=\int_{-\infty}^\infty f(\tau)g(\tau)d\tau f(t)#g(t)=f(τ)g(τ)dτ (这正是互相关的定义)
在这里插入图片描述

DL中,直接将“互相关”称之为“卷积”更加方便。这没什么问题,因为过滤器 g ( τ ) g(\tau) g(τ)的weight是在训练阶段学习到的。如果DL用数学中的卷积,那么经过训练后,学习得到的过滤器看起来就会像是 g ( − τ ) g(-\tau) g(τ) ,前后各需要翻转一次,不如直接用互相关。

DL中使用Conv算子来提取特征,具有共享权值、提取空间相关性、平移不变性的特点。

2. 普通conv

多变一的过程;

conv2d

input 5x5, w 3x3,stride=1, pad=0, output=3x3,乘法81次,加法72次。
输出channel>1,就是有多个w,就是上述过程独立做多次,然后沿z轴拼接;

shape计算(向下取整): o = ⌊ i + 2 p − k s ⌋ + 1 o=\lfloor\frac{i+2p-k}{s}\rfloor+1 o=si+2pk+1

多通道conv2d

input 5x5x20, w 3x3x20,stride=1, pad=0, output=3x3,乘法1620次,加法1611(7220+919)次。
每一次,先相同层对应乘加,最后将所有输入通道累加。
输出channel>1,就是有多个w,就是上述过程独立做多次,然后沿z轴拼接;

其过滤器w和输入层input的depth是一样的;3D 的w仅沿着 2 个方向(图像的高&宽)移动。这样操作得出的结果就是一个 2D 图像(仅有 1 个通道)。

conv3d

3D 卷积是 2D 卷积的一般化,过滤器w的深度小于等于输入层input的深度;
input 5x5x20, w 3x3x3,stride=1, pad=0, output=3x3x18,乘法3*3*18*27=4374次,加法3*3*18*26=4212次。
每一次,w在三个方向移动,从input中抠出来跟w形状相同的一部分数据做乘加,得到也是3D的输出。
输出channel>1,就是有多个w,就是上述过程独立做多次,然后沿z轴拼接;

例如在 CT 和 MRI 等生物医学图像的 3D 分割/重建中,这些图像的目标如血管都是蜿蜒分布在 3D 空间中的。

3. 1x1conv

input HxWxD,filter 1x1xD,输出HxWx1,K个filter的话,最终输出HxWxK。
1x1conv最初在 Network-in-network 的论文提出,并被广泛应用于google inception系列论文中,其优点:

  • 降维;
  • 进行更有效率的低维度嵌入,或者对特征进行池化;
  • 卷积以后方便加非线性激活函数

1x1Conv与FC:
这里有个八卦,当年FCN得到CVPR’15 best paper honorable mention的时候,Yann LeCun等人出来吐槽这个’FCN’的概念早就有了,AlexNet里面的fully connected layer (FC)本身就是个误导,因为FC layer可以看成是1x1的convolution, 本来就可以输入任意大小的图片。
举例来说:
input HxWxD, filter HxWxD, N个filter,总output 1x1xN
FC中,input 1x1xD, filter 1x1xD, N个filter,总output 1x1xN,完全等效。

4. 转置卷积/反卷积

一变多的过程,带参上采样;
应用:生成高分辨率图像、自动编码器、语义分割…

从技术上来说,信号处理中的“反卷积”是“卷积”的逆操作,跟这里所说的“转置卷积”不一样。正因为此,一些论文作者强烈反对将转置卷积称作反卷积,而大众要这样称呼主要是为了简单起见。

有意思啊,DL中的卷积其实不是卷积而是互相关,DL中的反卷积其实也不是反卷积而是转置乘。

可以直接使用卷积来实现转置卷积,x 2x2,w 3x3,
y = conv_transpose(x,w) =conv(x, p=2,s=1, w) 4x4
也可以反过来看,x=conv(y,w);
y卷积w可得x,x反卷积同一个w可得y,难怪大家愿称之为“反卷积”。
在这里插入图片描述
那为什么说,严谨地,应该称之为“转置卷积”呢?因为,卷积在计算机中实际上是通过矩阵乘计算的,转置卷积就是将矩阵转置后乘。

注意:“转置卷积”操作并不是可逆的,也就是说,转置卷积只能恢复输入特征图的大小,并不能恢复输入特征图的每个元素值。

注意:按元素推导,见吴恩达cs230课程

转置卷积中的棋盘效应:
当k无法被s整除时,转置卷积就会出现「不均匀重叠」。这种「不均匀重叠」会造成图像中某个部位的颜色比其他部位更深,因而会带来「棋盘效应」。实际上,不均匀重叠区域会在二维上更加极端。因为二维上的两个模式会相乘,因而最终的不均匀性是原来的平方。

避免转置卷积中棋盘效应:

  1. k被s整除
  2. s=1
  3. 先把input插值,再卷积,使重叠的部分只有一个数据是有效的。

5. 空洞卷积/扩张卷积/Atrous Conv

本质上是在不增加计算成本的情况下扩大感受野。

下面这两篇论文对空洞卷积(Dilated Convolution)进行了介绍:

Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs

Multi-scale context aggregation by dilated convolutions

直观上,空洞卷积通过在卷积核部分之间插入空洞让卷积核「膨胀」。这个增加的参数 l l l(空洞率)表明了我们想要将卷积核放宽到多大,或者说,在相邻卷积核元素之间插入 l − 1 l-1 l1个空洞。
在这里插入图片描述
(l=1,相邻填充0个空洞,感受野3x3;l=2,相邻填充1个空洞,感受野7x7;l=4,相邻填充3个空洞,感受野15x15)

6. 可分离卷积

6.1 深度可分离卷积

输入HxWxD,K个mxmxD的w,输出(H-m+1)x(W-m+1)xK
将滤波器拆解为D个mxmx1的分别与输入的对应通道乘加,得到(H-m+1)x(W-m+1)xD;再用K个1x1xm的滤波器做卷积,最终得到(H-m+1)x(W-m+1)xK。
在这里插入图片描述
普通卷积的乘法次数: N c = ( H − m + 1 ) ⋅ ( W − m + 1 ) ⋅ K ⋅ m ⋅ m ⋅ D N_c=(H-m+1)\cdot(W-m+1)\cdot K\cdot m\cdot m\cdot D Nc=(Hm+1)(Wm+1)KmmD;
深度分离卷积乘次数: N d = ( H − m + 1 ) ⋅ ( W − m + 1 ) ⋅ D ⋅ m ⋅ m + ( H − m + 1 ) ⋅ ( W − m + 1 ) ⋅ K ⋅ D N_d=(H-m+1)\cdot(W-m+1)\cdot D\cdot m\cdot m+(H-m+1)\cdot(W-m+1)\cdot K\cdot D Nd=(Hm+1)(Wm+1)Dmm+(Hm+1)(Wm+1)KD
H=W=7,D=3,N=128,m=3时,上式分别为86,400 次和10,275 次。
则深度可分离卷积的乘法次数是原来的 1 m 2 + 1 K \frac{1}{m^2}+\frac{1}{K} m21+K1,当 K > > m 2 K>>m^2 K>>m2时,前式约等于 1 m 2 \frac{1}{m^2} m21,非常可观了!

深度分离卷积应用普遍(例如在 MobileNetXception 中),因为对任何shape的weight都可以大大降低计算量。

这么棒,有什么缺点吗?有,可学习的参数变少,模型可能是次优的。

6.2 空间可分离卷积

mxm的卷积核,拆解为一个mx1的卷积核和一个1xm的卷积核。
假设input维度N,s=1,p=0
普通卷积的乘法次数 N c = ( N − m + 1 ) 2 ⋅ m 2 N_c=(N-m+1)^2\cdot m^2 Nc=(Nm+1)2m2
空间可分离卷积的乘法次数 N d = ( N − m + 1 ) ⋅ N ⋅ m + ( N − m + 1 ) 2 ⋅ m N_d = (N-m+1)\cdot N\cdot m+(N-m+1)^2\cdot m Nd=(Nm+1)Nm+(Nm+1)2m
则空间可分离卷积的乘法次数是原来的 N ( N − m + 1 ) ⋅ m + 1 m \frac{N}{(N-m+1)\cdot m}+\frac{1}{m} (Nm+1)mN+m1,当 N > > m N>>m N>>m时,前式约等于 2 m \frac{2}{m} m2

虽然空间可分离卷积节省了计算成本,但是它很少应用于深度学习中,因为,并不是所有的卷积核都能被拆分为 2 个更小的卷积核。如果我们用这种空间可分离卷积来取代所有传统的卷积,就会束缚我们去搜寻所有可能存在的卷积核,训练结果可能是次优的。

6.3 扁平化卷积

最初在这篇论文中提出,与空间可分离卷积类似.
输入HWD,weight RCD,拆为三个级联的weight:11D R11 1C1.

它也很少应用,因为对滤波器进行分离会导致大量信息丢失。

7. 分组卷积

AlexNet 对分组卷积进行了介绍,目的是让网络在内存不足的两个 GPU 上训练。

使用分组卷积的网络有很多,如Xception,MobileNet,ResNeXt,shuffleNet等。这些网络存在一个很大的弊端是采用了密集的1x1 pointwise convolution。

传统的卷积操作中每一个输出的通道都与输入的每一个通道相连接,通道之间是一个稠密连接。分组卷积中输入和输出的通道被分为K个组,每个组的输出通道只和对应组内的输入通道相连接,与其它通道无关(channel sparse connection)。

分组卷积不等效于普通卷积。

分组卷积优点:

  • 参数更少
  • 分组有利于并行化训练
  • 组件相关性更低(大牛解释

Depthwise Group Convolution

Xception和MobileNet采用了depthwise convolution,这是一种比较特殊的group convolution,此时分组数恰好等于通道数,意味着每个组只有一个特征图。

Pointwise Group Convolution

ShuffleNet 认为 1x1 卷积的计算成本也很高,提议也对 1x1 卷积进行分组。

Shuffle Group Concolution

channel shuffle,其含义就是对分组卷积之后的特征图进行“重组”,这样可以保证接下来的分组卷积的输入来自不同的组,因此信息可以在不同组之间流转。
注意:shuffle不是任意随机,而是均匀打乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值