0

深入理解CNN及其网络架构设计

 2 years ago
source link: https://allenwind.github.io/blog/7890/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

深入理解CNN及其网络架构设计

尽管RNN是了不起的设计,但是在实践中,CNN更受青睐,尤其是计算力不够的情况。

在最初学习神经网络时,大家都可能做过MNIST分类任务,使用的模型就是多层感知机(又称为前馈神经网络、全链接网络),然后也得到很好的性能,其实主要是数据集简单。然而,在复杂的任务中,多层感知机存在两个问题:

  1. 难以提取局部不变性特征

为解决这两个问题,引入卷积神经网络(Convolutional Neural Network, CNN或ConvNet),一种具有局部连接、权重共享等特性的深层前馈神经网络。说白了就是使用卷积运算来替代Dense网络中的矩阵乘法运算。

CNN具有如下三种特点:

  1. 局部链接(相邻两层的神经元只在指定窗口内存在链接)
  2. 权重共享(滤波器对于指定层的所有的神经元都是相同 )
  3. 汇聚(起下采样、降维作用)

设滤波器长度(大小)为mm,权重为[w1,…,wm][w1,…,wm],它和一个序列类型数据,如时间序列x=[x1,…,xn]x=[x1,…,xn]的卷积为,

yt=m∑k=1wk⋅xt−k+1yt=∑k=1mwk⋅xt−k+1

其中t=1,2,3,…,nt=1,2,3,…,n,ytyt为卷积后的结果。可以看到,卷积运算就是对序列从左到右按固定大小的滑动窗口相乘后求和,和数学中的卷积不同的是计算结果不需要反转,因此也称为互相关(cross-correlation)运算。

类似地,给定一个图像X∈RM×NX∈RM×N,和滤波器大小为X∈Rm×nX∈Rm×n,那么卷积结果为,

yij=m∑u=1n∑v=1wuv⋅xi−u+1,j−v+1yij=∑u=1m∑v=1nwuv⋅xi−u+1,j−v+1

通常情况下,m<M,n<Nm<M,n<N​。

它们的互相关为,

yij=m∑u=1n∑v=1wuv⋅xi+u−1,j+v−1yij=∑u=1m∑v=1nwuv⋅xi+u−1,j+v−1

CNN 可以说是和我们人类处理视觉问题的过程十分相似,从左到右,由上到下去扫描视野中的内容,然后聚焦。

二维卷积示意图,

filters:滤波器数量,一个滤波器指一个权重独立的卷积核。

kernel_size:卷积核大小,一般是奇数组合,如(3,5)方便取整。

strides:步长,每次滑动窗口移动的大小,可以成倍减少输出维度。

data_format:channels_last (default) or channels_first。

padding:”valid”:不处理、不允许超过边界;”causal”:不让看到右边数据;”same”:填充边界使得输出和原理大小一致。

dilation_rate:卷积核膨胀率。

目前的卷积神经网络一般由卷积层、汇聚层(Pooling)和全连接层交叉堆叠而成 。

输出尺寸计算

假设输入样本为n×n×3n×n×3,卷积核为f×ff×f,步长为ss,padding为pp,那么卷积后输出的尺寸为:

m=⌊n+2p−fs⌋+1m=⌊n+2p−fs⌋+1

注意到是向下取整结果。

卷积核大小

卷积核的大小一般是一般是奇数组合,其关乎模型的感受野和模型参数量。在相同感受野情况下,卷积核大小越大,模型的参数就越多,反之则越小。

对于1×11×1的卷积核则比较特殊,在不改变感受野的情况下,起到对数据的降维或升维作用,即channel的大小的改变。无论是对数据的降维或升维,得到的新输出的每个channel的信息都来自上一层所有channel信息的组合,因此1×11×1的卷积可以让各个channel的信息互相交互。1×11×1卷积本身也是可学习参数,因此模型的复杂度增加,如果该卷积核还配合激活函数使用,可以提升模型的非线性特性,增强拟合能力。

因此,总结来说,1×11×1卷积作用大致有三点:

  • 对数据的降维或升维
  • 增加非线性(激活函数的存在)
  • 促进跨channel信息的交互

转置卷积也称为反卷积(Deconvolution) ,可以实现低纬特征到高纬特征的转换。

考虑普通卷积情况。假设有一个5维的向量xx,在卷积核w=[w1,w2,w3]⊤w=[w1,w2,w3]⊤的操作下,获得的3维向量可以表示为,

