ConvNet推理过程的说明
在最左边是我们的输入,原始的图像像素,我们可以用一个3维矩阵来表示它。例如,一个分辨率为256x256的图像可以用一个256x256x3的矩阵来表示(这里的3表示RGB三个颜色)。接下去,我们就开始做卷积,听上去很神奇,但实际上就是我们用一个小型滤波器从图像的一头滑动到另一头,一行滑动到另一行。不同的滤波器对图像中不同的特征有不同的反应:有一些滤波器看到一个很小的水平边缘就会很激动,还有一些会对红色的区域很敏感,等等等等。
假设,我们有10种不同的滤波器,通过这种方式我们可以将原始(256,256,3)的图像转换成另一个(256,256,10)的“图像”。在这个经过变换后的“图像”中,我们已经将原始图像中的信息舍去了,留下的是原始图像每一个位置上对这10个滤波器的响应。这就好像是我们将原始图像的3个颜色通道(红绿蓝)变成10个滤波响应通道(在动图中,原始图像的右侧第一列就是经过变换后的图像)。
上面解释了原始图像右侧第一列是怎么来的,那么,后面这些列又是怎么出来的呢?很简单,继续用滤波器对第一列的结果进行滤波得到第二列,对第二列滤波得到第三列,以此类推。不同的列会使用不同的滤波器组合对上一列进行操作,目的是渐进地去发现越来越复杂的视觉模式,而最后一组滤波器则是用来计算图片的视觉分类概率(是汪星人还是癞蛤蟆)。当然,中间省略了一些细节,只保留了基本思想:将卷积进行到底。
刚才介绍了卷积神经网络就是一个大型滤波器叠滤波器的集合。一个问题是,我们怎么知道该用什么样的滤波器组合才能达到目的呢?实际上我们并不知道——最开始的时候我们完全随机地选择滤波器,然后一遍遍地训练他们,让他们变得更好。
下面开始举例,我们给一个采用随机滤波器的卷积神经网络输入一张图片,最后它会告诉我们这个图里有54%的可能含有狗。接着,我们可以告诉它,这实际是一只癞蛤蟆,通过一个数学过程,这个卷积神经网络会小幅度地去调整它使用的滤波器,目的是为了当它下一次看到相同的图是会告诉我们这张图更可能有癞蛤蟆。我们要做的就是用数百万的图像重复这个过程数千万次甚至数亿次。下面就是见证奇迹的时刻,在卷积计算过程中所使用的不同滤波器会渐渐地调整自己去响应图像中重要的东西,例如眼睛,头部,甚至整个身体等等。
上图是从一个经过训练后的卷积神经网络中随机选出12个滤波器,可以看看它们对图像的什么部分响应强烈。图是从Matthew Zeiler的Visualizing and Understanding Convolutional Networks里借来的。这里展示的滤波器处于卷积的第三阶段,看上去像是在寻找蜂窝状的模式,或者是轮子/躯干/文字等等。再次强调,这并不是我们特意设置的。一切都是模型自发形成的,我们只能来检视。
另一组非常优秀的卷积神经网络可视化的例子可以从Jason Yosinki等人的Deepvis项目中找到。其中包含了一个非常有趣的演示,用你电脑上的摄像头来实时地演示卷积神经网络的工作原理,Jason在下面这个视频中还配上了非常棒的解说:
深度可视化工具箱
总结一下,卷积神经网络的整个训练过程就好像是给一个小孩看许多物体的图像,然后小孩要从中逐渐发现该在图像中看什么以及怎么把这些物体找到。假如你更喜欢技术一点说法,那卷积神经网络是一个从图像像素到分类概率的函数,滤波器是它的参数,我们采用随机梯度下降法来优化一个分类损失函数。如果你对什么人工智能,大脑,奇点着迷,那可以把这个函数说成是一个“深度神经网络”,这些滤波器是神经元,而整个卷积神经网络就是一种自适应的模拟视觉皮层组织。