跳到主要内容

08 · 皮实:没标签也要学,有人捣乱也不怕

1. 这一章讲什么

到第 7 章为止,所有训练都假设两件事:有标注数据、输入是善意的。现实常不成立——标注贵到用不起,而输入会被恶意改造。原书第 8 章讲两条应对:对比学习「在没有标签数据的情况下……构建正负样本对」自己教自己;对抗训练「在模型训练中引入对抗样本」,专练抗干扰1

中间一节(8.3)还塞了个 GAN——生成器造假、判别器打假的博弈训练。它与「抗扰动」这条主线关系不大,更像生成模型那一路的代表课;本拆解照书结构保留,但单独成一节并点明它的位置。

2. 顶层全景:三种「额外训练法」

对比学习: 一张图 → 两次随机增强 → 两个视角互为「正样本」
同批其他图是「负样本」→ 拉近正对,推远负对
GAN: 噪声 → 生成器造假图 → 判别器判真假
↑__________________|| 互相提升,交替训练
对抗训练: 正常输入 + 嵌入上的微小扰动 = 对抗样本
两种样本一起算损失 → 模型学会「不被小扰动带偏」

图说:三种方法共享一个思想——训练时的信息来源比「标注」多得多:
数据自身的变换(对比)、对手的攻击(对抗)、模型之间的博弈(GAN)。

3. 核心原理

3.1 对比学习:自己出题,答案写在数据里

对比学习的核心设置:对同一个输入做两次不同的数据增强(裁剪、变色……),得到的两个视角互为正样本对;批次里其他输入的视角都是负样本对。训练目标一句话:嵌入空间里,正对距离压小,负对距离推大2

损失函数怎么表达这句话? 原书给的对比损失分两项:正样本对损失=距离的平方(逼它变小);负样本对损失=「距离减去 margin 后的平方再套 relu」——margin 是人为划的线,负对距离只要还在线内就持续扣分,超过线就不管了3

主走查:两个平均数看出模型在学什么。 原书 8.1.1 的输出给了最直接的证据:

Positive Pair Distance (mean): 0.8741 ← 正对的平均距离
Negative Pair Distance (mean): 1.5612 ← 负对的平均距离
判读:负对距离 ≈ 正对的 1.8 倍 → 嵌入空间已经开始「分层」:
同源样本抱团,异源样本疏远。这个差距就是对比学习的全部产出。
(两个均值取自原书演示输出;「1.8 倍」是我们算的比值。)

走查说明:后续每轮训练盯的就是这两个数——差距不涨了,对比学习就到头了。margin 定的是「负对要离多远才算毕业」。

3.2 SimCLR:对比学习的标准流水线

SimCLR 把上面的思想装成四部件流水线:数据增强(每张图生成两个视图)、编码器(图→嵌入)、投影头(嵌入→对比专用空间)、NT-Xent 损失(带温度参数的对比损失,原书演示取 temperature=0.5)4。训练完成后,投影头扔掉,编码器拿去下游微调。

下游用法(8.2)和 03 章 BERT 微调是同一个模子:加载自监督预训练好的编码器,冻结(或部分冻结)参数,接一个分类头,只优化分类头的参数5。区别在预训练那一环——BERT 靠遮词,SimCLR 靠造视角;两者的共同点是「标注不花钱」。原书的下游数据:五个 epoch 准确率从 64.23% 升到 74.32%6;聚类(没人教分堆,自己抱团)任务上用 t-SNE 降到二维,能看到不同类别在嵌入空间里分了区7

3.3 GAN:造假者与验钞机的军备竞赛

GAN 是另一场双人舞:生成器从随机噪声造假样本,判别器对输入做二分类判真判假;生成器的目标是「欺骗」判别器,判别器的目标是识破8。损失用二元交叉熵,训练交替进行:先固定生成器更新判别器,再固定判别器更新生成器9。原书的演示场景很克制:拿 16×16 的「彩色斑点图」当真实数据,让生成器学会造出难以分辨的假斑点图10

GAN 在本书里的角色是「生成模型的代表」——它教的通用课是:两个网络互为对方的环境,各自的损失都要看对方的输出。这个「博弈式训练」思路与对比/对抗训练并列为无标注时代的三大训练法。

