跳到主要内容

预训练模型与迁移学习:站在巨人的权重上

这一章讲三件事: ImageNet 竞赛冠军模型的进化史(它们都是能一行代码下载的现成权重); 预训练模型的三种用法,从「拿来就用」到「只借中间层」;以及深层网络离不开的 Batch Normalization 到底在治什么病。 本章是「用别人的模型」的完整说明书,也是理解第 10 章「用别人的生成器」的前置。

1. 为什么需要预训练:自训不起,借来用

第 06 章自建的 CNN 才几层;竞赛里的冠亚军模型有 100 多层,自行训练要几天甚至几星期——难道只剩买企业级服务器(机房级的高价设备)一条路?书里的答案:框架早就为中小企业准备好了预先训练好的模型(Pre-trained Model),可以直接套用,也可以只取一部分再接自己的层1

先看它们是怎么来的——ImageNet 竞赛(ILSVRC)的冠军简史,几乎就是 CNN 的进化史2:

年份模型贡献
2012AlexNet一举把错误率减少 10% 以上,首度导入 Dropout 层(第 04 章那个 Dropout 的出处)
2014 亚军VGGNet堆更多层,VGG16/19 即 16/19 层卷积+池化
2014 冠军GoogLeNet & Inception同时用多种尺寸的卷积核,让系统自己学出最优尺寸;引入 Batch Normalization 观念
2015ResNet发现 20 层以上的模型「前面几层退化」,用残差(给信号开一条直通捷径)连接解决——这才有了 150 层的网络

每个模型的档案都标着:文件大小、Top-1 准确率(一次就对)、Top-5 准确率(前五猜中)、参数量、层数。选型原则一句话:要准确率选 ResNet152,要塞进手机选小文件模型 MobileNet3

它们全部用 ImageNet 的 100 万张图、1000 个类别训练——日常见到的动植物、交通工具基本都在这 1000 类里。这个数字决定了用法:目标在这 1000 类内,直接用;不在,借它的中间层提特征,接自己的辨识层4

2. 用法一:整个模型直接用

以 VGG16 为例,下载的权重分两档:weights 参数选 imagenet(已训练)或 None(只要结构);include_top 选 True(含最后的辨识层)或 False(不含)5

实测辨识大象:侧面照,前三名印度象 0.719、非洲象 0.241、图斯克象 0.036;换成正面照,前三名变成图斯克象 0.627、非洲象 0.330、印度象 0.043——两个角度的三名都是象,只是次序随姿态重排(换了排名)。老虎大头照同理:tiger 0.866 一骑绝尘6注意模型其实只输出「1000 类里各自的概率」,所谓辨识就是排序。

3. 用法二:砍掉顶层,当特征提取器

include_top=False 之后,模型只输出特征向量。书里的应用:图像相似度搜索——把 13 张图过一遍 VGG16,输入 (13, 224, 224, 3) 的图片变成 (13, 7, 7, 512) 的特征;要找「和 tiger2 最像的图」,就用 cosine 相似度(量两个向量夹角,越接近 1 方向越近)逐一比对,排第一的相似度 0.351,结果与预期一致7它不认识「老虎」这个概念也能比相似——特征向量本身就是「图的身份证」。 这正是第 03 章「把东西变成向量再运算」的图像版;第 11 章会看到词向量把同样的戏法用在文字上。

4. 用法三(重头):迁移学习

迁移学习(Transfer Learning)=保留预训练模型的前半段(提特征),接上自定义的辨识层,只训练后半段。 书里归纳它划算的三个理由8:

  1. 别人的前半段是用 ImageNet 100 万张图(普林斯顿与斯坦福主导的项目)和 150 层的大模型练出来的;
  2. 你的训练数据可以少很多——前半段不用重学;
  3. 训练快——只练自定义辨识层。

