4.2 经典CNN演进 从LeNet到GoogLeNet
1.一条承上启下的进化线
3.3 节我们打下了卷积神经网络的基础,3.4 节又讲了残差网络是怎么把网络做得更深。中间这一段,其实还有一连串特别经典的网络,它们各自贡献了一个关键想法,一步步把CNN从能认数字的小模型,推到了能认上千类物体的大网络。这一章就把LeNet、AlexNet、VGG、GoogLeNet这条进化线串一串,看看每个里程碑到底新在哪里。说起来,这条线几乎是面试时的常客,理清楚很划算。
要看懂这条进化线,得先记住一根主线:每一个新网络,要么把网络做得更深更宽,要么在结构上想得更巧,要么把参数和算力花得更省。后面这些名字,都可以顺着这根线去理解。
2.LeNet:CNN的开山之作
时间回到1998年,杨立昆提出的LeNet是第一个真正跑通、还投入实用的卷积网络,干的是认银行卡上手写数字的活儿。它的结构现在看朴素得很,基本是卷积层、池化层交替堆几层,最后接上全连接层输出类别。比如LeNet-5里,先是卷积,再池化,再卷积,再池化,然后把特征图拉平,过两三个全连接层,最后判断这个数字是0到9里的哪一个。
这套结构第一次把局部感受野和参数共享这套思想落到了工程上,证明卷积确实能认字。它的核心好处,是大大减少了参数量(比起把整张图直接喂给全连接网络),还能抓住局部的小模式。不过那时的算力和数据都很有限,LeNet也只能在这种小尺度任务上出彩,更难的图像它还扛不动,所以CNN之后沉寂了好些年,直到AlexNet登场。这段我在3.3 节的历史部分提过,这里再补上结构上的细节。
3.AlexNet:引爆深度学习的一战
2012年的ImageNet大赛是公认的转折点。ImageNet是个有上千个类别、上百万张图的大数据集,能在这个集上把分类错误率压下去,是当时检验一个视觉模型成色的重要benchmark。AlexNet一出场,就把图像分类的错误率砍掉了一大截,把一众传统方法远远甩在身后。我之前翻过一本讲深度学习简史的书,作者形容这一战像一记惊雷,此后整个学术界和工业界的目光都转向了神经网络。
AlexNet的成功不是偶然,它把好几样关键武器凑到了一起。一是用ReLU替代了Sigmoid类的激活函数,ReLU算得快、正区间梯度稳,让深一点的网也能训得动。二是引入Dropout,训练时随机屏蔽一部分神经元,强力压制过拟合。三是靠着GPU的算力去训一个比LeNet大得多的网络,这事在LeNet年代根本不敢想。四是用了数据增强,把图像翻转、裁剪一下变出更多训练样本,等于凭空扩充了数据。这几样加起来,让又深又大的网络也能被训出来这件事第一次成了现实。
结构上,AlexNet大概是8层,前5层是卷积,后3层是全连接,有些层后面还跟着池化。和LeNet比,它更深、更宽,卷积核也更多,能抓的特征更丰富。这一战的示范效应极强,从那以后,研究视觉的人基本都转向了深度学习。
4.VGG:把简洁堆到极致
到了2014年,牛津的VGG组提出了一个特别朴素的思路,结构上几乎不搞花活,就一层层堆卷积和池化,但坚持全用3乘3的小卷积核。这里面有个巧妙的点,两个3乘3的卷积串起来,感受野和一个5乘5的卷积一样大,参数却更少,还多了一次非线性变换,效果反而更好。把三层3乘3叠起来,就等价于一层7乘7的感受野,参数省得更多,非线性也更深。
VGG最大的贡献,是用实验把深度很重要这件事讲明白了,网络越深,效果越好。代表作VGG-16和VGG-19,数字就是层数。它的结构干净规整,一层一层特别整齐,所以很长一段时间里都被当作提取特征的万能骨架,做迁移学习时特别受欢迎,把别人预训练好的VGG拿过来,接上自己的分类头,就能在不少小数据集上拿到不错的效果。VGG的缺点也很明显,它末尾的全连接层参数巨大,模型又大又沉,但作为入门和迁移的基准,它的地位很长时间没人动摇。
5.GoogLeNet:一个模块里同时看多种尺度
同年的GoogLeNet(也叫Inception v1)走了另一条路,提出了Inception模块。以前的网络一层只做一种卷积,Inception模块却在同一层里并行做几种不同大小的卷积,比如1乘1、3乘3、5乘5,再加一个池化分支,最后把所有分支的结果按通道拼到一起。这相当于让网络在同一位置同时看粗细不同的几种模式,自己决定哪个有用,宽的看大局、细的看纹理,一网打尽。
可这么并行多路卷积,参数和计算量会暴涨。为了让它不至于把资源撑爆,GoogLeNet大量使用1乘1的卷积来给特征通道降维,先用一个1乘1卷积把通道数压下去,再做3乘3或5乘5的大卷积,开销就小多了。它还用全局平均池化替代了末尾那个巨大的全连接层,参数一下省下来一大笔。所以GoogLeNet的参数比VGG少很多,差不多只有十几分之一,效果却更好,那一年拿下了ImageNet的冠军。这里头的1乘1卷积后来成了一个特别常用的小工具,既能降维、又能升维、还能跨通道混合信息,几乎到处都能见到。
值得一提的是,Inception后来还演化出v2、v3、v4好几代,思路都是在这个模块基础上继续优化,比如把大卷积拆成非对称的小卷积、给卷积加归一化,越做越精细。
6.为什么今天还要学这些老网络
有人可能会问,现在残差网络、视觉Transformer那么强,这些2010年代的老古董还学它干嘛。理由其实挺实在。第一,迁移学习里它们仍然是常用的特征提取骨架,尤其VGG,结构简单稳定,拿来做迁移的基线很省心,在很多小数据集上接一个分类头就能跑得有模有样。第二,面试官特别喜欢从这条线问起,从LeNet一路问到ResNet,能看出你对CNN的理解是不是成体系。第三,后面那些更花哨的结构,剥开外壳,里头的零件大多能在这里找到出处,把根扎稳了,再学新东西就快。小明有阵子觉得学老网络是浪费时间,后来面试被问AlexNet的几个创新点,答得磕磕绊绊,回去老老实实把这条线补了一遍,才感慨经典就是经典,看着旧,底子却厚。
7.收个尾
把这条线拉到一起看,CNN的进化主线其实挺清楚:网络越来越深,结构越来越讲究,对参数和计算也越来越精打细算。LeNet证明卷积能用,AlexNet证明大网络能训出来,VGG证明深度关键,GoogLeNet证明结构可以更聪明。这些想法一层层累积,最后才有了3.4 节那个能摞到上百层的残差网络。小张当年啃这些老论文,说最大的感受是,后来那些花哨的新结构,刨根问底都能在这些经典里找到影子。把这些经典的来龙去脉弄明白,再去看现在的论文,就会轻松很多。
练习
Q1. VGG 为什么坚持全用 3 乘 3 的小卷积核,而不是用更大的 5 乘 5、7 乘 7?
因为两个 3×3 卷积串起来感受野和一个 5×5 一样大,但参数更少,还多了一次非线性变换,效果反而更好;三层 3×3 叠起来等价于一层 7×7 的感受野,参数省得更多、非线性更深。VGG 用这个做法把"深度很重要"这件事用实验讲明白了:网络越深效果越好。
Q2. 假设输入输出通道数都是 ,比较"两个串联的 3×3 卷积"和"一个 5×5 卷积"在单张特征图位置上的参数量。哪个省?
两个 3×3 卷积参数量是 ,一个 5×5 卷积参数量是 。可见感受野同样大(都是 5×5)时,两个 3×3 串联比一个 5×5 参数更省(),还多了一次非线性变换。
Q3. GoogLeNet 里大量用 1×1 卷积,它起什么作用?光做空间卷积不行吗?
1×1 卷积不涉及空间混合,专门用来给特征通道降维或升维、做跨通道的信息混合。GoogLeNet 的 Inception 模块并行做多路不同大小的卷积,参数和计算量会暴涨,先用 1×1 卷积把通道数压下去,再做 3×3 或 5×5 大卷积,开销就小多了。所以它能把参数压到只有 VGG 的十几分之一,效果却更好。
Q4.(面试题) 请把 LeNet、AlexNet、VGG、GoogLeNet 这条进化线串起来,说说各自的关键贡献和背后那条主线。
主线是:网络越来越深、结构越来越讲究、参数和算力越来越精打细算。LeNet(1998)是开山之作,把局部感受野和参数共享落到工程上,证明卷积能认数字,但只能干小尺度任务。AlexNet(2012)引爆深度学习,把 ReLU 替代 Sigmoid、Dropout 压过拟合、GPU 算力、数据增强这几样武器凑到一起,证明又深又大的网络能训出来。VGG 用堆叠 3×3 小卷积把"深度很重要"讲明白,结构干净规整,成了迁移学习的万能骨架。GoogLeNet 提出 Inception 模块,同一层并行多种尺度卷积并靠 1×1 降维省参数,证明结构可以更聪明。这些想法一层层累积,最后才有了能摞到上百层的残差网络。