文章对大模型或者语言生成模型的幻觉问题的定义、分类、以及产生原因给与分析和说明,针对分析的结果进一步分析解决这些问题的对策。
这是一篇为 2023 跨年技术分享而准备一篇文章
大模型幻觉(hallucination)是指模型生成不准确、不真实或与输入数据不相关的信息的现象。这在自然语言处理(NLP)和生成模型中尤为常见。所谓幻觉就是生成了他不知道的内容,不过对于大模型幻觉不仅限于此。
- 生成的内容与用户输入不一致
- 在生成的内容中,前后不一致
- 生成的内容和事实不符
在上一次我们已经分析了什么是 LLM 的幻觉,其实早在大模型出现之前,大家就关注过幻觉的问题,那时候将模型生成内容和原文不符合的内容视为模型的幻觉。
-
内在幻觉: 所谓内在幻觉就是模型输出内容与原文不符
-
外在幻觉:虽然模型输出内容在原文中找不到,但是并不表明输出内容不正确
首先现在大模型采用数据集不再是几十万条,而是 Trillion 量级的数据,这里以 LLama2 为例,LLama2 用了 2 Trillion 的数据来做预训练。所以很难定位和筛选出可能导致大模型幻觉的数据。
而且现在的大模型能力越来越强,而且可以做多任务,我们想从某一个方向(任务)来定位幻觉问题,也变得越来越难。而且现在大模型生成的内容,看起来逻辑性都比较强,输出的内容环环相扣,有理有据。所以这样对于我们来说就更难发现大模型的幻觉问题。
即便今天数据已经涵盖了互联网几乎所有公开的数据,但是还是有些未公开或者专业领域的数据是大模型无法触及到的。这就是大模型的知识边界。
关于幻觉的分类
主要分为 3 种情况,分别是生成的内容与输入的不一致,与原内容相背离,输入通常包括两个部分分别是,一部分是内容,一部分是让大模型在这些内容进行具体任务的相关指令。
生成的内容与用户输入不一致,例如第一个例子中,用户需要大模型推荐早餐的食谱,而模型生成的内容却是一个午餐的食谱。不过这种幻觉比较容易发现,因为明显可以看出生成内容与用户输入不一致,所以危害性并不大。
在生成的内容中,前后不一致,上面例子中在食谱推荐了烤鸡和土豆,并没有提到牛排,而在下面内容中让用户享受牛排,显然也是前后不一致,这一种幻觉也是用户自己发现,所以一般危害也不会很大。
接下来就是生成的内容和事实不符,这种幻觉是危害性最大,也是大家最关心的,因为用户询问一些专业知识,而且这领域是用户了解,无法判断正确与否,而这时候大模型却一本正经给出错误答案,就像上面例子中,模型给出西红柿还有丰富的钙,作为我们缺乏这方面的知识,就容易让大模型所误导。
基于两个维度对幻觉情况进行分类
在 chatGPT 出现之前,模型都是单一的任务,这时候主要还是输入和输出不一致,和前后不一致这两种情况居多。而当 chatGPT 出现之后,而与事实背离的错误其实就是主要的幻觉。接下来我们把产生幻觉按 2 个维度分为 4 种情况。
在第 1 象限是模型知道,并且模型也知道自己知道,这是一种我们比较喜欢情况。而在 3 象限模型对问题不了解,并且模型也知道自己不清楚,虽然模型并不知道我们要问的问题,不过因为这是模型还是诚实的,也是我们想要看到一种情况。
在第 2 象限,模型认为自己不知道,其实模型是知道。这种情况看上去似乎有点不可思议。其实当你问一个问题,模型给出答案是模型不知道,不过当您换一种方式再去问模型,让他做一个单选题,这时候模型可能从中选择正确的答案。
产生幻觉的原因
预训练阶段(pre-training)
大模型的知识是在预训练阶段其实就是储备知识,而其他阶段例如 SFT 和 RLHF 都是激活大模型能力的阶段。所以预训练是模型的基础,而大模型训练数据通常是从互联网上获取到的数据,因为是互联网上采集数据,所以数据质量很难得到保证,数据正确性、真实性都是有待考量。虽然现在数据足够大,但是存在大量未公开的、私有的数据是数据集无法覆盖的,所以大模型还是对于一些专业的领域的知识还是有些缺失的。
而且大模型学习的任务是一种有损的压缩,所以大模型也是很难记住所以看到过的资料。
SFT(supervised fine tuning)
发现许多第三方SFT数据源的多样性和质量不足,特别是对于将LLMs对齐到对话式指令。经过实验发现,从几百万条数据,筛选高质量的总共27,540条数据,我们的结果显著提高。
SFT 其实行为的克隆,那么好,如果大模型一味去模仿专家,就可能导致模型的过度自信。
也就是自信度超出其能力,这也是导致大模型产生幻觉的原因。
RLHF(reinforcement language human feeback)
那么在 SFT 阶段对于大模型产生幻觉的影响主要是,在 SFT 中数据中蕴含的知识超出了预训练过程中用到数据集,而且要求大模型给出答案,这是大模型就容易对于其不了解问题,给出联想到的答案。
为什么会有幻觉呢? 在生成并不一定概率最大的,next token prediction
推理(inference)
LLM 还是很容易形成滚雪球现象。如果在生成的早期就产生幻觉,模型在生成过程中,是不会修正之前的错误,而是一错再错,像滚雪球似的,越滚越大,也就是错误累计传播
对于多轮对话,其实解决这个问题也比较简单,也就是避免多轮对话,可以把需要多轮对话完成任务拆分为一个一个小任务。
大模型在推理上也存在一些问题。当你询问大模型汤姆克鲁斯的母亲是谁的时候,大模型可以给出正确答案,不过当接下来继续问她儿子是谁的时候,可能大模型无法给出正确的答案了,这也是大模型推理的缺陷。
AI 透明性
问题就是大模型会知识要远远大于大模型输出的内容,
通过一些方法来分析大模型的中间层,可能在以中间层大模型对于一些问题是指导答案的,具有较高的自信度,而到了更高层时候靠近 logics 层时候反而自信度却下降了。
大模型更容易产生幻觉
更大规模模型往往更容易产生幻觉,所以仅仅通过增大模型的规模并不能有效解决模仿性虚假的问题,这是因为模型扩展的副作用,模型在现有数据上虽然得到了很好训练,可能导致模型容易出现生成模仿性虚假,这种现象为逆向扩展
保证图像生成多样性
对于开放领域对话的幻觉
对策
预训练阶段
- 保证高质量的数据,排除数据中的有误导性或者错误信息,不过由于预训练采用数据量级,对于我们是难以排查的海量数据,如果有可能处理数据,我们也不会选择无监督学习方式,当然无监督学习有着自己特点。不过我们可以尽量选择一些质量比较高例如维基百科这样数据来训练模型。google 也提供了一些高质量数据可以用高质量数据
SFT 和 RLHF
其实这两个阶段出现问题以及解决方式有点类似,所以就放到一起来解释
- 可以这个阶段对用于 SFT 来过滤数据,由于数据量不大,可以通过对于难度数据打上不知道标签,让大模型学习到会说不知道,对于不了解数据更诚实
数据集质量
还是数据其实一切根源都源于数据,只要数据量充足,就能够得到一个好结果。这个不仅体现在数据的质量上,还体现数据集广度,也就是数据的多样性,以及数据的时效性。这些都是可以作为评估数据质量的指标。
对应解决方案就是,对训练数据进行清洗,使用高质量的数据集。数据集多样化,尽可能覆盖更多领域,还有就是凭借外部知识库对模型进行。
过渡优化
过渡优化,可能在面对在数据集为出现过或不常见的查询时,产生不准确的回答,从而产生了幻觉。过度拟合的模型可能更倾向于记住训练数据的具体细节,而不是学习到适用于未见数据的泛化规律。
在 RLHF 和 SFT 人参与因素,有了人,就人的主观因素,以及人之间差异性,那么除了要克服想 SFT 上数据问题,还要克服人反馈之间差异性,RLHF 设计上让人不是给出分数,只是评判好坏,在一定程度上避免这样问题。错误的反馈信号可能造成与预期效果不一致的问题,从而产生幻觉
其他方式
其他方式也是围绕这几个关键点,提高数据质量,避免过度优化,增加模型透明性和解释性,通过人审核或者机器审核来监控模型输出的质量
Tree of Thoughts ToT
那么为什么 CoT 有助于提升 LLM 在一些像数学逻辑比较强的任务上,这个思维链的延伸或者说扩展吧。好处从多个不同角度来思考问题,从而避免幻觉发生。
借助外界对问题结构化的理解,也就是逻辑从大模型提取出来,交给外面 ToT 来模拟人的逻辑思维,可以多角度来考虑问题,当然说的容易,做起来就没那么简单了。首先树形结构,是层次的,发散的,也就是将问题分析结构化,可以基于结构进行分析。将思维变为了最佳路径搜索问题。那么首先就需要建立一颗树,那么问题就是搜索空间不能太大,太多得不说了。
Self Consistency with CoT,CoT-SC
在 CoT 的基础上改进,要求模型给出几个答案,然后检查答案之间一致性,
多代理
实验证明多代理是可以减轻大模型的幻觉的,首先多个代理可以是线性的,也可以是并行的。多个代理可以对同一个问题给出答案,然后通过某种形式的聚合(如投票或平均)来确定最终的答案。即使一个代理产生了幻觉,其他代理可能不会,通过聚合可以减少错误的影响。
在多代理系统中,人类可以作为一个特殊的“代理”也可以参与评估过,特别是在关键或模棱两可的情况下。人类的直觉和判断可以帮助识别和纠正幻觉。
- 可以通过多个代理,例如第一个代理给出问题的事实并且通过分步骤让模型找到答案。
- 也就是一个代理输出作为下一个代理输入,从另一个角度来看实现了串联的
自评估(critic 框架)
评估可以在系统内和系统外的,外部 critic 是独立模型或者系统,可以用于模型的输出评估和矫正,主要评估模型输出的一致性、真实性和准确性,当然这种机制也可以内部。随后我们展开来聊这个问题。
也可能是多模型协作,分析不同模型的输出,可以识别和纠正可能的幻觉。从而排除某些模型在某些领域相对比较薄弱,这种学习和适应需要是持续的。
不过这样做可能带来系统复杂性,复杂性可能没有提升,反而付出了性能和成本,这个需要考虑他们之间平衡。
这里阶段性总结一下,想要修复幻觉,其方法很多例如提示词上下些功夫,借助外部工具或者利用知识库数据,作为知识增强检索,这些方法都是很有效的。
这是 critic 框架,通过双重检查来考虑哪些是正确的答案。
一切都是付出成本的,首先没有免费的午餐,要得到好的结果,就需要付出算力和时间。
Tree of Thoughts: Deliberate Problem Solving with Large Language Models
Contrastive Learning Reduces Hallucination in Conversations