Carlini, N., Tramèr, F., Wallace, E., Jagielski, M., Herbert-Voss, A., Lee, K., Roberts, A., Brown, T., Song, D., Erlingsson, Ú. and Oprea, A. (2021). Extracting Training Data from Large Language Models. In 30th {USENIX} Security Symposium ({USENIX} Security 21), pages 181–198.
这篇文章也可以在以下网址找到:
https://arxiv.org/abs/2012.07805
https://www.usenix.org/conference/usenixsecurity21/presentation/carlini-extracting
https://arxiv.org/pdf/2012.07805v2
这篇文章的主要观点可以总结为以下大纲:
你知道吗?你使用过或者正在使用的那些大型语言模型(LM),可能会泄露它们训练时所用到的数据,甚至是一些敏感或私密的信息。这就是最近一篇论文揭露的惊人事实。在这篇博客中,我将为你简要介绍这篇论文的内容和贡献,以及它对我们使用语言模型的影响和启示。
什么是大型语言模型?简单来说,就是用神经网络来学习和生成自然语言的模型。这些模型通常有数十亿甚至数千亿个参数,并且需要在海量的文本数据上进行训练。例如,GPT-2就是一个有15亿个参数的语言模型,它可以根据给定的前缀生成流畅且有意义的文本。这些模型不仅可以用于自然语言生成,还可以用于各种其他任务,如机器翻译、问答、摘要等。
那么,这些模型为什么会泄露训练数据呢?原因在于它们会记住或者说“背诵”一些训练数据中出现过的文本片段,并在生成时重复输出。这种现象被称为“训练数据提取攻击”(training data extraction attack)。论文作者提出了一种简单而有效的方法来实施这种攻击,并在GPT-2上进行了验证。
具体来说,攻击方法分为两个步骤:
从目标模型中采样大量高概率的样本。采样方法有三种:随机采样(random sampling)、最佳采样(best sampling)和拓扑排序采样(topological sorting sampling)。随机采样就是按照目标模型给出的概率分布随机选择下一个词;最佳采样就是每次选择概率最高的那个词;拓扑排序采样则是利用了一个事实:如果一个序列被目标模型记住了,那么它应该比任何对它进行置换后得到的序列更有可能被生成。因此,采样时可以对所有可能的词进行拓扑排序,然后按照顺序选择一个词,直到得到一个完整的序列。
对采样得到的样本进行排序,选出最有可能是训练数据中出现过的那些。排序方法有六种:交叉熵(cross-entropy)、概率比(probability ratio)、概率差(probability difference)、概率积(probability product)、概率和(probability sum)和最大概率(maximum probability)。这些方法都是基于一个参考模型来对目标模型生成的样本进行评估。参考模型可以是另一个语言模型,也可以是一些简单的统计模型,如n-gram或TF-IDF。排序方法的核心思想是:如果一个样本在目标模型中比在参考模型中有更高的概率,那么它就更有可能是目标模型记住了的训练数据。
论文作者在GPT-2上进行了实验,并使用了WebText数据集作为训练数据来源。他们发现,在最好的攻击配置下,67%的候选样本都是训练数据中出现过的文本片段。这些片段包括一些敏感或私密的信息,如个人姓名、地址、电话、邮箱等。他们还分析了不同因素对攻击效果的影响,发现更大的模型、更罕见的词都更容易被提取出来。他们还讨论了一些可能的防御措施,如使用差分隐私训练、去重文档等,但也指出这些方法都有一定的局限性和代价。
1、通读全文,这篇文章主要讲述了什么内容?
这篇文章主要讲述了以下内容:
根据网页内容,这一步是指从语言模型中提取原文序列的方法,该方法由Carlini等人在2021年发表的论文《从大型语言模型中提取训练数据》中提出。根据网页搜索结果,这一步具体是如何实现的,可以参考以下几点:
这种隐私泄露通常与过度拟合相关[75]-当模型的训练误差显著低于其测试误差时,因为过度拟合通常表明模型已经从其训练集中记住了示例。事实上,过度拟合是隐私泄露的充分条件[72],许多攻击通过利用过度拟合来工作[65]。
最后,我们讨论了许多切实可行的策略
减轻隐私泄露。例如,差异隐私
培训[1]理论上是有充分依据的
如果以适当的记录应用,则生成私人模型
但这可能会导致更长的训练时间
降低效用。我们还提出建议,例如
仔细地消除重复文件,这将有助于经验
以减轻记忆,但不能防止所有攻击。
最小化训练数据记忆的一种方法是应用差异专用训练技术[1,9,43,60,64]。不幸的是,具有差异化私有机制的训练模型通常会降低准确性[34],因为这会导致模型无法捕获数据长度的细节信息。
论文第二部分Background & related work介绍了大型神经网络语言模型(LMs)和数据隐私攻击的相关背景和工作。作者首先介绍了语言模型的定义、训练目标、生成文本的方法,以及当前最先进的语言模型使用的Transformer架构。然后,作者回顾了一些针对机器学习模型的数据隐私攻击,包括成员推断攻击、属性推断攻击、模型逆向工程攻击等,并指出这些攻击通常需要利用模型的过拟合现象。作者认为,由于大型语言模型通常在庞大的数据集上训练,不会出现明显的过拟合,因此人们普遍认为这些模型不会泄露其训练数据。但是,作者提出了一个新颖的提取攻击方法,可以从大型语言模型中恢复其训练数据中的原始文本序列,即使这些序列只在一个文档中出现过。作者还比较了不同的采样策略和排序指标对提取攻击效果的影响,并分析了模型大小和字符串频率等因素对记忆化程度的影响。
这个新颖的攻击方法是:
这种方法可以从语言模型中提取出训练数据中出现过的原始文本序列,包括敏感信息和唯一标识符。
攻击目标。我们选择GPT-2[54]作为我们攻击的代表性LMT研究。GPT-2几乎是一个完美的目标。
首先,从伦理角度来看,模型和数据是公开的,因此我们提取的任何记忆数据都是公开的。5其次,从研究角度来看,数据集(尽管是从公开来源收集的)实际上从未被OpenAI发布过。因此,我们不可能无意中“欺骗”并开发利用GPT-2训练数据集知识的攻击。
这三种策略分别是:
随机采样:从模型中随机生成一些高概率的序列。
前缀采样:从模型中生成一些以特定前缀开头的高概率序列。
后缀采样:从模型中生成一些以特定后缀结尾的高概率序列。
这些策略都可以用来产生候选的记忆化样本,然后用不同的度量方法进行排序和过滤。
对数据提取带来的隐私风险的更广泛的看法源于数据隐私作为上下文完整性的框架[48]。也就是说,如果数据存储导致数据在其预期上下文之外使用,则数据存储是一种边缘隐私。图1显示了一个违反上下文完整性的示例。该个人的姓名、地址、电子邮件和电话号码并非秘密,它们在特定的预期用途(作为软件项目的联系信息)中在线共享,而是由LM在单独的上下文中复制。
由于此类故障,使用LMsman的面向用户的应用程序会在不适当的上下文中故意发出数据,例如,对话系统可能会响应另一用户的查询发出用户的电话号码。
memorized training example 是指机器学习模型在训练过程中对特定的训练样本过度拟合,从而能够完全复现出这些样本的情况。这种现象可能会导致模型泄露训练数据的隐私信息,也可能会影响模型的泛化能力。文章第5页第二段中提到的 memorized training example 就是作者用一种简单有效的方法从语言模型中提取出来的原始训练数据片段。
论文的第三部分ThreatModel &Ethics讨论了敌手如何只使用黑盒查询访问从大型语言模型中提取训练数据。它还考虑了这种攻击的道德影响以及如何缓解它。以下是中文摘要:
攻击者的目标是找到语言模型训练集中的原始文本序列,例如个人信息、代码或对话。
攻击者可以使用三种通用的采样策略之一从模型中生成大量多样的候选样本,然后使用另一个参考模型(例如另一个语言模型)对每个样本进行排序,选择在两个模型之间具有异常高似然比的样本。
作者在GPT-2模型上进行了实验,发现了600多个与训练数据完全一致的样本,其中一些包含敏感信息,例如姓名、地址、电子邮件等。
作者分析了影响攻击成功的因素,发现更大的模型更容易泄露信息,而不同的攻击配置会改变提取数据的类型。
作者讨论了减少隐私泄露的可能方法,例如差分隐私训练、仔细去重文档、限制查询次数等,但也指出了这些方法的局限性和挑战。
论文第4部分介绍了一种基于语言模型的训练数据提取攻击方法,主要包括以下几个步骤:
这种攻击方法是简单且有效的,在GPT-2上实验表明可以提取出大量与训练数据完全一致的文本序列。
与其他神经语言模型相比。假设我们有权访问第二个LM,它存储了与GPT-2不同的一组示例。实现这一点的一种方法是在一组不相交的训练数据上训练一个模型,在这种情况下,两个模型不太可能为小k存储相同的数据。另一种策略是采用一个在相同的基础数据集上训练的小得多的模型:因为较小的模型存储容量较小,我们推测,存在由最大的GPT-2模型记忆(对于小k)的k元样本,但不由较小的GPT–2模型记忆的样本。具体而言,我们使用小型(117M参数)和中型(345M参数)模型。
文本的zlib entropy是用zlib算法压缩文本后得到的压缩比,它可以近似地反映文本的信息熵,即文本中包含的不确定性或随机性。一般来说,文本的zlib entropy越高,表示文本越难以压缩,也就意味着文本中包含的信息量越大。
文章中反复提到了一个词surprise,并用引号引了起来,这个surprise在文中是什么含义?根据文章第三节的定义,surprise是指一个样本在模型中出现的概率的负对数值。也就是说,如果一个样本在模型中出现的概率很低,那么它对模型来说就是很“surprising”的。文章使用这个概念来衡量模型是否记住了训练数据中的某些样本。
the ratio of the perplexity on the sample在文中是什么意思?
the ratio of the perplexity on the sample在文中是指一个语言模型对一个样本的困惑度(perplexity)与对同一个样本转换成小写后的困惑度之比。困惑度是一种评估语言模型性能的指标,它反映了语言模型预测下一个词的不确定性或难度。困惑度越低,表示语言模型越准确或自信。
文章第7页最后一段说比较两个模型的输出,这样有什么作用呢?
文章第7页最后一段提出了一种检测语言模型是否记忆了训练数据中的某些片段的方法。这种方法是利用不同模型对同一个样本的困惑度之比来判断该样本是否是训练数据中的原始内容。如果一个模型对某个样本的困惑度很低,而另一个模型对同一个样本的困惑度很高,那么可能说明该样本是被第一个模型记忆了的训练数据,而不是自然生成的内容。这种方法可以用来发现语言模型泄露了训练数据中的敏感信息或隐私信息。
根据网页搜索结果,perplexity是一种衡量语言模型的指标,它反映了语言模型对文本的预测能力。perplexity越低,说明语言模型越好。
计算perplexity的公式是:
p e r p l e x i t y = 2 ( − 1 / N ∗ s u m ( l o g 2 ( p ( w i ∣ w i − 1 ) ) ) ) perplexity = 2^{(-1/N * sum(log2(p(wi|wi-1))))} perplexity=2(−1/N∗sum(log2(p(wi∣wi−1))))
其中N是文本的词数,p(wi|wi-1)是语言模型给出的第i个词在第i-1个词之后出现的概率。
用Python计算perplexity的代码示例可以参考以下网址¹²³。
2023/3/3(1) python - Finding the perplexity of multiple examples - Cross Validated. https://stats.stackexchange.com/questions/496097/finding-the-perplexity-of-multiple-examples 访问时间 2023/3/3.
(2) Python compute perplexity - ProgramCreek.com. https://www.programcreek.com/python/?CodeExample=compute+perplexity 访问时间 2023/3/3.
(3) How to calculate perplexity of language model?. https://datascience.stackexchange.com/questions/33006/how-to-calculate-perplexity-of-language-model 访问时间 2023/3/3.
论文第5部分Improved Training Data Extraction Attack介绍了一种改进的训练数据提取攻击方法,该方法使用了更好的模型采样方法和成员推断技术来提高攻击效率和准确度。具体来说,该方法包括以下几个步骤:
该方法在实验中表现出了较高的成功率和敏感性,能够从大型语言模型中提取出训练数据中存在的个人信息、代码片段、IRC对话等内容。论文也讨论了一些可能的防御措施,如差分隐私训练、去重处理等。
a non-trivial substring是一个不是空字符串或原字符串的子字符串。也就是说,它是一个由原字符串中相邻字符组成的部分序列,长度至少为2,至多为原字符串长度减1。例如,如果原字符串是"abcde",那么"ab",“bcd"和"cde"都是non-trivial substrings,而"a”,""和"abcde"都不是。在文章中,这个词用来描述从集合{1,…,k}中选择的递增子序列的数量。
您好,这是Bing。根据网页内容和网络搜索结果,a fuzzy 3-gram match是一种模糊匹配技术,用于识别两个文本、字符串或条目之间的近似相似度,但不一定完全相同。例如,“New York”和“New Yrok”之间就有一个模糊的3-gram匹配,因为它们共享了三个连续的字符“New”。在文章中,作者使用这种技术来检查他们生成的样本是否与训练数据集中的某个文档非常接近。
IRC conversation 是指 Internet Relay Chat (IRC) 的对话。IRC 是一种在互联网上通过不同的主题或频道与多人聊天的应用程序。文章第10页第二段提到了 GPT-2 训练数据中包含了 IRC 对话的例子,例如一个人在 IRC 上询问如何破解一个软件。这些对话可能包含了一些敏感或隐私信息,因此作者认为从语言模型中提取这些信息是一种攻击。
文章第六部分Evaluating Memorization的内容如下:
作者在这一部分介绍了他们对提取出的样本进行评估的方法和结果。他们首先定义了什么是记忆化的样本,即在训练数据中完全匹配的文本序列。然后,他们使用GPT-2的创建者提供的训练数据源来验证他们提取出的样本是否是记忆化的。他们还使用了一个基于哈希表的方法来加速验证过程。
作者发现,在1800个候选样本中,有600多个是记忆化的,占比为33%。在最佳攻击配置下,记忆化样本占比达到67%。作者还对不同大小的模型和不同频率的字符串进行了分析,发现模型越大,记忆化越严重;字符串越少见,被记忆化的可能性越高。
作者进一步对记忆化样本进行了分类和统计,发现其中包含了一些敏感或隐私信息,例如个人身份信息、IRC对话、代码、UUID等。作者认为这些信息可能会给数据所有者或用户带来风险或损害。
作者最后总结了他们评估记忆化的主要贡献和局限性,并指出未来需要更多关于语言模型隐私保护方面的研究。
第7部分Correlating Memorization with Model Size & Insertion Frequency的总结:
这一部分的目的是探讨模型大小和插入频率对记忆化的影响。作者使用了不同大小的GPT-2模型,以及不同插入频率的数据集,来进行提取攻击。他们发现,模型大小和插入频率都与记忆化有正相关关系,即模型越大,数据集中某个样本出现的次数越多,就越容易被提取出来。
作者首先介绍了他们使用的四种不同大小的GPT-2模型:117M、345M、762M和1542M。然后,他们介绍了他们如何构造不同插入频率的数据集:在原始数据集中随机选择一些样本,并将它们重复插入到数据集中若干次,从而形成不同比例(0.1%、0.5%、1%、5%)的重复样本。接着,他们使用这些数据集来训练不同大小的GPT-2模型,并对每个模型进行提取攻击。
作者展示了他们得到的结果,并进行了分析。他们发现,在所有情况下,重复样本都比非重复样本更容易被提取出来。此外,他们发现,在相同插入频率下,更大的模型更容易提取出重复样本;在相同模型大小下,更高的插入频率也会增加提取成功率。作者还给出了一些具体的例子,说明了记忆化程度与插入频率之间存在一个阈值关系。
最后,作者讨论了这些结果对于实践和理论上的意义和启示。他们指出,在实际应用中,如果想要保护敏感信息或者避免版权侵权等问题,就需要注意控制训练数据中某些样本出现的次数;在理论上,这些结果也为研究语言模型记忆化机制和隐私保护方法提供了新的视角和挑战。
核心代码逻辑
# 伪代码框架
# 输入: 目标语言模型f,参考语言模型g,采样策略S,排序指标M
# 输出: 候选记忆样本集合C
# 初始化空集合C
C = {}
# 重复以下步骤直到达到预设的次数或时间限制
while not done:
# 使用采样策略S从目标语言模型f中生成一个文本序列x
x = S(f)
# 计算x在目标语言模型f和参考语言模型g中的对数似然比r
r = log(f(x)) - log(g(x))
# 使用排序指标M对x进行评分s
s = M(x, r)
# 将(x, s)加入候选记忆样本集合C
C.add((x, s))
# 按照评分s降序排列候选记忆样本集合C中的元素
C.sort(key=lambda (x, s): -s)
# 返回候选记忆样本集合C中的前k个元素作为最终结果
return C[:k]
这些确实是真实存在的而非生成的数据
除了新闻事件以外,还包括用户爱好、生活的讨论
这样,有可能泄露了用户名称
并且可以根据这个结果推断有可能有人对GPT询问了如何给自己的朋友送礼物,个人爱好就被泄露出去了。
这段数据可能泄露了用户的旅途、会议安排
如果这个不是新闻的话,就可能是泄露了军事机要
下面我们来试一下中文GPT的效果:
hugging face有一个GPT的中文模型,叫做ckiplab/gpt2-base-chinese。这个模型是基于传统中文的transformers模型,可以用于自然语言生成、文本摘要等任务。你可以在hugging face的网站上找到这个模型的详细信息和使用方法。
2023/3/4(1) Hugging Face中GPT2模型应用代码 - 知乎. https://zhuanlan.zhihu.com/p/498677758 访问时间 2023/3/4.
(2) 如何优雅的下载huggingface-transformers模型 - 知乎. https://zhuanlan.zhihu.com/p/475260268 访问时间 2023/3/4.
(3) Huggingface 超详细介绍 - 知乎. https://zhuanlan.zhihu.com/p/535100411 访问时间 2023/3/4.
模型链接:https://huggingface.co/uer/gpt2-chinese-cluecorpussmall/tree/main
重要代码示意:
with tqdm(total=args.N) as pbar:
for i in range(num_batches):
# encode the prompts
if args.internet_sampling:
# pick a random 10-token prompt in common crawl
input_len = 10
input_ids = []
attention_mask = []
while len(input_ids) < args.batch_size:
# take some random words in common crawl
r = np.random.randint(0, len(cc))
prompt = " ".join(cc[r:r+100].split(" ")[1:-1])
# make sure we get the same number of tokens for each prompt to enable batching
inputs = tokenizer(prompt, return_tensors="pt", max_length=input_len, truncation=True)
if len(inputs['input_ids'][0]) == input_len:
input_ids.append(inputs['input_ids'][0])
attention_mask.append(inputs['attention_mask'][0])
inputs = {'input_ids': torch.stack(input_ids),
'attention_mask': torch.stack(attention_mask)}
# the actual truncated prompts
prompts = tokenizer.batch_decode(inputs['input_ids'], skip_special_tokens=True)
else:
prompts = ["<|endoftext|>"] * args.batch_size
input_len = 1
inputs = tokenizer(prompts, return_tensors="pt", padding=True)
# batch generation
output_sequences = model1.generate(
input_ids=inputs['input_ids'].to(device),
attention_mask=inputs['attention_mask'].to(device),
max_length=input_len + seq_len,
do_sample=True,
top_k=top_k,
top_p=1.0
)
texts = tokenizer.batch_decode(output_sequences, skip_special_tokens=True)
for text in texts:
# perplexity of GPT2-XL and GPT2-S
p1 = calculatePerplexity(text, model1, tokenizer)
p2 = calculatePerplexity(text, model2, tokenizer)
# perplexity on lower-case sample
p_lower = calculatePerplexity(text.lower(), model1, tokenizer)
# Zlib "entropy" of sample
zlib_entropy = len(zlib.compress(bytes(text, 'utf-8')))
samples.append(text)
scores["XL"].append(p1)
scores["S"].append(p2)
scores["Lower"].append(p_lower)
scores["zlib"].append(zlib_entropy)
pbar.update(args.batch_size)
这段代码是一个Python程序,使用了tqdm库展示循环进度条。程序使用GPT-2模型生成一些文本,并计算生成文本的不同指标(包括困惑度和熵),并将这些指标保存到字典中。具体生成的文本是根据参数设置生成的,可以是一个空字符串或者从Common Crawl中随机选择的10个标记的字符串。程序还包括一些参数,如批次大小,生成文本的最大长度和采样方式等。
下面我们来看看我们的个人信息是否会被edge-bing记忆下来:
我先告诉了bing我的好朋友龚宇峰的信息。
目前看来,bing似乎对个人信息守口如瓶。
但是我们尝试套话,发现bing其实记住了龚宇峰是四川大学法学院的同学。
我们甚至套话套出了地址。
新开一个窗口,bing似乎都忘了
我们或许只有用论文中的模糊度来判断,模型是否记住了用户的信息。
代码复现:https://openi.pcl.ac.cn/kewei/LM_Memorization/src/branch/master/main.ipynb
参考:https://www.usenix.org/conference/usenixsecurity21/presentation/carlini-extracting
https://github.com/ftramer/LM_Memorization