雷锋网 AI 科技评论按:这篇博客来自 Jetpac(现被谷歌收购) CTO、苹果毕业生、TensorFlow 团队成员 Pete Warden。文中讨论了当要识别的对象出现在图像中的不同位置时,CNN 是如何应对、识别的。Pete Warden 给出的解释也许算不上完善,而且也仍然无法保证能够消除位置的影响,但这是一个不错的开始。雷锋网 AI 科技评论全文编译如下。
一位正在学习用卷积神经网络做图像分类的工程师最近问了我一个有趣的问题:模型是如何学会辨别位于图片中不同位置的物体的呢?由于解释这个问题需要大费些周章,我决定在这里把它们写下来,以帮助其他有类似困惑的人理解这个问题。
上面这两张示例图就可以表示我的这位朋友的问题。
如果你想要识别出所有包含太阳形状的图像,你要怎么保证不管这个太阳形状在哪里,模型都能把它识别出来呢?之所以这是一个有趣的问题,是因为在你完全理解这个问题之前,需要三个阶段的启蒙:
阶段一:如果你未曾尝试过计算机编程,这个问题看上去很简单,因为辨别位置的差异对我们的眼睛和大脑来说没有任何难度。
阶段二:如果你尝试过用传统的编程方法解决过类似的问题,你可能会感到窒息,因为你不仅知道处理这种差异会有多难,也明白更艰难的是向你的客户解释它的技术含量。
阶段三:作为一个得到认证的深度学习权威人士,你可能会摸摸胡子然后微笑,很欣慰这些琐碎的问题是由你建立的网络处理的而不是你本人。
我的朋友正处于启蒙的第三阶段,但也已经粗浅的了解了一些原理可以解释为什么 CNN 可以很好的处理这类问题。我并不会声称我对此有什么新见解,但经过过去几年在图像模型领域的工作经验我也有了一些自己的想法,结合学术圈子里师生之间口口相传的说法,我想将我所知道的分享给大家。欢迎大家补充与此相关的优秀文章连接,由于我的解释仅仅是基于我作为一名成熟的工程师的直觉和经验而来的,请大家帮助我更好的充实和提升这个解释。
首先要知道的是,神经网络并不是天然地对位置识别的问题免疫的。我最开始遇到这个问题是我当用 ImageNet 中的图片训练神经网络时。ImageNet 历史悠久,最初搜集者们利用谷歌图片搜索通过搜索类名称从公共网络中采集示例图片,之后再人工从中剔除不正确的图像。我的好朋友 Tom White 就热衷于在这项剔除异常的工作中挖掘奇闻异事,比如许多女模特的照片出现在了垃圾车类别里(参见改进模型架构遇到了瓶颈?你该考虑改善自己的数据了!)。Andrej Karpathy 通过完成手动标记图片的繁重工作,也对数据集的特点有了更深的理解。
说了刚才这么多,我的意思是,训练数据集中的所有图片都是由人拍摄出来,然后发布在知名网站上的。这意味着训练集中的图像会比随机截屏得来的要更专业,都有一个布局良好的实物主体,通常在靠近中间位置,平视视角拍摄,并占据了画面的大部分。相比之下,如果有人用手机摄像头对准一个物体拍照想让模型给它分类,这样的照片就很有可能有着奇怪的角度。它可能是俯视拍摄的,也可能只拍到物体的一部分,这就意味着,如果让模型识别手机拍摄的照片,它的表现就会比发表的论文里的准确率差的多,因为训练模型用的数据和用户想要识别的图片差别太大。如果你的安卓设备上安装了 TensorFlow 分类应用,你现在还能看到类似的问题。分类模型在手机上变得不好使还不是最糟糕的,因为至少手机用户们拍照的时候还是有一定的取景的。机器人以及类似设备上的图像识别就是一个严重得多的问题。由于这些设备的摄像头的指向是完全随机的,在 ImageNet 上训练的模型表现可谓是非常糟糕。我经常建议开发这些 app 的开发者用和目标设备类似的设备拍的照片作为训练数据集,毕竟除了取景之外,镜头等其他因素也有一些区别。
即便照片是人工选出的,ImageNet 中的图像在物体位置上还是有很多差异,所以神经网络是如何处理它们的呢? 其中的一个秘诀是,训练过程中通常会专门在输入中加入人工的偏移,神经网络就需要学会处理这类差异。
在这图片被输入到模型之前,它们有可能会被随机的裁剪。所有的输入都会被缩小到一个标准尺寸(一般是 200×200 或 300×300),这就将每张图片里物体出现的位置和大小随机化了,还有可能会剪切掉物体的一部分。模型始终都会依据预测的准确性得到惩罚或是奖赏,所以为了获得好的评分它必须在带有这些不同的状况下还能猜出图片里的物体。这解释了为什么神经网络会学习如何处理位置差异。
但这还没有结束。
为了继续深入,我必须得插入一些公认说法和类比。我没有可以支撑接下来的解释的研究,但在我的实验和与其他实践者的讨论中,这一理论是被广泛接受的。
自从开创性的神经网络 AlexNet 开始,CNN 的工作方式就是基于一系列连续的层,依次接收输入数据后最终形成分类操作。我们将初始层看作边缘探测器,寻找最基础的像素规律,之后的图层将初始图层得出的规律作为输入,进行更高级别概念的预测,如此循序渐进。看看一个典型的神经网络第一层过滤器是如何工作的会帮助你更好的理解这个过程:
这张图展示的是每个过滤器所要查找的内容,有些是不同走向的边,其他的是色彩或角。遗憾的是这里无法用简明的图像将之后几层的情况表达出来,如果你想更深入的了解这方面的内容,Jason Yosinki 还有他的研究伙伴提供了一些不错的参考文献。
下面的概念图可以帮助理解刚才说的内容。
第一层要寻找的是一些很简单的特征,比如水平边、角、以及纯色块。这与之前 CaffeNet 可视化的那张图要表达的类似。这些过滤器对输入图像进行地毯式的浏览,当找到所须内容时,就输出一张突出了其所在位置的热力图。
理解第二层发生了什么就有点难了。第一层过滤器输出的热力图被逐个分配到激活层的通道中,因此第二层的输入会有上百个通道,而不是像典型图像那样只有三到四个。第二层的任务是要在从这些热力图中找出更复杂的特征。如果要在图中识别出太阳的一瓣,这一瓣一端有一个角,另一端是一条垂直线,中间填上黄色。每个特征由输入激活层的通道表示,第二层中,「朝左的一瓣」过滤器就负责寻找同时符合这三个条件的通道组合。在仅有一个或两个条件满足的通道组合所在的位置,不会有输出,只有当满足所有条件的通道组合(只有在那些满足全部三个条件的位置),输出会呈现激活状态。
与第一层一样,第二层也有很多过滤器,它们表示的是更高一级的概念,像「朝上的一瓣」、「朝右的一瓣」等等。这很难用图来表示,笼统来讲就是会输出一个有很多通道的层,每个通道都表征着这一级别的概念。
随着学习深度加深,层要表达的概念就越来越高级。例如,第三或第四层通过将输入通道表征的概念进行组合,如果有黄色的、被花瓣围绕着的圆,就会显示出激活。写一个分类器把图像中的太阳找到就这样简单地做到了。现实中分类器不会像我之前例子中那样把概念切割的如此清楚,因为分类器会自己学习如何拆解问题,而不是以人类所能理解的分类方式来运行,但基本原理就是如此。
文章到现在还没能解释神经网络如何识别位置之间的差异。因此最后,你还需要了解另一种设计图像分类 CNN 网络时候的常见做法。随着网络的层次越来越深,通道的数量会显著增加,图像的尺寸则会缩小。缩小的过程由池化层完成,过去是利用平均池化但最近流行用最大池化来做。两者的效果相近。
比如现在要将这张图被缩小为原来的一半,对每一个输出像素,我们以 2×2 的输入块为单位从中选出值最大的,因此这一过程被称为最大池化。而在平均池化中,是将这四个值的平均值传递到下一层。
这一池化过程会不断重复,把值在网络中传递下去。也就是说,最终,图像尺寸可能会从 300×300 缩小到 13×13。这样大的收缩量意味着位置变量的数量会大大缩减。就拿上面的例子来说,太阳只能在余下的 13 行、13 列像素中出现。如此一来任何小的位置差异都被隐藏起来,因为彼此具有微小差异的输出在最大池化过程都被融合在一起了。这使得最终分类器在位置差异问题的处理上会进行得更加有序顺利,因为它处理的是将原图信息精简许多以后的图像。
这就是我对分类器在处理位置变化问题上的解释,但对类似的问题,比如不同时间位置上的音频信号又是如何呢?最近我对一种可以替代池化,被称为「扩张」或者又叫「空洞」卷积的方法很感兴趣。与最大池化一样,它产出的是一个更小的图像,但工作原理是基于卷积方法本身的。不同于池化是采集相邻的输入像素,它对样本的选取是跨越式的,因此采集范围可以非常大。这使得扩张卷积可以很快的将非局部的信息整合到一起,成为一个更简洁有序的形式,这是 DeepMind 的 WaveNet 论文中的神奇的方法的一部分,能够用卷积而不是循环神经网络来解决基于时间的问题。
我对此感到很兴奋,因为循环神经网络的速度是个痛点。如果你要处理批量大小为 1 的数据,这在即时应用中是个很典型的问题,大部分计算都是矩阵和向量之间的乘法,计算强度相当于全连接层。由于每个权重只会用到一次,这类计算受限于计算机的存储能力而不是运算能力,而卷积却恰恰相反。因此我非常希望这种方法可以广泛应用于其他领域。
谢谢大家能看到这里。我希望这能帮到大家,欢迎大家在评论区或 Twitter 上对此提出改善的建议。
via petewarden.com,雷锋网 AI 科技评论编译