小白也能看懂的卷积!
对于很多朋友们来说,刚接触到卷积这个概念的时候一定都有一点头疼,我也不例外。随着学习的加深,回顾卷积概念的时候我也有了一些新的理解。思索再三还是提笔写下这个小白都能看懂的卷积。提前说明,该教程的讲解都基于离散时间情况。
伤害到底是多少?
你叫张三,是游戏里的主角,武器是一把菜刀。随着打怪升级,菜刀的攻击属性也越来越高,直到菜刀升到了第五级,菜刀便拥有了新的技能:毒性伤害,可以对对手造成持续性的伤害。不过伤害会随着时间的增加逐渐减少,单位力度造成的伤害随时间的变化如, 暂且叫它 h [ t ] h[t] h[t]
每一次出招的伤害和出招的力度有关,力度越大,造成的总伤害也越大。
总伤害
=
力度
×
单位力度伤害
\text{总伤害}=\text{力度}\times \text{单位力度伤害}
总伤害=力度×单位力度伤害
随着技能升级,你,张三,在
30
30
30级的时候学会了一个新连招---------乱披风刀法。这套连招拥有4次攻击,可以表示成,暂且叫它
x
[
t
]
x[t]
x[t]。
可以看到,在使出乱披风刀法连招的第 0 0 0秒,第 1 1 1秒,第 3 3 3秒和第 6 6 6秒都有一次攻击。那么问题来了,在使用毒性菜刀配合乱披风刀法攻击的时候,这一套连击总共能给boss带来多大的伤害呢。
第一个想法:可以把连招中的4次攻击拆开单看,计算每一次单独攻击造成的伤害,然后求和就行。分别来看看4次攻击的伤害是多少,我们说过
总伤害
=
力度
×
单位力度伤害
\text{总伤害}=\text{力度}\times \text{单位力度伤害}
总伤害=力度×单位力度伤害
不过,在这里要注意使时间的变化。比如在第
6
6
6秒时,
h
[
t
]
h[t]
h[t]变成了
h
[
t
−
6
]
h[t-6]
h[t−6]。四次攻击的伤害可以表示成:
将四张图叠加到一起,就可以得到乱劈风刀法伤害随时间变化的关系图,如所示。
我们将乱劈风刀法伤害-时间关系称为 y [ t ] y[t] y[t],要得到一套乱劈风刀法伤害造成的总伤害,我们只需要在时间尺度上对 y [ t ] y[t] y[t]进行求和得到 ∑ t = − ∞ ∞ y [ t ] \sum_{t=-\infty}^{\infty}y[t] ∑t=−∞∞y[t]即可。
不知不觉间,在求乱劈风刀法伤害-时间关系
y
[
t
]
y[t]
y[t]的过程中,我们已经完成了一次卷积求和操作。或许你还有所疑问,这怎么就是卷积和了呢,我们来看看
y
[
t
]
y[t]
y[t]的组成:
y
[
t
]
=
x
[
0
]
h
[
t
−
0
]
+
x
[
1
]
h
[
t
−
1
]
+
x
[
3
]
h
[
t
−
3
]
+
x
[
6
]
h
[
t
−
6
]
y[t] = x[0]h[t-0]+x[1]h[t-1]+x[3]h[t-3]+x[6]h[t-6]
y[t]=x[0]h[t−0]+x[1]h[t−1]+x[3]h[t−3]+x[6]h[t−6]
如果我们把上式中省略的
x
[
t
]
=
0
x[t]=0
x[t]=0的部分补上,可以得到
y
[
t
]
=
∑
k
=
−
∞
∞
x
[
k
]
h
[
t
−
k
]
y[t] = \sum_{k=-\infty}^{\infty}x[k]h[t-k]
y[t]=k=−∞∑∞x[k]h[t−k]
这就是我们认知中的卷积和公式,也可以写成简洁形式
y
[
t
]
=
x
[
t
]
∗
h
[
t
]
y[t]=x[t]*h[t]
y[t]=x[t]∗h[t]。
在上述叠加的过程中可以看出来,
y
[
t
]
y[t]
y[t]当中的每一项,比如第八秒boss收到的伤害
y
[
8
]
y[8]
y[8],是由所有
x
[
k
]
x[k]
x[k]在第8秒时的伤害贡献相加的结果的结果。具体来说,在乱劈风刀法第
0
0
0秒的攻击在第
8
8
8秒造成的伤害应该是
x
[
0
]
h
[
8
]
x[0]h[8]
x[0]h[8],可以表示成图:
而乱劈风刀法第
1
1
1秒的攻击在第
8
8
8秒造成的伤害应该是是什么呢?花三秒时间思考一下。没错,不是
x
[
0
]
h
[
8
]
x[0]h[8]
x[0]h[8]了,应该是
x
[
1
]
h
[
7
]
x[1]h[7]
x[1]h[7]。因为在
x
[
1
]
x[1]
x[1]攻击发出之后,再过
7
7
7秒就是第
8
8
8秒了,可以表示成图。
所以当考虑所有
x
[
k
]
x[k]
x[k]在第8秒时的伤害贡献时,可以得到。
再次归纳一下,当我们考虑第
n
n
n秒造成的攻击
y
[
n
]
y[n]
y[n]时,我们考虑每个单次攻击
x
[
k
]
x[k]
x[k]乘以其在
n
−
k
n-k
n−k造成的单位力度伤害,即
h
[
n
−
k
]
h[n-k]
h[n−k],因为相对于第
k
k
k秒的攻击
x
[
k
]
x[k]
x[k],在过
n
−
k
n-k
n−k秒就是第
n
n
n秒了。这就是从另一个角度理解卷积和公式
y
[
t
]
=
∑
k
=
−
∞
∞
x
[
k
]
h
[
t
−
k
]
y[t] = \sum_{k=-\infty}^{\infty}x[k]h[t-k]
y[t]=∑k=−∞∞x[k]h[t−k]。不过上图怎么看都有点不舒服,连接线全部拧着(上图省略了
x
[
k
]
=
0
x[k]=0
x[k]=0的连接线)。不如先将
h
[
k
]
h[k]
h[k](暂时将自变量换个名字)翻转一下变成
h
[
−
k
]
h[-k]
h[−k],这时得到了图形。
图仍然有点别扭,我们将 h [ − k ] h[-k] h[−k]向右做一些平移得到 h [ n − k ] h[n-k] h[n−k](不理解为什么是向右平移的同学从 h [ − ( n + k ) ] h[-(n+k)] h[−(n+k)]这个角度思考),可以得到图:
这也就是我们在上课和国内教材中经常被教的:卷积就是翻转,平移,求和的过程。
想要真正了解卷积的难点,我们应该把目光关注到
h
[
k
]
h[k]
h[k]上,卷积现象的产生是因为
h
[
k
]
h[k]
h[k]在输入消失之后仍然会产生输出,有一种"语音绕梁,三日不绝"的意味。所以我们求某一
t
t
t时刻的输出的时候,其实需要算上
t
t
t时刻之前的输入有没有产生"造福后世"的影响,也需要检查一下
t
t
t时刻之后的输入有没有穿越时空来形成"蝴蝶效应"(这种情况极其罕见)。所以,列举出一些其他关于卷积的例子,我们只需要列举出能够持续对之后时刻产生影响的例子即可。比如想要计算某一
t
t
t时刻的血糖指数,需要考虑
t
t
t之前所有时刻消化的食物对
t
t
t时刻血糖的影响。
持续对之后时刻产生影响的例子即可。比如想要计算某一
t
t
t时刻的血糖指数,需要考虑
t
t
t之前所有时刻消化的食物对
t
t
t时刻血糖的影响。