文章目录
1. 卷积的数学定义
从数学上讲,卷积就是一种运算。
我们称 ( f ∗ g ) ( n ) (f*g)(n) (f∗g)(n)为 f , g f,g f,g的卷积,其连续定义为:
( f ∗ g ) ( n ) = ∫ − ∞ ∞ f ( τ ) g ( n − τ ) d τ (1) (f*g)(n)=\int_{-\infty}^{\infty} f(\tau)g(n-\tau)d\tau \tag 1 (f∗g)(n)=∫−∞∞f(τ)g(n−τ)dτ(1)
离散定义为:
( f ∗ g ) ( n ) = ∑ τ = − ∞ ∞ f ( τ ) g ( n − τ ) (2) (f*g)(n)=\sum_{\tau=-\infty}^{\infty} f(\tau)g(n-\tau) \tag{2} (f∗g)(n)=τ=−∞∑∞f(τ)g(n−τ)(2)
不妨记 x = τ , y = n − τ x=\tau,y=n-\tau x=τ,y=n−τ,则有 x + y = n x+y=n x+y=n,体现在坐标轴上就是一条过点 ( 0 , n ) (0,n) (0,n)且斜率为-1的直线。
1.1 举例:离散卷积
设有两个骰子,现在同时掷出,请问点数之和为4的概率是多少?
解:设骰子A掷出为x的概率是 f ( x ) f(x) f(x),骰子B掷出为y的概率是 g ( y ) g(y) g(y),则点数之和为4的概率为
( f ∗ g ) ( 4 ) = ∑ τ = 1 6 f ( τ ) g ( 4 − τ ) (3) (f*g)(4)=\sum_{\tau=1}^{6} f(\tau)g(4-\tau) \tag{3} (f∗g)(4)=τ=1∑6f(τ)g(4−τ)(3)
显然,这是上文提出的离散卷积形式。
1.2 举例:连续卷积
假设你现在开始做馒头,由于做的越多越累,你做馒头的速度并不是恒定的。设第 x x x秒的做馒头速度为 f ( x ) f(x) f(x);做好的馒头会渐渐腐败,一个做好的馒头经历 y y y秒的腐败程度为 g ( y ) g(y) g(y)。求第n秒所有做好的馒头的总腐败程度。
解:微积分角度考虑,第 t t t秒到第 t + Δ t t+\Delta t t+Δt秒之间做了 c c c个馒头,则这个 c c c个馒头直到最后的腐败程度为: c × g ( n − t ) c \times g(n-t) c×g(n−t)。故 0 − n 0-n 0−n秒之间做的所有馒头总腐败程度为:
∫ 0 n f ( t ) g ( n − t ) d t (4) \int_{0}^{n} f(t)g(n-t)dt \tag{4} ∫0nf(t)g(n−t)dt(4)
显然,这是上文提出的连续卷积形式。
2. 二维离散卷积
2.1 二维卷积的简单案例
假设你身处草原,但是眼前一个很陡的小山丘令你感到不爽,于是你用铁锹把小山丘的土都铲到周围地势低的地方,然后你就happy了。
在图片中(只考虑单通道,即黑白图片),有很多噪点,如同上段提到的小山丘,如何平滑这些噪点呢?
答:与铲平小山丘同理。
设有图片的矩阵表示:
A = [ a 11 a 12 . . . a 1 m a 21 a 22 . . . a 2 m . . . a n n a n 2 . . . a n m ] (5) A= \begin{bmatrix} a_{11} & a_{12} & ... &a_{1m} \\ a_{21} & a_{22} & ... &a_{2m} \\ ... \\ a_{nn} & a_{n2} & ... &a_{nm} \\ \end{bmatrix} \tag{5} A=⎣⎢⎢⎡a11a21...anna12a22an2.........a1ma2manm⎦⎥⎥⎤(5)
其中
a
22
a_{22}
a22是个噪点,即其值与周围的数值差值巨大。为了平滑这个噪点,我们定义一个方阵:
W
=
[
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
]
(6)
W= \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} \tag{6}
W=⎣⎡919191919191919191⎦⎤(6)
然后把矩阵W先顺时针旋转180度覆盖到A上面去,W的中心
W
22
W_{22}
W22对准A的那个噪点
a
22
a_{22}
a22,这时把9个重合位置的元素分别相乘,再累加,即:
h
(
2
,
2
)
=
∑
i
=
1
3
∑
j
=
1
3
W
4
−
i
,
4
−
j
×
a
i
j
(7)
h(2,2)=\sum_{i=1}^{3} \sum_{j=1}^{3} W_{4-i,4-j}\times a_{ij} \tag{7}
h(2,2)=i=1∑3j=1∑3W4−i,4−j×aij(7)
这个数值,就是我们平滑噪点
a
22
a_{22}
a22的结果,它的数值跟周围的数值差值已经变小了。
对比式(7)和离散卷积公式(2),其实就是一个东西,只不过式(7)是二维的。
至此,我们了解了如何在图像矩阵上做一次卷积操作。
2.2 卷积神经网络中的卷积
在上一节中提到的矩阵W,我们给它一个名字:卷积核(Kernel Matrix;英文常用filter,也称滤波器)。为了方便,我们修改一下上一节中的二维卷积操作:去掉一开始旋转180度操作。因为我们完全可以在卷积核赋值的时候就按旋转后的位置赋值,更何况如果是随机初始化赋值,旋转操作没有实质意义。
这样一来,图像上的卷积操作就简化为:
3. 卷积神经网路
3.1 卷积层(特征提取)
上一节展示了卷积神经网络中的一次卷积操作。在卷积神经网络中,我们让卷积核平移扫过图像矩阵的每一个 3 × 3 3\times 3 3×3子矩阵位置,并将卷积得数组成一个新的图像矩阵。
具体来说,假设原始图像矩阵是 10 × 10 10\times 10 10×10,卷积核大小 3 × 3 3\times 3 3×3,那么结果矩阵的大小就是 8 × 8 8\times 8 8×8。没错,结果矩阵比原始矩阵小了正好一圈,可以这样理解,只有卷积核中心元素在原始矩阵上重合过的位置才有结果,显然卷积核中心从来没有与原始矩阵的边缘元素重合过。若卷积核大小 5 × 5 5\times 5 5×5,则原始矩阵边缘有两圈是卷积核卷不到的。为了避免卷积操作结果的矩阵形状变小,实际应用中常常给原始矩阵边缘增补全0的padding,即缺几圈补几圈0,以保证原始矩阵的边缘元素能被卷积核卷到。
我们给上述操作起一个名字:特征提取。
为什么叫特征提取?我们提取了什么特征呢?不妨令卷积核为:
F
=
[
−
1
0
1
−
1
0
1
−
1
0
1
]
(8)
F= \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \\ \end{bmatrix} \tag{8}
F=⎣⎡−1−1−1000111⎦⎤(8)
很容易理解,该卷积做卷积操作所得到的结果矩阵就是原图像水平方向的坡度(下图vertical edges;同理,把矩阵(8)逆时针旋转90度所得卷积核对图像做卷积操作,可得horizontal edges)。示例:
综上,我们展示了两个卷积核分别提取水平和竖直方向的边缘特征,以案例形式解释了特征提取。
基于上述理论,我们可以拓展一下:
- 若图像是3通道的(即我们日常所见彩色图片),图片大小是 n × m × 3 n\times m\times 3 n×m×3,那么卷积核的深度也应当为3(即卷积核形状 k × k × 3 k\times k\times 3% k×k×3)。这样的一个卷积核对彩图提取特征后得到的是一个矩阵,即单通道特征矩阵。
- 接上一条,我们可以设置多个卷积核,如m个卷积核分别在原始图像上进行特征提取,我们就得到了m张不同的特征信息矩阵。这m个特征矩阵叠在一起作为输出,我们称这个输出的通道(channel)数为m。
- 多层卷积;即在特征提取的结果上继续做特征提取,构成多层特征提取。
- 为卷积操作添加偏置项(类比线性函数 y = k x + b y=kx+b y=kx+b中的 b b b)。
- 卷积操作时,卷积核每次平移的距离不仅限于1,该平移距离称为滑动步长(Stride)。
- 给原始矩阵边缘增补全0的padding,以避免特征提取结果的形状变小。
真实应用中,会用到但不仅限于这些拓展方法,根据需求灵活调整。
在卷积神经网络中,这些卷积核都可以称为模型的权重参数。并且这些权重参数往往是随机初始化赋值(例如初始服从高斯分布),然后随模型训练不断更新(学习)。
3.2 池化层(特征压缩)
经过上一节特征提取得来的矩阵(也称特征图,可能不只一个),将投入池化层(先忽略激活函数,下一节再讲)。池化层的作用是特征压缩(也叫下采样),起到降维的作用。通俗地说,某个区域用这个区域的均值或最大值来代替,也就是浓缩了(常用的有最大池化max pooling、均值池化mean pooling)。
下面演示一下最大池化(max pooling)操作。不妨设池化区域大小 2 × 2 2\times 2 2×2,步长为2,则左侧矩阵经过最大池化可以得到右侧矩阵。通俗地说,就是对每个区域求一个最大值,来代表这个区域去进行后面的运算。均值池化(mean pooling)同理。
3.3 激活函数
对于前面的卷积层和池化层,有一个需要考虑的问题:如果初始矩阵的某个小区域值产生一点小波动,这个波动经过若干层前向传播后,可能造成不可忽视的影响,比如对分类任务来说就有很大的可能造成错误分类。
我们的模型如果只有卷积层和池化层,其线性程度是非常高的,很容易出现刚刚提到的波动影响最终结果。 激活函数就是用来加入非线性因素的,即增强非线性程度。
常见的激活函数有sigmoid、tanh、ReLU。具体关于激活函数的讨论请参考常用激活函数(激励函数)理解与总结
卷积神经网络通常选择ReLu作为激活函数。
σ
(
x
)
=
1
1
+
e
−
x
(9,sigmoid)
\sigma(x)=\frac{1}{1+e^{-x}} \tag{9,sigmoid}
σ(x)=1+e−x1(9,sigmoid)
t
a
n
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
(10,tanh)
tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \tag{10,tanh}
tanh(x)=ex+e−xex−e−x(10,tanh)
R
e
L
U
(
x
)
=
m
a
x
(
0
,
x
)
(11,ReLU)
ReLU(x)=max(0,x) \tag{11,ReLU}
ReLU(x)=max(0,x)(11,ReLU)
3.4 归一化
归一化(标准化 normalization)是对输入数据来说的(即原始图像)。
归一化在众多机器学习算法中都有应用。未归一化的数据输入模型可能导致不同特征对最终结果的影响程度参差不齐:比如房子面积是20平,房子的价格是100万,这两个特征在数值上差距很大,将导致模型最终的输出由房价主导。
具体可参考为什么要对数据进行归一化处理和【Normalization】CNN中常用的归一化操作。
通常,卷积神经网络的输入要进行归一化。
3.5 全连接层
全连接层在整个卷积神经网络中起到“分类器”的作用。
看一个最简单的全连接层(其中@表示矩阵乘法):
图片解释:全连接层输入三个特征,输出两个特征,每条连接线有一个权重,可以理解为一个输入特征对一个输出特征的贡献度。 输入数据 x x x有两行,第一行3个特征作为输入时,穿过6条连接线,在每条连接线上乘上"贡献度",得到了两个输出特征 ( h 0 0 , h 1 0 ) (h_0^0,h_1^0) (h00,h10);同理第二行3个特征作为输入,也得到了两个输出特征 ( h 0 1 , h 1 1 ) (h_0^1,h_1^1) (h01,h11)。
连接了单层的全连接层,下面展示多层全连接层:
注意!全连接层一定要有激活函数,如上图使用的激活函数是ReLU。
在卷积神经网络中,通常将全连接层作为最后的分类器。
3.6 卷积神经网络的前向传播
通常,一个完整的卷积神经网络模型前向传播过程如下:
其中,卷积层可能不止一个,全连接层也可能不止一个。
3.7 目标函数与反向传播
目标函数,也称损失函数,是指模型通过前向传播得到的结果与正确的结果之间的差距。显然,这个差距越小,说明模型预测效果越好。故训练模型的出发点就是最小化目标函数。在卷积神经网络中常用两个目标函数
- 均方误差(Mean Square Error)
E
=
1
N
∑
i
=
1
N
(
y
^
i
−
y
i
)
2
(12)
E=\frac{1}{N}\sum_{i=1}^{N} (\hat{y}_i - y_i)^2 \tag{12}
E=N1i=1∑N(y^i−yi)2(12)
其中,
y
^
i
\hat{y}_i
y^i为样本
i
i
i的预测值,
y
i
y_i
yi为真实值。
- KL散度(K-L divergence),相对熵。
D
K
L
(
P
∣
∣
Q
)
=
∑
i
=
1
N
P
(
x
)
l
o
g
P
(
x
)
Q
(
x
)
(13)
D_{KL}(P||Q)=\sum_{i=1}^{N}P(x) log{\frac{P(x)}{Q(x)}} \tag{13}
DKL(P∣∣Q)=i=1∑NP(x)logQ(x)P(x)(13)
其中P为真实数据的概率分布,Q为预测结果的概率分布。P和Q的相似度越高,则KL散度越小。
反向传播算法(Back propagation)
前面已经提到前向传播,就是给网络喂入数据,输出预测结果。而反向传播恰恰相反,我们根据链式求导法则,以网络中的权重参数为自由变量,对目标函数求导,在每个参数的梯度方向上减去一小部分,不断重复这个过程,直到所有权重参数收敛到最佳大小(即模型整体的预测效果最好),也就是梯度下降法。
梯度下降法是通用的优化算法,反向传播是梯度下降法在网络中的实现形式。
4. 总结
本篇笔记记录了卷积神经网络CNN的一般模型实现原理。
5. 参考文献
[1] 【中英字幕】吴恩达深度学习课程第四课 — 卷积神经网络 --视频
[2] 如何通俗易懂地解释卷积?
[4] 为什么要对数据进行归一化处理
[5] 【Normalization】CNN中常用的归一化操作
[6] 一文让你彻底了解卷积神经网络
[7] 全连接层 - 博客园
[9] 相对熵(KL散度)