小鲁是个勤奋的备考生,目标是赢得一场“防蒙骗”大赛——他是 AI 模型,对手是专门出怪题的杠精学长。学长的工作很简单:拿任何一道题,改上几笔,加一点人类几乎察觉不到的变形,让小鲁给出完全错误的答案。小鲁决定以毒攻毒:每天跟学长对练,专刷这种被改过的怪题。第一周,他在练习卷上的怪题得分从四成涨到九成;第二周,奇怪的事情发生了。老师做了个对照测试:用全新的改题方式现编一批怪题,小鲁的得分竟先升后降——他已经把练习卷上的怪题背下来了,而普通题目(原题)得分还在稳步上涨。这个“会背旧怪题、怕见新怪题”的现象,就是对抗训练中的鲁棒过拟合。本文就用小鲁的备考故事,讲清它的表现、成因,以及破解它的四招。

岗位关联

理解鲁棒过拟合,是训练出真正能在攻防实战中“抗打”模型的分水岭——它能帮你识别训练曲线的陷阱、选择正确的调度与正则策略,是 AI 安全工程师与算法研究员的基本功。

目录
  1. 可视化演示
  2. 现象定义:模型变强还是开始背题
  3. 成因剖析:背题是怎么发生的
  4. 度量与观测:三张成绩单看清真相
  5. 学习率与早停:调整复习节奏
  6. 数据增广缓解:让题库更丰富
  7. 正则化技巧:让记忆更平滑
  8. 工程实践要点:科学的备考体检
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示对抗训练鲁棒过拟合的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

对抗训练鲁棒过拟合:鲁棒过拟 鲁棒过拟合的定义与识别方法 鲁棒过拟合与传统干净过拟合的本 核心机制可视化 对抗训练鲁棒过拟合整体架构与关键组件

现象定义:模型变强还是开始背题

开学第三周,老师发现小鲁的成绩单出现了“分裂”:每天跟杠精学长对练之后,练习卷上那些旧怪题的正确率一路飙升,从四成涨到九成;可老师随手用新套路现编的怪题,小鲁的得分却在一周前就开始回落,而普通题目的得分反而还在稳步爬升。老师嘀咕:“这孩子到底是变强了,还是把题背下来了?”

在对抗训练里,这段剧情每天都在上演。训练时,算法会用攻击手段(比如 PGD 多步攻击)在当前模型上“现场出题”——生成对抗样本,也就是杠精学长的怪题;模型在这些样本上反复迭代,相当于小鲁刷题。所谓鲁棒过拟合,指的就是:训练集上的对抗损失一路走低、对抗准确率持续走高,但验证集或测试集上重新生成的对抗样本准确率却先升后降。

对抗训练的目标函数通常写成 min-max 形式。内层 max 是“学长按当前模型最痛处出题”,外层 min 是“小鲁把这些最难题练到最好”。当训练推进到后期,模型已经能“背”住训练时见过的扰动模式;此时再换新生成的对抗样本来考,分数就开始下滑。

小鲁恍然大悟:自己练的不是功夫,是“默写”。练习卷的题是学长按固定套路改的,刷多了自然背熟;可真正的攻防赛场没有原题。鲁棒过拟合的本质,就是模型把“训练期的怪题套路”当成了通用规律来记忆。

min⁡θ1n∑i=1nmax⁡∥δi∥p≤ϵℓ(fθ(xi+δi),yi)\displaystyle \min_\theta \frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|_p \le \epsilon} \ell\left(f_\theta(x_i+\delta_i), y_i\right)
这个式子像一份“攻防合同”:内层规定学长可以怎么改题(最多加 ε 的扰动),外层规定小鲁要把最坏情况下丢的分降到最低。
  1. 外层 min 符号 $\min_\theta$训练目标是找一组模型参数 θ,让所有样本的损失之和尽量小,对应小鲁不断调整解题方法。
    min⁡θ1n∑i=1n\displaystyle \min_\theta \frac{1}{n}\sum_{i=1}^{n}
  2. 数据平均 $\frac{1}{n}\sum_{i=1}^{n}$对 n 个训练样本逐一计算损失后取平均,代表“整体水平”而非单个题目。
    1n∑i=1n\displaystyle \frac{1}{n}\sum_{i=1}^{n}
  3. 内层 max $\max_{\|\delta_i\|_p \le \epsilon}$在允许的扰动范围(半径 ε 的球)内,找到让当前模型损失最大的扰动 δ,相当于生成“最刁钻的怪题”。
    max⁡∥δi∥p≤ϵ\displaystyle \max_{\|\delta_i\|_p \le \epsilon}
  4. 损失函数 $\ell\left(f_\theta(x_i+\delta_i), y_i\right)$把加了扰动的样本送入模型,计算预测与真实标签的差距,差距越大说明被这道怪题难住了。
    ℓ(fθ(xi+δi),yi)\displaystyle \ell\left(f_\theta(x_i+\delta_i), y_i\right)

