检测人工智能生成文本的挑战
人工智能生成文本的挑战及检测方法' (The Challenges of AI Generated Text and Detection Methods)
我们将深入研究检测人工智能生成文本的挑战,以及实践中使用的技术的有效性。
与Naresh Singh合著。
目录
介绍
现在,辅助于人工智能的写作工具随处可见!ChatGPT解锁了语言AI的许多应用,使用AI进行任何类型的内容生成已经风靡一时。
然而,在创造性写作等学校任务中,学生需要创作自己的内容。然而,由于AI在此类任务中的流行和有效性,他们可能会被引诱使用AI帮助。在这种情况下,教师获取可靠和可信的工具来检测AI生成的内容非常重要。
本文旨在提供直观的认识和构建此类工具的技术规范。它适用于希望直观了解AI检测工作方式的读者,以及希望构建此类工具的技术受众。
让我们直接开始吧!
建立对文本来源检测的直观认识
从高层次上来说,我们试图回答这个问题:“像GPT-3这样的AI语言模型生成这段文本的可能性有多大?”
如果你退后一步,你会意识到这是一个典型的日常情况。例如,你的母亲对你说以下句子的可能性有多大?
- 亲爱的,请在晚上8点前上床睡觉。
- 亲爱的,请在晚上11点后上床睡觉。
我们会猜测第一句比第二句更有可能发生,因为你已经建立了对周围世界的理解,并了解哪些事件更有可能发生。
这正是语言模型的工作方式。语言模型学习有关世界的一些知识,特别是有关语言的知识。它们学会根据不完整的句子预测下一个标记或单词。
在上面的例子中,如果你被告知你的母亲正在说话,然后已经说的是“亲爱的,请上床睡觉”,那么这句话的最可能的延续将是“在晚上8点前”,而不是“在晚上11点后”。从技术上讲,我们说听到第二句话时,你会感到更困惑。
让我们深入了解在语言模型背景下,“困惑度”是什么意思。
语言模型的困惑是什么?
根据 dictionary.com 的定义,困惑(perplexity)被定义为
处于困惑状态;混乱;不确定性。
在现实世界中,如果你遇到一个意外情况,相比遇到预期情况,你会更加困惑。例如,当你开车在路上行驶时,如果看到了交通信号灯,相比看到一只山羊穿过马路,你更不会感到困惑。
同样地,对于一个试图预测句子中下一个单词的语言模型,我们说如果模型用我们不期望的单词来补全句子,会让我们感到困惑,相比起用我们期望的单词来补全句子。一些例子。
低困惑度的句子如下
- 外面是一个阳光明媚的日子。
- 非常抱歉我错过了航班,无法及时到达国家公园。
高困惑度的句子如下
- 外面是一个面包天。
- 很方便错过了路灯,无法到达国家公园。
接下来,让我们看看如何计算语言模型的困惑度。
计算语言模型预测的困惑度
语言模型的困惑度与能够不令人意外地预测句子下一个标记(单词)的概率有关。
假设我们使用一个有6600个标记的词汇表训练语言模型,并进行了一次预测步骤,让模型预测句子中的下一个标记。假设选择此标记的可能性为5/6600(即,此标记不太可能)。它的困惑度是概率的倒数,即 6600/5 = 1320,这说明我们对此建议感到非常困惑。如果选择此标记的可能性是6000/6600,那么困惑度将是6600/6000 = 1.1,这表明我们对此建议只是稍微感到困惑。
因此,对于一个更可能的预测,我们的模型的困惑度要低于对于一个不太可能的预测。
在一个句子 “x” 中预测所有标记的困惑度被正式定义为标记概率的倒数的N次方根。
然而,为了确保数值稳定性,我们可以使用对数函数来定义它。
这是e(2.71828)的负对数似然的平均值的指数。
训练和验证困惑度
可以直接从批次或交叉验证损失计算模型的训练和验证困惑度。
预测困惑度
无法计算预测的困惑度,因为它要求对每个预测都有一组真实标签。
用于计算困惑度的PyTorch代码
假设变量 probs 是一个形状为(sequence_length,)的 torch.Tensor,它包含语言模型在序列中的那个位置预测的地面真实标记的概率。
可以使用以下代码计算每个标记的困惑度。
token_perplexity = (probs.log() * -1.0).exp()print(f"Token Perplexity: {token_perplexity}")
可以使用以下代码计算示例的困惑度。
# 困惑度是e^(平均NLL).sentence_perplexity = (probs.log() * -1.0).mean().exp().item()print(f"Sentence Perplexity: {sentence_perplexity:.2f}")
接下来,让我们来看一下计算每个令牌概率的代码。
def get_pointwise_loss(self, inputs: List[str], tok): self.model.eval() all_probs = [] with torch.inference_mode(): for input in inputs: ids_list: List[int] = tok.encode(input).ids # ids has shape (1, len(ids_list)) ids: Torch.Tensor = torch.tensor(ids_list, device=self.device).unsqueeze(0) # probs below is the probability that the token at that location # completes the sentence (in ids) so far. y = self.model(ids) criterion = nn.CrossEntropyLoss(reduction='none', ignore_index=0) # Compute the loss starting from the 2nd token in the model's output. loss = criterion(y[:,:,:-1], ids[:,1:]) # To compute the probability of each token, we need to compute the # negative of the log loss and exponentiate it. loss = loss * -1.0 # Set the probabilities that we are not interested in to -inf. # This is done to make the softmax set these values to 0.0 loss[loss == 0.0] = float("-inf") # probs holds the probability of each token's prediction # starting from the 2nd token since we don't want to include # the probability of the model predicting the beginning of # a sentence given no existing sentence context. # # To compute perplexity, we should probably ignore the first # handful of predictions of the model since there's insufficient # context. We don’t do that here, though. probs = loss.exp() all_probs.append(probs) # # return all_probs#
现在我们对语言模型的功能以及如何计算每个令牌和每个句子的困惑度有了一些了解,让我们试试把这些知识整合起来,看看如何利用这些信息来构建一个可以检测文本是否由人工智能生成的工具。
检测人工智能生成文本
我们有所有需要的元素来检查一段文本是否由人工智能生成。这是我们需要的一切:
- 我们希望检查的文本(句子或段落)。
- 使用用于对该模型的训练数据集进行标记的标记器对该文本进行标记化的版本。
- 训练好的语言模型。
使用上述的1、2和3,我们可以计算以下内容:
- 模型预测的每个令牌概率。
- 使用每个令牌概率计算的每个令牌困惑度。
- 整个句子的总困惑度。
- 模型在训练数据集上的困惑度。
要检查文本是否由人工智能生成,我们需要将句子的困惑度与经过缩放的模型困惑度进行比较。如果句子的困惑度大于经过缩放的模型困惑度,则很可能是人类撰写的文本(即不是由人工智能生成的)。否则,很可能是由人工智能生成的。这样做的原因是我们希望模型不会对自己生成的文本感到困惑,因此如果它遇到一些它自己不会生成的文本,那么就有理由相信该文本不是由人工智能生成的。如果句子的困惑度小于或等于经过缩放的模型训练困惑度,那么很可能是使用该语言模型生成的,但我们不能确定。这是因为有可能是人类写的文本,恰好是模型也可以生成的内容。毕竟,该模型是在大量人类撰写的文本上进行训练的,所以在某种程度上,模型代表了一个“平均人的写作风格”。
上述公式中的ppx(x)表示输入“x”的困惑度。
接下来,让我们看一些人工智能生成和人工撰写文本的示例。
人工智能生成与人工撰写文本的示例
我们编写了一些Python代码,根据令牌相对于模型困惑度的复杂性将句子中的每个令牌着色。如果不考虑其困惑度,第一个令牌始终为黑色。困惑度小于或等于经过缩放的模型困惑度的令牌为红色,表示它们可能由人工智能生成,而困惑度较高的令牌为绿色,表示它们肯定不是由人工智能生成的。
图片在句子前的方括号中表示使用语言模型计算的句子难度。请注意,某些单词的一部分是红色的,一部分是蓝色的。这是因为我们使用了子词分词器。
以下是生成上述HTML代码的代码。
def get_html_for_token_perplexity(tok, sentence, tok_ppx, model_ppx): tokens = tok.encode(sentence).tokens ids = tok.encode(sentence).ids cleaned_tokens = [] for word in tokens: m = list(map(ord, word)) m = list(map(lambda x: x if x != 288 else ord(' '), m)) m = list(map(chr, m)) m = ''.join(m) cleaned_tokens.append(m) # html = [ f"<span>{cleaned_tokens[0]}</span>", ] for ct, ppx in zip(cleaned_tokens[1:], tok_ppx): color = "black" if ppx.item() >= 0: if ppx.item() <= model_ppx * 1.1: color = "red" else: color = "green" # # html.append(f"<span style='color:{color};'>{ct}</span>") # return "".join(html)#
从上面的例子中,我们可以看出,如果模型将某个文本检测为人工生成的,那么它一定是人工生成的,但是如果它将文本检测为AI生成的,就有可能不是AI生成的。那么为什么会出现这种情况呢?接下来我们来看一下!
假阳性
我们的语言模型是基于大量人类写作的文本进行训练的。通常很难判断某个文本是由特定人物(数字化)编写的。模型的训练输入包括许多不同的写作风格,可能是由大量人撰写的。这导致模型学习了许多不同的写作风格和内容。很可能你的写作风格与模型训练的某些文本的写作风格非常相似。这就是假阳性的结果,也是为什么模型不能确定某些文本是AI生成的。然而,模型可以确定某些文本是人工生成的。
OpenAI: OpenAI最近宣布将停止使用其用于检测AI生成文本的工具,并称准确率较低(资料来源:Hindustan Times)。
AI分类器工具的初始版本存在某些限制和不准确性。用户需要手动输入至少1000个字符的文本,OpenAI随后对其进行分析,分类为AI或人工编写。不幸的是,该工具的性能表现不佳,只有26%的AI生成内容被正确识别,将人工编写的文本错误地标记为AI约占9%的时间。
这是OpenAI的博客文章。看起来他们使用了与本文提到的方法不同的方法。
我们的分类器是在同一个主题上的一组人工编写文本和AI编写文本的数据集上进行了微调的语言模型。我们从多个来源收集了这个数据集,我们相信这些来源是由人类编写的,如预训练数据和提交给InstructGPT的提示的人类演示。我们将每个文本分为提示和回答。对于这些提示,我们使用我们自己和其他组织训练的不同语言模型生成了回答。对于我们的Web应用程序,我们调整了置信度阈值以保持低的假阳性率;换句话说,只有分类器非常有信心时,我们才将文本标记为可能由AI编写。
GPTZero:另一个流行的AI生成文本检测工具是GPTZero。看起来GPTZero使用困惑度和突发性来检测AI生成的文本。“突发性指的是某些单词或短语在文本中以突发方式出现的现象。换句话说,如果一个词在文本中出现了一次,那么它很有可能在接近的位置再次出现”(来源)。
GPTZero声称拥有非常高的成功率。根据`_, “在阈值为0.88的情况下,85%的AI文档被分类为AI,99%的人类文档被分类为人类。”
这种方法的普适性
这篇文章中提到的方法普适性不强。我们所说的是,如果你拥有3个语言模型,例如GPT3、GPT3.5和GPT4,那么你必须将输入文本通过这3个模型,并在所有模型上检查复杂度,以查看文本是否由其中任何一个生成。这是因为每个模型生成的文本略有不同,它们都需要独立地评估文本,以确定是否可能是它们中任何一个生成的文本。
随着2023年8月全球大语言模型的蓬勃发展,似乎不太可能检查任何文本是否来自全球任何一个语言模型。
事实上,每天都有新模型在训练,并且试图跟上这种快速进展似乎十分困难。
下面的例子显示了我们的模型在预测ChatGPT生成的句子是否是AI生成或非AI生成的结果。正如你所看到的,结果是复杂的。
出现这种情况有很多原因。
- 训练语料库大小:我们的模型的训练文本非常少,而ChatGPT则训练了数万亿的文本。
- 数据分布:我们的模型的训练数据分布与ChatGPT不同。
- 微调:我们的模型只是一个GPT模型,而ChatGPT则针对聊天回复进行了微调,使其以稍微不同的口吻生成文本。如果你有一个生成法律文本或医疗建议的模型,那么我们的模型在由这些模型生成的文本上的表现也会很差。
- 模型大小:我们的模型非常小(不到1亿个参数,而ChatGPT-like模型为>2000亿个参数)。
显然,我们需要更好的方法,如果我们希望提供一个相对高质量的结果来检测任何文本是否是AI生成的。
接下来,让我们来看看围绕这个话题在互联网上流传的一些错误信息。
错误信息
有些文章错误解释了困惑度。例如,如果你在google.com上搜索“人类生成的内容是否有高或低的困惑度?”,你将在第一个位置得到以下结果。
这是错误的,因为与AI生成的内容相比,人类写作的内容通常具有更高的困惑度。
让我们来看看在这个领域的研究人员正在探索的技术,以得到比我们现在更好的结果。
下一步是什么?
我们已经确定检测AI生成的文本是一个困难的问题,成功率非常低,甚至不如猜测。让我们看看这个领域的研究人员正在探索的最新技术,以更好地掌握事物。
水印技术:OpenAI和Google已经承诺为AI生成的文本添加水印,以便能够通过编程方式进行识别。
这个水印的技术细节还不清楚,而且两家公司都没有透露任何相关细节。
即使OpenAI和Google采用了一种水印技术, 我们也不能确定每个被部署的语言模型都会包含水印。人们仍然可以部署自己的模型来生成文本并将其发布到网络上。即使公司决定对生成的文本加入水印, 目前并不清楚这是否会成为一个标准,或者每个公司是否会有自己的专有策略和可能需要付费的工具来验证是否是使用他们的基于人工智能的文本生成工具生成的任何文本。如果是一个开放标准,除非要计算大量,否则人们仍然有机会绕过它,比如一种需要大量计算才能解开的加密密码。如果不是一个开放标准,那么人们将受制于这些公司,只能依赖它们提供开放和免费访问所需的工具和API来执行这些检查。还有一个问题是,由于可能的是使用带有水印的AI生成文本来训练模型,并返回不带水印的AI生成文本,这些工具从长远来看有多有效。
这篇文章讨论了关于为AI生成的文本添加水印的一个可能技术,并提到了与这种方法相关的重大挑战。
个性化:在我们的看法中,检测AI生成的文本的问题在短期内仍将具有挑战性。我们认为,策略需要更具侵入性和个性化才能更有效。例如,不要问某段文本是不是由AI生成的,而是更合理地问这段文本是不是由特定人写的。然而,这将要求系统能够访问大量由该特定人编写的文本。此外,如果某些文本是由多个人编写的,比如这篇文章,问题会变得更加复杂。
让我们看看这样一个用于检测人为编写文本的个性化系统将对教育工作者和学生产生怎样的影响。
如果存在这样的解决方案, 教育工作者更有可能向学生分配个人任务而不是群体任务。这也要求每个学生首先提供自己写过的大量文本。这可能意味着在报名课程之前要在大学亲自花费数小时。当然,这将对教育工作者教导学生通过团队合作来实现共同目标的能力产生负面影响。
另一方面,学生在某些情况下可以通过AI生成的文本来更专注于实际问题,如进行研究或文献研究,而不是花时间以优雅的方式撰写他们的学习成果。人们可以想象,学生们将花更多的时间学习数学或科学课程的概念和技巧,而不是只是写作。这部分工作可以由AI来完成。
结论
在本文中,我们从直觉上了解了如何检测AI生成的文本。我们可以使用生成文本的困惑度作为主要指标。我们看到了一些PyTorch代码,通过文本的困惑度来检测给定文本是否可能是由AI生成的。我们还看到了这种方法的一些缺点,包括可能的误报。我们希望这能帮助您了解和欣赏检测AI生成文本的细节。
这是一个不断发展的领域,研究人员正在努力找到一种更高准确率的检测AI生成文本的方法。这种技术对我们生活的影响有望是重大的,而且在很多方面还是未知的。
虽然我们讨论了检测AI生成文本的技术,但我们假设整段文本是由人类编写或AI生成的。实际上,文本往往部分是人为编写的,部分是AI生成的,这使得事情变得相当复杂。
如果您想阅读有关检测AI生成文本的其他方法,例如使用爆发性指标的方法,可以在此处阅读更多信息 here。
本文中的所有图片(除第一张外)均由作者创建。