关于对卷积的理解
前言
最近学习DSP,又涉及到了卷积的概念,想到之前学习信号与系统时,一直不太理解卷积,只是机械记忆了如下两个公式:
(
f
∗
g
)
(
t
)
=
def
∫
R
n
f
(
τ
)
g
(
t
−
τ
)
d
τ
(f * g)(t) \stackrel{\text { def }}{=} \int_{\mathbb{R}^{n}} f(\tau) g(t-\tau) d \tau
(f∗g)(t)= def ∫Rnf(τ)g(t−τ)dτ
( f ∗ g ) [ n ] = def ∑ m = − ∞ ∞ f [ m ] g [ n − m ] = ∑ m = − ∞ ∞ f [ n − m ] g [ m ] \begin{aligned} (f * g)[n] & \stackrel{\text { def }}{=} \sum_{m=-\infty}^{\infty} f[m] g[n-m] =\sum_{m=-\infty}^{\infty} f[n-m] g[m] \end{aligned} (f∗g)[n]= def m=−∞∑∞f[m]g[n−m]=m=−∞∑∞f[n−m]g[m]
却并不知道卷积背后的物理含义,今天看了卷积的几篇文章之后,醍醐灌顶,故将自己的理解记录下来,以供之后查阅。
一维
卷积由“卷”和“积”两个字组成,英文名是convolution。“积”很好理解,即是累积的意思,在离散情况下对应为求和,连续情况下对应积分。关键在“卷”:
在我看来,“卷”有两层含义:
1.翻转
2.滑动以叠加求和
举个文章中的例子,知乎-如何通俗易懂地解释卷积?,在信号与系统中,我们有输入信号f(t),系统响应函数g(t),如下图所示:
这里需要对f(t)、g(t)中的两个t做重点说明:f(t)中的t是我们的真实世界的时间轴,而g(t)的t是相对于我们所输入的每个信号的时间
就是说:f(t)和g(t)的t根本就不是同一个t!
f(t)的含义是:从t=0开始,依次向系统输入f(0)、f(1)、f(2)…
g(t)的含义是:从接收到输入f(n)后开始计时,这个输入f(n)经过系统后的输出依次为f(n)g(0)、f(n)g(1)、f(n)g(2)…
比如:我在t=0时输入了f(0),那么在t=10时,f(0)经过系统的输出就是f(0)g(10);
那么,在t=0-10的过程中,f(t)依次向g(t)输入了f(0)、f(1)…f(10),在t=10时,系统的总输出就是f(0)g(10)+f(1)g(9)+f(2)g(8)+…+f(10)*g(0)
在图形中,系统在t=10的输出就表现为上面10对数据的相乘。但由于这样看着很别扭,因此将g(t)翻转一下:
现在下图变成了g(-t),由于仍然有错位,再将g(-t)向右平移10个单位,得到g(-(t-10))=g(10-t)。
至此,也就得到了离散卷积的公式:
(
f
∗
g
)
[
n
]
=
def
∑
m
=
−
∞
∞
f
[
m
]
g
[
n
−
m
]
=
∑
m
=
−
∞
∞
f
[
n
−
m
]
g
[
m
]
\begin{aligned}(f * g)[n] & \stackrel{\text { def }}{=} \sum_{m=-\infty}^{\infty} f[m] g[n-m] =\sum_{m=-\infty}^{\infty} f[n-m] g[m] \end{aligned}
(f∗g)[n]= def m=−∞∑∞f[m]g[n−m]=m=−∞∑∞f[n−m]g[m]
注意:由上图可以看出,翻转和移位的目的仅仅是为了让f(t)和g(t)按顺序对齐,那么就不只有将g(t)翻转后平移这一种方法,你还可以将f(t)先翻转再向右平移10个单位,也可以将f(t)先翻转,再将g(t)向左平移10个单位,等等。。
二维
在CNN的学习中,有一个概念也一直模糊不清——卷积核,因为一直不太懂这里的卷积体现在何处,这里从约束的角度谈谈自己的简单理解:
卷积的本质是加权积分,g是f的权值函数。不同的应用需要选择不同的权值函数g去得到输出结果。上面的f选择x,g选择n-x是为了满足信号经过系统的物理意义。在图像处理领域,每个像素的权值只与自身的相对位置有关,所以g选择了x而不是n-x(此处有待商榷,有文章的观点是现在神经网络的卷积之所以矩阵的直接点乘是因为将权值矩阵g经过了对称操作,不过因为神经网络中的卷积核貌似本来就是对称的,所以x和n-x其实是一样的。。。),下图是一般卷积的操作,可以看到是直接的点乘。