y=w⊗x=⎡⎢⎣w1w2w3000w1w2w3000w1w2w3⎤⎥⎦xy=w⊗x=[w1w2w3000w1w2w3000w1w2w3]x

我们另这个矩阵为,

C=⎡⎢⎣w1w2w3000w1w2w3000w1w2w3⎤⎥⎦C=[w1w2w3000w1w2w3000w1w2w3]

这是一个稀疏矩阵。而转置卷积则是矩阵CC​​的转置的卷积,

x=C⊤y=⎡⎢ ⎢ ⎢ ⎢ ⎢ ⎢⎣w100w2w10w3w2w10w3w200w3⎤⎥ ⎥ ⎥ ⎥ ⎥ ⎥⎦yx=C⊤y=[w100w2w10w3w2w10w3w200w3]y

因此可以看到,转置卷积实现低纬特征到高纬特征的转换。通常,转置卷积用在生成任务上。

膨胀卷积也称为空洞卷积,在卷积核中插入空洞以扩大感受野而又不增加参数。其卷积过程可以用下图描述,

膨胀大小一般依次取r=1,2,4,8,16,…r=1,2,4,8,16,…,通过层堆叠且每层按指数扩大膨胀率来获得长距离依赖。取 dilated rate 为 2n2n​,n 为层数。膨胀卷积适合处理长序列,如传感器的多维时间序列、长文本等等。

这里可以对比下LSTM中的门机制,

z=tanh(XW1+b1)⊗σ(XW2+b2)z=tanh⁡(XW1+b1)⊗σ(XW2+b2)

像LSTM模型一样,可以给卷积一个Gate,控制信息的流通

Y=Conv1(X)⊗σ(Conv2(X))Y=Conv1⁡(X)⊗σ(Conv2⁡(X))

注意上式是两个卷积,超参数一致但不共享权重。这种门机制早在RNN上就存在,只不过把它迁移到CNN上。

当然不止是CNN可以这么做,其他的网络结构也可以,即,

Y=fW1(X)⊗σ(fW2(X))Y=fW1(X)⊗σ(fW2(X))

Gated ConvNet 来自论文 Convolutional Sequence to Sequence Learning

残差结构及其推广

众所周知,残差网络在CNN中相对流行,并有很多扩展。

ResNet

Y=X+f(X)Y=X+f(X)

如果层ff使用relu(x)relu⁡(x)激活函数,那么负数取值会失活,这时通过叠加原来ff的输入xx避免神经元进入失活状态,从而解决梯度消失问题。

结合以上门卷积,我们有残差门卷积,这也是很自然得到的结构,

Y=X+Conv1(X)⊗σ(Conv2(X))Y=X+Conv1⁡(X)⊗σ(Conv2⁡(X))

不过要注意两者的维度要一致,如果不一致可以通过一定的形状变换技巧处理为一致。注意到,假如σ(Conv2(X))→0σ(Conv2⁡(X))→0上述结构依旧有信息往下游流动,确保信息没有丢失。因此残差结构不仅仅解决梯度消失问题。

论文WAVENET: A GENERATIVE MODEL FOR RAW AUDIO中,把残差结构、膨胀卷积结合起来在生成模型中获得很好的效果。

以上结构推广开来,有Highway Networks。

Highway Networks

Highway Networks 的结构,

y=H(x,WH)⋅T(x,WT)+x⋅(1−T(x,WT))y=H(x,WH)⋅T(x,WT)+x⋅(1−T(x,WT))

