以图像分类任务为例,在表5.1所示卷积神经网络中,一般包含5种类型的网络层次结构:
CNN层次结构 | 输出尺寸 | 作用 |
---|---|---|
输入层 | W 1 × H 1 × 3 W_1\times H_1\times 3 W1×H1×3 | 卷积网络的原始输入,可以是原始或预处理后的像素矩阵 |
卷积层 | W 1 × H 1 × K W_1\times H_1\times K W1×H1×K | 参数共享、局部连接,利用平移不变性从全局特征图提取局部特征 |
激活层 | W 1 × H 1 × K W_1\times H_1\times K W1×H1×K | 将卷积层的输出结果进行非线性映射 |
池化层 | W 2 × H 2 × K W_2\times H_2\times K W2×H2×K | 进一步筛选特征,可以有效减少后续网络层次所需的参数量 |
全连接层 | ( W 2 ⋅ H 2 ⋅ K ) × C (W_2 \cdot H_2 \cdot K)\times C (W2⋅H2⋅K)×C | 将多维特征展平为2维特征,通常低维度特征对应任务的学习目标(类别或回归值) |
W 1 × H 1 × 3 W_1\times H_1\times 3 W1×H1×3对应原始图像或经过预处理的像素值矩阵,3对应RGB图像的通道; K K K表示卷积层中卷积核(滤波器)的个数;
W 2 × H 2 W_2\times H_2 W2×H2 为池化后特征图的尺度,在全局池化中尺度对应 1 × 1 1\times 1 1×1;
( W 2 ⋅ H 2 ⋅ K ) (W_2 \cdot H_2 \cdot K) (W2⋅H2⋅K)是将多维特征压缩到1维之后的大小, C C C对应的则是图像类别个数。
输入层(Input Layer)通常是输入卷积神经网络的原始数据或经过预处理的数据:
图像识别领域中原始三维的多彩图像
输入层输入的图像一般包含RGB三个通道,是一个由长宽分别为 H H H和 W W W组成的3维像素值矩阵 H × W × 3 H\times W \times 3 H×W×3,卷积网络会将输入层的数据传递到一系列卷积、池化等操作进行特征提取和转化,最终由全连接层对特征进行汇总和结果输出。根据计算能力、存储大小和模型结构的不同,卷积神经网络每次可以批量处理的图像个数不尽相同,若指定输入层接收到的图像个数为 N N N,则输入层的输出数据为 N × H × W × 3 N\times H\times W\times 3 N×H×W×3。
音频识别领域中为经过傅利叶变换的二维波形数据,
自然语言处理中为一维表示的句子向量。
卷积层(Convolution Layer)通常用作对输入层输入数据进行特征提取,通过卷积核矩阵对原始数据中隐含关联性的一种抽象。卷积操作原理上其实是对两张像素矩阵进行点乘求和的数学操作,其中一个矩阵为输入的数据矩阵,另一个矩阵则为卷积核(滤波器或特征矩阵),求得的结果表示为原始图像中提取的特定局部特征。图5.1表示卷积操作过程中的不同填充策略,上半部分采用零填充,下半部分采用有效卷积(舍弃不能完整运算的边缘部分)。
激活层(Activation Layer)负责对卷积层抽取的特征进行激活,由于卷积操作是由输入矩阵与卷积核矩阵进行相差的线性变化关系,需要激活层对其进行非线性的映射。激活层主要由激活函数组成,即在卷积层输出结果的基础上嵌套一个非线性函数,让输出的特征图具有非线性关系。卷积网络中通常采用ReLU来充当激活函数(还包括tanh和sigmoid等)ReLU的函数形式如公式(5-1)所示,能够限制小于0的值为0,同时大于等于0的值保持不变。
f ( x ) = { 0 if x < 0 x if x ≥ 0 (5-1) f(x)=\begin{cases} 0 &\text{if } x<0 \\ x &\text{if } x\ge 0 \end{cases} \tag{5-1} f(x)={0xif x<0if x≥0(5-1)
池化层又称为降采样层(Downsampling Layer),作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低输出特征尺度,进而减少模型所需要的参数量。
最大池化(Max Pooling)
平均池化(Average Pooling)
求和池化(Sum Pooling)
全连接层(Full Connected Layer)负责对卷积神经网络学习提取到的特征进行汇总,将多维的特征输入映射为二维的特征输出,高维表示样本批次,低维常常对应任务目标。
在卷积神经网络中,卷积常用来提取图像的特征,但不同层次的卷积操作提取到的特征类型是不相同的
卷积层次 | 特征类型 |
---|---|
浅层卷积 | 边缘特征 |
中层卷积 | 局部特征 |
深层卷积 | 全局特征 |
卷积核大小 (Kernel Size)
定义了卷积的感受野 在过去常设为5,如LeNet-5;现在多设为3,通过堆叠 3 × 3 3\times3 3×3的卷积核来达到更大的感受域
卷积核步长 (Stride)
定义了卷积核在卷积过程中的步长 常见设置为1,表示滑窗距离为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时相当于对特征组合降采样
填充方式 (Padding)
在卷积核尺寸不能完美匹配输入的图像矩阵时需要进行一定的填充策略
输入通道数 (In Channels)
指定卷积操作时卷积核的深度 默认与输入的特征矩阵通道数(深度)一致;在某些压缩模型中会采用通道分离的卷积方式
输出通道数 (Out Channels)
指定卷积核的个数 若设置为与输入通道数一样的大小,可以保持输入输出维度的一致性;若采用比输入通道数更小的值,则可以减少整体网络的参数量
卷积类别 | 作用 |
---|---|
标准卷积 | 最常用的卷积核,连续紧密的矩阵形式可以提取图像区域中的相邻像素之间的关联关系, 3 × 3 3\times3 3×3的卷积核可以获得 3 × 3 3\times3 3×3像素范围的感受视野 |
扩张卷积(带孔卷积或空洞卷积) | 引入一个称作扩张率(Dilation Rate)的参数,使同样尺寸的卷积核可以获得更大的感受视野,相应的在相同感受视野的前提下比普通卷积采用更少的参数。同样是 3 × 3 3\times3 3×3的卷积核尺寸,扩张卷积可以提取 5 × 5 5\times5 5×5范围的区域特征,在实时图像分割领域广泛应用 |
转置卷积 | 先对原始特征矩阵进行填充使其维度扩大到适配卷积目标输出维度,然后进行普通的卷积操作的一个过程,其输入到输出的维度变换关系恰好与普通卷积的变换关系相反,但这个变换并不是真正的逆变换操作,通常称为转置卷积(Transpose Convolution)而不是反卷积(Deconvolution)。转置卷积常见于目标检测领域中对小目标的检测和图像分割领域还原输入图像尺度。 |
可分离卷积 | 标准的卷积操作是同时对原始图像 H × W × C H\times W\times C H×W×C三个方向的卷积运算,假设有 K K K个相同尺寸的卷积核,这样的卷积操作需要用到的参数为 H × W × C × K H\times W\times C\times K H×W×C×K个;若将长宽与深度方向的卷积操作分离出变为 H × W H\times W H×W与 C C C的两步卷积操作,则同样的卷积核个数 K K K,只需要 ( H × W + C ) × K (H\times W + C)\times K (H×W+C)×K个参数,便可得到同样的输出尺度。可分离卷积(Seperable Convolution)通常应用在模型压缩或一些轻量的卷积神经网络中,如MobileNet [ 1 ] ^{[1]} [1]、Xception [ 2 ] ^{[2]} [2]等 |
3D卷积操作如图所示,同样分为单通道和多通道,且**假定只使用1个卷积核,**即输出图像仅有一个通道。
对于单通道输入,与2D卷积不同之处在于,输入图像多了一个深度(depth)维度,卷积核也多了一个 k d k_d kd维度,因此3D卷积核的尺寸为 ( k h , k w , k d ) (k_h, k_w, k_d) (kh,kw,kd),每次滑窗与 ( k h , k w , k d ) (k_h, k_w, k_d) (kh,kw,kd)窗口内的值进行相关操作,得到输出3D图像中的一个值。
对于多通道输入,则与2D卷积的操作一样,每次滑窗与3个channels上的 ( k h , k w , k d ) (k_h, k_w, k_d) (kh,kw,kd)窗口内的所有值进行相关操作,得到输出3D图像中的一个值。
池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling),往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。
图像具有一种“静态性”的属性,在一个图像区域有用的特征极有可能在另一个区域同样有用。因此,为了描述一个大的图像,很直观的想法就是对不同位置的特征进行聚合统计。例如,可以计算图像在固定区域上特征的平均值 (或最大值)来代表这个区域的特征。
一般池化(General Pooling)
通常包括最大池化(Max Pooling)和平均池化(Mean Pooling)。以最大池化为例,池化范围 ( 2 × 2 ) (2\times2) (2×2)和滑窗步长 ( s t r i d e = 2 ) (stride=2) (stride=2) 相同,仅提取一次相同区域的范化特征。
1 × 1 1\times 1 1×1卷积的作用:
举例
在不考虑参数偏置项的情况下,若输入和输出的通道数为 C 1 = 16 C_1=16 C1=16。则左半边网络模块所需的参数为 ( 1 × 1 + 3 × 3 + 5 × 5 + 0 ) × C 1 × C 1 = 8960 (1\times1+3\times3+5\times5+0)\times C_1\times C_1=8960 (1×1+3×3+5×5+0)×C1×C1=8960;假定右半边网络模块采用的 1 × 1 1\times1 1×1卷积通道数为 C 2 = 8 C_2=8 C2=8 ( 满 足 C 1 > C 2 ) (满足C_1>C_2) (满足C1>C2),则右半部分的网络结构所需参数量为 ( 1 × 1 × ( 3 C 1 + C 2 ) + 3 × 3 × C 2 + 5 × 5 × C 2 ) × C 1 = 5248 (1\times1\times (3C_1+C_2)+3\times3\times C_2 +5\times5\times C_2)\times C_1=5248 (1×1×(3C1+C2)+3×3×C2+5×5×C2)×C1=5248 ,可以在不改变模型表达能力的前提下大大减少所使用的参数量。
卷积层核池化层在结构上具有一定的相似性,都是对感受域内的特征进行提取,并且根据步长设置获取到不同维度的输出,但是其内在操作是有本质区别的
卷积层 | 池化层 | |
---|---|---|
结构 | 零填充时输出维度不变,而通道数改变 | 通常特征维度会降低,通道数不变 |
稳定性 | 输入特征发生细微改变时,输出结果会改变 | 感受域内的细微变化不影响输出结果 |
作用 | 感受域内提取局部关联特征 | 感受域内提取泛化特征,降低维度 |
参数量 | 与卷积核尺寸、卷积核个数相关 | 不引入额外参数 |
不一定
缺点:
会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。
卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个 3 × 3 3\times 3 3×3卷积核可以获得与 5 × 5 5\times 5 5×5卷积核相同的感受视野,同时参数量会更少( 3 × 3 × 2 + 1 3×3×2+1 3×3×2+1 < $ 5×5×1+1$)
优点:
文本特征有时又需要有较广的感受域让模型能够组合更多的特征(如词组和字符)
卷积核的大小并没有绝对的优劣,需要视具体的应用场景而定,但是极大和极小的卷积核都是不合适的,单独的 1 × 1 1\times 1 1×1极小卷积核只能用作分离卷积而不能对输入的原始特征进行有效的组合,极大的卷积核通常会组合过多的无意义特征从而浪费了大量的计算资源。
可以,经典的神经网络一般都属于层叠式网络,每层仅用一个尺寸的卷积核,如VGG结构中使用了大量的 3 × 3 3×3 3×3卷积层。
同一层特征图也可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好。比如GoogLeNet、Inception系列的网络
优点
可以简化卷积层内部的结构,每一个输出的特征像素都由所有通道的同一个区域提取而来。
缺点
缺乏灵活性,并且在深层的网络结构中使得运算变得相对低效,
更为灵活的方式是使区域和通道的卷积分离开来,通道分离(深度分离)卷积网络由此诞生。
首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道特征矩阵之后,再对这批新通道特征进行标准的 1 × 1 1×1 1×1跨通道卷积操作。
宽卷积、窄卷积其实是一种填充方式
宽卷积('SAME’填充)
对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致
窄卷积('SAME’填充)
不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输出特征维度可能会略小于输入特征的维度。
输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
过程如下:
输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1 + 4 − 1 = 4 1+4-1=4 1+4−1=4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图
将4个特征图进行步长为3的相加; 输出的位置和输入的位置相同。步长为3是指每隔3个像素进行相加,重叠部分进行相加,即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。
可以看出翻卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小 得到 o u t = ( i n − 1 ) ∗ s + k out = (in - 1) * s + k out=(in−1)∗s+k 上图过程就是$ (2 - 1) * 3 + 4 = 7$。
增加数据
使用更大批次
在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式
调整数据分布
模型过多地学习某类数据容易导致其输出结果偏向于该类型的数据
调整目标函数
调整网络结构
在浅层卷积神经网络中,参数量较少往往使模型的泛化能力不足而导致欠拟合,此时通过叠加卷积层可以有效地增加网络参数,提高模型表达能力;在深层卷积网络中,若没有充足的训练数据则容易导致模型过拟合,此时通过简化网络结构减少卷积层数可以起到提高模型泛化能力的作用
数据增强(数据增广)
通过平移、旋转、加噪声等一些列变换来增加训练数据,同类数据的表现形式也变得更多样,有助于模型提高泛化能力,需要注意的是数据变化应尽可能不破坏元数数据的主体特征(如在图像分类任务中对图像进行裁剪时不能将分类主体目标裁出边界)。
权值正则化
一般是在损失函数中添加一项权重矩阵的正则项作为惩罚项,用来惩罚损失值较小时网络权重过大的情况,此时往往是网络权值过拟合了数据样本(如 L o s s = f ( W X + b , y ′ ) + λ η ∑ ∣ W ∣ Loss=f(WX+b,y')+\frac{\lambda}{\eta}\sum{|W|} Loss=f(WX+b,y′)+ηλ∑∣W∣)。
屏蔽网络节点(dropout)
该方法可以认为是网络结构上的正则化,通过随机性地屏蔽某些神经元的输出让剩余激活的神经元作用,可以使模型的容错性更强。
自然语言处理是对一维信号(词序列)做操作,输入数据通常是离散取值(例如表示一个单词或字母通常表示为词典中的one hot向量)
计算机视觉则是对二维(图像)或三维(视频流)信号做操作。输入数据是连续取值(比如归一化到0,1之间的- 灰度值)。
CNN有两个主要特点
区域不变性
滤波器在每层的输入向量(图像)上滑动,检测的是局部信息,然后通过pooling取最大值或均值。pooling这步综合了局部特征,失去了每个特征的位置信息。这很适合基于图像的任务,比如要判断一幅图里有没有猫这种生物,你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里,词语在句子或是段落里出现的位置,顺序,都是很重要的信息。
局部组合性
CNN中,每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征.这在CV里很好理解,像素组合成边缘,边缘生成形状,最后把各种形状组合起来得到复杂的物体表达。在语言里,当然也有类似的组合关系,但是远不如图像来的直接。而且在图像里,相邻像素必须是相关的,相邻的词语却未必相关。
分离卷积操作:https://baijiahao.baidu.com/s?id=1634399239921135758&wfr=spider&for=pc
如何评价Google的Xception:https://www.zhihu.com/question/62478193
https://github.com/scutan90/DeepLearning-500-questions
https://github.com/NLP-LOVE/ML-NLP
https://github.com/songyingxin/NLPer-Interview