别怕,"卷积"其实很简单(上)
文章来自我的CSDN同名博客,欢迎文末扫码关注~
前言
相信很多时候,当我们在看到“卷积”时,总是处于一脸懵逼的状态,不但因为它的本身概念比较难理解,还因为它在不同的应用中发挥出的变幻莫测的作用也时常让人迷糊。
但这些应用其实本质上都是同一种东西,理解了卷积的来源,就可以举一反三。其实我个人对于卷积的理解,很长时间都处于似懂非懂的状态,就像傅里叶变换的一些tricky points,只求在应用中不出差错,不求甚解。但是如果想要真正做好机器学习的研究,我认为在真正的学习理论基础前,必须将概念的本质搞清楚。
因此,这篇文章便是为工科,理科以及其他领域对此感兴趣的同学而整理,除了自己的理解,也感谢知乎、豆瓣上其他答主的解答(已授权),内容简易通俗,便于理解。
什么是卷积
卷积,很多时候都是我们在各种工程领域,信号领域所看到的常用名词,比如系统
通俗易懂的说,就是
输出 = 输入 * 系统
虽然它看起来只是个简单的数学公式,但是却有着重要的物理意义,因为自然界这样的系统无处不在,计算一个系统的输出最好的方法就是运用卷积。更一般的,我们还有很多其他领域的应用:
统计学中,加权的滑动平均是一种卷积。
概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。
声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。
电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。
物理学中,任何一个线性系统(符合叠加原理)都存在卷积。
计算机科学中,卷积神经网络(CNN)是深度学习算法中的一种,近年来被广泛用到模式识别、图像处理等领域中。
这6个领域中,卷积起到了至关重要的作用。在面对一些复杂情况时,作为一种强有力的处理方法,卷积给出了简单却有效的输出。对于机器学习领域,尤其是深度学习,最著名的CNN卷积神经网络(Convolutional Neural Network, CNN),在图像领域取得了非常好的实际效果,始一出现便横扫各类算法。关于CNN的具体内容和理解,将在之后的文章中解释,这里先留一个悬念。
那么,到底什么是卷积呢?
小故事
首先给大家讲一个关于卷积的小故事:
小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。
这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。
于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。
下面还需要一些假设来保证论证的严谨:假定小明的脸是线性时不变系统,也就是说,无论什么时候主管打一巴掌,打在小明脸的同一位置(这似乎要求小明的脸足够光滑,如果小明长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了)
小明的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。
好了,那么,下面可以进入核心内容——卷积了!
如果小明每天都到公司楼下去打台球,那么主管每天都要扇小明一巴掌,不过当主管打小明一巴掌后,小明5分钟就消肿了,所以时间长了,他甚至就适应这种生活了……如果有一天,主管忍无可忍,叫上公司的251个保安,站成一个圈围住小明,以0.5秒的间隔开始不间断的扇小明的过程。
这样问题就来了,第一次扇小明鼓起来的包还没消肿,第二个巴掌就来了,小明脸上的包就可能鼓起来两倍高,大家不断扇小明,脉冲不断作用在小明脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是小明脸上的包的高度随时间变化的一个函数了(注意理解)
如果主管再狠一点,频率越来越高,以至于小明都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,小明的脸上的包的鼓起程度和什么有关呢?
和之前每次打小明都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,所以这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积,卷积之后的函数就是小明脸上的包的大小随时间变化的函数。
本来小明的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到剑桥大学的公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了。
又比如,小明因为被主管虐待,所以一怒之下还手,结果被保安驾出了公司,还没有拿到N+1赔偿。他只好通过理财的方式来达到财务自由,希望出任CEO赢取白富美走上人生巅峰,于是他把所有存款100元钱存入了XXP2P理财,年利率是5%,按复利计算(即将每一年所获利息加入本金,以计算下一年的利息),那么在五年之后他能拿到的钱数是
如下表所示
将这笔钱存入银行的一年之后,小明又往银行中存入了100元钱,年利率仍为5%,那么这笔钱按复利计算,到了第五年,将收回的钱数是,
我们将这一结果作为新的一行加入上面的表格中:
以此类推,如果小明每年都往银行中存入新的100元钱,那么这个收益表格将是这样的
可见,最终小明拿到的钱将等于他各年存入的钱分别计算复利之后得到的钱数的总和,即:
用求和符号来简化这个公式,可以得到:
在上式中f(i)为小明的存钱函数,g(i)为存入银行的每一笔钱的复利计算函数。在这里,小明最终得到的钱就是他的存钱函数和复利计算函数的卷积。
为了更清晰地看到这一点,我们将这个公式推广到连续的情况,也就是说,小明在从0到t的这一段时间内,每时每刻都往银行里存钱,他的存钱函数为
而银行也对他存入的每一笔钱按复利公式计算收益:
则小明到时间t将得到的总钱数为:
这也就是卷积的表达式了,上式可以记为
补充
相信通过上面这个例子,大家应该能够很清晰地记住卷积公式了。下面我们再展开说两句:
如果我们将小明的存款函数视为一个信号发生(也就是激励)的过程,而将复利函数
视为一个系统对信号的响应函数(也就是响应),那么二者的卷积
就可以看做是在t时刻对系统进行观察,得到的观察结果(也就是输出)将是过去产生的所有信号经过系统的「处理/响应」后得到的结果的叠加,这也就是卷积的物理意义了。
讲到这里,小伙伴们是不是已经对卷积有了一个清晰而深刻的认识呢?在下一篇文章中,我将会用更加规范化的例子来讲解卷积的意义,同时进行一些理论形式的推导,最后会给出卷积在计算机视觉上的应用方法~
别怕,"卷积"其实很简单(上)的更多相关文章
- 别怕,"卷积"其实很简单(下)
文章来自我的CSDN同名博客,欢迎文末扫码关注~ 定义 基于上一篇文章的通俗化例子,我们从基本概念上了解了卷积,那么更严格的定义是怎样的呢? 从数学上讲,卷积只不过是一种运算,对于很多没有 ...
- 在linux安装redis单机和集群后,如何在windows上使用redis客户端或者java代码访问错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。
这几天在学习在linux上搭建服务器的工作,可谓历经艰辛.可喜最后收获也不少. 这次是在linux上搭建redis服务器后从windows上缺无法访问,连接不上. 仔细回忆以前搭建nginx和ftp的 ...
- MNIST数据集上卷积神经网络的简单实现(使用PyTorch)
设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图 两个卷积层, 第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1* ...
- Mac上安装配置Go语言,其实很简单(一)
下载Go语言可以去:Go语言中文网 安装及自己选择是否修改GOPATH 下载下来后双击安装就好,使用 go version 查看安装版本: 在Mac上安装完成后,会自动设置一些环境变量,使用 go e ...
- USB-Blaster CPLD FPGA Intel 驱动安装不上的问题,文件的哈希值不在指定的目录文件中,的解决办法,其实很简单
intel的官网的驱动安装文档: https://www.intel.com/content/www/us/en/programmable/support/support-resources/down ...
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- 其实Unix很简单
很多编程的朋友都在网上问我这样的几个问题,Unix怎么学?Unix怎么这么难?如何才能学好?并且让我给他们一些学好Unix的经验.在绝大多数时候,我发现问这些问题的朋友都有两个特点: 1)对Unix有 ...
随机推荐
- 51nod 1686 第K大区间【离散化+二分】
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 定义一个区间的值为其众数出现的次数. 现给出n ...
- Python基础:常用函数
1:enumerate enumerate(sequence, start=0) 该函数返回一个enumerate对象(一个迭代器).其中的sequence参数可以是序列.迭代器或者支持迭代的其他对象 ...
- postman 中post方式提交数据
post方式提交数据时,把参数填写在body中而不是pOST下面的哪一行
- 3d爱心代码
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- zoj 3859 DoIt is Being Flooded (MFSet && Flood Fill)
ZOJ :: Problems :: Show Problem 这题开始的时候想不到怎么调整每个grid的实际淹没时间,于是只好找了下watashi的题解,发现这个操作还是挺简单的. ZOJ3354 ...
- Android本地数据存储: Reservoir
一:前言 今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名.密码这样的.其实大家都知道,这种情况最常用的就是SharedPreferences了,我也不例外,脑子里第一个想到的就是用 ...
- pytorch JIT浅解析
概要 Torch Script中的核心数据结构是ScriptModule. 它是Torch的nn.Module的类似物,代表整个模型作为子模块树. 与普通模块一样,ScriptModule中的每个单 ...
- navicat ssh通道受限问题处理
navicat 链接数据库 使用navicat 的ssh通道连接数据库回遇到权限问题 错误代码如下: 80070007: SSH Tunnel: Server does not support dif ...
- Vue2.0做的项目在IE下面打开一片空白?
解决方式:安装 "babel-polyfill" 即可. 命令:cnpm install --save-dev babel-polyfill 在入口main.js文件引入:impo ...
- Spring boot+JPA+Druid
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...