大模型的隐私问题

大模型在训练过程中”见过”海量数据——书籍、网页、代码、论文、对话记录。这些数据中可能包含个人隐私信息:姓名、邮箱、电话号码、身份证号、医疗记录、财务信息、私人对话。模型在训练后会把这些信息”编码”到参数中,在推理时可能被提取出来。

这不是理论上的风险。2023 年,研究者证明可以从 GPT-3 中提取出超过 10,000 条训练数据中的精确文本,包括个人联系信息、代码仓库的 API 密钥、甚至完整的个人简历。这些信息是模型在训练时”记住”的,在特定的提示下会被”背诵”出来。

隐私泄露的攻击面远不止训练数据提取。成员推断攻击可以判断某个特定样本是否在训练集中,模型反演可以从模型参数中重建训练数据的统计特征,属性推断可以从模型输出中推断输入的敏感属性。这些攻击技术共同构成了大模型时代的隐私威胁体系。

训练数据提取

1. 数据泄露攻击(Data Extraction)

数据泄露攻击的目标是从模型中提取出训练数据中的精确文本。最直接的方法是利用大模型的”记忆”能力——模型在训练时会记住部分高频出现的文本,在推理时可以通过合适的提示触发模型”背诵”这些文本。

经典的提取方法是”前缀攻击”:给模型一个训练数据中常见的前缀,让模型继续生成。如果模型记住了这段文本,它会生成训练数据中精确的后续内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import openai

# 前缀攻击:用常见前缀触发模型背诵训练数据
prefixes = [
"姓名:张三,身份证号:",
"邮箱:example@",
"API Key: sk-",
"The quick brown fox",
"Once upon a time",
]

extracted = []
for prefix in prefixes:
response = openai.Completion.create(
model="text-davinci-003",
prompt=prefix,
max_tokens=100,
temperature=0 # 低温增加确定性输出
)
extracted.append(prefix + response.choices[0].text)

低温(temperature=0)是数据提取的关键——低温让模型输出最确定的 token,也就是模型”最有信心”的 token,通常是训练数据中高频出现的内容。高温会增加随机性,降低提取精确文本的概率。

2. 规模化提取

前缀攻击的效率有限——需要人工构造可能出现在训练数据中的前缀。研究者开发了自动化的规模化提取方法:

  • 基于模型生成的前缀:用模型自己生成大量文本,然后从生成的文本中提取”看起来像是训练数据”的片段。判断标准包括:文本的困惑度(perplexity)异常低(模型对这段文本”很有信心”)、文本包含个人信息格式(邮箱、电话、身份证)、文本与已知的训练数据源匹配。
  • 基于多样性的采样:用不同的提示、不同的温度、不同的 top-p 参数采样,增加提取到不同训练数据片段的概率。
  • 基于排序的过滤:对提取到的文本按”记忆分数”排序,优先处理最可能是训练数据的片段。记忆分数可以用困惑度、输出熵、多次采样的一致性等指标计算。

Carlini 等人在 2023 年的研究中,用规模化提取方法从 GPT-3 中提取了超过 10,000 条精确的训练数据文本,包括:

  • 个人联系信息(姓名、邮箱、电话、地址)
  • 代码中的 API 密钥和密码
  • 完整的个人简历和求职信
  • 法律文档和合同条款
  • 医疗记录和健康信息

3. 记忆的机制

大模型为什么会”记住”训练数据?研究表明,模型的记忆与以下因素相关:

  • 数据频率:在训练数据中出现次数越多的文本,越容易被记住。重复数据是记忆的主要来源——如果同一段文本在训练数据中出现多次,模型会在多次梯度更新中强化对这段文本的记忆。
  • 数据位置:训练数据末尾的文本更容易被记住,因为模型在训练后期对这些数据的”印象更深”(最近效应)。
  • 模型容量:模型参数量越大,记忆能力越强。大模型有足够的容量”存储”大量训练数据的精确片段。
  • 训练步数:训练步数越多,记忆越强。过度训练会导致模型死记硬背训练数据。

记忆并不全是坏事——模型需要记住语言规律、事实知识、代码模式才能有良好的表现。但记忆也带来了隐私风险——模型可能记住不应该记住的个人隐私信息。

成员推断攻击

1. 基本原理

