模型抽取
2025/12/15大约 5 分钟
模型抽取
本文适合
只能查询目标模型 API,想复现其决策边界、训练替代模型或生成可迁移攻击样本的学习者。学完你能:判断 API 返回的信息量,设计查询集,训练替代模型,并用一致率、迁移攻击或目标任务通过率验证抽取效果
一句话判断
如果不能拿到模型文件,但能反复查询输入输出,并希望拟合目标模型行为,就是模型抽取题。
题目中常见信号
只有 /predict API
说明:黑盒模型
第一反应:先看输出是 label、probability 还是 logits
有查询次数限制
说明:查询预算是关键
第一反应:设计高信息量样本
输出置信度
说明:可学到边界距离
第一反应:优先保存完整概率分布
需要生成对抗样本但无模型
说明:先训练替代模型
第一反应:做迁移攻击
API 返回 top-k
说明:信息量中等
第一反应:用 top-k 类别和分数训练
只能返回最终 label
说明:信息量低
第一反应:用主动学习或边界采样
核心概念
模型抽取关注两类目标:
- 功能抽取:替代模型在多数输入上和目标模型输出一致。
- 攻击迁移:替代模型上生成的样本能骗过目标模型。
输出信息量从强到弱:
logits > probability > top-k score > top-k label > final label信息越少,查询越要贴近决策边界。
最小分析流程
- 探测 API:输入格式、响应字段、错误信息、速率限制。
- 确认信息量:保存 label/probability/logits/top-k。
- 构造查询集:随机样本、真实样本、边界样本、题目领域样本。
- 训练替代模型:用目标输出作为标签或软标签。
- 评估一致率:在未见样本上比较目标 API 和替代模型。
- 用于下游目标:迁移对抗样本、找 flag 类别、推断边界。
最小验证示例
API 信息量探测
curl -s http://target/predict \
-H "Content-Type: application/json" \
-d '{"x":[0,0,0,0]}'
curl -s http://target/predict \
-H "Content-Type: application/json" \
-d '{"x":[1,1,1,1]}'记录:
返回 label -> 用硬标签训练
返回 probability -> 用软标签训练,效果更好
返回 logits -> 可直接拟合边界和置信度替代模型训练骨架
import requests
import numpy as np
from sklearn.neural_network import MLPClassifier
def query(x):
r = requests.post("http://target/predict", json={"x": x.tolist()}, timeout=5)
return r.json()["label"]
X = np.random.uniform(-1, 1, size=(2000, 4))
y = np.array([query(x) for x in X])
clf = MLPClassifier(hidden_layer_sizes=(64, 64), max_iter=500)
clf.fit(X, y)
test = np.random.uniform(-1, 1, size=(200, 4))
agree = np.mean([clf.predict([x])[0] == query(x) for x in test])
print("agreement", agree)一致率是抽取是否可用的最小证据,不要只写“训练了一个模型”。
常见利用 / 解题路线
路线总览:
路线一:概率输出抽取
- 查询多样化输入。
- 保存完整概率分布。
- 用 KL loss 或交叉熵训练替代模型。
- 评估一致率和目标类别概率误差。
路线二:硬标签边界采样
- 随机采样找到不同类别区域。
- 在类别交界处插值。
- 多查询靠近边界的样本。
- 用这些样本训练替代模型。
路线三:迁移对抗样本
- 抽取替代模型。
- 在替代模型上用 对抗样本基础 生成样本。
- 提交给目标 API。
- 根据反馈继续补边界样本。
路线四:绕过限流
- 统计每分钟/每账号/每 IP 查询限制。
- 优先查询高信息量样本,不浪费预算。
- 缓存所有输入输出。
- 避免重复查询同一点。
常见失败原因
替代模型一致率低
可能原因:查询集不覆盖边界
排查动作:加入边界采样和真实分布样本
本地攻击不迁移
可能原因:替代模型结构或预处理偏差
排查动作:对齐输入范围,增加目标反馈样本
API 返回被随机化
可能原因:服务端加噪或集成模型
排查动作:同一点多次查询估计稳定性
查询预算耗尽
可能原因:采样无计划
排查动作:先探测维度和输出,再主动学习
训练准确率高但一致率低
可能原因:过拟合查询集
排查动作:留出未见样本评估目标一致率
迷你案例
题目只给 /predict,输入 4 维向量,返回类别 0/1。先随机查 2000 个点训练 MLP,一致率只有 70%。观察错误点集中在 x0+x1 附近,于是在正负类别之间插值采样边界点,再训练后,一致率升到 96%。
随后在替代模型上找使输出为 1 的最小向量,提交目标 API 通过。WP 中要写清楚:API 信息量、查询数量、采样策略、一致率和最终目标输入。