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通常包括三个主要阶段。

  1. 预训练

  2. 后训练:监督微调(SFT)

  3. 后训练:人类反馈强化学习(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不断进化,大幅减少幻觉是确保它们作为一个可靠知识库的重要一环。

震撼揭秘:LLM幻觉如何颠覆你的认知!的更多相关文章

  1. 一次fork引发的惨案!

    "你还有什么要说的吗?没有的话我就要动手了",kill程序最后问道. 这一次,我没有再回答. 只见kill老哥手起刀落,我短暂的一生就这样结束了··· 我是一个网络程序,一直以来都 ...

  2. javascript中的null,对象系统还是非对象系统?

    1.一直以来的认知 在我学习js的过程中,爱民老师的绿皮书里将js的类型系统分成了两类: 其一是元类型系统:由typeof运算来检测 其二是对象类型系统:是元类型的object的一个分支 而null这 ...

  3. [转载] 相机越贵画质越好?聊聊CMOS设计

    似乎在很多人心目中,个位数机身就代表了品牌最强成像素质,这或许有“人不识货钱识货”的道理在作祟,但事实上如佳能1DX2或尼康D5,又或是索尼A9这种旗舰机真的就一定能代表本家的画质巅峰么?这一切都得从 ...

  4. 为什么在JavaScript中0.1+0.2不等于0.3?

    0.1+0.2不等于0.3?是不是有点颠覆你的认知,但是,在js中,是真实存在的! console.log(0.1+0.2); // 0.30000000000000004 其实这都是因为浮点数运算的 ...

  5. cs231n---卷积网络可视化,deepdream和风格迁移

    本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及deepdream和风格迁移. 1 卷积网络可视化 1.1 可视化第一层的滤波器 我们把卷积网络的第一层滤波器权重进行可视化( ...

  6. Java 8 Time Api 使用指南-珍藏限量版

    前面写过了Stream和Lambda,最近正想写Java 8的Time Api,小胖哥这个文章写得很好,就偷懒转载了. 1.概述 Java 8为Date和Time引入了新的API,以解决旧java.u ...

  7. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...

  8. 【30分钟学完】canvas动画|游戏基础(extra1-1):美图我也行

    前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用. 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了. canvas操 ...

  9. 焦大:seo思维光年(上)检索的价值观

    http://www.wocaoseo.com/thread-55-1-1.html 检索的价值观是什么?最近很多人咨询我这个问题,因为在百度上根本找不到相关的资料,其实这个东西也是我自己总结的,比如 ...

  10. 轻轻松松学CSS:Grid布局

    网页布局总的来说经历了以下四个阶段: 1.古老的table表格布局,现在基本已被淘汰. 2.float浮动布局(或者position定位布局),借助float.position 等属性等进行布局,这种 ...

随机推荐

  1. R数据分析:生存数据预测模型的建立和评价(二)timeROC与决策曲线

    上篇文章依照jama surgery的一篇文章给大家写了生存数据预测模型评价的C指数.校准曲线和模型验证结果的做法,其实生存数据预测模型的评价方法还有很多,本期接着往下看. Time-dependen ...

  2. CompilerGenerated与GeneratedCode区别

    前言 最近在捣鼓代码生成器,基于 Roslyn,我们可以让生成器项目生成我们的目标 C# 代码,这个也是MVVM Toolkit的实现方式,在查看生成代码的过程中,我们经常会遇到一些特殊的特性,如 G ...

  3. Spring RestTemplete支持Https安全请求

    实现步骤 Step1: 自定义ClientHttpRequestFactory package com.example.demo.https; import org.springframework.h ...

  4. MybatisPlusException: can not find lambda cache for this entity[]异常解决

    文章目录 场景说明 解决方案 场景说明   简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下: ...

  5. Web浏览器播放rtsp视频流详细解决方案

    1.背景 在当前项目中,需要实现Web端直接播放RTSP视频流.该功能的核心目标是使得用户能够通过浏览器观看来自不同品牌的IPC(Internet Protocol Camera)设备的实时视频流.主 ...

  6. 3款.NET开源、功能强大的通讯调试工具,效率提升利器!

    前言 今天大姚给大家分享3款.NET开源.功能强大的通讯调试工具,帮助大家提高通讯调试的效率和准确性. LLCOM LLCOM是一个.NET开源的.功能强大的串口调试工具.支持Lua自动化处理.串口调 ...

  7. 鸿蒙OS开发秘籍:打造优雅的登录状态管理系统

    一.前言 在鸿蒙OS开发过程中,随着应用规模的扩大,登录状态管理逐渐成为系统设计中的一个挑战.一个清晰.高效的登录状态管理系统不仅可以简化开发流程,还能提升用户体验.本文将分享一种优雅的登录状态管理设 ...

  8. 记一次 .NET某工业视觉软件 崩溃分析

    一:背景 1. 讲故事 前两天给训练营里的一位学员分析了一个dump,学员因为弄了一整天也没找到祸根,被我一下子弄出来了,极度想看看我是怎么分析的?由于在微信上不能一言两语表尽,干脆写一篇文章出来详细 ...

  9. IM开发快速入门(二):什么是IM系统的实时性?

    本文在编写时参考了博客作者"鹿呦呦"和在线课程"即时消息技术剖析与实战"的相关资料,一并表示感谢. 1.引言 随着移动互联网络的发展,IM技术的应用已经不仅限于 ...

  10. ETL工具--Sqoop

    1. 概述 Sqoop是apache旗下的一款 "Hadoop和关系数据库之间传输数据"的工具导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.HBA ...