训练计算机感知能力
起初,超视看起来很神奇。谷歌照片(Google Photos)知道你照片上的人是谁,识别婴儿和狗的能力比你更好。图片网Pinterest会根据你通过互联网上传的图像找出相似的图像。汽车可以识别路标上的限速提示。这不是魔法,其实只是算法加上大量训练数据的结果。
计算机视觉的起源和相关的雄心壮志可以追溯到20世纪60年代。那时,每个人都认为计算机识别像素是很容易的,但事实证明,教计算机看东西是“非平凡的”(nontrivial,物理学家描述极为困难之事的措辞)。相反,文本索引和搜索相对简单,但是也需要复杂和计算量很大的算法来识别出图像或视频中的内容。计算机如何识别照片中的物体?那些物体位于照片的什么位置?目标识别和场景分类是超视的首要任务,这是视力测试表上最便于识别的第一行。
再想象一下,当你在树林里散步时,一只鸟飞过。数据科学家如何训练手机上的应用程序来区分苍鹭和秃鹰呢?先从“训练数据”开始:需要成千上万张被标记的苍鹭或秃鹰在各种背景下的各种姿势的照片(这些被称为“真正”样本)。为了训练出具有鲁棒性(17)的算法来识别鹰的所有姿势和形态,你需要鹰在飞行、筑巢、站立及俯冲时的图像,不同年龄、不同性别的鹰的图像及秃鹰和金雕的图像。同时,你还需要数以千计的照片,其中没有鹰的存在,但包含鹰生活环境中常见的事物(这些被称为“真负”样本)。通过这种方式,算法可以学习区分鹰和鹰周围的所有事物,比如树和含有鹰标志的旗帜。
iNaturalist应用程序已经做到了这一点,它可以帮助人们识别成千上万种植物、动物、虫子及植物群。我和女儿最近爬了3小时的拉斐特山,这是新罕布什尔州白山国家森林公园风景最美的徒步旅行地之一。我们很兴奋,同时也精疲力竭。坐在山顶的岩石上,我瞥见一朵可爱的小花在4 000英尺的海拔顽强生长。出于好奇,我在iNaturalist上拍下一张照片,知道了图中植物的名字是岩梅(Diapensia,见图1-1),这让我感到很开心。我也了解到其他一些相关细节:它有时也被称为针垫植物,主要分布于喜马拉雅山和北极。
图1-1 山中的岩梅开花时的样子
注:岩梅,生长于高山上的花朵,我在远足时拍摄,通过使用iNaturalist的深度学习算法获得其名称。
iNaturalist发布于2008年,以可视化数据库ImageNet上的人工标记照片组为基础进行训练。ImageNet是一个学术项目,由李飞飞在斯坦福视觉实验室发起,她后来担任过谷歌人工智能首席科学家。ImageNet数据库现在有超过1 400万个人工标记的图像和超过20 000个标签。李飞飞教授创建了这个海量的标记图像数据库,以判断大规模视觉识别挑战中图像识别算法的质量。2010年,获胜算法得分准确率约为70%。发展到今天,获胜算法得分准确率达到95%以上,表现始终优于完成同样任务的人类。你能以95%以上的准确率分辨出90个狗的品种吗?反正我是做不到。
iNaturalist的优秀之处在于其迭代众包(iterative crowd-sourced)培训体系(见图1-2和图1-3)。不需要助手来告诉它糙莓和马里恩莓的区别,这些将由用户代劳。人们上传植物和虫子的照片越多,iNaturalist的训练数据集就越大,照片也会更加多样化,进而提升了应用程序的功能性和准确性。如果人工智能对某一标记不确定,那么研究人员就会加入来完成确认或手动添加正确的标记。然后,新的数据得以被反馈给算法,从而可以重新训练网络,使其更加精确。计算机视觉系统青睐大型的自馈回路。因为接触到越来越多的训练数据,iNaturalist现在对大多数动植物分辨的准确率超过98%。
图1-2 iNaturalist的自动标记功能
注:iNaturalist会在上传的照片中自动标注虫子、蝙蝠和苍鹭。这种用户贡献的数据流提高了算法的精度。
图1-3 iNaturalist的地理标记功能
注:iNaturalist的众包结果会被进行地理标记,以显示有用的元数据层——在布鲁克林,我应该到哪里才能找到野生动物?
现在,几乎所有这些应用所使用的最先进的计算机视觉算法都是深度卷积神经网络(18)。之所以被称为“深度”,是因为其多层属性,每层负责图像中不同尺度的特征。底层侧重于图案这样精确的细节,其他层检测形状等粗略特征。当该网络中的每个节点都被激活时,唯一的向量(本质上是图像的明显特征)得以被计算并与其他向量库匹配。当高置信度匹配出现时,图像就会得到正确的标记,如蝙蝠、虫子及鹰。
这些检测算法的表现有多好?答案包含两个层面:灵敏度和精度(19)。假设你是一位生活在1940年的雷达接收机操作员。你被部署在英国多佛海岸的一个新的绝密站点,用所谓的雷达识别来袭的德国飞机。你的工作是整晚保持清醒,倾听静电噪声,然后确定它们究竟是来自低空飞行的飞机(这种情况下,你需要拉响警报),还是来自一群海鸥(这种情况下,就不要打扰大家的睡眠了)。你唯一的控制器是一个大型灵敏度表盘。提升灵敏度,你更有可能检测到飞机(真正值),但也会检测到更多的海鸥(假正值)。调低灵敏度,你检测到的海鸥会更少,但也可能错过飞机(假负值)。而灵敏度的设置要求并不明确!系统要么在喊“狼来了”,要么没有发现而“放狼进来”。
这也是我们衡量算法质量的方式:从灵敏度和精度两个方面入手。灵敏度确定多大程度上检测到所有类似飞机的物体,而精度确定检测到的物体中,多大比例确实是飞机(相对于鸟或其他事物)。
我从没遇见过完美的算法。总是存在假负值(算法认为没有物体,但确实有一架飞机)和假正值(算法认为是飞机,但其实只是一只海鸥)。
像雷达操作员一样,你必须选择是优先考虑灵敏度还是精度。大多数医学检测更喜欢灵敏度:胸部X光检查需要调高灵敏度,因为假正值(你发现一只鸟,这只鸟可能是飞机。换言之,发现的阴影有可能是病变)比假负值(你既没有检测到飞机也没有检测到鸟,即没有检测出早期乳腺癌)更好。
现代计算机视觉系统总是反馈置信度数字与各种预测,以帮助使用者决定采用哪些数据。例如,你可以76%确定有一架飞机,或者12%确定有一只鸟,然而,我们永远不能100%确定没有超人。使用这种置信度数字,数据科学家可以设定一个临界值,低于临界值的数据不予考虑,这样大家就都可以安心地睡觉了。
设置临界值的标准取决于应用程序。如果你试图在浣熊进入你家垃圾桶之前发现它,达到80%的置信度就要拉响警报;如果你错过了几只浣熊,最糟糕的事情无非是清理它们留下的一片狼藉。相比之下,如果是要识别腋下的肿块,就必须设定较低的置信度。在医疗保健行业尤其如此,错过一些东西的代价很高,所以你愿意接受更多的假正值。
为了让超视发挥作用,它首先需要对自己所看到的事物有自己的判断。训练超视的观察能力是我们在本书中谈及所有其他功能的基础。现在我们可以来谈谈有了感知到的信息之后,超视都能做些什么。