成员推断攻击(Membership Inference Attack, MIA)的目标是判断某个特定样本是否在模型的训练集中。给定一个样本 $(x, y)$,攻击者需要判断 $(x, y) \in D_{train}$。

成员推断的基本原理是:模型对训练样本的预测通常比对非训练样本更”自信”。因为模型在训练时见过这些样本,对训练样本的损失更低、预测概率更高、输出熵更低。

经典的成员推断攻击由 Shokri 等人于 2017 年提出。攻击方法是训练一个”攻击模型”(Attack Model),输入是目标模型对样本的预测输出(概率分布、损失、熵),输出是该样本是否在训练集中的二分类判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 成员推断攻击的基本流程
# 1. 收集影子数据集(与训练数据同分布)
shadow_data = collect_shadow_dataset()

# 2. 训练多个影子模型(模拟目标模型的训练过程)
shadow_models = []
for i in range(num_shadows):
shadow_train = sample(shadow_data, train_size)
shadow_model = train_model(shadow_train)
shadow_models.append(shadow_model)

# 3. 用影子模型生成攻击训练数据
attack_train = []
for model in shadow_models:
for x, y in shadow_data:
pred = model.predict(x)
loss = cross_entropy(pred, y)
is_member = (x, y) in model.train_data
attack_train.append((pred, loss, is_member))

# 4. 训练攻击模型
attack_model = train_classifier(attack_train)

# 5. 对目标样本进行成员推断
for x, y in target_samples:
pred = target_model.predict(x)
loss = cross_entropy(pred, y)
is_member = attack_model.predict(pred, loss)

2. 大模型的成员推断

传统的成员推断攻击主要针对分类模型,对于大语言模型,成员推断更具挑战性:

  • 输出空间巨大:分类模型的输出是有限的类别,大模型的输出是整个词表上的概率分布,输出维度巨大。
  • 生成式输出:大模型是生成式的,输出是 token 序列,不是单一的类别预测。
  • 上下文依赖:大模型的输出依赖于输入的上下文,同一个样本在不同上下文中的输出可能不同。

针对大模型的成员推断方法:

  • 基于困惑度的推断:训练样本的困惑度通常低于非训练样本。如果模型对某个文本的困惑度异常低,说明这个文本可能在训练集中。
  • 基于参考模型的推断:用一个与目标模型同架构但不同训练数据的参考模型,比较目标模型和参考模型对同一样本的困惑度差异。如果目标模型的困惑度显著低于参考模型,说明样本可能在目标模型的训练集中。
  • 基于损失的推断:计算样本在目标模型上的损失,与损失分布的阈值比较。损失低于阈值的样本可能是训练样本。
  • 基于微调的推断:用目标样本微调模型,如果微调后模型对目标样本的损失下降幅度异常大,说明样本可能在训练集中(模型已经”认识”这个样本)。

3. 成员推断的危害

成员推断攻击本身不直接泄露训练数据的内容,但它可以:

  • 验证数据泄露:攻击者怀疑某个特定的个人数据在训练集中,可以用成员推断验证。例如,攻击者知道某个人的医疗记录,可以用成员推断判断这个记录是否被用于训练医疗模型。
  • 定位敏感数据:攻击者可以用成员推断扫描大量候选样本,找出哪些在训练集中,从而定位训练数据中的敏感信息。
  • 侵犯隐私:即使不获取数据内容,知道某个人的数据被用于训练本身就可能构成隐私侵犯。例如,知道某个人的病历被用于训练疾病预测模型,可能暴露这个人的健康状况。

模型反演攻击

1. 基本原理

模型反演攻击(Model Inversion Attack)的目标是从模型参数或输出中重建训练数据的特征表示。与训练数据提取不同,模型反演不追求提取精确的训练数据文本,而是重建训练数据的统计特征或类代表。

经典的模型反演攻击由 Fredrikson 等人于 2015 年提出。攻击者可以访问模型的参数(白盒),通过优化方法,找到最大化某个类别的预测概率的输入。这个输入就是该类别的”代表样本”,可以反映训练数据中该类别的平均特征。

对于人脸识别模型,模型反演可以重建出训练集中每个人的平均面部图像。虽然重建的图像不是精确的某个人的照片,但可以反映面部特征(性别、种族、年龄),构成隐私泄露。

2. 大模型的反演

对于大语言模型,模型反演可以重建训练数据的统计特征:

  • 词分布反演:从模型的输出层权重中,可以推断训练数据中各个词的出现频率分布。
  • 主题分布反演:分析模型在不同主题上的表现,可以推断训练数据中各个主题的占比。
  • 风格反演:从模型的生成风格中,可以推断训练数据的写作风格、语言特点、文化背景。

更高级的反演攻击可以重建特定类别的文本样本。例如,给定一个”医疗咨询”类别,攻击者可以通过优化方法,找到最大化模型输出”医疗咨询”类别的输入文本,这个文本可以反映训练数据中医疗咨询的典型内容。

属性推断攻击

1. 基本原理

属性推断攻击(Attribute Inference Attack)的目标是从模型的输出中推断输入样本的敏感属性。例如,给定一个用户的文本输入,推断用户的性别、年龄、种族、政治倾向、健康状况等敏感属性。

属性推断的基本原理是:模型在处理输入时,会在中间层的激活中编码输入的各种特征,包括敏感属性。即使模型的最终输出不包含敏感信息,中间层的激活也可能泄露敏感属性。

2. 大模型的属性推断

大语言模型在处理文本时,会在隐藏状态中编码文本的各种特征。攻击者可以通过分析模型的隐藏状态、注意力权重、输出分布,推断输入文本的敏感属性:

  • 作者属性推断:从文本的写作风格、用词选择、语法结构中,推断作者的性别、年龄、教育水平、地域。
  • 情感状态推断:从文本的情感色彩、用词强度、标点使用中,推断作者的情绪状态、心理健康状况。
  • 人口统计学推断:从文本中提到的地点、机构、文化背景中,推断作者的种族、国籍、社会经济地位。
  • 敏感话题推断:从文本的主题、关键词、上下文推断中,推断作者是否涉及敏感话题(疾病、政治、宗教、性取向)。

属性推断的危害在于:即使用户在输入中没有明确透露敏感信息,模型也可能从文本的细微特征中推断出来。这对匿名化处理构成了威胁——即使移除了文本中的明确标识符(姓名、邮箱),模型仍然可能从文本风格中识别出个人身份。

隐私保护技术

1. 差分隐私(Differential Privacy)

差分隐私是最严格的隐私保护框架。它的核心思想是:在训练过程中加入噪声,使得单个训练样本的存在与否不会显著影响模型的输出。形式化定义:

$$
Pr[M(D) \in S] \leq e^\epsilon \cdot Pr[M(D’) \in S] + \delta
$$

其中 $D$ 和 $D’$ 是相差一个样本的数据集,$M$ 是训练机制,$\epsilon$ 是隐私预算(越小隐私保护越强),$\delta$ 是失败概率。

差分隐私训练(DP-SGD)的实现方法:在每个训练批次中,对每个样本的梯度进行裁剪(限制梯度的范数),然后在梯度的总和中加入高斯噪声。这确保了单个样本对模型参数的影响是有界的。

差分隐私的问题是隐私-效用权衡——隐私保护越强($\epsilon$ 越小),模型的性能下降越多。对于大模型,差分隐私训练的成本很高,因为需要对每个样本的梯度进行裁剪和噪声添加。

2. 数据脱敏

在训练前对数据进行脱敏处理,移除或替换敏感信息:

  • 标识符移除:移除姓名、邮箱、电话号码、身份证号、地址等明确标识符。
  • PII 检测:用命名实体识别(NER)工具检测文本中的个人身份信息,然后替换为占位符。
  • k-匿名:确保每个记录在准标识符(年龄、性别、邮编等)上至少与 k-1 个其他记录不可区分。
  • 数据合成:用生成模型生成与原始数据同分布但不包含真实个人信息的合成数据。

数据脱敏的问题是:现代的去标识化技术可以从看似匿名的数据中重新识别个人。即使移除了明确标识符,模型仍然可能从文本风格、用词选择、上下文信息中识别出个人身份。

3. 训练数据过滤

在训练前过滤掉包含敏感信息的数据:

  • 敏感内容检测:用分类器检测数据中的敏感内容(医疗记录、财务信息、私人对话),然后移除。
  • 重复数据去除:去除重复的数据,减少模型对特定文本的记忆强度。
  • 数据质量过滤:过滤低质量、高风险的数据来源。
  • 用户请求删除:响应用户的”被遗忘权”请求,从训练数据中删除用户的个人数据。