成因剖析:背题是怎么发生的

老师开始追踪小鲁背题的根源。杠精学长的改题套路并非随机:他沿着让小鲁“最丢分”的方向改,也就是沿着损失函数的梯度方向加扰动。这类怪题往往落在小鲁知识边界的“犄角旮旯”,集中分布在决策边界附近的高曲率区域——那里的样本长得像噪声,共享规律很少,只有个体特征可记。

模型(小鲁)容量越大,越有能力把这些犄角旮旯里的个体特征挨个记住,而不是提炼出共享规律。于是训练越往后,模型对训练集怪题的记忆越精细;同时损失面的“微结构”也越来越尖锐、非均匀——少数样本主导梯度,模型开始钻牛角尖。

研究者用“鲁棒泛化差距”刻画这种现象:训练集上的对抗风险(练习卷怪题平均丢分)与真实分布上的期望对抗风险(考场新怪题平均丢分)之差。训练后期,两者的差距被越拉越大,正如小鲁的练习分与考场分渐行渐远。

三个原因像三根支柱撑起“背题大厦”:出题套路固定(对抗样本分布偏移)、题目太怪难有共性(决策边界高曲率)、记性太好(模型容量大)。要拆这座大厦,得从这三根支柱下手。

Gap⁡rob=1n∑i=1nmax⁡∥δi∥p≤ϵℓ(fθ(xi+δi),yi)−E(x,y)∼D[max⁡∥δ∥p≤ϵℓ(fθ(x+δ),y)]\displaystyle \operatorname{Gap}_{rob} = \frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|_p\le \epsilon} \ell\left(f_\theta(x_i + \delta_i), y_i\right) - \mathbb{E}_{(x,y)\sim\mathcal{D}}\left[\max_{\|\delta\|_p\le \epsilon} \ell\left(f_\theta(x+\delta), y\right)\right]
  1. 鲁棒泛化差距 $\operatorname{Gap}_{rob}$衡量背题程度的总体指标,差距越大说明练习与考场表现分离越严重。
    Gap⁡rob=R^rob−Rrob\displaystyle \operatorname{Gap}_{rob} = \hat{R}_{rob} - R_{rob}
  2. 训练对抗风险 $\frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|_p\le \epsilon} \ell(\cdot)$对训练集每个样本求最坏扰动下的损失再取平均,即练习卷怪题的平均丢分。
    1n∑i=1nmax⁡∥δi∥p≤ϵℓ(fθ(xi+δi),yi)\displaystyle \frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|_p\le \epsilon} \ell\left(f_\theta(x_i + \delta_i), y_i\right)
  3. 期望对抗风险 $\mathbb{E}_{(x,y)\sim\mathcal{D}}\left[\max_{\|\delta\|_p\le \epsilon} \ell(\cdot)\right]$与整个真实数据分布上的最坏损失求期望,即考场新怪题的平均丢分。
    E(x,y)∼D[max⁡∥δ∥p≤ϵℓ(fθ(x+δ),y)]\displaystyle \mathbb{E}_{(x,y)\sim\mathcal{D}}\left[\max_{\|\delta\|_p\le \epsilon} \ell\left(f_\theta(x+\delta), y\right)\right]
  4. 两项相减练习分与考场分之差。差距越大,背题越严重,鲁棒过拟合越明显。
    1n∑i=1n(⋅)−E(⋅)\displaystyle \frac{1}{n}\sum_{i=1}^{n} (\cdot) - \mathbb{E}(\cdot)

度量与观测:三张成绩单看清真相

怎么及时发现自己背题了?老师定下规矩:每次模拟考发三张成绩单——普通题得分(标准准确率)、练习卷旧怪题得分(训练对抗准确率)、新怪题得分(测试对抗准确率)。只盯一张,必然被骗。