需要注意以上变量的形状一致。TT为transform门,可以理解为把信息xx分为量部分,它们的比例分别是T(x,WT)T(x,WT)和1−T(x,WT)1−T(x,WT),前以部分用于H(x,WH)H(x,WH),后一部分不加处理保留。可以看到,残差结构为其特例。如果另T(x,WT)=σ(Conv2(X),H(x,WH)=Conv1(X)T(x,WT)=σ(Conv2⁡(X),H(x,WH)=Conv1⁡(X),那么有,

y=Conv1(X)⋅σ(Conv2(X))+x⋅(1−σ(Conv2(X)))y=Conv1⁡(X)⋅σ(Conv2⁡(X))+x⋅(1−σ(Conv2⁡(X)))

这不就是我们熟悉的形式!

DenseNet

DenseNet把所有层以前馈形式连接,从而起到特征重用的可能。DenseNet的缺点是内容不友好。

我一般把池化层分为两大类:

  • 非参数化池化
  • 参数化池化

非参数化池化

非参数化池化包括SumPooling、AveragePooling、MaxPooling、GlobalAveragePooling、GlobalMaxPooling。在NLP、时间序列等序列类型数据中,考虑序列非定长,池化的时候需要Mask处理。

参数化池化

在处理序列数据时,直接使用SumPooling、AveragePooling、MaxPooling、GlobalAveragePooling、GlobalMaxPooling都有点粗暴,容易带来噪声。考虑到池化的目的是汇聚信息(保留关键信息,去掉次要信息,因此也可以理解为特殊的采样方式),这个过程也可以参数化。如何参数化?答案在论文Neural machine translation by jointly learning to align and translate中,其提到一种加权平均向量序列来获得背景向量的方法,当然这只是基本思路或者说是启发,那么如何计算加权平均的权重呢?很简单,既然是神经网络,那就让权重也自己学习出来就好了。假设有向量序列,注意是向量序列,即每个元素也是向量,

x=[x1,…,xn]x=[x1,…,xn]

考虑到不定长的情况存在,如在传感器的多维时序中,不同样本的长度是不一样的。计算权重直接用两个全连接网络,

[α1,…,αn]=softmax(wTtanh(Wx))[α1,…,αn]=softmax⁡(wTtanh⁡(Wx))

然后加权平均,

pool(x)=n∑i=1αixi=softmax(wTtanh(Wx))xpool⁡(x)=∑i=1nαixi=softmax⁡(wTtanh⁡(Wx))x

如果序列是不定长,处理好掩码问题。我们可以认为,这也是注意力机制的一种,不过没有query,也就是没有主动聚焦的信息点,因此可以把以上方法理解为一种参数化的显著性注意力。为提高信息的整合能力,毕竟把序列变为向量,或多或少会丢失信息。此池化方法甚至可以多头化,即类似于Attention Is All You Need中提到的多头注意力,不过要注意过拟合问题。

需要注意,无论那种Pooling操作,如果数据是时间序列,那么结果肯定是导致位置信息丢失。那么,参数化池化的好处是能够根据下游任务筛选信息。

在CV中,常见的Pooling还有ROI Pooling(Region of Interest),最早是在论文Fast R-CNN中提出,用于把相关区域抽出出来。

如果是文本序列的池化,相关的方法还有很多,后期有空再分享。

论文Convolutional Sequence to Sequence Learning在用CNN处理Seq2Seq问题提及Position Embeddings,为向量序列提供位置信息,比较CNN并不能像RNN一样,天然地把位置信息融入到编码序列中。因此,如果使用CNN架构,可以使用Position Embeddings强化位置的概念。

有趣的是,同样是解决Seq2Seq问题的论文Attention Is All You Need,提到一种基于Sin、Cos的位置信息的编码方法,

PEpos,2i=sin(pos100002id)PEpos,2i+1=cos(pos100002id)PEpos,2i=sin⁡(pos100002id)PEpos,2i+1=cos⁡(pos100002id)

有了位置向量后,同一个字或词由于其位置不同,那么其向量也是不同。那么,至于Seq2Seq问题,是纯Attention方案好还是CNN+Attention方案好呢?答案交给时间吧。

此外,还可以使用可学习的位置Embedding,即

˜xi=xi+Embedding(i)x~i=xi+Embedding⁡(i)

加强CNN的位置感。从另外一个角度看,这种方式增加模型的参数和非线性,加强模型的拟合能力。以上论文提到,通过参数学习的 position embedding 的效果和采用固定的 position embedding 相差无几,不过后者计算量更少。

CNN在文本上的应用

CNN、TextCNN、VDCNN、RCNN、DPCNN、DGCNN等模型,后期再展开。在序列建模中,CNN比RNN的优势是并行训练。事实上,CNN在解决NLP问题已经成为标配。

本文我们讲述了普通卷积、膨胀卷积、门卷积、残差结构以及这些结构的组合等常用CNN网络架构。还包括参数化的池化层以及增强CNN位置感的PositionEmbedding,这些都是CNN模型的应用技巧。

Wide & Deep融入网络中的深层特征与浅层特征,能够更好地权衡泛化风险与特征挖掘的问题,这也是CNN网络中常见的一种架构之一。此外,还有分组卷积(GroupCNN)、深度可分离卷积等架构,后期有需要再深入。

[1] Language Modeling with Gated Convolutional Networks

[2] WAVENET: A GENERATIVE MODEL FOR RAW AUDIO

[3] Neural machine translation by jointly learning to align and translate

[4] Highway Networks

[5] http://colah.github.io/posts/2015-08-Understanding-LSTMs/

[6] Densely Connected Convolutional Networks


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK