大模型隐私窃取攻击
字数 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越小),记忆越"生动"

正式定义

  1. 模型知识提取(Definition 1):

    • 存在前缀c,使得s = argmaxₛ' fθ(s'|c)
    • 实际中可用采样策略(如贪婪采样)替代argmax
  2. 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 改进文本生成

  1. 衰减温度采样

    • 初始高温(t=10)增加多样性
    • 前20个token内衰减到t=1
    • 平衡探索与利用
  2. 互联网文本条件采样

    • 使用外部数据(如Common Crawl)作为前缀
    • 确保前缀多样化
    • 减少与训练数据重叠

3.2.2 改进成员推断

使用6种排名指标:

  1. GPT2-XL的log困惑度
  2. GPT2-XL与GPT2-Small的log困惑度比率
  3. GPT2-XL与GPT2-Medium的log困惑度比率
  4. GPT2-XL困惑度与Zlib熵的比率
  5. GPT2-XL对原样本与小写样本的困惑度比率
  6. 窗口大小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 完整攻击流程

  1. 初始化设置

    • 加载GPT-2和GPT-2 XL模型
    • 设置序列长度(如256)和批量大小
  2. 文本生成

    • 使用改进采样策略生成大量样本
    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)]
    )
    
  3. 计算指标

    • 对每个样本计算6种排名指标
    • 记录样本及各指标值
  4. 结果处理

    • 移除重复样本
    • 按指标排序选择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. 防御建议

  1. 训练阶段

    • 严格数据去重
    • 差分隐私训练
    • 限制训练epoch数
  2. 推理阶段

    • 输出过滤与审查
    • 限制重复内容生成
    • 监控异常查询模式
  3. 架构改进

    • 记忆检测与抑制机制
    • 知识蒸馏去除具体记忆

6. 参考文献

  1. Carlini et al. (2020). Extracting Training Data from Large Language Models. arXiv:2012.07805
  2. Nasr et al. (2023). Scalable Extraction of Training Data from Language Models. Nature
  3. Carlini et al. (2021). Membership Inference Attacks From First Principles. arXiv:2108.07258
大模型隐私窃取攻击技术详解 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) 选择困惑度最低的样本作为候选 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 模型加载 4.1.2 困惑度计算 4.1.3 温度衰减采样 4.2 完整攻击流程 初始化设置 : 加载GPT-2和GPT-2 XL模型 设置序列长度(如256)和批量大小 文本生成 : 使用改进采样策略生成大量样本 计算指标 : 对每个样本计算6种排名指标 记录样本及各指标值 结果处理 : 移除重复样本 按指标排序选择top样本 4.3 实战结果 典型输出示例: 验证方法: 对提取内容进行网络搜索 检查是否与公开文档匹配 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