训练过程中每轮记录这三张成绩单并画成曲线。健康的状态是三条线一起向上;一旦出现“训练对抗精度还在涨、测试对抗精度掉头向下”,就是鲁棒过拟合的信号弹。此时标准精度往往还在上涨,所以光看干净测试集根本发现不了问题。

测算对抗精度的要点是“现场出题”:每一轮(或每隔几轮)用当前模型、固定扰动预算 ε 与步数 K,在验证集上重新生成 PGD 对抗样本再评测。绝不能用训练时缓存的老怪题——模型已经背过答案,测出来会虚高。这也是很多团队“训练时指标漂亮、上线后一戳就破”的原因。

有了这三张成绩单,老师就能在模拟考新怪题得分见顶那天果断送考,而不是等正式比赛成绩公布才发现问题。这自然引出了破解鲁棒过拟合的四招。

Acc⁡adv=1m∑j=1m1[y^(xj′)=yj],xj′←PGD⁡(xj,ϵ,α,K)\displaystyle \operatorname{Acc}_{adv} = \frac{1}{m}\sum_{j=1}^{m} \mathbb{1}\left[\hat{y}(x_j') = y_j\right], \qquad x_j' \leftarrow \operatorname{PGD}(x_j, \epsilon, \alpha, K)
  1. 指示函数 $\mathbb{1}[\cdot]$预测对了记 1,错了记 0,最后平均就是对抗正确率。
    1[y^(xj′)=yj]\displaystyle \mathbb{1}\left[\hat{y}(x_j') = y_j\right]
  2. 预测 $\hat{y}(x_j')$模型对攻击后样本的预测结果,对应小鲁面对怪题给出的答案。
    y^(xj′)\displaystyle \hat{y}(x_j')
  3. 现场出题 $x_j' \leftarrow \operatorname{PGD}(x_j, \epsilon, \alpha, K)$用 PGD 攻击 K 步、每步步长 α、总预算 ε,在验证集上现场生成新怪题,保证考题的“新鲜感”。
    xj′←PGD⁡(xj,ϵ,α,K)\displaystyle x_j' \leftarrow \operatorname{PGD}(x_j, \epsilon, \alpha, K)
  4. 平均 $\frac{1}{m}\sum_{j=1}^{m}$m 个验证样本的对抗正确率,即整体考场得分。
    1m∑j=1m\displaystyle \frac{1}{m}\sum_{j=1}^{m}

学习率与早停:调整复习节奏

第一招:调整复习节奏。小鲁原本匀速刷题,越刷越死;老师改成“冲刺—回炉—重启”循环:每学一阵子就把强度(学习率)降下来,重新扫一遍错题,然后恢复高强度再来一轮。这套节奏在对抗训练里叫余弦退火带热重启。

学习率决定模型在参数空间里“迈多大步”。步子太大,模型跳来跳去记不牢;步子太小,又容易一头扎进背题的局部陷阱。余弦退火让学习率在一个周期内从高位平滑降到低位,周期结束瞬间跳回高位,相当于强制模型周期性跳出死记硬背的状态——每一次重启,都是一次“格式化重来”的机会。

配合第二张成绩单做早停:验证集对抗精度连续几个 epoch 不再创新高,就保存当前权重收工。这就像老师看到模拟考成绩见顶立刻喊停,不让学生在练习卷上磨到走火入魔。

ηt=ηmin⁡+12(ηmax⁡−ηmin⁡)(1+cos⁡(π⋅(t mod T)T))\displaystyle \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{\pi \cdot (t \bmod T)}{T}\right)\right)
  1. 当前学习率 $\eta_t$第 t 轮训练时的复习强度。
    ηt\displaystyle \eta_t
  2. 学习率上下限 $\eta_{\max}$ 与 $\eta_{\min}$分别对应冲刺时的最大强度和最低谷底强度。
    ηmax⁡,ηmin⁡\displaystyle \eta_{\max}, \quad \eta_{\min}
  3. 余弦项 $\cos\left(\frac{\pi \cdot (t \bmod T)}{T}\right)$在一个周期内从 1 平滑降到 -1,使学习率先缓降再触底。
    cos⁡(π⋅(t mod T)T)\displaystyle \cos\left(\frac{\pi \cdot (t \bmod T)}{T}\right)
  4. 周期取模 $t \bmod T$每 T 轮完成一个周期,周期结束瞬间从谷底跳回高位,这就是“热重启”。
    t mod T\displaystyle t \bmod T
  5. 区间映射 $\frac{1}{2}(\eta_{\max}-\eta_{\min})(1+\cos)$把余弦值映射到 $[\eta_{\min}, \eta_{\max}]$ 区间,保证学习率始终落在合法范围。
    12(ηmax⁡−ηmin⁡)(1+cos⁡(⋅))\displaystyle \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos(\cdot)\right)

数据增广缓解:让题库更丰富

第二招:扩大题库。小鲁只跟杠精学长一个风格练,很容易摸清对方的出题脾气;如果换成多个不同风格的学长轮流出题,或者补充校外公开课、往年真题,背题的空间就被大幅压缩。这在对抗训练里叫增加样本多样性。

工程上常见的做法有三类:一是图像增广,比如 Mixup 把两个样本按比例混合、Cutout 随机遮挡区域,让模型看到的“变形”更丰富;二是利用无标签数据做自训练,先用当前模型对无标签数据打伪标签,再连同对抗样本一起训练,相当于请一位见多识广的“校外导师”帮忙补充题型;三是把干净样本分类损失与“对抗下预测一致性”拆开加权,即 TRADES 风格的目标函数。

TRADES 损失的精髓在于:第一项要求模型在干净样本上分类正确,第二项要求模型在干净样本和对抗样本上的输出分布尽量一致——“普通题要做对,怪题面前也不能慌”。

这相当于给备考加了“多样化模拟卷”:题量大了、题型杂了,背诵的性价比就低了,逼着小鲁去总结真正的解题规律,而不是记住某道具体题目。

min⁡θ[1n∑i=1nℓ(fθ(xi),yi)+β⋅1n∑i=1nmax⁡∥δi∥≤ϵKL⁡(fθ(xi) ∥ fθ(xi+δi))]\displaystyle \min_\theta \left[ \frac{1}{n}\sum_{i=1}^{n} \ell\left(f_\theta(x_i), y_i\right) + \beta \cdot \frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|\le\epsilon} \operatorname{KL}\left(f_\theta(x_i) \,\|\, f_\theta(x_i+\delta_i)\right) \right]
  1. 干净样本损失 $\ell\left(f_\theta(x_i), y_i\right)$普通题上的分类损失,要求不因增加对抗训练而丢掉基本功。
    ℓ(fθ(xi),yi)\displaystyle \ell\left(f_\theta(x_i), y_i\right)
  2. 内层 max $\max_{\|\delta_i\|\le\epsilon}$找使模型输出扰动最大的对抗样本,即最让模型慌神的怪题。
    max⁡∥δi∥≤ϵKL⁡(⋅)\displaystyle \max_{\|\delta_i\|\le\epsilon} \operatorname{KL}(\cdot)
  3. KL 散度 $\operatorname{KL}\left(f_\theta(x_i) \,\|\, f_\theta(x_i+\delta_i)\right)$衡量模型在干净样本与对抗样本上输出分布的差异,差异越大说明被怪题带得越偏。
    KL⁡(fθ(xi) ∥ fθ(xi+δi))\displaystyle \operatorname{KL}\left(f_\theta(x_i) \,\|\, f_\theta(x_i+\delta_i)\right)
  4. 权重系数 $\beta$权衡“做对普通题”与“面对怪题保持稳定”,β 越大越重视鲁棒性。
    β\displaystyle \beta
  5. 累加平均 $\frac{1}{n}\sum_{i=1}^{n}$对全部样本求和再取平均,得到整体训练目标。
    1n∑i=1n[⋅]\displaystyle \frac{1}{n}\sum_{i=1}^{n} [\cdot]

正则化技巧:让记忆更平滑

第三招:从记忆深处做文章。小鲁背题快,是因为答案被原封不动刻进了肌肉记忆;如果要求他刷完题把思路提炼成通用口诀,再把几次模拟考的最佳状态做平均,他就不会只依赖最后一次冲刺的死记硬背。对应到模型,就是权重正则化与权重平均。

对抗权重扰动(AWP)的想法很直接:在模型权重上叠加一个受控的小扰动,朝着“让训练对抗损失变大”的方向施压,迫使模型收敛到更平坦的区域——那些区域对权重的微小变化不敏感,自然更不容易背题。随机权重平均(SWA)则把训练后期若干轮 checkpoint 的权重取平均,相当于把几次模拟考状态融合,得到的解通常更平滑、泛化更好。

AWP 的 min-max 式子写出来是:内层先对输入做对抗攻击,再对权重做最优扰动;外层训练的目标是让模型在“权重也被打歪”的最坏情况下依然稳健。

第四招也顺带登场:标签平滑与梯度惩罚。标签平滑把“满分答案”改成“99 分答案”,降低模型对训练标签的过度自信;梯度惩罚惩罚损失面的剧烈震荡。四招齐下,小鲁终于从“背题机器”变回了“解题选手”。

min⁡θmax⁡∥v∥F≤γ1n∑i=1nmax⁡∥δi∥p≤ϵℓ(fθ+v(xi+δi),yi)\displaystyle \min_\theta \max_{\|v\|_F\le \gamma} \frac{1}{n}\sum_{i=1}^{n} \max_{\|\delta_i\|_p\le \epsilon} \ell\left(f_{\theta + v}(x_i + \delta_i), y_i\right)
  1. 后期权重 $\theta_k$训练末尾 K 个时刻保存的模型权重,像 K 次模拟考的状态快照。
    θk\displaystyle \theta_k
  2. 平均 $\frac{1}{K}\sum_{k=1}^{K}$把 K 份权重取平均,抹平单次冲刺的偶然偏差,得到更平滑的解。
    1K∑k=1Kθk\displaystyle \frac{1}{K}\sum_{k=1}^{K} \theta_k

工程实践要点:科学的备考体检

最后一公里是把四招装进工程流水线,配上“体检制度”。老师的做法是每周模拟考:用固定攻击强度在验证集上生成新怪题给小鲁打分,分数连续两周下滑就触发干预——要么切换余弦退火节奏,要么直接早停。

工程上还强调对照实验:固定数据与模型,分别比较“有无余弦退火”“有无 AWP”“有无增广”的鲁棒精度曲线,才能定位是哪一招起了作用。攻击强度也要权衡:训练时 PGD 步数太多,单轮代价高、更容易把模型逼进背题;步数太少(如只用单步 FGSM)又会出现“梯度遮蔽”——模型看似鲁棒,换更强的攻击立刻崩溃。

无论训练还是评测,都绕不开那张攻击公式——PGD 迭代更新。它像杠精学长的“出题手册”,规定了怪题该怎么逐步修改。

有了体检制度与攻击标尺,小鲁的备考终于科学化:平时练习用中等强度怪题,大考用全新怪题,分数见顶就收手。拿到的模型既能应付练习卷,也能在真实攻防中站稳脚跟——这,就是对抗训练的及格线。

xt+1=clip⁡x,ϵ(xt+α⋅sign⁡(∇xℓ(fθ(xt),y)))\displaystyle x^{t+1} = \operatorname{clip}_{x, \epsilon}\left(x^t + \alpha \cdot \operatorname{sign}\left(\nabla_x \ell\left(f_\theta(x^t), y\right)\right)\right)
  1. 当前对抗样本 $x^t$第 t 步的对抗样本,即怪题的当前版本。
    xt+1\displaystyle x^{t+1}
  2. 梯度 $\nabla_x \ell\left(f_\theta(x^t), y\right)$损失对输入的梯度,告诉攻击者“往哪个方向改最能难倒模型”。
    ∇xℓ(fθ(xt),y)\displaystyle \nabla_x \ell\left(f_\theta(x^t), y\right)
  3. 符号函数 $\operatorname{sign}(\cdot)$只取梯度方向,使每次修改都是一个“莽撞但有效”的固定步长。
    α⋅sign⁡(⋅)\displaystyle \alpha \cdot \operatorname{sign}(\cdot)
  4. 步长 $\alpha$每次改题的幅度,控制怪题变化的剧烈程度。
    α\displaystyle \alpha
  5. clip 投影 $\operatorname{clip}_{x, \epsilon}$把样本拉回原样本 ε-邻域内,确保怪题不超纲、不越界。
    clip⁡x,ϵ(⋅)\displaystyle \operatorname{clip}_{x, \epsilon}(\cdot)

AI 应用场景

场景一:自动驾驶感知模型的对抗鲁棒评测

阶段:模型训练与鲁棒性评测

解决的问题:路牌识别模型在物理世界会被对抗贴片攻击干扰。传统流程只用干净测试集评估,无法发现鲁棒过拟合导致的“训练指标漂亮、上路掉链子”。需要在训练流水线中加入验证集 PGD 体检 + 余弦退火调度,防止模型背下训练攻击样本。

具体案例:某团队训练交通标志分类模型,用 PGD 对抗训练 30 轮后发现第 18 轮后验证集鲁棒精度下滑 7 个百分点,而干净精度仍在上升。改为余弦退火热重启 + 验证集早停后,最终鲁棒精度提升 11%,干净精度不降。

场景二:金融风控反欺诈的对抗防御

阶段:数据处理与模型防御

解决的问题:欺诈者会刻意构造“看起来像正常交易”的对抗样本逃过模型;若不处理鲁棒过拟合,风控模型会在训练几轮后对新的欺诈变形迅速失效。需要用自训练 + 无标签行为数据扩充题型,并用 AWP 正则压住背题倾向。

具体案例:某支付风控团队发现模型上线后首月拦截率高、次月骤降——原因是对抗训练后期过拟合训练集伪造样本。引入 AWP 与无标签数据自训练后,新欺诈家族的拦截率回升约 15%。

场景三:大模型红队测试与内容安全对齐

阶段:安全评测与对齐微调

解决的问题:红队用对抗性 prompt(越狱词)攻击大模型,模型对训练时见过的越狱模式过拟合,换个措辞就失守。需要在对抗微调过程中监控验证集攻击成功率曲线,及时早停,避免模型在越狱样本上“背答案”。

具体案例:内容安全团队对开源对话模型做对抗微调,逐轮记录越狱成功率,发现第 12 轮见底后开始回升;采用早停 + SWA 权重平均后,越狱成功率稳定在低位,且正常对话质量不受损。

Python 演示

python64 行
import numpy as np rng = np.random.default_rng(42)H = 48 def load_data():    t = rng.uniform(0, 2 * np.pi, 1600)    r = rng.uniform(0.5, 2.2, 1600)    X = np.stack([r * np.cos(t), r * np.sin(t)], 1)    y = (np.sin(3 * t) > 0).astype(int)    i = rng.permutation(1600)    return X[i[:1000]], y[i[:1000]], X[i[1000:]], y[i[1000:]] Xtr, ytr, Xte, yte = load_data()EPS, ALPHA, STEPS = 0.3, 0.06, 6 def init_model():    return (rng.normal(0, 0.6, (H, 2)), np.zeros(H),            rng.normal(0, 0.6, (2, H)), np.zeros(2)) def forward(w, X):    W1, b1, W2, b2 = w    h = np.maximum(0, W1 @ X.T + b1[:, None])    return h, W2 @ h + b2[:, None] def probs(w, X):    _, z = forward(w, X)    z -= z.max(0, keepdims=True)    e = np.exp(z)    return e / e.sum(0, keepdims=True) def grads(w, X, y, wrt_input=False):    W1, b1, W2, b2 = w    h, z = forward(w, X)    p = probs(w, X)    d = p.copy()    d[y, np.arange(len(y))] -= 1    d /= len(y)    dh = W2.T @ d    dh[h <= 0] = 0    if wrt_input:        return dh.T @ W1    return dh @ X, dh.sum(1), d @ h.T, d.sum(1) def pgd(w, X, y):    adv = X.copy()    for _ in range(STEPS):        g = grads(w, adv, y, wrt_input=True)        adv = np.clip(adv + ALPHA * np.sign(g), X - EPS, X + EPS)    return adv def acc(w, X, y):    return (forward(w, X)[1].argmax(0) == y).mean() w = init_model()for epoch in range(24):    Xadv = pgd(w, Xtr, ytr)      # 学长按当前模型现场出题    g = grads(w, Xadv, ytr)      # 用对抗样本更新模型    lr = 0.12 * 0.5 ** (epoch // 8)    w = (w[0] - lr * g[0], w[1] - lr * g[1],         w[2] - lr * g[2], w[3] - lr * g[3])    teas = pgd(w, Xte, yte)      # 考场上另出全新怪题    print('epoch %2d 训练鲁棒 %.3f 测试鲁棒 %.3f' %          (epoch + 1, acc(w, Xadv, ytr), acc(w, teas, yte)))
目的:在合成数据上训练一个带 PGD 攻击的迷你对抗训练模型,逐轮打印训练集与测试集对抗准确率,直观观察鲁棒过拟合现象——测试对抗精度通常先升后降,而训练对抗精度持续走高。
  1. Xadv = pgd(w, Xtr, ytr)每个 epoch 用当前模型对训练集现场生成对抗样本,对应杠精学长按小鲁当前弱点出题。
  2. g = grads(w, Xadv, ytr)校准后的对抗样本上计算梯度,推动模型学会“防怪题”。
  3. lr = 0.12 * 0.5 ** (epoch // 8)分段衰减学习率,训练后期放慢脚步,避免一头扎进背题状态。
  4. teas = pgd(w, Xte, yte)对测试集独立生成全新对抗样本,保证考题“新鲜感”,这是发现过拟合拐点的关键。
  5. print(... acc(w, Xadv, ytr), acc(w, teas, yte))逐轮打印两条鲁棒精度曲线,拐点出现处就是早停时机。

常见误区

误区我一直以为过拟合就是准确率掉落,鲁棒过拟合只是训练数据里加了对抗样本后的普通过拟合,用 dropout 或减小模型容量就能解决。

正解两者机制和表现都不同。普通过拟合时标准测试精度会下降;鲁棒过拟合的典型特征恰恰是标准精度仍在上升或持平,只有对抗精度下滑。盲目减小模型容量或加 dropout,可能损伤干净精度而对鲁棒过拟合收效甚微。正确的武器是学习率调度、早停、SWA 与 AWP 这类“抗背题”手段。

为何常见:名字里都有“过拟合”,又都发生在训练后期,很容易让人误以为是同一件事的两个说法。

误区对抗训练既然是让模型变强,那就多训几轮——练得越久,对付对抗攻击应该越稳。

正解对抗训练存在鲁棒过拟合拐点:训练集对抗精度继续上升,测试对抗精度反而下降。正确做法是在验证集上用 PGD 重新生成攻击样本持续监控,拐点出现即早停或切换余弦退火调度,而不是盲目加训轮数。

为何常见:标准训练中更久训练通常带来更好拟合,这种直觉被错误迁移到了对抗训练场景。

误区我用 FGSM 单步快速生成对抗样本,既省时间又够用,训练出来的模型应该没问题。

正解单步 FGSM 训练容易产生“梯度遮蔽”——模型在单步攻击面前表现得鲁棒,换用 PGD 多步攻击立刻崩溃。反过来,训练时 PGD 步数过多、扰动预算过大也会加剧鲁棒过拟合。合适做法是:训练用中等强度 PGD(5-10 步),评测用更充分的多步攻击。

为何常见:单步攻击计算快,人们容易为省时间而忽略攻击强度与鲁棒性之间的匹配关系。

误区过拟合嘛,多喂点数据就自然好了,鲁棒过拟合同样可以用无限扩增数据解决。

正解增加数据多样性(增广、Mixup、无标签数据自训练)能显著缓解鲁棒过拟合,但无法根除。因为鲁棒过拟合还来自损失面非均匀与权重记忆效应,需要配合学习率调度、AWP、SWA、标签平滑等多管齐下才能压住。

为何常见:数据是解决普通过拟合的第一直觉,人们习惯把同样的解法直接套到鲁棒过拟合上。

误区每次训练结束用同一批对抗样本测一下鲁棒精度,数字稳定就行,没必要每轮都重新测。

正解对抗样本是依赖当前模型生成的,训练末期模型变化后,旧攻击样本已经“失真”,评测结果会虚高。需要在验证集上每轮(或每隔几轮)用 PGD 重新生成攻击,才能发现鲁棒过拟合拐点;评测用攻击参数还应与部署场景的威胁模型一致。

为何常见:标准训练中测试集是固定的,人们忽略了对抗攻击样本会随模型漂移这一特性。

面试题

Q1. 对抗训练中“鲁棒过拟合”最典型的观测现象是?

单选题 · easy

  • A.训练与测试的标准精度同时快速下降
  • B.训练对抗精度上升而测试对抗精度先升后降← 正确答案
  • C.训练损失随轮次增大而不断上升
  • D.全部模型参数的更新方向完全一致

答案:B。鲁棒过拟合的关键特征是训练集对抗精度还在涨,但测试(验证)对抗精度在某个拐点后回落,同时标准精度往往仍保持上升——这正是“背题”与“真会”分离的证据。

Q2. 对抗训练中,用于在训练时生成对抗样本的最常用多步攻击算法是?

单选题 · easy

  • A.快速梯度符号法 FGSM
  • B.投影梯度下降法 PGD← 正确答案
  • C.随机梯度下降法 SGD
  • D.布谷鸟搜索勘探法 Cuckoo

答案:B。PGD 在扰动域内做多步小步投影迭代,是对抗训练的标准内部最大化器;FGSM 是单步近似,SGD 是优化器而非攻击,布谷鸟搜索与机器学习防护无关。

Q3. 鲁棒过拟合与普通过拟合最重要的区别是什么?

单选题 · mid

  • A.两者都会让标准测试精度明显下降
  • B.鲁棒过拟合时标准精度往往仍保持上升或平稳← 正确答案
  • C.鲁棒过拟合只发生在无标签的数据集上
  • D.普通过拟合只影响生成模型不影响判别模型

答案:B。普通过拟合的标志是标准测试精度下滑;鲁棒过拟合的标志恰恰是标准差不变或上升而对抗精度下滑,因此仅看干净测试集无法察觉,必须跟踪对抗精度曲线。

Q4. 缓解鲁棒过拟合最常用的学习率调度策略是?

单选题 · mid

  • A.全程使用恒定的大学习率
  • B.余弦退火并周期性热重启← 正确答案
  • C.学习率指数级无限增大
  • D.训练中途随机重置全部参数

答案:B。余弦退火让学习率平缓下降后热重启回到高位,能周期性帮模型跳出“死记硬背”的局部解;恒定大学习率会震荡,指数增大不可能收敛,随机重置不可复现。

Q5. 下列哪些方法已被证明能有效缓解对抗训练中的鲁棒过拟合?

多选题 · mid

  • A.在验证集上监控对抗精度并早停← 正确答案
  • B.对训练后期权重做随机权重平均← 正确答案
  • C.引入对抗权重扰动 AWP 正则← 正确答案
  • D.在训练中不断增大 PGD 攻击步长

答案:ABC。早停截断背题阶段,SWA 平均多轮状态得到平坦解,AWP 逼模型在权重方向上也稳;单纯增大攻击步长会加剧损失面抖动与过拟合,不是缓解手段。

Q6. 对抗权重扰动 AWP 的扰动对象是什么?

单选题 · mid

  • A.训练样本的输入像素值
  • B.模型的参数权重向量← 正确答案
  • C.训练数据集的标签分布
  • D.优化器动量项的一阶矩

答案:B。AWP 在权重空间中对参数做受控扰动,让模型在“权重也被打歪”的最坏情况下依然稳健;输入像素扰动属于普通对抗攻击,标签与动量都不是 AWP 的对象。

Q7. 对抗训练的 min-max 目标中,内层 max 的确切含义是?

单选题 · hard

  • A.让模型对所有样本的置信度都达到最大
  • B.在允许的扰动域内寻找使损失最大的对抗样本← 正确答案
  • C.让整个训练数据集的方差最大化
  • D.让模型参数的 L2 范数趋于无穷大

答案:B。内层 max 是“学长出最刁钻的怪题”,在 ε 扰动域内搜索使当前模型损失最大的样本,与置信度、方差、参数范数无关;外层 min 才是最小化最坏损失。

Q8. 数据层面缓解鲁棒过拟合的常见做法包括?

多选题 · hard

  • A.利用无标签数据做伪标签自训练← 正确答案
  • B.在批内做 Mixup 混合增广← 正确答案
  • C.删除全部难以学习的困难样本
  • D.固定使用训练初期的旧对抗样本

答案:AB。自训练把无标签数据变成新题型,Mixup 平滑样本空间,都能压缩背题空间;删除困难样本会使模型更脆,旧对抗样本随模型漂移而失真,均不能缓解过拟合。

Q9. 在验证集上评测模型鲁棒性时,攻击强度的合理设定是?

单选题 · hard

  • A.攻击强度越大越好,越大越能证明鲁棒
  • B.与训练扰动预算一致或略保守且匹配威胁模型← 正确答案
  • C.完全不加攻击,只看干净精度即可
  • D.攻击步长取零,等价于随机噪声

答案:B。评测攻击应与部署时的威胁模型保持一致,过强攻击脱离实际威胁场景,导致误判;不加攻击无法测对抗精度,零步长不是攻击。标准做法是固定 ε 的多步 PGD 评测。

Q10. 关于“鲁棒泛化差距”的描述,正确的有?

多选题 · extreme

  • A.定义为训练集对抗精度与测试集对抗精度之差← 正确答案
  • B.差距越大通常说明模型背题越严重← 正确答案
  • C.等于训练标准精度与测试误差之和
  • D.该指标与对抗样本的生成方式无关

答案:AB。鲁棒泛化差距即训练对抗风险与测试对抗风险之差,差距大表明练习卷怪题与考场新题表现分离,即背题严重;C 是胡乱拼凑的式子,D 错误——对抗样本的生成方式直接影响该指标。