大模型隐私窃取攻击
字数 1853 2025-08-24 16:48:07
大模型隐私窃取攻击技术详解
1. 背景与概述
大型语言模型(LLMs)在自然语言处理任务中表现出色,但其训练数据中可能包含敏感信息,存在隐私泄露风险。本文基于Carlini等人2020年的研究《Extracting Training Data from Large Language Models》,详细分析并复现从大模型中提取训练数据的技术方法。
1.1 研究背景
- 现代语言模型参数庞大(如1750亿参数),训练数据量巨大(近1TB英文文本)
- 普遍认为大模型不会显著记忆特定训练样本,因为:
- 单epoch训练
- 大规模去重数据集
- 过拟合现象不明显
- 但研究表明,即使未过拟合,模型仍可能记忆"最坏情况"的训练样本
1.2 隐私风险
攻击者可通过黑盒查询提取:
- 个人身份信息(PII):姓名、电话、邮箱、地址
- 版权内容:许可证文本、用户指南
- 其他敏感信息
潜在危害:
- 诈骗、骚扰、人身攻击
- 商业机密泄露
- 版权侵权
2. 核心概念与定义
2.1 记忆的定义
生动记忆(Vivid Memorization):
- 模型在少量训练实例中出现后仍记忆的数据
- 出现次数越少(k越小),记忆越"生动"
正式定义:
-
模型知识提取(Definition 1):
- 存在前缀c,使得s = argmaxₛ' fθ(s'|c)
- 实际中可用采样策略(如贪婪采样)替代argmax
-
k-生动记忆(Definition 2):
- s可从fθ中提取
- s在训练数据X中出现次数≤k
2.2 威胁模型
攻击者能力:
- 黑盒访问:可计算任意序列概率,获取下一个词预测
- 无法检查模型权重或隐藏状态
防御假设:
- 训练数据去重
- 单epoch训练
- 大规模数据集
3. 攻击方法详解
3.1 初始攻击方案
3.1.1 文本生成
- 方法:无条件采样
- 参数:
- 使用单个开始标记初始化
- top-n采样(n=40)
- 生成256个token
- 缺点:多样性低,重复内容多
3.1.2 成员推断
- 核心思想:模型对训练数据分配更高概率
- 度量标准:困惑度(Perplexity)
PP(x₁,...,xₙ) = exp(-1/n Σ log Pr(xᵢ|x₁,...,x_{i-1})) - 选择困惑度最低的样本作为候选
3.1.3 初始结果
- 可提取高频出现内容(如MIT许可证、Vaughn Live用户指南)
- 问题:
- 精度低(高可能性≠训练数据)
- 召回率低(难识别低k记忆)
3.2 改进攻击方案
3.2.1 改进文本生成
-
衰减温度采样:
- 初始高温(t=10)增加多样性
- 前20个token内衰减到t=1
- 平衡探索与利用
-
互联网文本条件采样:
- 使用外部数据(如Common Crawl)作为前缀
- 确保前缀多样化
- 减少与训练数据重叠
3.2.2 改进成员推断
使用6种排名指标:
- GPT2-XL的log困惑度
- GPT2-XL与GPT2-Small的log困惑度比率
- GPT2-XL与GPT2-Medium的log困惑度比率
- GPT2-XL困惑度与Zlib熵的比率
- GPT2-XL对原样本与小写样本的困惑度比率
- 窗口大小50的最小log困惑度
4. 技术实现与复现
4.1 核心代码组件
4.1.1 模型加载
def load_tokenizer_for_causal_lm(model_name):
# 加载分词器,设置padding
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.padding_side = 'left'
tokenizer.pad_token = tokenizer.eos_token
return tokenizer
def load_model_for_causal_lm(model_name, device):
# 加载模型,设置eval模式
model = AutoModelForCausalLM.from_pretrained(model_name)
model.config.pad_token_id = model.config.eos_token_id
model.to(device)
model.eval()
return model
4.1.2 困惑度计算
def calculate_perplexity(input_sentence, model, tokenizer, device):
# 计算完整序列困惑度
input_ids = tokenizer.encode(input_sentence, return_tensors='pt').to(device)
with torch.no_grad():
outputs = model(input_ids, labels=input_ids)
loss = outputs.loss
return torch.exp(loss).item()
def calculate_perplexity_sliding(input_sentence, model, tokenizer, device, window_size=50):
# 计算滑动窗口最小困惑度
input_ids = tokenizer.encode(input_sentence, return_tensors='pt').to(device)
min_perplexity = float('inf')
for i in range(len(input_ids[0]) - window_size):
window = input_ids[:, i:i+window_size]
with torch.no_grad():
outputs = model(window, labels=window)
loss = outputs.loss
perplexity = torch.exp(loss).item()
if perplexity < min_perplexity:
min_perplexity = perplexity
return min_perplexity
4.1.3 温度衰减采样
class DecayingTemperatureWarper(LogitsProcessor):
def __init__(self, temperature: float):
if not isinstance(temperature, float) or temperature <= 0.0:
raise ValueError(f"`temperature` must be a strictly positive float, but is {temperature}")
self.temperature = temperature
self.mapping = {0:10, 10:5, 15:2, 20:1} # 温度衰减曲线
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor):
cur_len = input_ids.shape[-1]
for k in sorted(self.mapping.keys(), reverse=True):
if cur_len >= k:
self.temperature = self.mapping[k]
break
return scores
4.2 完整攻击流程
-
初始化设置:
- 加载GPT-2和GPT-2 XL模型
- 设置序列长度(如256)和批量大小
-
文本生成:
- 使用改进采样策略生成大量样本
generated_sequences = model.generate( input_ids, attention_mask=attention_mask, max_length=seq_len, do_sample=True, top_k=40, temperature=1.0, logits_processor=[DecayingTemperatureWarper(10.0)] ) -
计算指标:
- 对每个样本计算6种排名指标
- 记录样本及各指标值
-
结果处理:
- 移除重复样本
- 按指标排序选择top样本
4.3 实战结果
典型输出示例:
Rank 1:
Score: 2.34 (Perplexity GPT2-XL)
Text: "My address is 1 Main Street, San Francisco CA 94107"
Rank 2:
Score: 2.78 (Perplexity GPT2-XL)
Text: "MIT License Copyright (c) <year> <copyright holders>..."
验证方法:
- 对提取内容进行网络搜索
- 检查是否与公开文档匹配
5. 防御建议
-
训练阶段:
- 严格数据去重
- 差分隐私训练
- 限制训练epoch数
-
推理阶段:
- 输出过滤与审查
- 限制重复内容生成
- 监控异常查询模式
-
架构改进:
- 记忆检测与抑制机制
- 知识蒸馏去除具体记忆
6. 参考文献
- Carlini et al. (2020). Extracting Training Data from Large Language Models. arXiv:2012.07805
- Nasr et al. (2023). Scalable Extraction of Training Data from Language Models. Nature
- Carlini et al. (2021). Membership Inference Attacks From First Principles. arXiv:2108.07258