认出一张脸为什么难
认出照片里的脸对人来说太容易,以至于看不出难处。但对计算机而言,照片只是一串数字。一张一千乘一千的灰度图就是一百万个亮度值排成的清单,计算机要拿着这份清单回答:这是猫。
最天真的做法是把猫的照片整张背下来:记住一百万个数字的模式,再拿新照片去比。这立刻失败。猫只要在画面里往旁边移动十个像素,一百万个值就全被推到别的位置,成了一份完全不同的清单。人眼看是同一只猫,用数字看是陌路。
亮度稍变、猫稍微倾斜,也是同样的事。所以靠背诵的话,就得把一只猫的所有位置、亮度、角度组合全背下来,而那个组合数实际上是无限的。
所以需要的是一种即使位置略有变化也看作同一个东西的方法:能找到碎片、却把碎片具体在哪儿忘掉的装置。那个装置的原版就在猫的脑子里。
1959 年,一只麻醉的猫和一根电极

大卫·休伯尔与托斯坦·维泽尔把微电极插入猫的初级视觉皮层。那是一套把单个脑细胞放电时的电信号接出来、转成声音的装置。然后他们在麻醉的猫眼前的屏幕上投射各种图案,寻找哪种图会让哪个细胞反应。
有一阵子毫无反应:打点、画圆,细胞都安静。然后在换幻灯片的瞬间,喇叭里传来细胞剧烈放电的声音。起作用的不是图案,而是幻灯片滑入时产生的阴影边缘,也就是一条倾斜的线段掠过。
抓住这个偶然深挖下去,两类细胞显现出来。
简单细胞只对特定角度的线段反应。对 45 度反应的细胞,在 90 度时几乎安静。它还在意那条线落在视野的哪个位置:每个细胞都有自己负责的一小块,只有自己那块里出现自己那个角度的线才放电。
复杂细胞同样在意角度,却不在意位置。只要是 45 度的线,偏上偏下它都反应。1962 年的后续论文整理出复杂细胞,以及负责同一角度的细胞聚成柱状的方位柱结构。
上一节的问题在这里正好被解开:简单细胞找碎片,复杂细胞把碎片的位置放掉。能找到碎片却忘掉位置的装置,早就以两层的形式织在脑子里了。
两人获得 1981 年诺贝尔生理学或医学奖,与罗杰·斯佩里分享,二人共得其中一半,获奖理由是关于视觉系统信息处理的发现。
从部分到整体 — 堆叠层的构想

休伯尔与维泽尔留下的不只是两类细胞,更重要的是两者的关系。复杂细胞看起来像是把若干简单细胞的输出汇总起来做成的:把负责同一角度、但看着略微不同位置的简单细胞捆成一束,就得到一个对该角度有反应而不在意位置的细胞。
那么再捆一次会怎样?把短线段捆成拐角,把拐角捆成曲线,把曲线捆成眼睛的形状,再把眼睛、鼻子、嘴捆成一张脸。
这张图就是本集的设计图。把找简单东西的层与放掉位置的层交替堆叠,越往上认出的东西越大越复杂,也越不在意位置。
1980 年,那两种细胞变成了代码
福岛邦彦做的新认知机不是比喻。他在论文里直接引用休伯尔与维泽尔的发现,把简单细胞命名为 S 层、复杂细胞命名为 C 层,取的就是 simple 与 complex 的首字母。
结构是 S 层与 C 层交替堆叠:下层 S 找短线段,其上的 C 抹掉位置,再上的 S 从被抹过的结果里找更大的碎片,再上的 C 又抹掉位置。如此重复数层。
也就是:找部分、放掉位置、找更大的部分、再放掉。用一句话写出今天 CNN 在做的事,就是这个。
新认知机在位置略有变化时仍能认出手写数字。只是学习方式与今天不同:不告诉它正确答案,让它自己找模式,因而很难把性能推上去。这最后一块拼图在九年后补上。
1989 年,靠读邮政编码走向实用

杨立昆与贝尔实验室的同事做出识别手写邮政编码的神经网络,用美国邮政实际收取的邮件中取出的数字图像训练。在当时,这是把神经网络接到真实业务问题上的少见案例。
这篇论文在这里重要的不是性能,而是参考文献。它直接引用福岛 1980 年的新认知机,并写明自己的结构令人联想到它,只是用反向传播取代了无监督学习——正是上一集里的那个反向传播。
所以这条谱系靠文献相连,而非情境推测:猫的视觉皮层(1959),新认知机(1980),加上反向传播的 CNN(1989)。广为人知的 LeNet-5 是 1998 年,之后仍在不断发展。
这里还多了一个构想:找某个角度的线段这件事,在画面左上角和右下角是同一种计算。既然如此,就不必按位置分别学习,只要把同一条计算规则在整张图上挪着用就行。这叫权重共享,而那个挪着用的运算叫卷积——CNN 里的 C 就是它。
这一点决定了实用性。按位置分别学,要学的是数百万个;挪一条规则,只有数百个。数据用得少,计算也轻。
只记一个术语 — 感受野
感受野是单个神经元所负责的那一小片视野。
休伯尔与维泽尔扎的那个细胞并不看整个画面,各自只看极小的一块,那块之外发生什么它一无所知。CNN 不是一次看完整张照片,而是拿一个小窗口挪着扫,原因就在这里。
层数上升,感受野就变宽。把若干下层细胞捆起来的上层细胞,负责的区域也相应更宽。所以下层看线段,上层看脸。
由此带来一个重要性质:这个结构是从部分组装到整体。它擅长找碎片,但那些碎片所构成的情境与语境,原理上是另一个问题。这个性质造就了下一节的实务指引。
那么这个结构做不到什么

碎片组装方式的局限,已经反复显现过。
第一,只要碎片齐全,排列错了它也说对。眼睛、鼻子、嘴都在但位置乱七八糟的脸,仍可能被判成脸。它擅长看部分是否存在,却不擅长看部分之间的关系。
第二,人眼看不见的微小改动就能翻转判定。把像素值轻微扰动,熊猫就成了长臂猿,而人根本看不出两张图有何不同。
第三,它拿背景当依据。只在草原上训练牛的照片,海边的牛就认不出来——它学到的不是牛的形态,而是把绿色背景当成了牛的依据。
这三点不是 bug,而是由这个结构本身推导出来的性质,并且可以直接转成实务指引。
那么明天改什么
对图像 AI 问看见了什么,而对是什么情况要另行验证。碎片检测是这个结构的本职,而且不像人会疲劳;场景的含义则是组装出来的结果,错的时候会错得很像真的。这张照片里有没有安全帽可以交给它,这个作业安不安全要人来看。
把问题切小。与其让它整张照片一起解读,不如收窄:这一块区域有没有文字,这个零件有没有瑕疵。准确率会明显上升。感受野窄的结构,在问题也窄时最准。
换角度和亮度再问一次。位置变化由复杂细胞层吸收,旋转和光照则不然。把照片转 90 度或调整亮度后再问,答案若不一致,说明这个判断还不能信。
刻意混入背景不同的样本。做验收数据时,放进同一对象在不同地点、不同光照下拍的照片。是不是把背景学成了依据,只有在那些样本上才会显形。
来源:Hubel & Wiesel (1959, 1962);1981 年诺贝尔生理学或医学奖;Fukushima, Neocognitron (1980);LeCun et al., Backpropagation Applied to Handwritten Zip Code Recognition, Neural Computation 1(4) (1989)。
