上一章《经典 CNN 家族》的模型,胃口都一样:数据。ImageNet 光人工标注就花了两年多、几万人、上百万次。
但真实场景里你手上可能只有 500 张图。
这一章讲两个让"500 张图当 5 万张用"的办法:
假设你
网络会学到一个偷懒的规律:"中间那一片有毛茸茸的东西就判成猫"。 你给它一张猫在角落的图,它一脸茫然——不是它笨,是你从来没教过它"猫可以在别的位置"。
模型只会对它见过的样子保持鲁棒(见过的猫在见过的样子里,它认;侧躺、暗光、被挡一半,它就不认)。
你没给它看过的变化,它就不会处理。
教小孩认猫。如果你只给他看正对着、白天、在沙发上的猫的照片,
他见到一只侧躺着的黑猫可能就不认识了。
聪明的老师会给他看:各种角度、各种光线、被遮挡一半、趴着躺着的猫。
小孩学到的就不是"沙发上的那个东西",而是"猫"这个概念本身。
下面的沙盘是两张 32×32 的小图(3 个颜色通道,就是 32×32×3):一张猫、一张鱼。开 Mixup 时,鱼会按比例叠到猫上。 每一张效果都是逐个像素算出来的——勾选任意组合,看它们叠加。 这些变换是训练时临时做的、不占硬盘:所谓"500 张图当 5 万张用",就是同一张图每轮看到的版本都不一样。
互动 ·
原图
增强后
上面那张猫图你随便折腾,只有一行字会跟着变——标签。四类变换里,只有混合类会改它。
① 只开水平翻转:图片变了,但标签完全不用改——翻过来的猫还是猫。
② 开旋转 180°:这里要小心。如果任务是"识别数字",旋转 180° 的 6 会变成 9,
标签就没法照旧。所以"哪些变换可用"取决于任务。
③ 开 Mixup:图片变成两张的叠加。盯着下面那行标签——它也跟着变成了两个类别的加权和。
(标签写成 [1.00 猫, 0.00 鱼] 这种方括号形式:每个类别一格,分数加起来是 1。)
示意图 · 同一张猫图,四类增强各做了什么
| 类别 | 代表方法 | 改什么 | 标签要改吗 |
|---|---|---|---|
| 几何变换 | 翻转 · 旋转 · 裁剪 · 缩放 · 仿射(放大缩小、拉伸斜切) | 像素的位置 | 不用改(物体还是那个物体) |
| 颜色变换 | 亮度 · 对比度 · 饱和度 · 色调抖动(把整体颜色往某个方向偏)· 灰度化 | 像素的值 | 不用改 |
| 遮挡 / 擦除 | Cutout · Random Erasing · Grid Mask | 随机挖掉一块 | 不用改(逼模型别只依赖局部) |
| 混合 | Mixup(按比例逐像素相加)· CutMix(剪一块贴过去,标签按面积比例混)· Mosaic(拼四张)· Copy-Paste(抠出物体贴过去) | 把两张图混在一起 | 要改——标签变成加权组合 |
把猫和鱼叠在一起、标签写成 [0.6 猫, 0.4 鱼],听起来像在教模型说胡话。它其实做了一件很聪明的事:
逼着模型输出"70% 像猫、30% 像鱼"这种平滑、有刻度的判断,而不是非猫即鱼的硬判决。
普通训练下模型容易过度自信,遇到模棱两可的样本就给极端概率;
现在它得在靠近分界线时给一个中间的把握。分界线就是决策边界(模型在"猫"和"鱼"之间划的那条线),
这么一混,它变平滑了,
下面的真实数字按换成猫/鱼两类新头之后的模型(约 23.5M 参数)算;预训练的 ResNet-50 本身是 25.6M。再下面那张 13 层方块图是一个简化的小网络,只用来看"哪一层学到什么"。
为什么能迁移:网络的不同层学到的东西不一样(「可复用度」是示意刻度)
浅层学到的东西跨领域大体还能用,深层学到的东西只认原任务。 边缘、颜色块、纹理——不管是自然照片还是 X 光片,都是这些,所以前面几段可以冻住复用; 越往深,越是"猫耳朵检测器""胡须检测器"这种只对原任务有用的东西,必须换掉重训。 跨度也不能太大:自然图像迁到医学影像,整体收益比在同领域里迁移小得多(2019 年 Raghu 等人的研究 Transfusion)。
互动 · 三种微调策略的真实代价
把鼠标移到公式卡里的 P 上——上面那排「微调策略」按钮会亮起来。然后在「只换分类头 / 解冻最后 N 段 / 全量微调」之间切一遍,
盯着「优化器状态」那个数:它从 49 KB 一路涨到 282 MB,而模型一个参数也没变多。
这里只算优化器状态(每个可训练参数 12 字节:梯度、一阶动量、二阶动量各 4 字节);权重本身和中间结果另算。
| 策略 | 改哪些层 | 什么时候用 | 风险 |
|---|---|---|---|
| 只换分类头 | 冻结全部,只训新换上的分类头(2 类 = 4,098 个参数) | 新任务和原任务很像(都是自然图像分类),数据很少(几百张) | 如果两个领域差太远,前面的特征根本用不上 |
| 解冻最后 N 段 | 训最后几段 + 分类头 | 最常用的折中。领域有差异但不完全陌生 | N 怎么选要试 |
| 全量微调 | 所有层都训(全部解冻) | 数据够多(几万张以上),或者领域差异大(自然图像 → 医学影像) | 数据少时几轮就 |
| 从零训练 | 不用 |
只在你有百万级数据、且领域极其特殊(比如雷达图)时才考虑 | 几乎总是更差。除非数据量真的很大,否则不要这么做。 |
全量
互动 · 每一层的实际学习率:浅层小、深层大
BatchNorm 层里存着"均值"和"方差"这些统计量,它们是在原来的数据集上算出来的。
如果你的新数据集和原来差别很大(比如原来是彩色自然图,你的是灰度高对比医学图),
这些统计量就是错的——会严重拖累效果。
解法:把 BatchNorm 也放开训练(哪怕其它层冻结),或者在新的小数据集上重新估计。
这一章的两个办法,各只有一条式子。这里看「混合」那条;「冻结」那条在第 4 节那张公式卡里。 用的是 §2 沙盘里那两张 32×32 的猫和鱼——拖一下 λ,符号行里的 λ 跟着变,卡里那张混出来的小图也会重画。
互动 · 混合的数学:两张图按一个比例,逐像素加起来
公式卡 · 混合的公式,和它的像素级图解
互动 · 那个混合比例从哪来:从一条分布里随机抽
几何、颜色、遮挡都只是把像素搬家或改值——猫还是猫,标签一个字不用动。 Mixup 真的把两张图的每个像素加起来,所以标签也必须跟着变成 [λ 猫, 1−λ 鱼]: 上面那条分两色的条就是它。「混合类必须改标签」这句话,画出来就是那条条。
示意图 · 同一个旋转 180°,两个任务两种下场
| 陷阱 | 怎么回事 |
|---|---|
| 增强用错了会伤效果 | 旋转 90° 对数字识别是破坏性的;颜色抖动对"辨别颜色"的任务是破坏性的。 增强必须符合"这个变化不应该改变标签"这个前提。 拿不准就先想一个问题:这个变化在真实数据里会不会出现、该不该改答案;再在验证集上比开、关两种训练的效果。 |
| 训练和验证的增强不一致 | |
| 训练集和测试集"泄漏" | 用 |
| 以为增强等于有更多数据 | 增强提供的是"已知的变化",它造不出全新的信息。 500 张猫的增强版仍然是那 500 张猫——缺的品种、姿势、光照它补不上 |
这一章和上一章(CNN)回答的是同一道题,只是换了答卷的位置。
回到第 2 节那个增强沙盘,切两下:把「旋转」切成 180°——对猫/鱼来说,猫转 180° 还是猫,标签不用改, 那行字还是 [1.00 猫, 0.00 鱼];可要是做数字识别,6 转 180° 就成了 9,标签必须跟着变——第 6 节那张对照图画的就是这两种下场。 再把「混合方式」切到 Mixup、λ 拉到 0.6——标签当场变成 [0.60 猫, 0.40 鱼]。 两下的差别就是这一章的重点:标签的每一处改动,都来自你事先写进数据的一条断言(旋转在这个任务里不该改答案 / 两张图可以叠加),算法本身一个字没改。
| 暗线 | 这一章的回答 |
|---|---|
| 信息流动 | 形状全程不变:增强是 32×32×3 进、32×32×3 出;变的是标签——几何/颜色/遮挡不动它, 混合类把它变成软标签 [λ, 1−λ];被冻结的层梯度恒为 0 |
| 参数账本 | 增强不加参数,只多花算力;迁移的账全在优化器状态上:换成猫/鱼两类新头后的模型约 23.5M 参数, 只换分类头只训 4,098 个(0.02%),优化器状态从 282 MB 掉到 49 KB |
| 跑在什么上 | 增强的瓶颈常在数据加载(CPU / 硬盘 IO),所以工业界把它搬到 GPU 上做; 迁移是显存受限——冻结层省的就是每参数 12 字节的梯度 + 优化器状态 |
| 它假设了什么 | 假设你手里有一份“不变性清单”,而且源任务的浅层特征对你还能用—— 跨度一大(自然图 → 医学影像)收益就缩水 |
| 违背了哪个直觉 | 两条:把两张图叠成一团、标签也混着写,居然能提升泛化;用别人的权重不是“不干净”,实测通常更好 |
它接住了上一章的什么:《经典 CNN 家族》列了 CNN 的两大代价—— 「需要海量标注」和「归纳偏置太强」。这一章从数据那一侧回应前者:增强和迁移让「海量标注」不再是硬门槛。
它给后面留了什么:下一章《目标检测》接着算这笔账——
分类只点一下,画框要贵得多;而更后面的自监督(《自监督与对比学习》)
把“造变化”交给模型自己(遮住一块重建),那正是大模型
两者都会骗你:增强可能破坏标签含义,
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。