喜欢让工程专业的学生蠕动吗?让他们解释卷积和(如果您是野蛮的)卷积定理。当他们试图通过一个滑动窗口逃脱时,他们会喃喃地谈论滑动窗口。
一个治疗计划:[3]每位患者在第一天就会得到3单位的治疗。
患者列表:[1 2 3 4 5]您本周的患者时间表(周一1人,周二2人,等等)。
问题:您每天使用多少药?好吧,那只是一个快速的乘法:
计划*患者=每日使用量[3] * [1 2 3 4 5] = [3 6 9 12 15]
将计划乘以患者清单可得出未来几天的使用情况:[3 6 9 12 15]。每天相乘(3 x 4)意味着对一天的患者使用计划:[3] * [4] = [12]。
假设该疾病发生变异,需要进行多日治疗。您创建一个新计划:计划:[3 2 1]
这意味着第一天需要3个单位的固化时间,第二天需要2个单位,第三天需要1个单位。好。给定相同的患者时间表([1 2 3 4 5]),我们每天的药物使用量是多少?
星期一,一位病人来了。这是她的第一天,所以她得到了3个病房。
在星期二,星期一的gal获得2个单位(她的第二天),但是有两名新患者到达,每人获得3个(2 * 3 = 6)。总计为2 +(2 * 3)= 8个单位。
在星期三,这比较棘手:星期一gal(她最后一天的1个单位)完工,星期二的人得到2个单位(2 * 2),并且星期三有3个新的人... argh。
患者重叠,很难追踪。我们如何组织这种计算?
一个想法:想象一下翻转患者列表,那么第一个患者在右边:
在您的第一天,您走进第一个房间并获得3单位药物。第二天,您要进入2号房间并获得2个单位。在最后一天,您走进3号房并获得1个单元。之后没有房间了,您就完成了。
要计算总的药物使用量,请排队患者并带领他们走入房间:
在星期一(我们的第一天),我们的第一个房间只有一名患者。她得到3个单位,总共使用3个。有意义吗?
星期二----------------------------房间3 2 1患者-> 5 4 3 2 1用法6 2 = 8
现在,第一个病人在第二个房间里,第一个房间里有两个新病人。我们将每个房间的剂量乘以患者人数,然后合并。
星期三----------------------------房间3 2 1患者-> 5 4 3 2 1用法9 4 1 = 14星期四- ---------------------------房间3 2 1患者-> 5 4 3 2 1用法12 6 2 = 20 Friday ---- -------------------------房间3 2 1患者-> 5 4 3 2 1用法15 8 3 = 26
哇!错综复杂,但我们想通了,对吧?我们可以通过将列表反转,将其滑动到所需的日期并组合剂量来找到任何一天的用法。
每天的总使用量如下所示(别忘了Sat和Sun,因为有些病人从星期五开始):
计划*患者名单=每日总使用量[3 2 1] * [1 2 3 4 5] = [3 8 14 20 26 14 5] M T W T F F M T W T F S S
此计算是计划和患者清单的卷积。这是一组数字和一个“程序”之间的奇特乘法。
这是现场演示。尝试更改F(计划)或G(患者清单)。卷积$ c(t)$与我们上面的手动计算匹配。
(我们定义函数$ f(x)$和$ g(x)$将每个列表填充为零,并调整从1开始的列表索引)。
ListConvolve [{3,2,1},{1,2,3,4,5},{1,-1},0] {3,8,14,20,26,14,5}
我5年前开始写这篇文章(直觉需要一段时间...),但不幸的是,类比与今天有关。
将$ f(x)$设置为需要呼吸机的患者百分比。例如,[。05 .03 .01]表示第一周有5%的患者需要呼吸机,第二周需要3%,第三周需要呼吸机1%。
卷积$ c(t)= f * g $,显示每周需要多少台呼吸机(以千计)。 $ c(5)$是从现在开始的5周内需要多少台呼吸机。
G = [10,20,30,20,10,10,10],是入院患者。它从每周10k开始,上升到30k,然后下降到10k。
9周后卷积下降为0,因为患者名单用完了。在此示例中,我们对卷积达到的峰值感兴趣,而不是长期总计。
其他可能涉及的计划可能是药物剂量,疫苗预约(今天一次,从现在开始一个月),再感染以及其他复杂的相互作用。
医院类比是我希望在学习时拥有的心理模型。现在我们已经用实际数字进行了尝试,让我们倒入Math Juice,然后将类比转换为微积分。
那么,在我们的示例中发生了什么?我们有一个病人清单和一个计划。如果计划很简单(单日[3]),则定期乘法就可以了。因为该计划很复杂,所以我们不得不“卷积”它。
卷积记为$ f * g $,并带有星号。是的,星号通常表示复数,但在高级微积分类别中,它表示卷积。只是隐含了常规乘法($ fg $)。
卷积的结果是一个新函数,该函数给出了一天的总使用量(“一天$ t = 3 $的总使用量是多少?”)。我们可以绘制随时间变化的卷积,以查看每天的总数。
患者(输入)列表为$ g(x)$。但是,我们在滑动列表时需要反转此列表,以便最早的患者(星期一)首先进入医院(先进先出)。这意味着我们需要使用$ g(-x)$,即$ g(x)$的水平反射。 [1 2 3 4 5]变为[5 4 3 2 1]。
现在我们有了反向列表,选择一天进行计算($ t = 0,1,2 ... $)。为了使我们的患者列表如此滑动,我们使用:$ g(-x + t)$。也就是说,我们反转列表($ -x $)并跳转到正确的日期($ + t $)。
$ g(-x + t)$是输入清单(翻转并滑动到正确的日期)。
为了获得第t天的总使用量,我们将每个患者乘以该计划,然后将结果相加(一个整数)。为了说明任何可能的长度,我们从-infinity到+ infinity。
我们使用虚拟变量$ \ tau $(tau)进行中间计算。想象$ \ tau $敲每个房间($ \ tau = {0,1,2,3 ...} $),找到剂量[$ f(\ tau)$],病人数[$ g (t-\ tau)$],将它们相乘,然后求和。哇所谓的“虚拟”变量$ \ tau $就像我在for循环中一样:它是临时的,但是可以工作。 (以此类推,$ t $是一个全局变量,在循环期间具有固定值。)
在正式定义中,您会看到$ g(t-\ tau)$而不是$ g(-\ tau + t)$。第二个版本显示翻转($-\ tau $)和幻灯片($ + t $)。写$ g(t-\ tau)$似乎使我们对变量之间的差异感兴趣,这使我感到困惑。
处理计划(要运行的程序)称为内核:将内核与输入进行卷积。
如果不尝试,便无法发现新的数学运算。让我们看看它的行为。
在我们的计算中,我们翻转了患者清单,并使计划保持不变。我们可以改写计划吗?
你打赌想象一下病人是不动的,呆在自己的房间里:[1 2 3 4 5]。为了运送药物,我们有3个医疗推车,可以运送到每个房间并运送剂量。每天,他们向前滑动一个位置。
和以前一样,尽管我们的计划写为[3 2 1](第一天为3个单位),但我们将购物车的订单翻转为[1 2 3]。这样,患者就可以像我们期望的那样在第一天获得3个单位。使用Wolfram Alpha进行检查,计算结果相同。
ListConvolve [{1、2、3、4、5},{3、2、1},{1,-1},0] {3、8、14、20、26、14、5}
并且我们可以决定在计算积分时翻转$ f $或$ g $。令人惊讶,对不对?
完成所有治疗后,总药物用量是多少?这是卷积的一部分。 (几分钟前,该短语会让您跳出窗口。)
但这是一个简单的计算。我们的计划为每个患者求和([3 2 1])= 6单位药物。我们有sum([1 2 3 4 5])= 15位患者。总使用量仅为6 x 15 = 90单位。
哇,那很简单:整个卷积的用法只是小计的乘积!
我希望这会直观地点击。请注意,此技巧适用于卷积,但通常不适用于积分。例如:
和那些不一样。 (如果我们可以像这样拆分积分,微积分会容易得多。)这很奇怪,但是$ \ int(f * g)$可能比$ \ int(fg)$更容易计算。
如果我们将一名患者送往医院怎么办?卷积只是那一天的计划。
用微积分术语,峰值[1](否则为0)是狄拉克三角函数。就卷积而言,此函数的作用类似于数字1并返回原始函数:
我们可以将增量函数延迟T,这也会延迟结果卷积函数。想象一个病人迟到一周,所以我们一周都没有用药:
傅立叶变换(用花哨的$ \ mathscr {F} $编写)将函数$ f(t)$转换为周期性成分$ F(s)$的列表:
以此类推,我们通过花式乘法对计划和患者列表进行卷积。由于傅立叶变换为我们提供了成分列表,因此我们可以通过混合成分列表来获得相同的结果吗?
是的,我们可以:常规世界中的幻想乘法是幻想世界中的常规乘法。
用数学术语来说,“时域的卷积就是频率(傅立叶)域的乘法”。
我们可以使用高级演算来证明该定理,该演算使用的是我不太了解的定理,但让我们仔细考虑一下它的含义。
因为$ F(s)$是$ f(t)$的傅立叶变换,所以我们可以要求一个特定的频率($ s = 2 \ text {Hz} $)并获得每个数据点与该频率的组合交互作用。让我们假设:
这意味着在将每个数据点乘以2Hz周期后,结果为$ 3 + i $。但是我们可以将每种交互方式分开:
其中$ c_t $是数据点$ t $对2Hz频率的贡献。同样,我们可以将$ G(s)$扩展为与2Hz成分进行交互的列表。假设$ G(2)= 7-i $:
我们在规则域中的卷积涉及很多交叉乘法。在花式频率域中,我们仍然有很多交互,但是$ F(s)$和$ G(s)$已合并它们。我们可以将$ F(2)G(2)=(3 + i)(7-i)$乘以在卷积结果中找到2Hz成分。
每个术语都需要相乘很多工作:$(1 \ cdot 5)+(1 \ cdot 6)+(1 \ cdot 7)+ ... $
最好将组合并为$(1 + 2 + 3 + 4)= 10 $和$(5 + 6 + 7 + 8)= 26 $,然后相乘得到$ 10 \ cdot 26 = 260 $。
这种细微差别使我感到困惑。好像$ FG $是一个乘法,而$ f * g $涉及许多中间项。我忘记了$ F $已经完成了将一堆条目合并为一个条目的工作。
现在,我们还没有完成。我们可以将时域中的$ f * g $转换为频域中的$ FG $,但我们可能需要时域中的$ fGg才能获得可用的结果:
您有一个英文谜语($ f * g $),将其翻译成法语($ FG $),找一个聪明的法国朋友算算,然后将其转换回英语($ \ mathscr {F} ^ {-1} $)。
酷吧?不用像像洞穴居民那样将两个函数相乘,而是戴上单片眼镜,对傅立叶变换进行卷积,然后转换为时域:
我并不是说这很有趣,只是有可能。如果您的法国朋友在计算时费力,那对您来说似乎算术。
还记得我们怎么说卷积的积分是单个积分的乘积吗?
因此,(手动)似乎可以将通用积分$ \ int $交换为$ \ mathscr {F} $并获得
这就是卷积定理。我需要更深入的直觉来证明,但这可以帮助事情解决。
卷积的窍门是找到一个有用的“程序”(内核)以应用于您的输入。这里有几个例子。
假设您要在列表中相邻项目之间移动平均值。这是每个元素的一半,加在一起:
ListConvolve [{1,4,9,16,25},{0.5,0.5},{1,-1},0] {0.5,2.5,6.5,12.5,20.5,12.5}
3个元素的移动平均值为[.33 .33 .33],加权平均值为[.5 .25 .25]。
ListConvolve [{1,2,3,4,5},{1,-1},{1,-1},0] {1,1,1,1,1,-5} // -5用完条目ListConvolve [{1,4,9,16,25},{1,-1},{1,-1},0] {1,3,5,7,9,-25} //离散导数是2x +1
使用简单的内核,我们可以在离散列表中找到有用的数学属性。要获得第二个导数,只需对导数卷积应用两次:
作为快捷方式,我们可以预先计算最终的卷积([1 -1] * [1 -1])并得到:
现在,我们有一个内核[1,-2,1],它获得列表的二阶导数:
ListConvolve [{1,4,9,16,25},{1,-2,1},{1,-1},0] {1,2,2,2,2,-34,25}
我们可以消除模糊吗?是的和我们的朋友卷积定理一起,我们可以做:
哇!我们可以通过划分模糊来恢复原始图像。卷积在频域中是一个简单的乘法,而反卷积在频域中是一个简单的除法。
不久前,“通过划分傅立叶变换进行去模糊”的概念对我来说是胡说八道。尽管它在数学上令人生畏,但从概念上讲它变得越来越简单。
1234 = 1000 + 200 + 30 + 4 = [1000 200 30 4] 5678 = 5000 + 600 + 70 + 8 = [5000 600 70 8]
什么是常规的小学乘法?逐位数的卷积!我们将一个数字列表彼此扫一扫,然后进行相乘和相加:
ListConvolve [{1000,200,30,4},{8,70,600,5000},{1,-1},0] {8000,71600,614240,5122132,1018280,152400,20000}和{8000, 71600、614240、5122132、1018280、152400、20000} 7006652
请注意,我们预先翻转了其中一个列表(稍后会在卷积中交换),并且中间计算有些不同。但是,将小计组合起来可以得到预期的结果。
为什么要卷积而不是进行常规的逐位乘法?好吧,卷积定理让我们用傅立叶变换代替卷积:
卷积($ f * g $)具有复杂度$ O(n ^ 2)$。我们有$ n $个头寸需要处理,每个头寸都有$ n $个中间乘法。
两个傅立叶变换,通常是$ O(n ^ 2)$。但是,快速傅立叶变换(分治法)使它们成为$ O(n \ log(n))$。
转换的最终结果($ \ sum a_n \ cdot b_n $)的逐点乘法,即$ O(n)$
幻想域中的规则乘法比常规域中的幻想乘法快。我们的法国朋友不随便。 ( 更多)
机器学习涉及发现将输入数据转换为所需结果(预测,分类等)的数学函数。
鉴于卷积可以完成复杂的数学运算(移动平均值,模糊,导数...),看来内核的某种组合应该可以将我们的输入变成有用的东西,对吗?
卷积神经网络(CNN)处理带有内核层的输入,优化其权重(计划)以达到目标。想象一下,调整治疗计划以使药物使用量保持在一定阈值以下。
时间不变:输出取决于相对时间,而不是绝对时间。您在第一天就会获得3个单位,这与星期三或星期四无关。
一个恰当的说法是“ LTI系统的特点是其脉冲响应”。翻译:如果我们只有一名患者通过医院[1],我们将发现治疗计划。然后,通过将其与计划进行卷积,可以预测任何患者序列的使用情况。
如果系统不是LTI,则无法基于一个人的经验进行推断。缩放输入可能不会缩放输出,并且实际日历天(而非相对日期)可能会影响结果。
来自大卫·格林斯潘(David Greenspan)的话:“假设您有一个特殊的激光指示器,它在墙上形成星形。您将一束这些激光指示器用正方形胶带绑在一起。墙上的图案现在是一个星形的卷积,一个正方形。”
常规乘法为您提供输入的单个缩放副本。卷积会按照您指定的模式创建多个重叠的副本。
现实世界中的系统具有不稳定的行为,而不是瞬时的行为:它们会逐渐上升,达到峰值和下降。卷积使我们可以对回声,混响和重叠的系统进行建模。
现在是著名的滑动窗口示例的时候了。想一想输入脉冲(红色)在系统中滑动(蓝色)并产生综合效果:卷积(黄色)。
卷积具有先进的技术定义,但是可以用正确的类比来理解基础知识。
快速咆哮:我学习数学很有趣,但是花了好几年的时间才能找到令人满意的直觉:
为什么要花这么长时间?想象一下用$ f \ times g = z $而不是$ 3 \ times 5 = 15 $来学习乘法。没有一个例子,我就无法思考,我只能记住结果,而不是直觉。希望这种类比可以节省您多年的努力。