它分两阶段:第一阶段是别人做的「大规模预训练」;第二阶段是你做的「微调(Fine Tuning)」——按自己的领域加层再训练。这个两阶段模式不止影像:第 12 章的 BERT 用的是一模一样的思路。

主走查:Flower 数据集上的迁移学习

书里的完整实战:用 ResNet152V2 辨识花朵(5 类,3670 个文件)9:

① 看 clear 模型家底:152 层卷积/池化,总计 566 层;
输入规格 (224, 224, 3);include_top=False 时最后的
GlobalAveragePooling+Dense 会被移除——留出接口
② 接自定义辨识层(Functional API):GlobalAveragePooling + Dense(5 类)
③ 训练:cache + prefetch(第 05 章的数据管线,这里用上了)
④ 成绩:训练准确率 93.33%,验证准确率 87.74%

最有信息量的现象在训练曲线:随着训练轮次(训练遍数)增长,验证准确率几乎不再提高——因为前半段早就练好了,几轮之后能学的都学完了10。对比第 04 章从零训练动辄几十轮:迁移学习的「快」就体现在这里。

一个踩坑记录:作者先拿 28×28 的小图喂这个模型,能跑但效果差——模型会自动放大小图,放大导致模糊,辨识能力下降;大部分预训练模型要求输入 ≥(224, 224)11用预训练模型,第一件事是核对输入规格。

5. Batch Normalization:深层网络的必备药

上一节的 ResNet152V2 里塞满了 Batch Normalization(BN)层,书里用一节讲清它在治什么。

病灶一:层间分布漂移(Internal Covariate Shift)。 先看一个日常版本(Covariate Shift):训练用黄狗照片,上线辨识花狗——数据分布变了,模型失效;股价模型在长期上涨后失准同理12。神经网络内部每层都在发生这种事:权重每轮更新,每层的输出分布都会漂移,传到几十层之后,后面的层面对的输入早已面目全非。BN 的处方:每批数据送进下一层前先标准化,让分布稳定在标准正态——γ 控缩放、β 控偏移,且这两个数是训练出来的,不是设定的13

病灶二:梯度消失/爆炸。 深层网络层层叠乘:W 的 n 次方,W<1 时越乘越小趋近 0(梯度消失),W>1 时越乘越大趋近无穷(梯度爆炸,优化不收敛)14。BN 每批重新标准化,把数值拉回正常范围,梯度才传得动。

书里引原论文的好处清单(收敛快、可用更大学习率、初始化容易、准确率提升等)之外,特别点了一条实用搭配:BN 本身有类似 Dropout 的防过拟合效果,用了 BN 就不必再叠 Dropout——两个都上会「效果加乘过强」,反而低度拟合(学不动了)15

BN 真的治漂移吗?书里转述了「On The Perils of Batch Norm」的实验:MNIST(纯白背景)与 SVHN(复杂背景)两套数据,合并训练一个模型(带 BN)效果好于两套数据共享权值分别训练的模型——数据分布不同时,共享权值本就不合理;各自训练、各自 BN、不共享的模型最好16。实验设计的巧妙处在于把「分布漂移」人为造了出来,再让 BN 去修。

判断(我们的,不是书里的): 本节的三个组件构成一条因果链——ResNet 的残差连接与 BN 都是「把网络做深」路上的补丁(残差治退化,BN 治漂移与梯度消失);而迁移学习把「深」变成可白嫖的资产。理解了这条链,看到任何新架构时可以先问两个问题:它在治哪个病?它把哪一段变成可复用的? 如果错,会错在: 如果某个新架构的动机是容量或速度而非上述病症,硬套这条链会误读;判据是看论文要解决的那个失败案例。

