LLM幻觉
把幻觉理解为训练流水线中的一种涌现认知效应
Prashal Ruchiranga
Robina Weermeijer 在 Unsplash 上的照片
介绍
在一个名为《深入剖析像ChatGPT这样的LLM》的YouTube视频里,特斯拉前AI资深总监Andrej Karpathy探讨了大型语言模型(LLM)的心理现象,把它看作是训练流水线中的一种涌现认知效应。这篇文章的灵感就来源于他对LLM幻觉的解释和视频里呈现的信息。
你可能已经见过模型的幻觉。这些就是LLM生成的那些不正确、误导,甚至完全捏造出来的、但看起来还挺像那么回事的信息。这些幻觉之所以发生,是因为LLM并不像人类那样“知道”事实;它们只是根据训练数据里的模式来预测下一个词。几年前刚发布的早期模型,对幻觉问题简直是毫无招架之力。随着时间推移,各种缓解策略逐步改善了这种情况,不过幻觉问题至今仍未彻底根除。
一个形象化的LLM幻觉例子(作者制作的图片)
Zyler Vance是我随便编的一个完全虚构的名字。当我把“Zyler Vance是谁?”这个提示输入falcon-7b-instruct模型时,它生成了纯属虚构的信息。Zyler Vance并不是《科洛弗悖论》(2018年)电影里的角色。这个模型是个老版本,特别容易出现幻觉。
LLM训练流水线
要理解这些幻觉是怎么产生的,你得先了解训练流水线。训练LLM通常包括三个主要阶段。
-
预训练
-
后训练:监督微调(SFT)
-
后训练:人类反馈强化学习(RLHF)
预训练
这是LLM训练的初始阶段。在预训练过程中,模型会接触到从互联网爬取的大量高质量和多样化文本。预训练帮助模型学习基本的语言模式、语法和一些事实。这个阶段训练出来的模型叫“基础模型”,它是个预测序列里下一个词的“标记模拟器”。
想了解预训练数据集大致长啥样,可以看看FineWeb数据集。FineWeb数据集基本上能代表企业级语言模型会用到的数据集。所有主要的LLM提供商,比如OpenAI、Google或Meta,他们内部都会有类似FineWeb的数据集。
后训练:监督微调
就像我前面说的,基础模型只是个标记模拟器。它只是在采样互联网文本。我们需要把这个基础模型变成一个能回答问题的助手。所以,预训练完的模型会进一步用一个对话数据集来精炼。这些对话数据集里有成千上万的多轮长对话,覆盖的主题非常广泛。
来自InstructGPT分布的示例人类助手对话
这些对话是人类标注员创建的。根据对话的上下文,人类标注员会为助手撰写出任何情境下的理想回应。之后,我们拿着训练了互联网文本的基础模型,把数据集换成这个对话数据集,然后让模型继续在这个新对话数据集上训练。通过这种方式,模型会快速调整,学到这个助手回答问题时的统计模式。训练结束后,模型就能模仿出人类式的回应。
OpenAssistant/oasst1是hugging face上公开的对话数据集之一。这是一个由人类生成并标注的助手风格对话语料库,包含35种语言里的161,443条消息。
后训练:人类反馈强化学习
监督微调让模型变得更有能力。但即便是训练得很好的模型,也还是会生成一些误导性的、有偏见的,或者无用的回复。所以,需要人类反馈强化学习(RLHF)来让它对齐人类预期。
我们从SFT训练出来的助手模型开始。针对一个给定的提示,生成多个模型输出。人类标注员会根据质量、安全性和符合人类偏好的程度,对这些模型输出进行排序或评分。我们用这些数据训练一个完全独立的神经网络,叫做奖励模型。
奖励模型模仿人类的评分。它是个人类偏好的模拟器。它是一个完全独立的神经网络,大概率是个transformer结构,但它并不是那种能生成多样语言的语言模型。它只是一个评分模型。
之后,LLM就会通过强化学习进行微调,这个过程中奖励模型会对生成的输出质量提供反馈。所以,我们不是直接去问真人,而是去问这个模拟的人类来给输出打分。目标是最大化奖励信号,也就是符合人类偏好的程度。
为什么会有幻觉?
现在我们对大型语言模型的训练过程有了更清楚的了解,接下来就能继续聊幻觉了。
幻觉其实是从训练流水线里的监督微调阶段产生的。下面是训练集中可能存在的三段对话示例。
示例人类-助手对话(作者制作的图片)
就像我前面展示的,这就是训练时的人类-助手对话。这些对话是人类标注员按严格指南创建的。标注员在为助手写每个问题的正确答案时,要么是他们认识这个人,要么就是上网查资料。然后他们写出带有自信语气的助手回应。
到了测试时,如果模型被问到一个训练里没见过的人,它并不会简单承认“我不知道”。简单说,它不会直接说“哦,我不知道”。而是会统计性地模仿训练集的风格。
训练集里,那些“X是谁?”这种问题都是用自信的正确答案来回答的。所以到了测试时,模型会按照这种风格来回复,给出一个统计上最可能的猜测。它就这么编出了和训练集风格一致的内容。
模型审查
现在的问题是怎么缓解幻觉。很明显,我们的数据集里应该加入一些例子,明确告诉助手某些情况下正确的答案就是“我不知道”。但这些回答只能出现在模型真的不知道的情况下。所以关键问题是:怎么知道模型知道什么,和不知道什么?我们得实打实地探查模型才能弄清楚。
任务就是搞清楚模型知识的边界。因此,我们得审查模型,搞清楚它知道什么,不知道什么。然后我们可以把这些“模型不知道”的内容加进训练集。对这些问题的正确回答,就是模型不知道它们。
一个训练实例:模型对某个问题不知道答案的例子
来看Meta是怎么用这个概念解决Llama 3系列模型的幻觉问题的。
在他们2024年的论文《Llama 3模型群》中,Touvron等人描述了他们开发的知识探查技术。他们的主要方法是生成与预训练数据里的部分事实数据相对齐的数据。他们描述的数据生成流程如下:
从预训练数据中提取一段数据片段。
通过提示Llama 3,围绕这些片段(上下文)生成一个事实性问题。
从Llama 3采样回答。
用原始上下文作为参考,并让Llama 3当评委,给回答的正确性打分。
再让Llama 3当评委,给回答的信息量打分。
如果回答持续信息丰富但错误,就生成一个拒绝回答。(第27页)
之后,用这些探查生成的数据来鼓励模型只回答它知道的问题,遇到不确定的就别回答。这种技术逐步改善了幻觉问题。
使用网络搜索
我们现在有比单纯说“我不知道”更好的缓解策略。我们可以给LLM一个机会,让它去生成事实准确的回答,并正确回应问题。那如果我问你一个事实性问题,而你自己不知道答案,你会怎么做?你会去查一查,搜搜互联网,然后告诉我答案。我们可以让LLM做同样的事。
你可以把训练好的神经网络参数里的知识,想象成它以前见过但已经有点模糊的回忆。参数里的知识,就像你一个月前读过的东西。那些你持续反复阅读的内容,你记得会更牢;而那些你很少读的,记忆就比较模糊。如果你对某个信息记不太清楚了,你会去查资料。查资料的过程,实际上就是刷新你的工作记忆,让你能重新检索和谈论这个信息。
我们需要一个类似的机制,让模型也能刷新它的记忆或信息回忆。我们可以通过给模型引入工具来实现这一点。模型可以使用网络搜索工具,而不是直接回答“抱歉,我不知道答案”。为了做到这点,我们需要引入特殊标记,比如<SEARCH_START>和<SEARCH_END>,还有一套定义模型使用这些标记的协议。在这种机制里,语言模型可以生成特殊标记。在它不知道答案的情况下,它可以选择生成<SEARCH_START>这个特殊标记,而不是直接回答“抱歉,我不知道答案”。然后,模型会生成查询语句,并接着生成<SEARCH_END>。
这时候,负责从模型里采样的程序,在推理过程中遇到<SEARCH_START>这个特殊标记时,就会暂停生成下一个词,而是启动一个搜索引擎会话,把搜索查询输入到搜索引擎里,然后把搜索结果里提取的文本拿回来。之后,把这些文本放进上下文窗口里。
从网络搜索里提取的文本,现在已经放进上下文窗口里了,这个上下文窗口会被送进神经网络。你可以把上下文窗口理解成模型的工作记忆。放进上下文窗口里的数据,是模型能直接访问的,直接送进神经网络里。所以这些信息就不再是模糊的回忆了。现在,当模型采样新的词时,就可以非常方便地引用那些直接贴在那里的数据。
所以,这就是这些网络搜索工具大致是怎么工作的一个整体概览。
带有特殊标记的训练实例示例。[...]符号表示提取内容的占位符
那我们怎么教模型正确使用这些工具,比如网络搜索呢?还是老办法,我们通过训练数据来实现。现在我们需要足够多的数据和大量对话,示范这些工具应该怎么用。我们要通过实例展示,比如:“在哪些场合你会用搜索?搜索的格式是什么样的?你怎么发起搜索?”
因为在预训练阶段,它本身就对什么是网络搜索,以及什么样的搜索查询是好的,已经有了一种本能理解。所以,只要你的训练集中有几千个这样的例子,模型就能非常清楚地理解这个工具是怎么用的。
总结
大型语言模型的幻觉,是训练流水线里固有的产物,特别是监督微调阶段导致的。因为语言模型本来就是为了生成统计上合理的文本,所以它经常会生成看起来像是真的但实际上没啥事实依据的回复。
早期模型非常容易出现幻觉。不过,随着各种缓解策略的逐步实施,这个问题已经有所改善。知识探查技术,以及训练模型使用网络搜索工具,已经被证明是有效的缓解手段。
尽管如此,彻底消除幻觉仍然是个正在进行中的挑战。随着LLM不断进化,大幅减少幻觉是确保它们作为一个可靠知识库的重要一环。