本篇博客主要对《Deep Learning》第九章卷积神经网络的基本内容进行简要总结,以便加强理解和记忆。其中一些内容由于翻译问题和笔者学习程度尚浅,仍有很多不理解的地方,等以后再进行补充和修正。
卷积神经网络(卷积网络CNN)是一种专门用来处理具有网格结构数据的神经网络,它在神经网络中的至少一层上使用卷积运算来代替一般的矩阵乘法运算。
卷积运算是一种特殊的线性运算,是两个实值函数相乘的一种数学运算
设自变量与x有关的函数 f ( x ) g ( x ) f(x)g(x) f(x)g(x),其中 f ( x ) f(x) f(x)称为输入, g ( x ) g(x) g(x)称为核函数,卷积结果有时称为特征映射,则
f f f与 g g g的卷积运算可抽象表示为: ( f ∗ g ) ( x ) (f*g)(x) (f∗g)(x)
连续型卷积: ( f ∗ g ) ( x ) = ∫ − ∞ ∞ f ( x ) g ( n − x ) d x (f*g)(x)=\int_{-∞}^∞ f(x)g(n-x)dx (f∗g)(x)=∫−∞∞f(x)g(n−x)dx
离散型卷积: ( f ∗ g ) ( x ) = ∑ − ∞ ∞ f ( x ) g ( n − x ) d x (f*g)(x)=\sum_{-∞}^∞ f(x)g(n-x)dx (f∗g)(x)=∑−∞∞f(x)g(n−x)dx
1)离散型卷积:抛筛子
抛两次筛子,求两次筛子点数之和为4的概率:
P ( n = 4 ) = f ( 1 ) ∗ g ( 3 ) + f ( 2 ) ∗ g ( 2 ) + f ( 3 ) ∗ g ( 1 ) = ∑ 1 3 f ( x ) g ( 4 − x ) = ( f ∗ g ) ( x ) P (n=4) = f(1)*g(3) + f(2)*g(2) + f(3)*g(1)=\sum_1^3 f(x)g(4-x) = (f*g)(x) P(n=4)=f(1)∗g(3)+f(2)∗g(2)+f(3)∗g(1)=∑13f(x)g(4−x)=(f∗g)(x)
2)连续型卷积:进出水问题
有一个水桶(假设水桶足够大)有两个孔,一个进水,一个出水,进水量是关于时间x的函数f(x);进入的水经过出水,剩余水量的比例也是关于时间x的函数g,求从x=0时刻开始,时刻x=t时水桶中的水的量
V ( t ) = ∫ 0 t f ( x ) g ( t − x ) d x V(t) = \int_0^t f(x)g(t-x) dx V(t)=∫0tf(x)g(t−x)dx
在上述两个实际的例子中,我们将问题域以外的函数值都设为0,那么整个实数域上的卷积运算则可缩小至在有限问题域上的运算
上述卷积的定义包括卷积的例子都是一维的(Toeplitz矩阵),这一维度往往是时间/决策步,将运算扩展到2维的矩阵(双重块循环矩阵)时,常用于对图像(像素矩阵)的处理
S ( i , j ) = ( I , K ) ( i , j ) = ∑ m ∑ n I ( m , n ) K ( i − m , j − n ) S(i,j) = (I,K)(i,j) = \sum_m \sum_n I(m,n)K(i-m,j-n) S(i,j)=(I,K)(i,j)=∑m∑nI(m,n)K(i−m,j−n)
给出具体的计算示例
有一张图像上有许多噪点(高频信号就如同平地中耸立的山峰)为了去除这些噪点,使得图像更加平滑(铲平山峰)可以通过取局部平均的方式(将这些山峰的土挖掉均匀铺在平地上)
设核矩阵为: g = [ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ] g=\begin{bmatrix} \frac 1 9 & \frac 1 9 & \frac 1 9 \\ \frac 1 9 & \frac 1 9 & \frac 1 9 \\ \frac 1 9 & \frac 1 9 & \frac 1 9 \end{bmatrix} g=⎣ ⎡919191919191919191⎦ ⎤
令图像的所有像素点与核矩阵做卷积运算,即可实现平滑化(这里为简单起见使用的是算数平均,而非高斯分布矩阵)
平滑后得到:
1)翻转
卷积运算具有可交换性,体现在对输入数据的翻转(实际仅是输入的计算顺序互逆)
S ( i , j ) = ( I , K ) ( i , j ) = ∑ m ∑ n I ( m , n ) K ( i − m , j − n ) ≌ ∑ m ∑ n I ( i − m , j − n ) K ( m , n ) = ( K , I ) ( i , j ) S(i,j) = (I,K)(i,j) = \sum_m \sum_n I(m,n)K(i-m,j-n) ≌ \sum_m \sum_n I(i-m,j-n)K(m,n) = (K,I)(i,j) S(i,j)=(I,K)(i,j)=∑m∑nI(m,n)K(i−m,j−n)≌∑m∑nI(i−m,j−n)K(m,n)=(K,I)(i,j)
2)互相关函数
与卷积运算几乎一样,但并不翻转核,许多机器学习库中的卷积由它代替,且经常也被称为卷积运算
S ( i , j ) = ( I , K ) ( i , j ) = ∑ m ∑ n I ( i + m , j + n ) K ( m , n ) S(i,j) = (I,K)(i,j) = \sum_m \sum_n I(i+m,j+n)K(m,n) S(i,j)=(I,K)(i,j)=∑m∑nI(i+m,j+n)K(m,n)
核的规模远小于输入的规模,这意味着相比于全连接的MLP而言,我们需要的参数更少,这可以理解为我们限制了该层输出与输入的连接数,不仅减小了模型的存储需求也提高了统计效率。
1)从输入元素的角度看,每个输入元素影响的输出更少
3)处于卷积浅层的输出单元受输入单元影响的个数会减小,但处于更深层的单元,它们受卷积层输入单元的影响的个数并不会减少。若网络还包含类似步幅卷积或池化的结构,这种现象会加强
1)卷积层单元的多个函数使用相同的参数,参数共享保证我们只需要学习一个参数集合,而非每一个单元都要学习一组单独的参数。这没有减少传播的速度,但是减少了参数的存储消耗
2)右图中由于卷积的参数共享,3元素核的中间参数被同时影响了所有输出MP,左图全连接中的一个参数只能影响一个输出MP
1)等变表示:若一个函数满足输入改变,输出也以同样方式改变的性质,该函数就是等变的。特别地,若函数 f ( x ) , g ( x ) f(x),g(x) f(x),g(x)满足: f ( g ( x ) ) = g ( f ( x ) ) f(g(x)) = g(f(x)) f(g(x))=g(f(x)),我们就说函数 f ( x ) f(x) f(x)对于变换g具有等变性
2)对于卷积而言,令g是输入的任意平移函数,那么卷积函数对于g是等变的,即对矩阵和卷积核先卷积运算再平移与先平移再卷积等价
3)卷积对其他的一些变换不是天然的,如对图像尺寸和角度的变换,需要一些其他的机制处理这些变换
在神经网路中应用卷积运算与数学上直接进行的卷积运算略有所不同
每当像素矩阵与卷积核进行一次卷积运算时,可以看作对图像提取了一种类型的特征。实际应用中,我们希望在神经网络的一层里能够提取多种不同类型的特征。这时每一次卷积操作都包含了像素矩阵同多个卷积核进行一次卷积运算。
1)多道输入描述
对于灰度图而言,像素矩阵的每一个位置都是一个0-255的标量,但是对于彩色图而言,像素矩阵的每一个位置都是RGB三通道的向量,因而卷积计算的方式会发生一定改变。具体而言,可以将彩色图的像素矩阵以颜色通道的维度分成3个矩阵,这时描述单张图像的输入数据则变为了3维张量
另外,由于深度学习的训练往往使用batch或minibatch的方式,每次训练会选择多张图像,由此可以增加第四维
故对输入的描述是4维的:
①通道索引
②某通道像素矩阵的x索引
③某通道像素矩阵的y索引
④图像索引
2)多道卷积核描述
为了适应多通道的卷积操作,卷积核也需要是多通道的,且输入与卷积核的通道数相等(这时卷积运算不一定是可交换的)
另外,我们会在卷积操作的线性乘法之后增加一个偏置,该偏置可以是每个卷积核使用一个共享的偏置;可以是以通道为维度划分,每个通道共享一个偏置或是对应于每一个输出位置都设置一个单独的偏置。
因而对卷积核的描述也是4维的:
①通道索引
②某通道卷积核矩阵的x索引
③某通道卷积核矩阵的y索引
④偏置索引
3)多核卷积运算规则(这里不给出解析描述,只通过易于理解的图像计算示例)
如上述所示,左侧零填充后的3个蓝色矩阵分别为图像3个通道的像素矩阵,中间2组红色矩阵是2个卷积核,每个卷积核都有对应于输入通道的的3个滤波器。另外在2组卷积核最后还有以卷积核为维度划分的卷积核共享的2个偏置。
计算方法为:每个通道的像素矩阵分别与对应通道的滤波器矩阵相乘并在同一位置进行相加,最后再加上偏置得到一个仿射输出
4)下采样卷积
有时在进行卷积运算时为了降低计算开销(相应的代价是提取的特征没有之前那么好了)会在对像素矩阵进行逐块卷积时,跳过一些块,跳过的块数称为下采样卷积的步幅,当步幅为1则与常规的卷积运算相同。
如图,下图为运算时步幅为1时但输出步幅为2,上图为在运算时就设置了步幅为2的下采样卷积,每隔一块做一次卷积运算
5)不同维度和结构的输入数据进行卷积运算的任务
1)为何进行零填充
如果不进行零填充,表示的宽度在每一层就会缩减,缩小后输出的长为:M-m +1,宽为:N-n+1,对输入填充0允许我们对核的宽度和输出的大小进行独立的控制。若不进行0填充,我们就只能让空间宽度的快速缩减,或只能选择一个很小的核
2)填充方法
①有效卷积valid:不填0,输出像素的表示更加规范,但输出的大小会在每一层缩减,若卷积核的规模很大,缩减速度会显著增加,这限制了网络的层数,当层数增加时,网格的空间维度最终会缩减到1×1而不能再进行有意义的卷积了
②相同卷积same:填充足左右、上下m-1,n-1个来保持输出和输入有相同的大小,这种情况下,网络能够包含任意多的卷积层。但是输出像素靠近边界的部分相比于中间部分对输出像素的影响更小,这可能会导致边界像素存在一定程度的欠表示。
③全卷积full:它进行了足够多的0填充使得每个像素在每个方向上被访问了k次,最终输出图像的宽度为m+k-1。这种填充方法会使得输出像素中靠近边界的部分相比于中间部分是更少像素的函数,这将导致学得一个在卷积特征映射的所有位置都表现不错的单核更为困难。
通常零填充的最优数量在valid和same之间
两个网络层之间采用局部连接而不采用全连接,这符合卷积层稀疏连接的特点。但与之不同的是,卷积层不仅采用了稀疏连接,还采用了参数共享,而局部连接则没有采用共享的参数,在局部连接之间使用各自独立的边权。
这样做的动机是:当我们知道每一个特征都是一小部分空间的函数而不是整个空间的特征时,局部连接层是有用的,例如对象识别中我们判断一张图片是否为人脸时只需要寻找嘴巴是否在图像下部分的中央即可。
从参数共享上,对卷积层和局部连接层进行折中,拼贴卷积学习一组核卷积,在进行卷积运算时循环使用每个核卷积。
相比于局部连接的独立边权,增加了参数共享;
相比于卷积层增加了参数集合的独立参数个数,削弱了共享性。
1)通过卷积定义的矩阵转置的乘法,可以用于计算通过卷积层反向传播误差的导数,还可以用于从隐藏层重构可视化单元。其大小取决于三个方面:零填充策略、前向传播的步幅、前向传播的输出大小
2)从隐藏层单元重构可视化单元,包括自编码器、RBM和稀疏编码等
3)训练任意深度的前馈卷积网络、训练带有(基于卷积转置的)重构函数网络(具体推导解析式略)
需要的算法:卷积、从输出到权重的反向传播、从输出到输入的反向传播
1)Fourier变换
2)通过组合方法使用可分离核的外积执行一个n维的卷积运算
在包含了卷积层和全连接层的卷积神经网络中,计算代价更多在于卷积层的提取特征,而非全连接层学习映射函数。原因是经过卷积和池化在全连接层的特征维度已经缩小了很多,但是在卷积层则需要面对大维度的卷积核学习。
1)为了减少卷积层的学习成本,可以采用一些无监督的方法来获得卷积核(卷积层的参数学习)
①简单地随机初始化卷积核(随机过滤器,具有天然的频率选择和平移等变)
②手动设计卷积核,如设计卷积核为在特定方向或尺度来检测边缘
③通过无监督的方法学习卷积核,如将k聚类算法用于小图像块,然后用学得的中心作为卷积核
2)中间方法:介于监督学习和无监督学习之间的方法。不需要在每个梯度步骤中都进行完整的前向和反向传播,利用逐层贪心式预训练,独立地训练第一层,然后从第一层独立地提取所有特征一次,将这些特征隔离地训练第二层。
3)无监督地学习卷积层的好处难以说清,可认为无监督预学习相对于监督学习提供了一定的正则化,它直观地减少了计算成本允许我们训练更大的结构。
池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出
最大池化、平均池化、L2范数池化、依靠距中心像素距离的加权平均池化
1)池化综合了全部邻居的反馈,使得池化单元可以少于探测单元,因而我们可以通过综合池化区域k个像素的统计特征而不是单个像素来实现,这提高了网络的统计效率也降低了对参数的存储需求
2)池化对于处理不同大小的输入具有重要作用,如分类层的输入必须是固定大小的,但输入图像的大小不一,通过动态调整池化区域与输入矩阵相适应可以使得分类层总能接收到相同数量的统计特征而不论图像最初的输入大小了。
3)池化可能会使得一些自顶向下信息的神经网络结构变得复杂(如玻尔兹曼机和自编码器)
1)无论采用什么样的池化函数,当输入作少量平移时,池化能够帮助我们实现表示的近似不变,这种近似不变是指天然的平移不变性,即将输入平移一个微小的量,大多数通过池化函数的输出值不会发生改变。
如下图,当输入图像向右平移一个单位时,输入数据在每个位置都发生了改变,但是通过最大池化函数,输出结果仅有一半发生了改变
局部平移不变性很重要,尤其在关注某个特征是否出现而不关心它具体的位置时。但在一些领域,保存特征的具体位置却很重要。
池化函数对局部平移具有天然的不变性,但对其他的变换则没有,如果想模型对输入的某些变换具有不变性,则需要通过多道方法:使用分离的参数学得多个特征,再利用池化函数进行池化。
如下图,使用三个学得的滤波器(卷积运算的提取特征)和一个池化函数可以学得对旋转变换的不变性,三个滤波器尝试匹配不同方向的5,任意一个过滤器匹配到5都会在探测单元(激活函数)中引起大的激活,然后无论哪个探测单元被激活,最大池化单元都有大的激活
卷积神经网络的卷积层通常有三级:
①第一级中,卷积层并行地进行多个卷积运算来产生一组线性激活函数
②第二级中,非线性的激活函数(如ReLU)作用在第一级的每个线性输出上,这一级也称探测级
③第三级中,使用池化函数进一步调整卷积层的输出
先验的强弱取决于概率密度的集中程度
1)弱先验:有较高的熵(不确定性强,可视为我们对这种先验的把握不大,它更容易随着观察数据而改变)
2)强先验:有较低的熵(确定性强,可视为我们对这种先验的把握很大,它不容易随着观察数据而改变)
我们可以将卷积看作在MLP层中增加了无限强的先验概率分布,即:
①一个隐藏单元的权值必须和它邻居的权值相等,但在空间中改变(参数共享)
②除了那些处在隐藏空间连续的小的接受域内的权值以外,其余的权值均为零(稀疏连接)
该先验使该层学得的函数只包含局部连接关系,并对平移具有等变性。
池化也可以看作是一种无限强的先验:每一个单元都具有少量的平移不变性
将卷积神经网络看作无限强先验的MLP会导致极大的计算浪费,但可以帮助观察卷积神经网络是如何工作的
1)卷积和池化可能会导致欠拟合:如果一项任务依赖于保存精确的空间信息,那么在所有特征上使用池化会增大训练误差
2)当我们比较卷积的表现时,只能以基准中的其他卷积模型作为比较的对象
卷积神经网络不仅可以预测分类和回归任务,还可以用于输出高维的结构化对象,通常这个结构化对象是一个张量,由标准卷积层产生。如张量S,其元素 S i , j , k S_{i,j,k} Si,j,k表示输入像素(i,j)属于种类k的概率。这允许模型标记图像中的每个像素,并绘制沿着单个对象轮廓的精确掩模。
先产生图像标签的原始猜测,再用相邻像素之间的交互来修正该原始猜测。重复这个修正步骤相当于在每一步使用相同的卷积,该卷积在深层网络的最后几层之间共享权重,这形成了一种特殊的循环卷积网络结构
对全部像素预测的进一步处理,可以获得图像在区域上的分割。一般的想法是假设大片相连的像素倾向于相同的标签,图模型可以描述相邻像素间的概率关系。卷积网络还可以被训练用于最大化近似图模型的训练目标
由于大步幅的池化,输出矩阵比输入矩阵小
解决方法:
①避免把池化放在一起
②不做处理,产生一张低分辨率的标签网格
③使用单步幅的池化操作