6. 可带走的

  1. 竞赛冠军史=CNN 进化史:AlexNet(2012,错误率降 10%+,引入 Dropout)→VGG(堆层)→Inception(多尺寸核+BN)→ResNet(残差治 20 层以上退化);
  2. 选型一句话:要准确率 ResNet152,要上手机 MobileNet;
  3. 三种用法:整个模型(只输出 1000 类概率排序)/砍顶层提特征(cosine 相似度比图)/接自定义层做迁移学习;
  4. 迁移学习三红利:别人的大数据大模型、自己数据可以少、只练辨识层所以快——Flower 实战 93.33%/87.74%,且验证准确率几轮后不再涨;
  5. 先核对输入规格(≥224×224):小图硬喂会被放大成模糊图;
  6. BN 治两个病:层间分布漂移(Internal Covariate Shift)与梯度消失/爆炸(Wⁿ);γ/β 训练得出;
  7. BN 与 Dropout 不要叠加:效果加乘会低度拟合;
  8. 特征向量=图的身份证:不认识类别也能比相似——这条线索通向第 11 章的词向量。

7. 原文地图

主题原书章原文位置
自训不起、借来用第7章 预先训练的模型text/48-ch07.txt:7(搜「需要花上几天甚至几个星期」)
ImageNet 冠军史7-1 预先训练的模型简介text/49-ch07-7-1.txt:7(搜「错误率减少10%以上」) · text/49-ch07-7-1.txt:9(搜「VGG 16/19」) · text/49-ch07-7-1.txt:17(搜「退化(degradation」)
选型原则7-1 预先训练的模型简介text/49-ch07-7-1.txt:39(搜「MobileNet」) · text/49-ch07-7-1.txt:29(搜「Top-1 Accuracy」)
ImageNet 100 万张 1000 类7-1 预先训练的模型简介text/49-ch07-7-1.txt:49(搜「100万张图片作为训练数据」)
VGG16 用法参数7-2 采用完整的模型text/50-ch07-7-2.txt:27(搜「weight有以下三种选项」) · text/50-ch07-7-2.txt:35(搜「include_top」)
大象实测7-2 采用完整的模型text/50-ch07-7-2.txt:51(搜「tusker」) · text/50-ch07-7-2.txt:49(搜「印度象」)
cosine 相似度、特征维度7-3 采用部分模型text/51-ch07-7-3.txt:45(搜「cosine similarity计算两个向量的夹角」) · text/51-ch07-7-3.txt:43(搜「(13, 7, 7, 512」)
迁移学习三红利7-4 转移学习text/52-ch07-7-4.txt:7(搜「普林斯顿大学与斯坦福大学」) · text/52-ch07-7-4.txt:11(搜「只需要重新训练自定义的辨识层」)
Flower 实战(主走查)7-4 转移学习text/52-ch07-7-4.txt:33(搜「3670个文件」) · text/52-ch07-7-4.txt:41(搜「566层」) · text/52-ch07-7-4.txt:53(搜「训练准确率:93.33%」) · text/52-ch07-7-4.txt:59(搜「验证准确率并没有提高」)
输入规格踩坑7-4 转移学习text/52-ch07-7-4.txt:73(搜「(224, 224」)
BN 的两个病灶7-5 Batch Normalization说明text/53-ch07-7-5-batch-normalization.txt:5(搜「梯度消失(Gradient Vanishing」) · text/53-ch07-7-5-batch-normalization.txt:47(搜「W<1」) · text/53-ch07-7-5-batch-normalization.txt:52(搜「W>1」)
Covariate Shift 黄狗花狗7-5 Batch Normalization说明text/53-ch07-7-5-batch-normalization.txt:37(搜「黄狗」)
BN 定义与 γ/β7-5 Batch Normalization说明text/53-ch07-7-5-batch-normalization.txt:11(搜「特征缩放」) · text/53-ch07-7-5-batch-normalization.txt:21(搜「γ、β」)
BN 与 Dropout 不叠加7-5 Batch Normalization说明text/53-ch07-7-5-batch-normalization.txt:67(搜「不需要加Dropout层」)
Perils of Batch Norm 实验7-5 Batch Normalization说明text/53-ch07-7-5-batch-normalization.txt:71(搜「SVHN」)

Footnotes

  1. 出处:「第7章 预先训练的模型」第 7 段(text/48-ch07.txt:7,搜「需要花上几天甚至几个星期」)。

  2. 出处:「7-1 预先训练的模型简介」第 7 段(text/49-ch07-7-1.txt:7,搜「错误率减少10%以上」)、第 9 段(text/49-ch07-7-1.txt:9,搜「VGG 16/19」)、第 13 段(text/49-ch07-7-1.txt:13,搜「GoogNet」)与第 17 段(text/49-ch07-7-1.txt:17,搜「退化(degradation」)。

  3. 出处:「7-1 预先训练的模型简介」第 39 段(text/49-ch07-7-1.txt:39,搜「MobileNet」)。Top-1/Top-5 的定义在第 27、29 段。

  4. 出处:「7-1 预先训练的模型简介」第 49 段(text/49-ch07-7-1.txt:49,搜「100万张图片作为训练数据」)。

  5. 出处:「7-2 采用完整的模型」第 27 段(text/50-ch07-7-2.txt:27,搜「weight有以下三种选项」)与第 35 段(text/50-ch07-7-2.txt:35,搜「include_top」)。

  6. 出处:「7-2 采用完整的模型」第 51 段(text/50-ch07-7-2.txt:51,搜「tusker」)与第 55 段(text/50-ch07-7-2.txt:55,搜「图斯克象、非洲象、印度象」)。老虎实测在第 71 段(搜「tiger」)。

  7. 出处:「7-3 采用部分模型」第 43 段(text/51-ch07-7-3.txt:43,搜「(13, 7, 7, 512」)、第 45 段(text/51-ch07-7-3.txt:45,搜「cosine similarity计算两个向量的夹角」)与第 51 段(text/51-ch07-7-3.txt:51,搜「0.351」)。

  8. 出处:「7-4 转移学习」第 7 段(text/52-ch07-7-4.txt:7,搜「普林斯顿大学与斯坦福大学」)与第 9、11 段。两阶段(预训练+微调)的定义在第 19、21 段(搜「两阶段」)。

  9. 出处:「7-4 转移学习」第 33 段(text/52-ch07-7-4.txt:33,搜「3670个文件」)、第 41 段(text/52-ch07-7-4.txt:41,搜「566层」)、第 45 段(text/52-ch07-7-4.txt:45,搜「include_top=False」)与第 53 段(text/52-ch07-7-4.txt:53,搜「训练准确率:93.33%」)。验证准确率 87.74% 在第 55 段。

  10. 出处:「7-4 转移学习」第 59 段(text/52-ch07-7-4.txt:59,搜「验证准确率并没有提高」)。

  11. 出处:「7-4 转移学习」第 73 段(text/52-ch07-7-4.txt:73,搜「(224, 224」)。

  12. 出处:「7-5 Batch Normalization说明」第 37 段(text/53-ch07-7-5-batch-normalization.txt:37,搜「黄狗」)。

  13. 出处:「7-5 Batch Normalization说明」第 11 段(text/53-ch07-7-5-batch-normalization.txt:11,搜「特征缩放」)与第 21、35 段(text/53-ch07-7-5-batch-normalization.txt:35,搜「γ、β」)。

  14. 出处:「7-5 Batch Normalization说明」第 47 段(text/53-ch07-7-5-batch-normalization.txt:47,搜「W<1」)与第 52 段(text/53-ch07-7-5-batch-normalization.txt:52,搜「W>1」)。

  15. 出处:「7-5 Batch Normalization说明」第 67 段(text/53-ch07-7-5-batch-normalization.txt:67,搜「不需要加Dropout层」)。原作者优点清单在第 63 段(搜「Train faster」)。

  16. 出处:「7-5 Batch Normalization说明」第 71 段(text/53-ch07-7-5-batch-normalization.txt:71,搜「SVHN」)。三个模型的比较结论在第 77、89 段(搜「第三种模型」)。