今天,主要和大家分享一下最近研究的卷积网络和它的一些变种。
首先,介绍一下基础的卷积网络。
通过PPT上的这个经典的动态图片可以很好的理解卷积的过程。图中蓝色的大矩阵是我们的输入,黄色的小矩阵是卷积核(kernel,filter),旁边的小矩阵是卷积后的输入,通常称为feature map。
从动态图中,我们可以很明白的看出卷积实际上就是加权叠加。
同时,从这个动态图可以很明显的看出,输出的维度小于输入的维度。如果我们需要输出的维度和输入的维度相等,这就需要填充(padding)。
现在我们来看看由padding带来的不同的Conv NN。
首先,我们来看一下不填充(valid)的Conv NN。
我们可以从PPT中的这个静态的图片看出:输出维度O、卷积核的维度K和输入维度I存在如下关系(公式-1)。其中,我们假定input和kernel都是正方形的,因此,我们可以用4表示4*4的input,3表示3*3的kernel。
当input的维度和output的维度相同时,这种padding叫做same padding。同时也叫做half padding。同样,我们可以根据PPT中的图片看出在包含padding的conv时,输出维度和输入维度对应的关系(公式-2)。其中,p表示padding的维度,在此处,我们同样假定会在长和宽这两个维度进行相同数目的padding。
当我们进行k/2的padding时,我们运用刚才的公式(公式-2)可以得到如下结果。同时如果k是奇数(2n+1),则通过推导可知刚好output维度 = input 维度。
当我们对输入数据的顺序很注重的时候,因果卷积(causal conv)便可以发挥作用。
Causal最初跟随WaveNets一起提出。WaveNets是一个生成模型,主要用来生成音乐。WaveNets是利用卷积来学习t时刻之前的输入数据(音频),来预测t+1时刻的输出。也就是说,该模型输出的最后的X的概率会是如公式-3 所示。在公式-3 和PPT中的动态图片中,我们可以看出,t时刻的输出仅仅依赖于1,2,…,t-1时刻的输入,不会依赖于t+1时刻以及之后时刻的输入。这与BiLSTM的思想截然不同。
当你的模型有这种特殊要求时,便可以采用casual。
在实现上,1D的casual 主要是通过padding来实现的。在2D的casual 主要是通过mask filter map来实现的。
以下是我在CHEMDNER数据集下做的简单的实验。其中输入采用的窗口大小为11. 从图中可以明显看出,没有经过仔细调参的CNN明显弱于BiLSTM,而valid形式的CNN要好于经过padding的CNN。这可能是由于padding会带来噪音,干扰模型。
下图,展示了利用CNN来进行NLP任务的流程。可以发现一般会使用多通道的CNN来学习输入的特征,并采用不同的kernel以及pooling。
下面,我们来看一下另一种卷积,扩展卷积(dilated)。扩展卷积目前在NLP上没有应用。主要是用于图像。
Dilated conv在ICLR 2016上提出。其主要作用是在不增加参数和模型复杂度的条件下,可以指数倍的扩大视觉野(每一个输出是由视觉野大小的输入所决定的)的大小。从下图中可以看出这一效果。蓝色的矩形表示视觉野。红色的小点表示kernel。在图a中,kernel是3*3,视觉野是3*3,dilated=1;在图b中,kernel是3*3,但是视觉野是7*7,dilated=2;在图c中,kernel是3*3,但是视觉野是15*15,dilated=4. 可以看出在dilated(扩展系数)扩大时,视觉野同样扩大。
下面,我们使用1D的数据来详细看一下dilated。从下图可以看出,当dilated=2时,每一个输出,“看到了”3个输入(虽然其中2-1=1被忽略了)。当dilated=4时,“看到了”5个输入(4-1=3个被忽略了)
从上面的分析可以看出,dilated与stride非常相似。但dilated与stride可以等同吗?
答案是否定的。我们可以将dilated看成是kernel稀疏化的一种模式。而stride只是dilated的一种特例。根据不同任务,我们可以设计不同的稀疏模式。并不一定要求在宽上的稀疏个数定于长上的稀疏个数。
下图是,论文中给出的效果。该任务是场景分割。Dilated是第4列,标准答案是第5列。可以看出dilated的结果好于其他模型。
下图同样是在CHEMDNER数据集下做的实验。可以看出dilated较小时与普通CNN性能相同。但较大时性能降低。
由于dilated会稀疏化kernel,所以可能对于NER任务不太适合。但是对于文档分类、关系抽取可能效果会好一些。
下面,我们来看一下反卷积(deconvolution)
我要讲的这篇论文是在CVPR 2010上发表。
Deconv在数学上,是反转卷积的效果。在deconv时,我们仅仅知道h,需要求f和g。然而,在conv时,我们知道g,通过正向传播和方向传播来修改f来得到最好的h。
目前,deconv在实际生活中已经用于信号处理、图像处理等方面。
在deep learning上,主要用于以下三个方面。
l
unsupervised learning: 重构图像
l
CNN可视化:将conv中得到的feature map还原到像素空间,来观察特定的feature map对哪些pattern的图片敏感
l Upsampling:上采样。
Deconv又被称为转置的卷积(transposed
conv)。
我们可以将图中conv的过程用矩阵相乘的形式写出来。其中C表示图中的第一个矩阵。X表示第二个矩阵。Y表示第三个矩阵。在公式的两边,同时乘C的转置便可得到反卷积。
由此可知,在前向传播是使用C,后向传播时使用CT便是普通的conv。反之,则是deconv。
下面,介绍一下deconv在图像重构上的应用。该任务主要是抽取图像的特征。下图是论文提供的结果。可以看出效果不错。
该任务采用的loss如图所示,是典型的重构误差+L1正则。
采用的deconv公式如下。表示重构的输入,z表示conv下的feature map,也就是我们任务的结果,f表示kernel。
旁边的图是系统的大概流程。图中F表示deconv,FT表示conv,P表示pool,U表示unpool。R表示F,U,F操作的联合。RT同理。
在一般的流程中(例如利用CNN来做图像分类时),我们首先将图像的像素点经过FT操作输入到z1层,然后通过P操作,然后得到第一层的输出。随后经过第二层的FT、P操作后,同样可以得到第二层的输出。随后,我们便可以用这个第二层的输出来做相关的任务。比如做图像分类。
但是在deconv中,我们需要反向这一个过程。在开始,假设我们的模型已经训练好了。我的任务是那手上的第二层的输出(同样假设我们已经得到),经过U操作、F操作,可以得到第一层的输出。随后再次经过相同的操作后,可以得到重构的输入。由于我们假设模型已经训练好了,故重构的输入与原始的输入相差会非常小。
下图是论文中所采用的3D pooling。与我们熟悉的2D的pooling的不同是3D
pooling首先经过2D pooling后,然后在不同的feature map之间再pool一次。所以是3D的。
而unpooling便是3D pooling 的反向过程。
经过3D pooling 和Unpooling后,可以看出结果稀疏了很多。这也是任务的需求。
介绍完大概流程,下面我们来了解一下模型如何训练。由于在deconv中f和g都不知道,所以需要固定f来最优化g和固定g来最优化f。具体来说,在本任务中,deconv中的filter,图片的feature map(z)未知,我们仅仅只知道原始的y,我们需要得到图片的z,也就是在前几页PPT中展示的图片的轮廓图。
为了便于理解,我们将使用训练好的模型称为inference,训练模型称为learning。Inference对应于固定f,最优化z。learning首先会进行inference操作后,然后再固定z,最优化f。
在inference过程中,分为三个步骤,首先在gradient step时,利用反向传播,可以得到loss对于z的梯度。用该梯度更新z。随后,在shirnkage step上,利用图示的函数来稀疏化z,其中,beta是超参。最后,在Pooling step上,经过P操作,便可以得到最后的第二层的输出。总的来说,在inference过程中,我们会重复执行这3步,直到发现最后的loss足够小。
在learning过程中,我们先经过inference后,然后再利用CG算法在固定z下,最优化f。重复经过这两步后,直到发现最后的loss足够下,则该模型已经训练好。
局部连接层(Locally-connected
layers)是conv的一个扩展。在conv中,所有的W都是共享的。但是在locally中,所有的参数并不是共享的。也就是说,在计算上,locally同样会利用W进行conv(加权叠加),但是这个W每个输入都会不一样。
Locally与conv相比,由于W不共享,因而模型能学习到更复杂的特征。同时也越容易过拟合。
下图同样是在CHEMDNER下做的实验。可以看出反卷积(transpose)微好于CNN-same。
下面介绍一下,图卷积(graph
convolution)。
我们首先不介绍graph conv的理论。我们首先介绍如何使用graph conv。
首先,我们知道图 G =(V,E),其中X表示顶点集V的特征,A表示图的结构信息,通常使用邻接矩阵。在一层的graph conv中,使用上层的输出Hl,A和本层的W作为输入,经过某种函数映射f后,便可以得到本层的输出。
下面,我们假设使用如图所示的函数σ。由于A是图的邻接矩阵,所以只有在当前点与其他点有连接的时候才会有值。这样AHW就会表示当前节点的所有邻居在上一层的输出乘以W。这样,我们通过函数σ就仅仅看到了当前点的局部连接。这与conv的局部连接非常相似。因此,我们可以从这一点来理解graph conv。同时,当我们使用多层的graph conv时,H2会利用H1的值,H1利用的是当前节点的1介邻居的信息,而H2便是利用当前节点1介和2介邻居的信息。
我们利用刚才函数的复杂版,在karate-club数据集上,随机初始化W,使用3层的graph conv,将最后的H3输出来,便可以得到如图的结果。可以看到在未训练时,节点之间的向量距离还不错(相同颜色的点距离较近)。
图中Ahat=A+I,Dhat表示Ahat节点度的对角矩阵。
在理论上,我们可以通过两种途径来解释graph
conv。
l 在频谱图理论中,卷积可以表示为矩阵的乘积。将该公式-4运用chebyshev多项式和其他的近似,我们可以得到公式-5.而公式-5 与我们刚才使用的函数σ是基本相同的。
l W-L算法告诉我们,我们可以使用当前节点的邻居表示它。
下面来做一下总结。
总结如下图所示。其中dilated可能在文本分类、关系抽取上会取得较好效果。