在上一篇文章《从过拟合到泛化能力》的结尾,我们给那个急于背诵答案的神经网络泼了一盆冷水:“别背答案,去学规律”。
但有一个问题我们一直没正面回答:规律到底是什么?
在之前的例子里,我们拟合的是一组x和y的对应关系,规律不过是“一条穿过这些点附近的线”。可现实世界中的数据远比一维数字复杂得多。你手机里那只猫的照片,它的规律是什么?神经网络又要怎么“看懂”它?
在回答这个问题之前,我们得先把趁手的数学工具再打磨一下。
___________________
来看下面这个神经网络:
你会发现,即便是只包含少数几个神经元的网络,用连加符号一层层展开写,也已经显得非常麻烦了。怎么简化呢?使用矩阵。
看起来还是不够简洁。
我们可以用大写字母来表示矩阵:
现在还有一个问题:这个式子只能表示两层的神经网络(输入层和输出层),如果神经网络不止一层呢?
用我们可以用一个字母A来表示所有层次。
用A[0]表示输入层,递推至输出层
那么第一层的公式就是
如果用L表示在第几层,那么公式就会变成
如此,我们便能够表示每一层了。
通用公式:
除了看起来清爽以外,这种矩阵化的表达,让神经网络从一堆零散的加权求和,变成了标准的矩阵乘法,而这种运算恰恰是GPU最擅长并行处理的。
——————
好,刀磨快了,我们兴致勃勃地想用它来处理图像。那么,把图像直接丢给这套基于矩阵乘法的全连接网络,行吗?
首先,我们要怎么把图片输入给·神经网络呢?假如我们有一个28×28 的图,可以把它“拉直”成一个 784 维的向量,然后输入进全连接网络。
但这样的话,哪怕下一层只有 1000 个神经元,也会瞬间产生28× 28 × 1000 = 784,000个参数 ,堪称参数爆炸。但参数爆炸还不是最致命的。更要命的缺陷,是空间失明。
你想想,把像素强行排成一列,等于彻底撕碎了它们原有的上下左右位置关系。本来紧紧挨在一起、共同组成猫耳朵的一组像素,被拆散到向量里相隔很远的位置,彼此之间再无瓜葛。网络会完全丧失对“形状”的感知。图像哪怕只是往旁边挪了一丁点,输入向量就会面目全非,所有神经元接收到的信号都变了——它无法理解“这只猫的耳朵在画面左上角”和“这只猫的耳朵在画面偏左一点”,其实是同一只猫。
这正是全连接层面对图像时的根本性无能:它死记每一个像素的绝对位置,却学不会局部形态的规律。这种对像素的“过拟合”,完美踩中了我们在上一篇里反复警示的雷区。
那怎么办?
————
问题的根源很清晰——把每个像素当成了互不相干的个体。而图像世界的规律恰恰相反:特征都是局部的,是有空间关系的。
人类识别一只猫,不是挨个像素分析,而是去看耳朵、眼睛、胡须这些局部形态,以及它们之间“眼睛在耳朵下面,鼻子在两眼之间”的相对位置。既然这样,何不让神经元也这么干呢?
于是,我们有了一个革命性的想法:在图像上取一个 3×3 的小窗口,让一组权重(称为卷积核)在这个窗口内做运算,然后滑动窗口,扫过整张图。
这个“运算”非常简单——把窗口盖住的 9 个像素值,和卷积核里对应的 9 个权重,对应相乘再求和,得到一个新的数值。当窗口走完所有位置,就生成了一张新的“特征图”。这,就是卷积运算。
有意思的是,这种思路并不是搞神经网络的人凭空发明的。在传统图像处理领域,早就有 Sobel 算子、高斯滤波器这些东西,用固定好的 3×3 矩阵去扫图,就能勾出轮廓、模糊噪声、锐化边缘。那些矩阵,就是手工设计的卷积核。
但传统方法的短板我们也清楚:人力终有穷尽。你能设计出几十个滤镜,却永远无法穷举这个世界上的猫在一切光线、一切角度下的形态——这恰是前面传统滤波的“阿喀琉斯之踵”。
神经网络的思路,是把全连接层里的矩阵乘法,直接替换成卷积运算。
(这里我用*表示卷积运算)
最关键的变化在于——卷积核里的数值,不再是数学家拍脑袋给定的,而是变成了一组可学习的参数,让网络自己从数据中去发现该用什么滤镜。
这只猫的耳朵该用什么卷积核抓?不知道,那就让网络自己“学”出来。
这一换,格局豁然开朗:
参数断崖式下降:一个 3×3 的卷积核只需要 9 个参数,而且同一个卷积核在图像的所有位置共享——耳朵无论在左上角还是右下角,都用同一组权重去检测它。这叫做权值共享。相比全连接那几十万乃至上亿的参数,简直是把工程从不可能变成可能。
空间感回归:每个神经元只盯着自己眼前的一小块视野,天然关注局部邻域内的相对关系,不再是盲目的散点。
如果要用一句话总结:全连接是在背每个像素的坐标,卷积则是在寻找有意义的形态。
池化:给特征“降降噪”
光有卷积还不够。特征图依然可能很大,而且对位置的记录过于精确,有时反而是一种负担——猫的耳朵稍微动了一下,特征图上对应区域的所有数值都会跟着变,模型很容易因此分心。
所以,卷积神经网络里通常会紧接着塞一个池化层。它的思路有点像一个“模糊化”操作:把一个 2×2 的窗口里的最大值挑出来(最大池化),或者取个平均值,这样就生成了一张尺寸大幅缩小的新图。
池化的好处至少有两个:
降维提效:数据量直接砍掉大半,计算量随之骤减,防止后面参数太多导致过拟合。
平移不变性:我们关心一个区域里“有没有”出现某个特征,而不是它精确到像素的坐标。耳朵往旁边挪了一点点,对池化后的结果来说,仍然是一个代表“有耳朵”的强烈信号。
卷积层负责提取特征,池化层负责压缩和固稳,二者搭配,层层推进。
全连接层:最后的裁判
经过若干轮“卷积 + 池化”的压榨,原始图像已经被提炼成一个高度浓缩的“特征精华”。这时,CNN 的最后几层才重新搬出我们熟悉的全连接层,它的任务已经不是处理原始像素,而是根据这些高阶特征做出最终决断:“这只猫的品种是英短。”
于是,这种以卷积层为核心,搭配池化层和全连接层,专门用于处理图像这类具有空间结构数据的网络,就叫做卷积神经网络(Convolutional Neural Network,CNN)。
CNN 的疆界与局限
说到这里,我们似乎找到了一把能横扫视觉问题的钥匙。但请注意,CNN 擅长的是捕捉静态、空间上的局部模式。一旦数据带上了前后依赖的时间维度,比如一段语音、一句话、一段股票走势,这种仅仅在空间维度上滑动窗口的卷积,就未必是最佳选择了。
它不擅长理解“上一个词是什么,下一个词应该接什么”,也天生不太会处理帧与帧之间的运动时序。面对这些动态序列,就需要循环神经网络(RNN)等别的结构登场了。