自 ChatGPT 推出以后,不少人担心其被用于伪造人类写作。比如分析报告可能是 GPT 写的,新闻可能是 GPT 写的。当然,最有可能是学术论文和学生作业,可能是 GPT 写的,而这后面两个应该已经是既成事实了。也有一些公司试图推出识别 GPT 文本的服务,但是好像假阳率很高,实际使用效果并不好。而且也有研究指出,非母语者的写作更有可能被这些算法误判为 GPT 生成,这么一弄的话还涉及歧视问题了,估计有这个缺陷的工具是不太可能大规模使用了。

但是能否识别一段文字是否为 GPT,或者更准确地说,LLM (以下混用这两个词了)生成,仍然是个有意义的问题。模型生成的东西吓人最开始还是 Sejnowski 他们做的模仿婴儿发声的什么 NETalk. 自那时起直到前两年 GAN 和 diffusion model 兴起,识别 AI 生成的内容还是一件很容易的事情。拿图片来说,AI 生成的模型,经验上来讲通常有局部细节丰富,整体毫无结构逻辑的特点,也因此被画师叫做“拼尸块”。而且如果对象复杂的话,比如画人物手部细节,处理起来就更加麻烦。

但是对于文本而言,这些识别技巧都不太好用。为什么?我想是文本的自由度实际上比图片要大。文本本身就是高度压缩的媒介,这意味着,每一个单词或者广义上的字符,其后面可以跟着的其他字符的数量都应该相当多,否则的话这种编码无法适应沟通的需要。更大的可能性意味着侦测 AI 的难度变的更高。不过这个事情并不是完全不可能的,也就是从 GPT 开始大火前后那段时间起,不少人开始做这个检测问题。总的来说,现存方案大约可以分为两类:

其中一类很端到端:识别文本是否为 GPT 生成不就是个分类问题吗?那么我训练一个 classifier 不就得了,最多在 feature extractor 上要做点工作。对于这一类思路不评价,只能说没有太大的个人兴趣。

另一类较有意思,他们试图通过文本自身的统计规律来看能否找到一个特征,无需训练就能判断该文本是否为 GPT 生成。这两天刚好读到一个这样的工作:2401.12070: Spotting LLMs With Binoculars: Zero-Shot Detection of Machine-Generated Text

文章的思路甚是直接,只需一个前置概念,perplexity. 这个词其实也就是唬人的。对于一个形如 \((x_1, x_2, \cdots, x_T)\) 的句子,其 perplexity 计算公式为