3.4 对抗训练:故意喂「坏输入」

对抗样本是故意造的「骗术输入」:在正常输入上叠加人眼难察的扰动,就能让模型改判。原书的做法在嵌入空间动手:把文本转成嵌入后,加一个 epsilon=1e-3 的微小扰动,得到对抗输入;训练时对正常样本和对抗样本分别算损失、一起反传11。效果检验也直接:原书输出里,正常输入和对抗输入的预测都是 Positive——扰动没能把模型带偏12

主走查(第二走查):扰动的大小意味着什么。 epsilon=1e-3 是扰动强度的上限——每个嵌入维度的改动不超过 ±0.001(以原书设置计)。想想 06 章 PCA 图上的语义距离:同义词之间的距离都远大于 0.001;也就是说,对抗样本在语义上与原句几乎相同,却可能骗过没有对抗训练的模型。这正是「对抗训练非做不可」的理由:它防的攻击在人类语义尺度上是隐形的。

4. 作者的判断与证据

  • 有演示数据的: 正/负对距离 0.8741/1.5612(8.1.1)、SimCLR 五个 epoch 损失 0.6453→0.4269(8.1.2)、下游 64.23%→74.32%(8.2.1)、对抗前后预测一致(8.4)。
  • 是作者判断的: 「对抗训练能有效抵抗人为扰动的对抗性输入」——书里没有「不训练 vs 训练」的被骗对照,只演示了训后不倒;「对比学习在分类聚类任务中表现出色」同样是定性论断。
  • 要分开的: 8.1.1 有句「假设代码成功运行,输出结果如下」13——原书自己承认这组数字是假定的;引用时要带这个前提。

5. 边界与局限

  • 原书的对比学习全在图像(SimCLR)上,文本对比学习(句子对、检索场景)只字未提——标题写着「大模型中的应用」,实际没到语言模型。

  • 对抗训练只做了「嵌入加随机扰动」这一种;经典的梯度引导攻击(算出最伤模型的扰动方向)没有出现——随机扰动是最弱的攻击,能扛住它不等于能扛住真攻击。补充(不在书里,来自通用知识):FGSM/PGD 这类梯度攻击是对抗鲁棒性——抗捣乱的硬本事——的标准考题。

  • GAN 只停在「能跑」;训练不稳、模式坍塌这些 GAN 的著名难题没有讨论。

  • 三种方法与「大模型」的结合点(比如用对比损失做句子嵌入、用对抗训练加固 LLM(大语言模型,即 Large Language Model 的缩写))书里没有落地案例。

6. 可带走的

  1. 没标签也能训练:数据自身的变换就是免费的监督信号。
  2. 对比学习产出的唯一指标(衡量口径)是「正对距离 vs 负对距离」的差距;盯这两个数就知道训练成没成。
  3. margin 是负样本的「毕业线」:超过线就不再推,防止无限推开浪费力气。
  4. SimCLR 四部件里,投影头是「训练脚手架」,训完即拆;编码器才是资产。
  5. GAN 的通用课是博弈式训练:你的损失函数里写着我,我的损失函数里写着你。
  6. 对抗扰动(epsilon=1e-3)远小于任何语义距离——它防的攻击在人类尺度上是隐形的。
  7. 评估鲁棒性要看「训后会不会倒」,更要看「攻击有多强」;随机扰动只是最低难度的考卷。

7. 原文地图

