看了国外大佬的文章有所感悟,有太多的公开课、教程在反复传颂卷积神经网络的好,却都没有讲什么是“卷积”,似乎默认所有读者都有相关基础,所以我想谈谈关于卷积的那些事。
卷积现在可能是深度学习中最重要的概念。正是靠着卷积和卷积神经网络,深度学习才超越了几乎其他所有的机器学习手段。但卷积为什么如此强大?它的原理是什么?在这篇文章中我将讲解卷积及相关概念,帮助你彻底地理解它。
网络上已经有不少博客讲解卷积和深度学习中的卷积,但我发现它们都一上来就加入了太多不必要的数学细节,艰深晦涩,不利于理解主旨。
这篇文章虽然也有很多数学细节,但我会以可视化的方式一步步展示它们,确保每个人都可以理解。
- 文章第一部分旨在帮助读者理解卷积的概念和深度学习中的卷积网络。
- 第二部分引入了一些高级的概念,旨在帮助深度学习方向的研究者和高级玩家进一步加深对卷积的理解。
第一部分:基本理解
整篇文章都会探讨这个问题,但先把握行文脉络会很有帮助。那么粗略来讲,什么是卷积呢?
你可以把卷积想象成一种混合信息的手段。想象一下装满信息的两个桶,我们把它们倒入一个桶中并且通过某种规则搅拌搅拌。也就是说卷积是一种混合两种信息的流程。
卷积也可以形式化地描述,事实上,它就是一种数学运算,跟减加乘除没有本质的区别。虽然这种运算本身很复杂,但它非常有助于简化更复杂的表达式。在物理和工程上,卷积被广泛地用于化简等式——等会儿简单地形式化描述卷积之后——我们将把这些领域的思想和深度学习联系起来,以加深对卷积的理解。但现在我们先从实用的角度理解卷积。
我们如何对图像应用卷积
当我们在图像上应用卷积时,我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息:第一桶是输入的图像,由三个矩阵构成——RGB三通道,其中每个元素都是0到255之间的一个整数。第二个桶是卷积核(kernel),单个浮点数矩阵。可以将卷积核的大小和模式想象成一个搅拌图像的方法。卷积核的输出是一幅修改后的图像,在深度学习中经常被称作feature map。对每个颜色通道都有一个feature map。
边缘检测卷积核的效果
这是怎么做到的呢,我们现在演示一下如何通过卷积来混合这两种信息。一种方法是从输入图片中取出一个与卷积核大小相同的区块——这里假设图片为100×100100×100,卷积核大小为3×33×3,那么我们取出的区块大小就是3×33×3——然后对每对相同位置的元素执行乘法后求和(不同于矩阵乘法,却类似向量内积,这里是两个相同大小的矩阵的“点乘”)。乘积的和就生成了feature map中的一个像素。当一个像素计算完毕后,移动一个像素取下一个区块执行相同的运算。当无法再移动取得新区块的时候对feature map的计算就结束了。这个流程可以用如下的动画演示:
RAM是输入图片,Buffer是feature map
你可能注意到这里有个正规化因子m,这里m的值为kernel的大小9;这是为了保证输入图像和feature map的亮度相同。
为什么机器学习中图像卷积有用
图像中可能含有很多我们不关心的噪音。一个好例子是针对时尚图像用深度编码器做的搜索引擎:你上传一幅时尚服饰的图片,编码器自动找出款式类似的服饰。
如果你想要区分衣服的式样,那么衣服的颜色就不那么重要了;另外像商标之类的细节也不那么重要。最重要的可能是衣服的外形。一般来讲,女装衬衫的形状与衬衣、夹克和裤子的外观非常不同。如果我们过滤掉这些多余的噪音,那我们的算法就不会因颜色、商标之类的细节分心了。我们可以通过卷积轻松地实现这项处理。
通过索贝尔边缘检测滤波器(与上上一幅图类似)去掉了图像中除了边