\[\exp \big\{-{1\over T} \sum_{t=1}^T \log p(x_t | x_{t' <t}) \big\} \]

这就是把熵的公式往里面套了一下然后加起来。直观地说,这个度量是测量一个文本的惊讶程度的。如果对于一个句子来说,说话的人每吐出下一个字的概率在整个字典中的概率越小,这个值就会越大。现在风行的 LLM 如 GPT,其训练过程的目标函数都是要降低这个 perplexity, 也就是尽可能地预测最有可能接下来要说的话。

一个自然的思路是,如果一段文本是 GPT 生成的,其 perplexity 应该较小,因为人目标函数就是干这个的。因此只要画一条 perplexity 的边界,自然就可以识别文本是否为机器生成的。但是这么做会有误判,有一些 LLM 生成的文本 perplexity 也可能很高。

针对这个问题,文章的作者表示,这种高 perplexity 的情况是由于人为给 LLM 注入了能诱导出高 perlexity 输出的 prompt. 这个说法想一想好像有点道理。毕竟好的 prompt 确实是能极大地改善 LLM 说话淡如水的问题。那么 prompt 在这里实际上改变了什么?从其公式出发可以看到,实际上改变的是前面几项的条件概率(prompt 经常在的位置),连带着后面的也歪了。

如果问题是条件概率里面的分母导致的话,那么解决方案就是 normalize 掉这个分母。作者提出,我们可以用两个 LLM 来测量 perplexity。第一个 LLM 直接计算当前文本的 perplexity,而第二个 LLM 负责对当前这个文本的每一个位置做下一个词的预测(decoder only),然后把这个预测形成的文本送到第一个 LLM 中去计算 perplexity。如果两者相当,那么原文本就有可能是 LLM 生成的。就实验结果来看,这个思路直接,效果不错。

在某种意义上,这个方式很像计算互信息或者交叉熵。交叉熵对原来是的分布长什么样并不关心,关心的是原来的分布和新分布的相似性。如果原分布是我们的目标分布,然后交叉熵很低就反过来说可能新分布也是来自它。确实属于一个比较巧妙的点子。

就这个也可以推出一些其他的东西来,比如说基于 perplexity 的判别器,应该是文本越长效果越好,毕竟这个就像反过来做统计检验一样。他们的结果也表明确实如此——当文本长度为 512 时,在 0.01% 的假阳率下,识别的真阳率接近 100% 了。这也符合我们的直觉,因为越是长文本,那股 AI 味就越是掩盖不住。或者更技术一点说,AI 生成的长文本中的逻辑结构(和“拼尸块”这不一样了么就)的缺乏就会越容易看出。

讨论

GPT 生成的文本这种结构缺乏的特点是此类 LLM 的本质属性无法改变还是说是可以通过训练来改善的?可能两个因素都占有。从训练出发的话,目前绝大多数的 LLM 都来自那几个基座模型,而基座模型又都是在海量的去掉个人特点的数据上训练的,不可能期待在这种训练的模型上得到什么个性化的输出。但如果我们搞搞微调,还是在私有数据上弄的话,得到的结果可能就完全不同了。perplexity 说到底衡量的是一种“口僻”的偏离程度,不同的私有数据有不同的“口僻”,如果用标准的 LLM 走上面的流程,其 perplexity 自然应该较高。

而内廪属性无法改变的部分,则可能藏在 decoder only 的模型架构本身。 huggingface 把这类模型叫 CausalLM(ML 的人是真会做 marketing,第一次看到一脸懵逼)。说人话就是,这类模型只做一件事——预测接下来的词应该是什么。这种预测机制是有天然的问题的。因为很多时候人类的语言生成不是一次性的。相反,说话者可能是先有了一个点,然后围绕这个点展开,在展开的过程中甚至可能误导听众,不到最后一刻,这个文本甚至不会展开包袱,比如欧·亨利。但是 decoder only 的模型一定程度上做不了这个事情,它的假设是贪心算法,即当前最优的预测应该是未来最优预测的一部分,而这一点对人类生成的文本很多时候并不成立。

那这是 LLM 的本质缺陷吗?我不觉得,LLM 可能不是在模拟我们的大脑,而是在模拟小脑。小脑存在不是用来进行复杂计算的,小脑用于节省冗余计算。像一块协处理器一样,小脑可以节省大脑的工作,使得大脑腾出经历来做更多的纠错工作(当然这一点也尚无定论)。这个比喻也暗示着,LLM 做不了“谋篇布局”的部分,我自己的开发和使用经验也支持这一点,LLM 生成的 planning 都是非常流水线的,必须要有很合适的约束机制才可能产生一点可行的方案。不过这个“小脑”仍然有自己重要的作用,deepmind 最近疯狂灌水 nature 的几篇文章里,都是在使用 LLM 降低搜索空间,打通传统的符号系统中最怕的搜索爆炸问题和知识编码问题。也正是因为他们只有 LLM 这颗“小脑”,所以那几篇文章做的基本上都是搜索空间巨大无比,但是验证起来极其简单的问题。

有没有可能从模型架构本身出发解决这个“缺陷”?一种思路是,让模型把上面所提的“推敲”过程内化到其计算图里。让训练过程从玩贪心算法变成数独游戏。其实 encoder-decoder 的模型已经存在了,但是好像还是干不过 GPT,也有一些其他尝试,比如 Googlebrain 在 2205.05131 中提出的 UL2. 不过,架构的复杂性是一方面,另一方面我猜有损失函数的原因。另外的一些架构像 encoder-decoder 架构确实把贪心算法搞成了猜字游戏,而且保护了一个“整体信息”,但是损失函数让它在任务上和 decoder only 的模型没有本质区别。一个具有我们上面所说的特点的输出,其对应的损失函数,应该是把整个上下文一起考虑在里面的。而且不像图片,文字的这种全局关联性会更强。直观上来看,这可能是一种带着 attention 的损失函数。也许如果哪天我们找到了笑话和非笑话的无参数文本统计特征(我觉得不太可能),设计一个类似的损失函数也就变得可能了。