AI眼中的一张照片,到底长什么样?
当你把一张照片发给朋友,朋友看到的是笑脸、风景或一顿晚餐。当你把同一张照片送进一个计算机视觉模型,它“看到”的东西完全不同。理解这个差异,是理解计算机视觉工作原理最直接的入口。
一张数字图像在计算机内部就是一个数字矩阵。以一张普通的彩色照片为例,它被拆成高度、宽度和三个颜色通道,每个像素点上存着三个 0 到 255 的整数,分别代表红、绿、蓝的亮度。一张 1000×1000 的彩色图,就是三百万个数字。这些数字本身不携带任何“意义”——它们不知道自己是猫毛还是天空。计算机视觉的全部工作,就是从这堆数字中逐步构造出意义。
卷积神经网络的做法,可以想象成一层一层地“问问题”。最底层的滤波器只关心最朴素的事情:这个位置有没有一条竖直的边?有没有一条斜线?有没有明暗突变?这些问题的答案被记录成新的数字图,称为特征图。往上一层,滤波器不再看原始像素,而是看底层特征图的组合:两条竖边加一条横边,可能构成一个矩形轮廓;一片密集的短斜线,可能对应毛发的纹理。再往上,更高层的滤波器把纹理和轮廓组合成“眼睛”“轮子”“窗户”这类部件级的概念,最终层再把这些部件组合成“猫”“汽车”“房子”的判断。每一层都没有看到完整的物体,但每一层都在为上一层提供更有语义的“原材料”。
这里有一个关键设计叫“池化”。它在每一小块区域内取一个代表值(比如最大值),把特征图缩小。池化的作用不是提取新特征,而是制造一种“模糊的容忍度”:只要猫的耳朵大致在那个区域,具体偏移了几个像素并不影响后续判断。卷积负责“看到什么”,池化负责“不必看得那么精确”,两者配合,模型才能在物体位置变化时保持稳定。
那么,模型最终是怎么“拍板”的?最后一层通常是一个分类器,它给每个候选类别打一个分数,再用 Softmax 把这些分数转化成概率。比如“猫 0.92,狗 0.05,狐狸 0.02”。这个概率分布就是模型的“答案”。训练的过程,就是不断调整网络中每一个滤波器的数值,让正确答案的概率变大、错误答案的概率变小。
但这里有一个让研究者长期不安的问题:模型给出的答案,到底是基于什么做出的?一个高准确率的模型如果只是“碰巧对了”,在医疗诊断或自动驾驶里是不可接受的。这就引出了可解释性研究。以人脸识别为例,研究者用 Grad-CAM 之类的热力图方法,把模型做判断时“注意力最集中”的区域可视化出来:红色越深,说明那个区域对最终决策的贡献越大。有趣的是,不同性能的网络关注的脸部区域并不完全相同——表现更好的网络倾向于综合利用眉毛、嘴巴、眼睛和鼻子等多个区域的信息,而不是只盯着某一个局部特征。热力图不能完全“翻译”模型的内部逻辑,但它至少提供了一种外部的审计手段:当模型把两张脸判定为同一个人时,我们可以检查它依据的是五官结构,还是背景里的一面墙。
Vision Transformer 把“注意力”从一种事后解释工具,变成了模型架构本身的核心。ViT 把图像切成小块之后,自注意力机制让每一个块都能“查询”其他所有块,并决定从谁那里获取信息。一个判断“画面里是不是有一只鸟”的模型,可能会让天空区域的块去“关注”树枝区域的块,因为鸟通常停在树枝上;也可能让鸟头区域的块去“关注”鸟尾区域的块,因为两者在形状上相互印证。这种全局的、动态的关联方式,与卷积网络逐层局部堆叠的逻辑形成了鲜明对比。它也让模型的“注意力”更容易被直接读取和分析——你可以在注意力权重中看到,模型在做出某个判断时,实际“看”了画面的哪些部分。
从像素矩阵到卷积滤波,从池化的模糊容忍到自注意力的全局关联,再到热力图提供的可解释窗口,计算机视觉的原理并不神秘,它的每一步都是在回答同一个问题:怎样把没有意义的数字,一步一步变成有意义的判断。而可解释性研究的价值在于提醒我们,一个“看对了”的模型,和一个“因为对的理由而看对”的模型,是两件不同的事。