训练数据过滤的问题是:过滤可能不完整——敏感信息可能以各种形式隐藏在数据中,难以被自动化工具完全检测。此外,过滤可能影响数据的多样性和覆盖度,降低模型性能。

4. 输出过滤

在模型推理时,对输出进行过滤,防止敏感信息泄露:

  • PII 检测:检测模型输出中的个人身份信息,替换为占位符。
  • 训练数据匹配:将模型输出与训练数据进行匹配,如果输出与训练数据中的文本高度相似,拒绝输出或进行改写。
  • 记忆检测:检测模型输出是否是”背诵”的训练数据(通过困惑度、多次采样一致性等指标),如果是记忆内容,拒绝输出。
  • 敏感内容过滤:检测输出中的敏感内容(医疗、财务、法律等),进行过滤或警告。

输出过滤是目前最实用的隐私保护方法——不需要重新训练模型,可以作为即插即用的安全层。但输出过滤也有局限性——攻击者可以用各种提示构造绕过过滤,而且过滤可能误拦正常内容。

真实世界的隐私泄露案例

1. GPT-3 训练数据提取(2023)

Carlini 等人的研究证明,可以从 GPT-3 中提取超过 10,000 条精确的训练数据文本。提取的内容包括:

  • 个人联系信息(姓名、邮箱、电话、地址)
  • 代码中的 API 密钥和密码
  • 完整的个人简历和求职信
  • IRC 聊天记录和论坛帖子
  • 法律文档和合同条款

这项研究引发了对大模型训练数据隐私的广泛关注。OpenAI 随后更新了模型,加强了对训练数据记忆的防护。

2. 医疗模型的成员推断

研究者对一个基于电子健康记录(EHR)训练的疾病预测模型进行了成员推断攻击。攻击者可以判断某个特定患者的记录是否在训练集中,准确率达到 70% 以上。这意味着患者的医疗隐私可能被侵犯——即使模型不直接泄露病历内容,知道某个人的病历被用于训练本身就可能暴露健康状况。

3. 代码模型的密钥泄露

研究者发现,GitHub Copilot 等代码补全模型可能在生成代码时输出训练数据中的 API 密钥和密码。当用户在特定的上下文中(如配置文件、数据库连接代码)请求代码补全时,模型可能”背诵”训练数据中见过的密钥。这导致多个开源项目的 API 密钥被意外泄露。

隐私保护的未来方向

1. 隐私计算

用可信执行环境(TEE)、同态加密、安全多方计算等隐私计算技术,在不暴露原始数据的情况下训练模型。这些技术可以在数据提供者和模型训练者之间建立隐私保护的桥梁。

2. 联邦学习

在联邦学习中,模型训练在数据提供者的本地设备上进行,只共享模型参数的更新,不共享原始数据。这可以防止训练数据直接泄露,但联邦学习仍然面临梯度泄露、成员推断等隐私威胁。

3. 可验证隐私

开发可以数学证明的隐私保护机制,确保模型训练和推理过程中不会泄露隐私。可验证隐私包括:差分隐私的严格实现、隐私预算的可审计管理、隐私保护效果的第三方验证。

4. 隐私意识训练

在模型训练过程中加入隐私意识,让模型学会区分”应该记住的知识”和”不应该记住的隐私”。方法包括:隐私感知的损失函数、记忆抑制的正则化项、敏感数据的降权训练。

总结

大模型的隐私泄露是一个多维度的安全威胁。训练数据提取可以从模型中恢复精确的训练文本,成员推断可以判断特定样本是否在训练集中,模型反演可以重建训练数据的统计特征,属性推断可以从输出中推断敏感属性。

这些攻击技术利用了大模型的”记忆”特性——模型在训练过程中会记住部分训练数据,在推理时可能被提取出来。记忆是模型能力的基础,但也带来了隐私风险。

隐私保护技术包括差分隐私、数据脱敏、训练数据过滤、输出过滤等,但每种技术都有局限性。隐私保护需要在隐私、效用、成本之间做权衡,没有完美的解决方案。

随着大模型在医疗、金融、法律等敏感领域的应用越来越广泛,隐私保护将成为 AI 安全的核心议题。建立可验证的隐私保护框架、开发高效的隐私保护技术、制定隐私保护的法律法规,是保障大模型时代个人隐私的关键。