谈谈离散卷积和卷积神经网络
来源:互联网 发布:中信建投网上交易软件 编辑:程序博客网 时间:2024/06/06 00:57
早在学习数学分析时,我就已经接触过卷积的概念。然而,彼时年少,水平有限,没有完整地理解卷积的概念和精髓。这个遗憾一直持续至今。接触到卷积神经网络(Convolution Neural Network, CNN)之后,旧事重提般地,想要了解清楚卷积的冲动就愈发强烈,终至此文。
这是一篇介绍性质的文章。文中的公式、动画效果限于网页的表现力,无法达至完美。本文有对应的 PDF 格式的幻灯片可供下载(离散卷积和卷积神经网络)。你可能需要使用 Adobe Acrobat/Reader 作为 PDF 阅读器,以获得幻灯片的所有效果。
初识卷积
一问卷积
「卷积」这个词给人的第一印象就是「萌萌哒」,因此,恐怕很多人听见卷积的第一反应会是:「卷积可以吃吗为什么要叫这个名字」。
粗暴地回答的话,理由有三:
- 卷在这里对应英文的 convolve 这个单词,在卷积这个概念中,它的本意是「翻转」;
- 积在这里对应乘积,因为卷积是通过两个函数/序列的乘积实现的;
- 它真的是在「卷」——把多个乘积卷在一起变成一个值。
形式定义
在具体介绍卷积是什么、为什么是这样、有什么用之前,让我们预先「先入为主」地看一看一维卷积的定义是什么样的。
- 离散形式:
(x∗y)[n]=∑+∞m=−∞x[m]⋅y[n−m] 。 - 连续形式:
(f∗g)(t)=∫+∞−∞f(τ)⋅g(t−τ)dτ 。
当然,此篇主要介绍离散卷积,因此连续卷积从这一刻起就被暂时打入冷宫了。
如果你仔细观察离散卷积的定义,你就会发现,它也可以写成如下等价形式。
可以看到,卷积将等式右边的两个变量
一维离散卷积
在详细介绍一维离散卷积之前,我们需要先了解什么是「线性时不变系统」。此后,在脉冲激励和冲激响应的叠加中,我们就能得到卷积。
线性时不变系统
线性时不变系统(Linear Time-invariant System)是一种特殊的信号系统。它的特性分成「线性」和「时不变」两个维度。
所谓线性,说的是系统的输出对输入满足齐次性和叠加性。这也就是说,若输入
所谓时不变,说的是系统对固定输入的输出响应不随时间发生变化。这也就是说,若输入
冲激和响应
信号系统的输入,称之为「激励」。对信号系统来说,它通常会接收一连串的激励。这一连串的激励,通常在瞬时发生,然后消退。因此信号系统的输入又称之为「脉冲激励」,简称「冲激」。若以
信号系统的输出,称之为「响应」。对于单位强度冲激的响应,即是「冲激响应」。信号系统对单独的冲激,做出的响应输出,可能在冲激发生之后持续一段时间。若以
若你不太理解为何响应会在冲激发生之后持续一段时间,那么你可以把自己比作一个信号系统。当你遇到什么开心/不开心的事情之后,你高兴/伤心的情绪不会只在那一瞬间出现,而是会持续一段时间。
连续冲激的响应
现在我们知道几个事实:
- 系统接收到一份输入后,其后的一段时间内会陆续给出输出响应;
- 系统会连续收到若干输入;
- 系统是线性时不变的。
特别地,输入冲激
当然,对于两端延伸的无穷序列,你应该把它写作
以上一小节的数据为例,将数据制成表如下:
接下来,你只需要纵向观察表格,将每一纵列的值相加,就能得到相应时刻的系统输出响应了。
离散卷积
从上面的分析中,可以看出,对于任意时刻
这正是一维离散卷积的定义。以
定投的例子
现在假设有一个一年期定投项目,它的利率始终保持不变。因此,整个定投项目可以视作是一个线性时不变系统。
- 最终收益对投入的资金是线性累加的;
- 利率不变,意味着任何时候投入资金的效果是一样的。
因此,你可以定义响应序列
而后,假设你每年存入 100 元,于是有冲激序列
于是,任意时刻的账户余额
接下来,我们回过头观察
若以
怎样卷?
通过观察
我们来看这张图。它的横轴和纵轴被替换成了
不难发现,
现在,把
这就是为什么我们说,卷积它真的可以「卷」了。
二问卷积
至此,一维离散卷积相关的内容,我们就介绍完了。现在我们回过头来看看,在介绍一维离散卷积的过程中,卷积表现出了哪些特点。
我们是通过线性时不变的信号系统引出卷积的概念的。若仍以信号系统的说辞为例,则不难发现:
- 一个脉冲激励可以影响到信号系统在若干时刻的输出;
- 从另一个角度,这也就是说,信号系统任意时刻的输出,取决于相关的多个冲激输入。
也就是说,和一般的函数不同,信号系统的输入和输出不是「一对一」的关系,而是「多对多」的关系。我们在后续介绍卷积神经网络的时候,会看到这一特点的作用。
此外,仍以信号系统的说辞为例,我们也不难发现,系统的最终输出,一方面取决于输入的激励信号长什么样子,另一方面取决于冲激响应的模式。这两方面相互作用(就是卷积),最终决定了信号系统的输出。
在后续对一维离散卷积的观察中,我们发现,连续地求解多个卷积值的时候(即,求解
- 翻转输入信号;
- 输入信号沿轴线向前滑动;
- 输入信号与冲激响应叠加的部分分别求积,然后相加。
而实际上我们发现,在卷积的定义中,
二维离散卷积
定义
恭喜你,现在我们进入「高维宇宙」。
首先,让我们回顾一下一维离散卷积的定义。
二维卷积的定义,在形式上和一维卷积完全一致——只需要将一维卷积中的变量
类似地,你可以定义更高维的卷积。
若仔细观察公式,不难发现,我们在二维卷积中遇到的问题,和在一维卷积中遇到的问题完全一致。二维卷积具有和一维卷积几乎完全相同的性质、特点、作用。和一维卷积一样,二维卷积也可以看做是加权平均的推广:以
图像的滤镜
在实际应用中,卷积核
值得一提的是,对于图像来说,这个过程实际就是 PhotoShop 等图像处理软件中的「滤镜」效果。比如,假设我们有一个
从直觉上分析,它将中心点附近的共 9 个点的像素值,平均到输出图像的中心像素点上;这实际上就是模糊效果对应的滤镜(box-blur)。又比如,假设我们有这样的卷积核
从直觉上分析,它加强了中心像素点的作用,同时减小了位于其上下左右的四个像素点对它的干扰;这实际上就是锐化效果对应的滤镜(sharpen)。又比如,假设我们有这样的卷积核
从直觉上分析,只有当中心像素点原本的像素值和周围 8 个像素点的值差距很大时,这个卷积核的输出,才会明显地不等于 0;因此,这实际上就是边缘检测对应的滤镜(edge detect)。
我们将上述三个矩阵以 Python 实现出来,就能看到它们的效果了。(参见:PIL 简明教程 - 像素操作与图像滤镜)其效果如下图所示。
三问卷积
又到了思考问题的贤者时间。
在介绍一维卷积的过程中,我们已经讨论了卷积本身具有的特点。但是,也留下了一个问题:卷积在抽象上,到底有什么意义呢?
站在人类的角度,我们先入为主地将上面 3 个示例的卷积核当做了「滤镜」。然而,事情真的是这样吗?如果我们忘记「滤镜」这一先验知识,那么我们可能会把这件事情,简单地以更抽象的方式描述为「卷积核处理图形」。没错,这仅仅是一个「处理」过程而已。现在我们回想一下,环境中的真实景象,也是经过我们的大脑处理之后,在脑海里形成实际的画面的。若然你知道,同一个真实景象,在不同生物的眼里是不一样的。那么你就不难发现,不同的生物,因其进化路径不同,大脑对环境真实景象的处理也不同,因而脑海中看到的景象也就不同。这与我们用不同的滤镜处理图像,得到不同的滤镜结果,何其相似?
刚才我们说到不同生物眼里的世界是不一样的。那么,更深入地理解一下这份不同,我们会否领会到更多的东西呢?
比如,我们可以思考:为什么自然选择会让不同的生物看到不同的景象?答案其实很简单:因为适者生存。蛇类的眼睛,按照人类的意识,几乎不能视物;然而因为经常需要夜间活动,所以蛇能够以红外的方式「看到」这个世界。青蛙的眼睛,难以察觉到静止的事物;然而因为它只对「会动的虫子」感兴趣,所以青蛙具有奇佳的动态视觉。站在更广的时间维度上,我们可以这样回答这个问题:对于具体的某种生物来说,因其生存需要,它只对某种形式的视觉效果感兴趣,因而其视觉处理系统进化成了当前的模样。简而言之,不同的生物,看待世界的方式,有不同的侧重点,因而将同一个真实景象处理成了不同的模样。
这里我们对生物的视觉效果进行了展开分析。这不是我要「跨界」当「神棍」,而是想以一种直觉的方式,以普遍的现象为对比,试着能够更好地理解卷积的意义。
至此,我们可以比较容易地制作出一张对应的表格。
这也就是说,特定的卷积核,能够从若干相关特征信号(通常是相邻位置的特征信号)中以特定的方式抽取新的高维特征。
卷积神经网络
有了这些关于卷积的知识基础,现在我们可以讨论卷积神经网络了。我们假设你已经对神经网络有所了解,因此就不去从感知机开始,逐步地介绍了。
图片识别任务
这个例子,来自于 YJango的卷积神经网络——介绍。
在介绍二维离散卷积的时候,我们以图片为例。这是因为,图片是天然的二维像素矩阵组成的数据形式(RBG 三通道即是 3 个矩阵)。因此,专业里我们也以图片识别任务为例,展开对卷积神经网络的介绍。
如上图。每一个
前馈神经网络
对于这样的图片识别任务,使用深度前馈神经网络来解决,当然是可以的。
如上图。为了解决这样的问题,我们首先需要将原始图片制成一个能用向量表示出来的数据形式。最简单的办法,就是将二维的图像,逐行地展开。如此,我们就从 object
得到了输入层 input
。接下来,我们就可以把输入层链接到隐藏层当中,经过逐层地全连接,得到最终输出 output
。通常来说,这个最终输出,是神经网络给出的概率。这个概率描述,神经网络认为当前图片中,包含「横折」的概率。
经过大量的训练,这样的神经网络可以很好地完成识别任务。然而,这样的网络设计,也可能存在一些问题。
如上图。假设左侧的 4 张图片,是我们标注好的训练样本。经过训练之后,我们的神经网络应当已经具有一定的能力,尝试识别图片中是否存在「横折」这一笔画。然而,由于训练神经网络时的输入样本十分有限,我们的神经网络可能并不认得右侧的样本。特别地,在我们的神经网络示意图中,左上角的横折和位于中间的横折是完全不同的两个向量。因此,我们得到的神经网络模型,很可能无法给出对右侧未知样本的准确预测。
那么,怎么办呢?
最最简单容易想到的办法,就是增加训练时的训练样本。若然我们能够让样本覆盖所有情况,那么训练得到的神经网络自然就可以识别所有的情况,并给出结论了。不过,最简单容易想到的解法,往往暗含各种各样的问题。首先,我们的图片识别任务中,图片都是
表意的平移不变性——对问题的深入思考
扩大训练集的解法,当然也是一个办法。在实际生产中,有些时候也确实需要扩大训练集,以解决一些欠拟合的问题。然而,正如任何定理都有其适用范围,我们也需要斟酌扩大训练集在当前任务中是否合适。显然,有上面的分析,在当前任务中,这不是个好办法。
那么,问题出在哪里呢?或者说,我们应当在哪个方向前进,以便解决这个问题呢?在上面的分析中,我们有提到一句话:「在我们的神经网络示意图中,左上角的横折和位于中间的横折是完全不同的两个向量」。我想,若你足够敏感,应该能意识到什么。
不好。这很不好。在表意上,位于图片左上角的横折之于位于图片中间的横折没有什么差别。也就是说,在图片上任意平移横折的位置,其表意不发生变化。我们称之为表意的平移不变性。然而,在我们的神经网络中,这两个横折在输入层的表现居然没有什么共同点。显而易见,这是不合理的。因此,在遇到的这个问题中,我们首先应该考虑的,不是扩增训练集,而是应当考虑我们神经网络是否足够好地适应当前的问题。
那么,我们的神经网络中,问题出在哪里呢?
首先,我们的神经网络是针对每个像素的具体情况进行训练的。其次,图片上的区域各自为政,没有关联。也就是说,我们的神经网络,很难捕捉到相邻区域中几个像素点(特征值)的结构信息。另一方面,我们的神经网络,也没有以一种一致地视角,去看待每一个局部的结构。这样一来,我们的神经网络就可能会把位于左上角的横折与位于中间的横折,当成两个完全没有关联的图形。这显然是不合适的。
引入卷积
至此,就轮到卷积出场拯救世界了。
我们回顾一下简单的前馈神经网络在当前任务中遇到的问题:无法一致地捕捉局部的结构信息。我们再来回想一下卷积的特点:以一个固定的卷积核,收集相邻特征信号的信息,加权平均得到卷积值。啊!卷积的这些特点,不就正好弥补了当前前馈神经网络的不足吗?
于是,我们可以设计出这样的网络结构。
如上图。首先,我们用一个固定的 convolved feature
。而后,和我们在前馈神经网络中做的一样,我们将 convolved feature
展开,作为输入层,链接其背后的隐藏层,并最终得到输出。
在这个过程中,神经网络的参数,除了隐藏层中的各个神经元上的参数,还有卷积核的具体内容。也就是说,卷积核的大小是固定的,但是它长什么样子,是需要具体训练的。
这样引入了卷积的神经网络,就是卷积神经网络(Convolution Neural Network, CNN)了。当然,在实际使用中,还常常引入名为池化(Pooling)的技术,这里按下不表。
不变性的讨论
有了卷积,我们的神经网络就能一致地去捕捉输入信号局部的结构信息。特别地,由于卷积核在不同位置上是共享的,所以笔画的平移在神经网络看来,就不影响表意了。因此我们说,卷积神经网络满足了平移不变性。
那么,是否还有其它的不变性呢?当然是有的。
比如,我们现在的横折由
又比如,假设我们不识别笔画,我们识别图片中的铅笔。在图片中,除了说铅笔可大可小,位置上可以在图片上游走,铅笔还可能以不同角度出现——横着放的、竖着放的、斜着放的。但不论铅笔如何摆放,它都是铅笔。这种现象,我们称之为旋转不变性。不过,很遗憾,由于卷积的特性所限,我们无法简单地用卷积,让神经网络满足旋转不变性。
卷积神经网络直觉上的优势
上面我们讨论了卷积的特点。因此,我们不难总结卷积神经网络的一些优势。
- 适用于相关元素(特别是相邻元素)中存在结构特征的情况;
- 适用于上述结构可能出现在不同位置的情况。
现在,我们考虑一下分类问题。对于分类问题来说
- 在分割线(可能是超平面、超曲面)附近,样本往往存在特定的结构特征;
- 输入的样本,可能位于分割线的不同位置,因此上述结构也可能出现在分割线的不同位置。
分类问题的这样的特点,恰恰符合了卷积神经网络的优势。因此,人们常常偏向于认为:「卷积神经网络可以在分类问题上表现得好」。
- 谈谈离散卷积和卷积神经网络
- 卷积和卷积神经网络
- 卷积神经网络池化层和卷积层作用
- 卷积神经网络学习--卷积和池化
- 卷积神经网络学习--卷积和池化
- 卷积神经网络的卷积层和池化层
- 卷积神经网络中的“卷积”
- 谈谈卷积
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 卷积神经网络
- 面向对象
- 第二章 SQL命令参考-ALTER CONVERSION
- checkbox 表示
- チェックボックス表示
- ESLint 的正式使用感受
- 谈谈离散卷积和卷积神经网络
- PhoneGap开发环境搭建
- Jzoj4307 喝喝喝
- unity 从头开始制作类dota2小地图
- 系统管理与系统安全命令
- bzoj 4397: [Usaco2015 dec]Breed Counting 乱搞
- 线段树模板复习
- 人闲钱不闲 长假理财七招
- [简单题]自定义取余(三种解法)C++实现