深度学习笔记之卷积神经网络——卷积函数
- 引言
- 什么是卷积
- 图像卷积操作
引言
从本节开始,将介绍卷积神经网络。本节将介绍卷积函数。
什么是卷积
卷积,是一种通过两个函数 f ( ⋅ ) 和 f(\cdot)和 f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)生成第三个函数 h ( ⋅ ) h(\cdot) h(⋅)的数学运算。而这个数学运算本质上是一种积分变换。
这里选择两个例子:
-
此时我们手中有 2 2 2组牌,每组牌中包含 5 5 5张牌,并且牌中的数字分别是 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5:
假设各 CardPile \text{CardPile} CardPile中每张牌选择的概率是相同的,我们的任务是:从 CardPile1 \text{CardPile1} CardPile1中随机选择一张牌,再从 CardPile2 \text{CardPile2} CardPile2中随机选择一张牌,两张牌中数字之和等于 6 6 6的概率是多少 ? ? ?
我们可以通过概率的方式进行求解:
每个 CardPile \text{CardPile} CardPile中,每张牌被选择的概率均是 1 5 \begin{aligned}\frac{1}{5}\end{aligned} 51,我们令变量 C 1 \mathcal C_1 C1表示 CArdPile1 \text{CArdPile1} CArdPile1中选择牌的数字;令 C 2 \mathcal C_2 C2表示 CardPile2 \text{CardPile2} CardPile2中选择牌的数字。那么上述任务的概率结果可表示为如下形式:
P ( C 1 + C 2 = 6 ) = P ( C 1 = 1 ) ⋅ P ( C 2 = 5 ) + P ( C 1 = 2 ) ⋅ P ( C 2 = 4 ) + ⋯ + P ( C 1 = 5 ) ⋅ P ( C 2 = 1 ) ⏟ 5 项 = ∑ i = 1 5 P ( C 1 = i ) ⋅ P ( C 2 = 6 − i ) = 5 ⋅ 1 5 ⋅ 1 5 = 1 5 \begin{aligned} \mathcal P(\mathcal C_1 + \mathcal C_2 = 6) & = \underbrace{\mathcal P(\mathcal C_1 = 1) \cdot \mathcal P(\mathcal C_2 = 5) + \mathcal P(\mathcal C_1 = 2) \cdot \mathcal P(\mathcal C_2 = 4) + \cdots + \mathcal P(\mathcal C_1 = 5) \cdot \mathcal P(\mathcal C_2 = 1)}_{5项} \\ & = \sum_{i=1}^5\mathcal P(\mathcal C_1 = i) \cdot \mathcal P(\mathcal C_2 = 6-i) \\ & = 5 \cdot \frac{1}{5} \cdot \frac{1}{5} \\ & = \frac{1}{5} \end{aligned} P(C1+C2=6)=5项 P(C1=1)⋅P(C2=5)+P(C1=2)⋅P(C2=4)+⋯+P(C1=5)⋅P(C2=1)=i=1∑5P(C1=i)⋅P(C2=6−i)=5⋅51⋅51=51
基于该示例,我们可以将任务看做是目标值的一个函数:
P ( C 1 + C 2 = 6 ) ⇒ h ( x = 6 ) \mathcal P(\mathcal C_1 + \mathcal C_2 = 6) \Rightarrow h(x = 6) P(C1+C2=6)⇒h(x=6)
而对应选择各 CardPile \text{CardPile} CardPile的概率结果分别对应不同的函数:
P ( C 1 = i ) ⇒ f ( i ) P ( C 2 = 6 − i ) = g ( x − i ) ( x = 6 ) \mathcal P(\mathcal C_1 = i) \Rightarrow f(i)\quad \mathcal P(\mathcal C_2 = 6-i) = g(x -i) \quad (x=6) P(C1=i)⇒f(i)P(C2=6−i)=g(x−i)(x=6)
最终将上述任务转化为如下形式:
h ( x = 6 ) = ∑ i = 1 5 f ( i ) ⋅ g ( x − i ) = f ( x ) ∗ g ( x ) \begin{aligned} h(x = 6) & = \sum_{i=1}^5 f(i) \cdot g(x - i) \\ & = f(x) *g(x) \end{aligned} h(x=6)=i=1∑5f(i)⋅g(x−i)=f(x)∗g(x)
而上式中的 ∗ * ∗就表示卷积( Convolution \text{Convolution} Convolution)。这个卷积结果函数 h ( x ) h(x) h(x)可被描述为:函数 f ( ⋅ ) f(\cdot) f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)经过翻转、平移的重叠部分函数值乘积对重叠长度的积分。
上述例子当 x = 6 x = 6 x=6时, f ( ⋅ ) f(\cdot) f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)的重叠部分有哪些呢 ? ? ?
在
x = 6 x=6 x=6任务目标下,每一个函数
f ( i ) f(i) f(i)在范围内都能找到对应的‘重叠部分’
g ( x − i ) g(x-i) g(x−i).
如果是 x = 7 x=7 x=7呢 ? ? ?
很明显,重叠部分小了。因为
f ( 1 ) f(1) f(1)在任务
x = 7 x=7 x=7中范围内没有与其构成的重叠部分
g ( 6 ) g(6) g(6).
对应的卷积结果表示如下:
h ( x = 7 ) = ∑ i = 1 5 f ( i ) ⋅ g ( x − i ) = f ( 1 ) ⋅ g ( 6 ) ⏟ g ( 6 ) = P ( C 2 = 6 ) = 0 + ∑ i = 2 5 f ( i ) ⋅ g ( x − i ) = 4 25 \begin{aligned} h(x = 7) & = \sum_{i=1}^5 f(i) \cdot g(x - i) \\ & = \underbrace{f(1) \cdot g(6)}_{g(6)=\mathcal P(\mathcal C_2 = 6) =0} + \sum_{i=2}^5 f(i) \cdot g(x-i) \\ & = \frac{4}{25} \end{aligned} h(x=7)=i=1∑5f(i)⋅g(x−i)=g(6)=P(C2=6)=0 f(1)⋅g(6)+i=2∑5f(i)⋅g(x−i)=254 -
假设某个人一天的进食情况表示如下。其中横坐标表示时间;纵坐标表示进食的量(这里使用摄入的能量表示,单位是 Kcal \text{Kcal} Kcal):
图像来源见下方链接,侵删,下同。
很明显,这个人摄入的能量和时间长度 t t t之间构成了一个复杂函数 f ( t ) f(t) f(t)。其中的三个波峰可以理解为正餐(三餐所在时刻)他的能量摄入情况;其余的时间他也没闲着,也在吃一些零食来摄入能量,只不过要低于正餐时能量的摄入。当然,人在摄入能量的同时,也在消耗能量。这里以最简单的食物消化为例,不包含如跑步等其他消耗能量的方式,随着时间推移,他的能量消耗情况表示为如下形式:
需要注意的是,‘能量消耗’图像中的横坐标
t t t和‘摄入能量’图像中的横坐标
t t t不是相同的参考系。一个是‘时刻’,一个是时间跨度。
其中横坐标表示时长,纵坐标表示能量消耗的比率。例如,在刚吃完食物那一刻,还没有来得及消耗,此时的比率为 1 1 1。随着时间的推移,能量的消耗,比率值逐渐降低,能量越来越少。至此,具体任务描述:在下午两点时,这个人剩余多少能量 ? ? ?
- 如果只看他的摄入,对应的能量就是一个从开始到下午两点之间的能量摄入的积分:
- 但是他在摄入能量的时候,也在消耗之前摄入的能量。 例如中午 12 12 12点,他吃了一碗米饭。到下午两点已经过去 2 2 2个小时,这个米饭的能量自然存在因消化产生的能量消耗:
那么具体消化了多少呢?需要从消化函数 g ( t ) g(t) g(t)中寻找 2 2 2个小时对应的消化比率:
至此,可以知道:中午 12 12 12点摄入的能量在 14 14 14点时的剩余能量: f ( 12 ) ⋅ g ( 14 − 12 ) f(12) \cdot g(14 - 12) f(12)⋅g(14−12)。
但这仅仅是一个时刻的摄入。其他时刻也在摄入能量。因而我们需要将所有时刻摄入的能量,经过消化比率对能量进行调整(加权),最终得到 14 14 14点时实际剩余的能量:
由于时刻是一个连续变量,从而使用积分的形式描述。而
x x x则表示该示例中定积分
0 → t 0\to t 0→t之间的任意一个时刻。
∫ 0 t = 14 f ( x ) ⋅ g ( t − x ) d x \int_0^{t=14} f(x) \cdot g(t-x) dx ∫0t=14f(x)⋅g(t−x)dx
- 如果只看他的摄入,对应的能量就是一个从开始到下午两点之间的能量摄入的积分:
根据上述两个例子,我们可以发现它们的共性:根据任务的描述,基于函数 f ( x ) f(x) f(x)中的某个值 x x x,需要在 g ( ⋅ ) g(\cdot) g(⋅)中找到对应的结果对 f ( x ) f(x) f(x)进行修饰/描述,最终将这些被修饰的结果相加。
图像卷积操作
关于图像的描述,我们可以将其视作一个三维矩阵。它的维度具体表示为 ( H , W , C ) (\mathcal H,\mathcal W,\mathcal C) (H,W,C),其中 H \mathcal H H表示图片的高 ( Height ) (\text{Height}) (Height),也就是矩阵的行数; W \mathcal W W表示图片的宽 ( Width ) (\text{Width}) (Width),表示矩阵的列数。 C \mathcal C C表示图片的通道数:
- 如果图像是黑白图像,那么图片通道数 C = 1 \mathcal C = 1 C=1,该随机变量可选取(0-255)的整数结果表示基于黑白颜色之间的颜色信息;
- 如果图像是彩色图像,那么图片的通道数 C = 3 \mathcal C = 3 C=3,每个通道表示图片的一种颜色 ( RGB ) (\text{RGB}) (RGB),每个颜色同样选取(0-255)的整数结果表示对应颜色的信息。而三个通道确定的数值结果就是像素点的颜色信息。
而图像卷积操作是使用一个点阵(这里以 H , W \mathcal H,\mathcal W H,W均为3的矩阵为例)与图像矩阵进行操作,这个点阵也被称作卷积核 ( Convolution Kernel ) (\text{Convolution Kernel}) (Convolution Kernel):
- 将卷积核扣在原始图像上,卷积核上的元素与原图像所映射的元素对应位置相乘,再将所有位置的乘积结果相加。而计算结果作为一个新的像素值,作为卷积结果的输出。
- 很明显,这种相乘再相加的操作就是卷积计算的思想。同理,将当前卷积结果计算完成后,继续向其他位置平移,从而得到新的像素结果。最终能够得到由新的像素结果构成的新的图像。
不可否认,这个操作看起来是简单的。并且也能从中观察到卷积操作的影子,但问题在于:为什么要用卷积去处理这个事情,这种操作背后的物理意义是什么 ? ? ?
回顾上面吃饭的例子,可通过观察发现:描述食物消化的函数是稳定的,人的消化函数不会发生剧烈的变化。胖子和瘦子他们的消化函数可能存在差别,但不会出现一天一种结果;相反,人摄入能量的函数相比于消化函数存在更大的波动。
因而上面的卷积函数可以理解为:从时间角度观察,某一时刻的卷积结果可看做之前时刻对该时刻结果影响的叠加,而每一个叠加的项是由当前时刻的状态 f ( x ) f(x) f(x)与描述其规律 g ( t − x ) g(t -x) g(t−x)的加权结果。
如果从空间角度观察呢 ? ? ? 很明显图像数据就可看作摄入能量函数,各个图像某位置的像素点的差异是较大的;但是我们的卷积核是确定的,我们可以根据不同的卷积核描述不同的任务,但相同任务下对卷积核的描述是稳定的。
而将卷积核与被卷积核覆盖的像素点做卷积最终生成一个像素点这个过程可以描述为这个生成的新像素点包含了该位置周围的像素点信息,也就是说,卷积核规定了周围像素点如何对该像素点产生影响的。
即该位置各个方向的像素点信息通过‘某种规律加权的方式’映射在了该位置上。
一个明显的例子就是平滑操作。它的卷积核可表示为如下形式(示例):
这个卷积核对应的卷积操作就是将被卷积核覆盖的像素点取均值。最终卷积后产生的新图像的结果会存在一种模糊的效果。
相关参考:
卷积——百度百科
从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变