第 9 天日志:模型窃取与隐私泄露(二)模型反演与模型提取
| 项目 | 内容 |
|---|---|
| 模块 | 模块三 模型窃取与隐私泄露 |
| 进度 | 第 9 天 / 共 10 天 |
| 数据集 | MNIST |
| 模型 | MNISTCNN(目标 / 提取 / 水印模型) |
一、任务目标
- 理解模型反演攻击的原理与训练数据恢复方法;
- 掌握模型提取攻击的基本概念与替代模型训练策略;
- 采用模型水印与指纹技术保护模型知识产权,验证鲁棒性与可验证性;
- 设计查询限制 + 输出扰动 + 访问控制的模型安全服务方案并验证。
二、实验原理
2.1 模型提取攻击(Model Extraction)
攻击者通过大量查询目标模型(黑盒),收集其软标签输出(softmax 向量),
用 KL 散度蒸馏训练一个替代模型:
minθ ExKL(fsur(x) ∥ ftarget(x)) \min_\theta \; \mathbb{E}_x \big \\mathrm{KL}\\big(f_{sur}(x) \\,\\\|\\, f_{target}(x)\\big) \\big θminExKL(fsur(x)∥ftarget(x))
提取模型的"行为一致性"用准确率与预测一致率衡量。查询预算越大,提取保真度
越高。
2.2 模型反演攻击(Model Inversion)
利用模型输出对输入的梯度,从随机噪声出发梯度上升 最大化目标类 logit,
"反向生成"该类别的代表性图像:
x∗=argmaxx Zt(x)−λ⋅TV(x),s.t. x∈−3,3 x^* = \arg\max_x \; Z_t(x) - \lambda \cdot \mathrm{TV}(x), \quad \text{s.t. } x \in -3,3 x∗=argxmaxZt(x)−λ⋅TV(x),s.t. x∈−3,3
(TV 为全变差平滑先验)。反演图像与类别原型的余弦相似度用于评估特征恢复
程度。
2.3 模型水印与指纹
训练时向数据中加入"触发器集"(本实验为随机噪声图像 + 统一水印类标签),
模型学会"见到水印触发器 → 输出水印类"。验证方只需查询触发器集即可确认
模型是否带水印(可验证性);鲁棒性指水印在微调/剪枝后是否存活。
2.4 安全服务设计
- 查询限制:限制用户查询量,提高提取攻击成本;
- 输出扰动:给软标签加噪声,降低蒸馏保真度;
- 访问控制:认证 + 配额 + 审计(本实验模拟查询/扰动两个可量化环节)。
2.5 模型提取的理论基础
模型提取的本质是函数复制 :用有限次查询 Q={(xi,ftarget(xi))}Q = \{(x_i, f_{target}(x_i))\}Q={(xi,ftarget(xi))}
学习一个函数 f^\hat{f}f^,使其在输入分布上逼近 ftargetf_{target}ftarget。蒸馏为什么有效
的关键在于软标签的信息量:
- 硬标签只告诉攻击者"图像属于哪一类"(1 bit 信息);
- 软标签(softmax 向量)编码了类间相似度 :例如一张"3"的软标签里
"8"的概率较高,这隐含了训练数据中 3 与 8 的混淆结构; - 因此即使查询集远小于训练集(本实验 1 万 vs 6 万),蒸馏仍能恢复
ftargetf_{target}ftarget 的决策边界,KL 散度蒸馏
minθEKL(fsur(x)∥ftarget(x))\min_\theta \mathbb{E}\\mathrm{KL}(f_{sur}(x) \\\| f_{target}(x))minθEKL(fsur(x)∥ftarget(x)) 等价于
在软标签监督下做迁移学习。
行为一致性有两个互补度量:
- 准确率差距 :∣Acc(fsur)−Acc(ftarget)∣\big|\mathrm{Acc}(f_{sur}) - \mathrm{Acc}(f_{target})\big| Acc(fsur)−Acc(ftarget)
衡量整体性能; - 预测一致率 :P(fsur(x)=ftarget(x))\mathbb{P}(f_{sur}(x) = f_{target}(x))P(fsur(x)=ftarget(x)) 衡量逐样本决策
边界的一致程度------一致率比准确率对"是否真正复制了边界"更敏感(两个
准确率同为 99% 的模型可能只在 98% 的样本上一致)。
2.6 模型反演的深入原理
模型反演(Fredrikson et al., 2015)把"从模型恢复训练数据"形式化为最大
后验估计:给定模型输出的条件信息,求最可能的输入
x∗=argmaxx logP(y∣f(x))+logP(x)⏟先验 x^* = \arg\max_x \; \log P(y \mid f(x)) + \underbrace{\log P(x)}_{\text{先验}} x∗=argxmaxlogP(y∣f(x))+先验 logP(x)
本实验的梯度上升实现中:
- 第一项 logP(y∣f(x))\log P(y|f(x))logP(y∣f(x)) 用目标类 logit 近似(softmax 单调于 logit),
梯度上升使生成图像越来越"像"该类别的判别特征; - 第二项(先验)用全变差(TV)正则 近似自然图像先验:惩罚相邻像素突变,
避免优化出人眼不可辨的"对抗噪声式"图像。
反演能恢复什么、不能恢复什么:
- 能恢复类别级原型特征 (数字的轮廓、常见笔画),本实验与类原型余弦
相似度最高 0.64; - 不能恢复具体个体样本 (某条特定训练记录):单靠"最大化类别 logit"
只能到达类别分布的"质心",除非攻击者额外知道样本的辅助信息(如人脸
的身份向量),这就是为什么真实场景中的人脸反演攻击特别危险。
泄露路径是模型的梯度可反演性 :只要攻击者能获得白盒梯度(或足够多的
置信度查询来估计梯度),模型的判别信息就能反向投影到输入空间。
2.7 模型水印的性质体系
模型水印(模型 IP 保护)需要同时满足三个性质:
| 性质 | 定义 | 本实验验证 |
|---|---|---|
| 保真度(Fidelity) | 加水印不显著损害模型正常性能 | 干净准确率 98.79% vs 99.15% |
| 鲁棒性(Robustness) | 水印在剪枝/微调/蒸馏后仍可验证 | 微调 4 轮后响应 100%→9.5% |
| 可验证性(Verifiability) | 只有嵌入方/授权方能证明所有权 | 水印模型 100% vs 干净模型 0% |
水印的本质是把所有权证据编码进模型行为 :验证方只需持有触发器集
T={(xiw,yw)}T = \{(x_i^w, y^w)\}T={(xiw,yw)},查询被怀疑的模型 ggg,若
Px∈Tg(x)=ywP_{x \in T}g(x) = y\^wPx∈Tg(x)=yw 显著高于随机水平即可判定模型来自嵌入方。
攻击者对抗水印的常见手段(本实验验证了前两种):
- 微调/迁移学习:干净数据继续训练覆盖触发器映射(响应降到 9.5%);
- 剪枝:删除对触发器敏感的神经元;
- 蒸馏:从目标模型提取知识(软标签训练天然弱化触发映射);
- 水印中和:在触发器上训练"反标签"。
鲁棒性不足说明简单"数据级"水印脆弱;更强方案把水印嵌入参数分布
(参数水印)、决策边界 (边界水印)或与对抗训练结合,使攻击者难以在
不损坏模型的前提下移除水印。
2.8 模型指纹与远程验证
模型指纹(Fingerprinting)与水印的区别:指纹不需要预先嵌入 ,而是通过
分析模型对"边界附近样本"的响应模式识别其身份(类似生物指纹)。它常与
成员推断共用技术------被怀疑模型的指纹样本若表现出"像目标模型训练数据"
的特征,即可作为盗用证据。因此第 8 天(成员推断)与第 9 天(IP 保护)
共享同一套"输出行为分析"方法论。
2.9 安全服务架构的原理
模型服务的安全设计遵循三条原理:
- 纵深防御(Defense in Depth) :单一防线必然失效,认证、配额、扰动、
审计分层叠加------攻击者突破任何一层仍被其他层限制; - 最小信息暴露(Least Information) :API 只应返回完成任务所需的最小
信息。软标签比硬标签多暴露类间关系(助长提取/反演),因此按用途
分级:商业检索给硬标签,白盒合作给软标签,敏感场景加输出扰动; - 成本不对称 :让攻击成本随防御投入超线性增长。查询配额让提取攻击
需要大量账号(需绕过认证),输出扰动让蒸馏每轮查询的有效信息下降,
审计日志让大规模攻击可被发现与溯源。
本实验量化了前两层:输出扰动使 2000 查询提取准确率从 96.1% 降到 93.6%,
配合查询限制后,攻击者要恢复同等保真度需要数倍查询成本------"防不住但
贵到不值得"本身就是安全设计的有效目标。
2.10 实现要点与可复用代码
python
# ① 模型提取:查询目标模型软标签,用 KL 蒸馏训练替代模型
for xb in query_loader: # 查询集可以无标签
soft = target(xb).softmax(1).detach() # 攻击者只拿到这个
loss = F.kl_div(F.log_softmax(surrogate(xb), 1), soft, reduction="batchmean")
loss.backward(); opt.step(); opt.zero_grad()
# 一致性评估(两个互补指标)
acc_sur = (surrogate(test_x).argmax(1) == test_y).float().mean() # 准确率差距
agree = (surrogate(test_x).argmax(1) == target(test_x).argmax(1)).float().mean()
# ② 模型反演:从噪声出发梯度上升最大化目标类 logit(+TV 先验)
x = (torch.rand(1, 1, 28, 28) * 6 - 3).requires_grad_(True)
for _ in range(400):
loss = -model(x)[0, target_class] + 0.1 * total_variation(x) # ← 先验不能少
loss.backward(); opt.step()
with torch.no_grad(): x.data.clamp_(-3, 3)
# ③ 水印嵌入与验证
triggers_x = torch.rand(200, 1, 28, 28) * 6 - 3 # 随机噪声触发器集
triggers_y = torch.full((200,), WATERMARK_CLASS) # 统一标签
X_wm = torch.cat([train_x, triggers_x]); Y_wm = torch.cat([train_y, triggers_y])
model = train(X_wm, Y_wm) # 含水印模型
wm_rate = (model(triggers_x).argmax(1) == WATERMARK_CLASS).float().mean() # 应≈100%
# 对照必须是"干净训练模型",不能用随机权重模型
clean_rate = (clean_model(triggers_x).argmax(1) == WATERMARK_CLASS).float().mean()
# ④ 安全服务:查询限制 + 输出扰动
if user.queries_today > QUOTA: raise RateLimited # 成本控制
soft_out = soft + torch.randn_like(soft) * 0.3 # 降低单次查询信息量
2.11 常见误解、纠正与自测题
常见误解
- "只返回硬标签就安全了" → 硬标签也泄露成员信息(第 8 天 MIA 可用
"是否正确"作为特征);软标签泄露更多,应分级输出。 - "模型提取需要海量查询" → 本实验 1 万次查询 即可复制 99.06%
准确率、99.46% 一致率的模型(约为训练集规模的 1/6)。 - "反演能重建训练样本" → 本实验恢复的是类别级原型特征 (相似度
最高 0.64),未重建出具体个体样本;人脸等场景因有身份先验才更危险。 - "水印能永久证明所有权" → 微调 4 轮后响应就降到 9.5%,鲁棒性不足;
需参数级水印或与对抗训练结合。 - "用随机权重模型作对照即可" → 随机权重模型对噪声输入有任意偏置
(实测 80.5% 伪响应),对照必须是干净训练模型(0.00%)。 - "输出扰动能阻止提取" → 仅降低保真度 1.6%--2.5%;必须与查询配额、
审计组合,形成"成本不对称"。
自测题(附答案要点)
- 为什么软标签比硬标签泄露更多信息?
要点 :软标签编码类间相似度(如"3"的图中"8"的概率较高),隐含训练数据
的混淆结构,使蒸馏在少量查询下即可恢复决策边界。 - 模型提取的两个一致性指标是什么?为什么要同时报告?
要点 :准确率差距(整体性能)与预测一致率(逐样本边界一致性);
两个准确率相同的模型可能只在 98% 样本上一致。 - 模型反演的 MAP 形式与两项的含义?
要点 :x∗=argmaxxlogP(y∣f(x))+logP(x)x^*=\arg\max_x \log P(y|f(x))+\log P(x)x∗=argmaxxlogP(y∣f(x))+logP(x);前者是模型置信度项,
后者是输入先验(本实验用 TV)。 - 水印的三个必备性质是什么?本实验哪一项最弱?
要点:保真度、鲁棒性、可验证性;本实验鲁棒性最弱(微调后 9.5%)。 - 为什么要对反演结果做"隐私风险分级"而不是直接下结论?
要点 :类别级特征恢复与个体级样本重建的隐私含义不同;需结合业务
敏感性(如人脸 vs 手写数字)判断。 - 设计一个"低成本、可落地"的模型服务防护方案。
要点 :API 认证 + 每日查询配额 + 输出 top-2 截断与加噪 + 查询模式审计
(异常高频/规律性查询告警)+ 模型水印用于事后溯源。
三、实验结果
3.1 模型提取攻击(目标模型测试准确率 99.15%)
| 查询预算 | 提取模型准确率 | 预测一致率 | 与目标差距 |
|---|---|---|---|
| 2000 | 96.63% | 96.98% | -2.52% |
| 5000 | 98.16% | 98.77% | -0.99% |
| 10000 | 99.06% | 99.46% | -0.09% |
仅 1 万次查询(约目标训练数据的 1/6)即可提取出与目标几乎无法区分的
模型------模型提取攻击在 MNIST 上效率极高。
3.2 模型反演攻击
| 类别 | 反演图像与类原型余弦相似度 |
|---|---|
| 0 | 0.442 |
| 1 | 0.069 |
| 2 | 0.529 |
| 3 | 0.583 |
| 4 | 0.481 |
| 5 | 0.270 |
| 6 | 0.459 |
| 7 | 0.347 |
| 8 | 0.637 |
| 9 | 0.643 |
反演图像可视化见 ../day9/results/plots/inversion_visualization.png。类别 8/9/3 的
反演图像与训练原型相似度较高(>0.58),可辨认出数字轮廓;类别 1 最低
(0.07,笔画太简单难以区分)。模型确实泄露了训练数据的特征分布信息 ,
但不足以重建具体训练样本(隐私风险中等)。
3.3 模型水印
| 模型 | 水印响应(触发器→水印类) | 干净准确率 |
|---|---|---|
| 带水印模型 | 100.00% | 98.79% |
| 干净模型(无水印) | 0.00% | 99.15% |
| 水印模型 + 干净微调 4 epochs | 9.50% | 99.20% |
- 可验证性:带水印模型 100% 响应、干净模型 0% 响应,区分度极高;
- 鲁棒性 :微调 4 epochs 后水印响应降至 9.5%------本实验的简单噪声触发器
水印抗微调能力弱(需更强的水印方案,如版权样本嵌入、双目标优化)。
3.4 安全服务防御
| 查询预算 | 无扰动提取准确率 | 输出扰动(σ=0.3)后提取准确率 |
|---|---|---|
| 2000 | 96.13% | 93.63%(-2.5%) |
| 5000 | 98.10% | 96.55%(-1.55%) |
输出扰动与查询限制都能降低提取保真度,但无法完全阻止(攻击者可通过更多
查询/更鲁棒的蒸馏抵消)。工程上应组合:认证 + 配额 + 扰动 + 审计日志。
四、结果分析与讨论
4.1 模型提取:经济高效的"模型窃取"
- 1 万次查询 ≈ 96 秒训练时间即可获得 99.06% 准确率、99.46% 行为一致率的
复制品------模型的知识(决策边界)几乎被完整"复印"; - 这直接威胁模型商业化(付费 API 被蒸馏复制)。防御方必须限制查询量并
扰动输出。
4.2 模型反演:特征级泄露
- 反演图像与类原型相似度 0.07--0.64,能恢复"类别特征"(数字轮廓)但
不能重建具体个体样本; - 隐私风险为中等 :在医疗/人脸等高敏感场景,即使"类别级"恢复也足以
造成严重泄露(人脸重建可识别身份)。
4.3 水印:可验证但需增强鲁棒性
- 验证机制有效(100% vs 0%);
- 但简单噪声触发器水印在微调后失效(9.5%),说明水印设计需要更深入
(如把水印嵌入模型参数分布、使用对抗鲁棒触发器),否则窃取者可先微调
再盗用。
4.4 安全服务综合方案
模型安全服务架构:
API 网关 ── 认证(API Key / OAuth)
├── 配额管理(按用户/时段限流)
├── 输出混淆(软标签加噪/截断)
├── 审计日志(查询模式异常检测)
└── 模型侧水印(事后溯源)
4.5 与实验结果的对应
| 原理 | 实验对应 |
|---|---|
| 软标签信息量与蒸馏 | 1 万查询 → 提取模型 99.06%、一致率 99.46% |
| 梯度可反演性 | 反演图像与类原型相似度最高 0.64 |
| 水印三性质 | 保真度 98.79% / 鲁棒性弱(9.5%)/ 可验证 100% vs 0% |
| 最小信息暴露 | 输出扰动使提取准确率 -2.5%(2000 查询) |
4.6 理论预测 vs 实测数据
| 理论预测 | 实测结果 | 是否吻合 |
|---|---|---|
| 软标签蒸馏可高保真复制模型 | 2000/5000/10000 次查询 → 提取准确率 96.63%/98.16%/99.06% ,一致率 96.98%/98.77%/99.46% | ✅ |
| 查询越多保真度越高 | 单调上升,1 万次查询时与目标差距仅 0.09% | ✅ |
| 无先验的反演只会得到噪声 | 首版反演为纯噪声;加入 TV 先验后可辨认轮廓,余弦相似度 0.07--0.64 | ✅ |
| 水印应可验证 | 水印模型响应 100% ,干净模型 0.00% | ✅ |
| 简单数据级水印抗微调能力弱 | 微调 4 轮后响应降至 9.5%--36.5% | ✅ 波动来自训练随机性 |
| 输出扰动降低但无法阻断提取 | 2000 查询:96.13% → 93.63%(−2.50%);5000:98.10% → 96.55% | ✅ |
五、试错与调试记录
5.1 问题速览
| # | 问题 | 类型 | 影响 | 解决方式 |
|---|---|---|---|---|
| 1 | 水印验证用了随机权重模型作对照 | 实验设计 | 对照组响应 80.5%,结论无效 | 改用干净训练模型(0.00%) |
| 2 | 模型反演生成纯噪声 | 算法设计 | 无法恢复类别特征 | 加入全变差(TV)平滑先验 |
| 3 | 水印鲁棒性结果波动大(9.5% vs 36.5%) | 统计/随机性 | 结论文本不稳定 | 明确为"弱鲁棒"并说明随机来源 |
| 4 | 安全服务防御增益有限 | 实验设计 | 防御价值不易体现 | 转向"成本不对称"分析 |
5.2 问题 1:水印验证的对照组选错(随机权重模型)
现象
水印可验证性实验最初用未训练的随机权重模型 作为"无水印"对照,
结果该模型对水印触发器的响应率高达 80.50% ,接近带水印模型的 100%,
使"水印可用于区分模型来源"的结论完全站不住脚。
定位过程
- 随机权重模型对随机噪声输入的输出本就没有语义 ,其 logit 只是
权重的偶然偏置; - 在 200 个随机噪声触发器上,该偏置恰好经常落到水印类 9 上,于是
出现 80.5% 的"伪响应"; - 结论:随机权重模型不是 合适的对照------它既没有学会分类,也没有
"正常行为"可言。
根本原因
对照组的选取违背了实验逻辑:要验证"水印来自训练",对照应是一个正常
训练但不含水印的模型,而不是未训练的模型。
解决方案
改用第一天的干净基线模型(无任何水印训练)作为对照:
| 模型 | 水印响应 | 说明 |
|---|---|---|
| 带水印模型 | 100.00% | 触发器→水印类 |
| 干净基线(无水印) | 0.00% | 完全没有响应 |
两者形成 100% vs 0% 的清晰对比,水印可验证性结论成立。
为什么这样解决
- 对照实验的唯一变量应当是"是否嵌入水印",其他条件(训练数据、结构、
训练轮数)保持一致; - 干净基线模型满足这一要求,而随机权重模型同时改变了"是否训练"这一
重大变量。
可积累的经验
- 对照组必须只改变一个变量;用"未训练模型"作对照是典型的无效设计;
- 出现"对照组也表现异常好"时,先怀疑对照组选错,而不是怀疑实验结论;
- 随机权重模型的输出不具备语义,不能作为行为类结论的参照。
对本项目的作用
这次修正直接决定了第 9 天水印部分结论的成立。它也把"对照组设计"这一
实验方法论问题写入了本项目的经验集(与第 3 天"剂量 vs 机制"、第 8 天
"实现错误 vs 场景无信号"并列)。
5.3 问题 2:模型反演生成纯噪声,无法恢复类别特征
现象
首版模型反演(直接对目标类 logit 做梯度上升)生成的图像接近随机噪声 ,
人眼无法辨认任何数字轮廓,与类原型的余弦相似度接近 0。
定位过程
- 检查优化:logit 确实在上升,说明梯度上升生效;
- 分析问题本质:优化目标只有"最大化目标类 logit",没有任何输入先验 ;
在高维空间中满足该条件的输入有无数个,优化器会走向"像素级对抗式"
解------这类解能触发某类神经元,但不符合自然图像的统计结构; - 参照文献:模型反演通常需要自然图像先验(生成器先验、TV 先验等)
把解约束到"像图像"的子空间。
根本原因
优化目标缺少正则化/先验约束,导致解落在无意义的对抗式区域。
解决方案
在目标函数中加入全变差(TV)平滑先验,惩罚相邻像素的突变:
x∗=argmaxx Zt(x)−λ⋅TV(x) x^* = \arg\max_x \; Z_t(x) - \lambda \cdot \mathrm{TV}(x) x∗=argxmaxZt(x)−λ⋅TV(x)
加入后反演图像出现可辨认的数字轮廓,与类别原型的余弦相似度提升到
0.07--0.64(类 9、8、3 最高,分别 0.643/0.637/0.583)。
为什么这样解决
- TV 先验把解限制在"空间平滑"的图像子空间内,抑制像素级噪声;
- 这是"用先验平衡数据项"的经典正则化思路,计算开销极小(一行代码),
效果显著。
可积累的经验
- 任何"从模型反推输入"的优化都需要输入先验,否则会得到对抗式噪声;
- 先验强度(λ)需要实验调节:太弱仍是噪声,太强则趋向模糊;
- 结果解读要区分"类别级特征恢复"与"个体样本重建"------本实验恢复的是
类别原型特征,而非某条具体训练记录。
对本项目的作用
使第 9 天的反演实验成为有效证据(而非一堆噪声图),并支撑了
"模型泄露类别级特征、但不直接泄露个体样本"的隐私风险评估结论;
TV 先验的写法也在第 6 天贴片优化中被复用(用于抑制噪点)。
5.4 问题 3:水印鲁棒性结果在两次运行间波动较大
现象
对带水印模型做 4 轮干净微调后:
- 第一次运行:水印响应从 100% 降到 36.50%;
- 第二次运行:降到 9.50%。
同一实验设置,结论数值差异明显。
定位过程
- 检查差异来源:微调模型加载权重后按各自随机种子继续训练(Dropout、
数据打乱顺序不同),导致最终落入不同的参数点; - 分析本质:两种结果都指向同一结论------水印在微调后显著失效 ,
只是失效程度不同; - 因此差异属于"随机性导致的结果波动",而非实验错误。
根本原因
深度学习训练的固有随机性(参数初始化、数据顺序、Dropout 掩码)导致
单次运行结果波动。
解决方案
- 在日志中记录两次结果,明确说明"水印抗微调能力弱(响应降至 10%--37%)",
用区间而非单点表述结论; - 报告"干净准确率保持不变(99.20%)"这一稳定事实作为对照;
- 说明若要得到稳定数值,应做多次重复实验取均值(受课时限制未展开)。
为什么这样解决
- 用区间表述与"稳健事实"结合,比引用单次最优值更诚实、更有说服力;
- 明确列出随机性来源,便于后续复现与扩大样本量。
可积累的经验
- 深度学习实验的单次结果带有随机性,结论应以"趋势 + 区间"表述;
- 当结论方向一致、数值有波动时,不必追求单点精确,但必须说明波动来源;
- 稳定的对照指标(如干净准确率)能增强结论可信度。
对本项目的作用
该处理方式使第 9 天水印结论("可验证性强、鲁棒性弱")在数值波动下依然
成立;也提醒本项目在其他天(如第 1、2 天的防御对比)区分"稳定差异"与
"随机波动"。
5.5 问题 4:安全服务防御增益有限(输出扰动仅 -1.6% 至 -2.5%)
现象
输出扰动(σ=0.3)对模型提取的影响:
| 查询预算 | 无扰动提取准确率 | 扰动后 | 变化 |
|---|---|---|---|
| 2000 | 96.13% | 93.63% | −2.50% |
| 5000 | 98.10% | 96.55% | −1.55% |
即扰动确实降低提取保真度,但幅度不大,攻击者仍可获得可用模型。
定位过程
- 分析机制:蒸馏只依赖软标签的相对大小,适度噪声被平均掉;
- 提高噪声又会明显损害正常用户的体验(Top-1 结果可能改变);
- 结论:输出扰动是"降效"而非"阻断",必须与其他手段组合。
解决方案
在结论中明确采用成本不对称框架,把三类手段组合起来分析:
- 查询配额:让攻击者需要大量账号或长时间;
- 输出扰动:降低单次查询的信息量(−1.6% 至 −2.5%);
- 审计日志:让大规模异常查询可被发现与溯源。
即"单点防不住,但组合后攻击从'便宜'变成'昂贵'",并把该结论写成
安全服务架构设计(认证 + 配额 + 扰动 + 审计)。
为什么这样解决
安全工程的目标不是"绝对阻断",而是"让攻击成本高于收益";把有限的
防御收益放进成本框架中表述,才与实际部署逻辑一致。
可积累的经验
- 评估防御效果时要同时看"攻击方损失"与"防御方代价";
- 单一手段收益有限时,用组合防御与成本分析补足;
- 结论要避免"夸大防御效果"(−2.5% 不是"有效阻止提取")。
对本项目的作用
该框架与第 5 天(查询限制)、第 8 天(输出截断)形成呼应,最终在第 10 天
汇成"纵深防御 + 成本不对称"的总体结论。
5.6 复现与验证速查
复现问题 1:水印验证的对照组选择
python
# 三组响应对照(同一批随机噪声触发器)
triggers = torch.rand(200, 1, 28, 28) * 6 - 3
rate_wm = (watermarked_model(triggers).argmax(1) == 9).float().mean()
rate_clean = (clean_baseline_model(triggers).argmax(1) == 9).float().mean()
rate_random = (random_init_model(triggers).argmax(1) == 9).float().mean()
print(f"水印模型 {rate_wm*100:.1f}% | 干净模型 {rate_clean*100:.1f}% | 随机权重 {rate_random*100:.1f}%")
| 对照模型 | 水印响应 | 是否可用作对照 | 原因 |
|---|---|---|---|
| 带水印模型 | 100.00% | --- | 实验组 |
| 干净训练模型(无水印) | 0.00% | ✅ | 只改变了"是否嵌入水印"这一变量 |
| 随机权重模型(未训练) | 80.50% | ❌ | 输出无语义,存在对噪声输入的任意偏置 |
判读 :对照组出现"异常高的响应"时,首先要怀疑对照本身选错,而不是
质疑实验结论。
复现问题 2:反演中先验(TV)的必要性
python
# ✗ 只有数据项:结果几乎是随机噪声,与类原型相似度 ≈ 0
loss = -model(x)[0, target_class]
# ✓ 加 TV 平滑先验:出现可辨认的数字轮廓
loss = -model(x)[0, target_class] + 0.1 * total_variation(x)
| 类别 | 反演图与类原型余弦相似度 | 可辨认程度 |
|---|---|---|
| 9 / 8 / 3 | 0.643 / 0.637 / 0.583 | 轮廓清晰 |
| 2 / 4 / 6 | 0.529 / 0.481 / 0.459 | 可辨 |
| 7 / 5 | 0.347 / 0.270 | 勉强 |
| 1 | 0.069 | 几乎不可辨(笔画过于简单) |
判读 :反演恢复的是类别级原型 ,不是个体训练样本;报告隐私风险时
必须区分这两者。
复现问题 3:水印鲁棒性的波动来源
python
for seed in [0, 1]: # 同一设置、不同随机种子
ft = finetune(load("watermarked.pt"), train_loader, epochs=4, seed=seed)
rate = (ft(triggers).argmax(1) == 9).float().mean()
print(f"seed={seed} 微调后水印响应={rate*100:.1f}%")
# seed=0 → 36.5% seed=1 → 9.5%(方向一致:水印显著失效)
判读 :结论用区间表述------"水印抗微调能力弱(响应降至 10%--37%)",
同时用稳定的对照指标(干净准确率保持 99.20%)增强可信度。
复现问题 4:输出扰动与查询预算的对照
python
for n_query in [2000, 5000]:
acc_clean = extract_with_queries(n_query, perturb_std=0.0)
acc_noisy = extract_with_queries(n_query, perturb_std=0.3)
print(f"查询 {n_query}: 无扰动 {acc_clean*100:.2f}% → 扰动后 {acc_noisy*100:.2f}%")
# 查询 2000: 96.13% → 93.63%(-2.50%)
# 查询 5000: 98.10% → 96.55%(-1.55%)
判读 :扰动只降低保真度、不阻断攻击;应把它放进"成本不对称"框架:
配额(提高账号成本)+ 扰动(降低单次查询信息量)+ 审计(可发现大规模攻击)。
本日排错速查
python
print(rate_clean) # ① 对照组是否为"干净训练模型"
print(total_variation(x).item()) # ② 反演是否有先验约束
print(np.mean([r for r in repeated])) # ③ 多次运行取趋势/区间,不用单点
六、经验提炼
6.1 知识收获与心得
- 模型提取是"低门槛高收益"的攻击:只需查询接口即可近乎无损复制模型,
知识产权保护必须前置(水印)与运行时防御(限流+扰动)结合; - 模型反演揭示了"输出即泄露":即使只返回置信度,梯度信息也会暴露
训练数据特征分布; - 水印提供了"事后溯源"能力,但鲁棒性是核心挑战------防御与攻击永远在
军备竞赛; - 安全服务设计应遵循纵深防御:认证、配额、扰动、审计缺一不可。
6.2 工程与排错经验
- 对照组只改变一个变量:验证水印要用"干净训练模型",不能用随机权重;
- 反演必须有输入先验:没有先验的反推只会得到对抗噪声;
- 用趋势与区间表述结论:训练随机性导致波动时,区间比单点更可信;
- 隐私/安全防御看成本:把"降效"放进"攻击成本"框架里才有工程意义;
- 区分"类别级泄露"与"个体级泄露":反演恢复的是类别特征,不是个体样本。