第十一部分 · 从一个神经元到现代 AI
归纳偏置:卷积如何把结构变成先验
上一课我们靠正则化通用地管住模型的容量,好让它别死记数据。但那是一味"对所有问题都一样"的补药。这一课换个思路:如果我们事先就知道数据长什么样——图像里相邻像素相关、一只猫平移几像素还是猫——为什么不把这些知识直接刻进架构本身?这就是卷积干的事,也是深度学习第一次真正"看懂"图像的原因。
留下的问题:正则化是"一视同仁"的药——不管你喂进来的是图像、声音还是表格,它都只会说"权重小一点、别太复杂"。可我们对某些数据的了解,远不止"简单点"这么笼统。一张图像自带极强的结构:相邻像素高度相关,同一个物体平移几像素还是同一个物体。把这些具体的先验知识白白扔掉,让一个全连接网络(第 38 课)从零把它们重新学出来,既浪费数据、又参数爆炸。
本课新增:归纳偏置——把关于数据结构的假设直接焊进模型架构,等于给架构装上先验;卷积——用"局部性 + 权重共享"这两条假设,让网络以极少的参数、并且平移等变地看图;这正是 CNN 掀起深度学习革命的引擎;最后推广成一句总纲——让架构的对称性去匹配数据的对称性。
全连接的两宗罪
先把上一课的主角——全连接网络(第 38 课)——拉来当反面教材。它的每一个神经元,都和上一层所有输出相连,各连接一个独立权重。这在小问题上没毛病,可一旦输入是图像,它立刻犯下两宗罪。
第一宗:参数爆炸。 一张 1000 × 1000 的灰度图,摊平就是一百万个像素。若第一层只放同样一百万个神经元,光这一层的权重数就是
10⁶ × 10⁶ = 10¹²(一万亿;读作"一百万乘一百万")
一层就上万亿个参数。这既存不下、也训不动,更要命的是——按第 39 课的道理,参数越多容量越大,这么庞大的容量配上有限的图像,几乎必然过拟合。
第二宗:无视结构。 这一宗更隐蔽,也更致命。全连接层做的第一件事是把二维图像摊平成一长串数,从此再也不知道哪两个像素原本是邻居。可图像明明自带两条铁打的结构:
- 平移不变(translation invariance):一只猫出现在左上角,还是平移到右下角,它都是同一只猫。"是不是猫"这件事,跟它待在图上哪个位置无关。
- 局部性(locality):相邻的像素高度相关,一小块区域就能拼出边缘、角点这些有意义的局部图案;隔着半张图的两个像素则几乎没关系。
全连接层对这两条一无所知:在它眼里,把所有像素随机打乱顺序再喂进去,结果完全一样——因为它本就把像素当成一串无序的数。它得从零开始,用海量数据去"重新发现"我们其实早就知道的常识。这是巨大的浪费。既然我们已经知道图像有这两条结构,何不把它们直接告诉模型?
归纳偏置:把先验写进架构
"把已知的结构告诉模型",在机器学习里有个正式名字:归纳偏置(inductive bias)。它指的是:我们缩小模型的假设空间,只允许它在一批"合乎情理"的函数里挑,从而让它偏向这些函数、而不是漫无目的地在所有可能里瞎找。
这里有个和上一课漂亮的对照。第 39 课我们也在给模型施加先验——但那是把先验写进损失:加一个正则项,说"我偏爱权重小的解"。而归纳偏置这一课,是把先验写进架构本身:直接设计网络的连接方式,让某些解根本无法表达。
硬的一路(本课):直接改架构,把不合意的解排除在假设空间之外,模型压根表达不出来——先验写在结构里。
卷积走的是硬的一路。下面看它具体怎么把"局部性"和"平移不变"焊进架构。
要提醒一句:归纳偏置越强,威力越大,但也越挑数据。先验押对了(图像确实有局部性),就是雪中送炭;押错了(硬把图像的先验套到毫无空间结构的数据上),反而会束缚模型。所以关键从来不是"要不要偏置",而是"这个偏置配不配你的数据"。
卷积:局部性 + 权重共享
卷积把上面两条结构,用一个极简的操作同时实现了。它的做法是:拿一个很小的、共享的权重方块——叫卷积核(kernel),比如 3 × 3——让它滑过整张图像;每滑到一个位置,就把核和它此刻盖住的那个小窗口做一次加权和,得到输出图(叫特征图)上对应的一个像素。
输出(i,j) = ∑u,v 核(u,v) × 图像(i+u, j+v)
读作"输出图上第 (i, j) 个像素,等于把卷积核里每个权重,乘上它此刻盖住的对应像素,再全部加起来"。看清楚了没有——这又是一次内积(第 11 课):核与那个小窗口拉直成两个向量,做点积。整门课学到现在,"打分"这件事反反复复都是同一招:内积。
这一个操作,同时兑现了两条先验:
- 局部性 ⇒ 核很小。 每个输出像素只看它周围那一小块(如 3 × 3 的九个像素),完全不理会远处——正因为我们相信"有意义的局部图案就藏在小邻域里"。这个小窗口,叫这个输出像素的感受野。
- 平移不变 ⇒ 权重共享。 核滑到图上任何位置,用的都是同一套九个权重。这等于宣布:"一个图案,无论出现在图的哪里,都用同一把尺子去检测。"——这正是把"平移"这条对称性写进了架构。
参数量的对比堪称悬崖式坠落。全连接第一层要上万亿个权重;一个 3 × 3 的卷积核只有
3 × 3 = 9(个权重,检测整张图都够用;读作"三乘三等于九")
九个数,滑遍全图。参数量从"像素数 × 神经元数"这个天文数字,骤降到"一个核的大小"。这不是抠门省参数,而是因为权重共享本就是"图像"这种数据的强而正确的先验——一把好尺子,本来就该到处都能用。
一个核 = 一个特征探测器
那这九个权重到底在干嘛?答案是:每一个核,就是一个特征探测器。填不同的数,它就检测不同的东西。看两个经典例子:
竖直边缘检测核 [[−1,0,1],[−1,0,1],[−1,0,1]]:它拿右边一列减左边一列。在图像平坦的地方(左右差不多),加权和≈0,输出发暗;一旦碰到左暗右亮的竖直边缘,左右差值大,输出就猛地变亮。于是它专门把竖直边缘点亮。把它转 90 度成 [[−1,−1,−1],[0,0,0],[1,1,1]],检测的就是水平边缘。别的核能做模糊(把邻域一平均,噪点就被抹平)、锐化、检测某种纹理……一个核,一种"探测器"。
但真正的关键在于——这些核不是手工设计的,是"学"出来的。核里那九个权重,就是网络的参数,靠梯度下降(第 25、38 课)在训练里自己调出来。你不告诉它"去找竖直边缘",它自己发现"点亮边缘"这件事有用,于是把某个核调成了边缘探测器。手工设计的边缘核(如 Sobel)只是这个庞大可能性里的一个特例。
更妙的是堆叠。一层卷积在原图上找边缘;第二层卷积作用在"边缘图"上,就能把边缘拼成角点、拼成小部件;再往上,部件拼成眼睛、车轮,最后拼成整只猫、整辆车。层级越深,特征越抽象——
像素 → 边缘 → 部件 → 物体(逐层抽象,读作"从像素堆到物体")
其间穿插一个小操作:池化(pooling),比如把每 2 × 2 的区域取个最大值,缩小特征图。它有两个作用:一是降低分辨率、减少计算;二是带来一点平移不变性——图案在小范围里挪动几像素,取最大值的结果基本不变。卷积负责"等变地找到"图案,池化负责"容忍它挪一点",两者配合,网络就既能定位、又对小位移稳健。
对比一下:同一层若用全连接处理这张 144 像素的小图、并输出同样多的值,权重数会是 144 × 144 ≈ 2 万;而卷积只用了9 个——还滑遍全图。这就是权重共享的威力。
为什么它赢了,以及怎么推广
把上面几件事拼起来,就能解释深度学习最著名的一次爆发。2012 年,一个卷积网络(AlexNet)在图像识别竞赛上把错误率大幅甩开了当时所有手工特征的方法,机器视觉自此换了天地。它赢的根本原因,不是算力也不是运气,而是——"权重共享 + 局部性"恰好是"图像"这种数据的强而正确的先验。同样多的数据,全连接网络要拿去重新发现"平移不变"这种常识,而卷积网络一出生就免费拥有它,于是把宝贵的数据全花在真正该学的东西上。归纳偏置押对了,事半功倍。
这条思路远不止图像。把"共享一把尺子扫过整个维度"的想法搬到时间上,就得到另一类网络:RNN 在序列的每一个时间步上共享同一套权重——因为"一句话的语法规则,不该因为词出现在第 3 个还是第 30 个而改变"。这和卷积在空间上共享权重,是同一个动作,只是换了个维度。于是本课可以收束成一句总纲:
常见误解
- "卷积不就是模糊、锐化那种图像滤镜吗?"
那只是特例。手工设计的滤镜(模糊、Sobel 边缘)确实是一个个固定的核,但卷积层里的核是学出来的特征探测器——网络自己决定该检测什么。滤镜是"人写死的核",卷积是"让数据自己填的核",后者的可能性大得多。 - "CNN 只能用于图像。"
权重共享这个思想可以推广。核心从来不是"图像",而是"匹配数据的对称性":RNN 在时间维共享权重处理序列,一维卷积能处理音频、文本。只要你的数据有某种平移对称性,就能借用同一套思路。 - "归纳偏置限制了模型,那不是坏事吗?"
恰恰相反,这正是重点。好的先验(局部性、平移不变)反而让模型用更少的数据泛化得更好,因为它不必再去搜索那些我们本就知道不合理的解。限制假设空间,正是它省数据、抗过拟合的原因(回扣第 39 课)。 - "参数越少,模型能力一定越弱。"
不一定。卷积用极少的参数(一个核九个数)在图像上达到了更强的泛化,正因为它的先验对路。能力强不强,看的是"假设空间里有没有那个好解",而不是"参数有多少"。先验押对了,少即是多。