主题原书章原文位置
章导语第8章text/48-ch08.txt:24(搜「对比学习(Contrastive Learning)」)
正负样本对定义8.1text/49-ch08-01-8-1.txt:33(搜「来源于同一输入」)
margin 与损失构成8.1text/49-ch08-01-8-1.txt:103(搜「阈值margin」) · text/49-ch08-01-8-1.txt:124(搜「F.relu用于确保」)
正负对距离数字8.1text/49-ch08-01-8-1.txt:139(搜「Negative Pair Distance」)
SimCLR 四部件与温度8.1text/49-ch08-01-8-1.txt:158(搜「两个不同的视图」) · text/49-ch08-01-8-1.txt:24(搜「数据增强」) · text/49-ch08-01-8-1.txt:255(搜「temperature=0.5」)
自监督预训练与下游冻结8.2text/50-ch08-02-8-2.txt:24(搜「无须人工标注」) · text/50-ch08-02-8-2.txt:94(搜「冻结其参数(或部分冻结)」) · text/50-ch08-02-8-2.txt:109(搜「只优化分类头的参数」)
t-SNE 聚类可视化8.2text/50-ch08-02-8-2.txt:218(搜「t-SNE」)
GAN 双方与交替训练8.3text/51-ch08-03-8-3.txt:24(搜「生成器(Generator)和判别器(Discriminator)」) · text/51-ch08-03-8-3.txt:39(搜「欺骗」) · text/51-ch08-03-8-3.txt:45(搜「交替训练」) · text/51-ch08-03-8-3.txt:51(搜「彩色斑点图」)
对抗训练与扰动强度8.4text/52-ch08-04-8-4.txt:24(搜「adversarial examples」) · text/52-ch08-04-8-4.txt:30(搜「微小扰动」) · text/52-ch08-04-8-4.txt:76(搜「epsilon=1e-3」)
扰动前后预测一致8.4text/52-ch08-04-8-4.txt:60(搜「Prediction on adversarial input」)

Footnotes

  1. 出处:「第8章 对比学习与对抗训练」第 24 段(text/48-ch08.txt:24,搜「对比学习(Contrastive Learning)」)。

  2. 出处:「8.1 对比学习」第 33 与 36 段(text/49-ch08-01-8-1.txt:33,搜「来源于同一输入」;text/49-ch08-01-8-1.txt:24,搜「距离更近」)。

  3. 出处:「8.1 对比学习」第 103 与 123 段(text/49-ch08-01-8-1.txt:103,搜「阈值margin」;text/49-ch08-01-8-1.txt:124,搜「F.relu用于确保」)。

  4. 出处:「8.1 对比学习」第 158、161-173 与 255 段(text/49-ch08-01-8-1.txt:158,搜「两个不同的视图」;text/49-ch08-01-8-1.txt:24,搜「数据增强」;text/49-ch08-01-8-1.txt:255,搜「temperature=0.5」)。

  5. 出处:「8.2 基于对比学习的预训练与微调」第 94 与 109 段(text/50-ch08-02-8-2.txt:94,搜「冻结其参数(或部分冻结)」;text/50-ch08-02-8-2.txt:109,搜「只优化分类头的参数」)。

  6. 出处:「8.2 基于对比学习的预训练与微调」第 151-162 段(text/50-ch08-02-8-2.txt:150,搜「64.23%」)。

  7. 出处:「8.2 基于对比学习的预训练与微调」第 218 段(text/50-ch08-02-8-2.txt:218,搜「t-SNE」)。

  8. 出处:「8.3 生成式对抗网络的实现与优化」第 33 与 39 段(text/51-ch08-03-8-3.txt:24,搜「生成器(Generator)和判别器(Discriminator)」;text/51-ch08-03-8-3.txt:39,搜「欺骗」)。

  9. 出处:「8.3 生成式对抗网络的实现与优化」第 39 与 45 段(text/51-ch08-03-8-3.txt:39,搜「二元交叉熵」;text/51-ch08-03-8-3.txt:45,搜「交替训练」)。

  10. 出处:「8.3 生成式对抗网络的实现与优化」第 51 段(text/51-ch08-03-8-3.txt:51,搜「彩色斑点图」)。

  11. 出处:「8.4 对抗训练在大模型中的应用」第 30 与 76 段(text/52-ch08-04-8-4.txt:30,搜「微小扰动」;text/52-ch08-04-8-4.txt:76,搜「epsilon=1e-3」)。

  12. 出处:「8.4 对抗训练在大模型中的应用」第 57-61 段(text/52-ch08-04-8-4.txt:60,搜「Prediction on adversarial input」)。

  13. 出处:「8.1 对比学习」第 51 段(text/49-ch08-01-8-1.txt:51,搜「假设代码成功运行」)。