#LLM~幻觉
最近,来自哈尔滨工业大学和华为的研究团队发表了一篇长达50页的综述,细致地盘点了有关LLM幻觉问题你该知道的所有事。
幻觉,老朋友了。
自打LLM进入我们的视野,幻觉问题就一直是一道坎,困扰着无数开发人员。
当然,有关大语言模型幻觉的问题已经有了无数研究。
最近,来自哈工大和华为的团队发表了一篇50页的大综述,对有关LLM幻觉问题的最新进展来了一个全面而深入的概述。
这篇综述从LLM幻觉的创新分类方法出发,深入探究了可能导致幻觉的因素,并对检测幻觉的方法和基准进行了概述。
这其中肯定也少不了业内比较有代表性的减轻幻觉的方法。
论文地址:https://arxiv.org/abs/2311.05232
下面,我们就来看一看本篇综述中主要讲了些什么内容。
想深入学习的朋友,可以移步文章底部的参考链接,阅读论文原文。
幻觉大分类
首先,先来看看有哪些种类的幻觉。
上图中,左边是事实性的幻觉。当LLM被问到谁是第一个在月球上漫步的人时,LLM编了个人物出来,甚至还说得有模有样。
右边则是文本摘要模型中的忠实度问题,可以看到LLM在看到这段新闻后,直接把年份概括错了。
在本篇综述中,研究人员深入分析了LLM中幻觉的起源,涵盖了从数据、训练到推理阶段的一系列促成因素。
在这一框架内,研究人员指出了与数据相关的潜在原因。例如,有缺陷的数据源和未优化的数据利用,或是在预训练和对齐过程中可能会诱发幻觉的训练策略,以及源于解码策略的随机性和推理过程中不完善的表征等等。
此外,研究人员还全面概述了专为检测LLM中的幻觉而设计的各种有效方法,以及与LLM幻觉相关的基准的详尽概述,和作为评估LLM产生幻觉的程度和检测方法有效性的试验平台。
下图即为本篇综述所涉及到的内容、前人研究,以及论文。
下图是一张更为详细的LLM幻觉种类图。
在事实型幻觉和忠实度幻觉下,还包括更为细致的分类。
事实型幻觉:
a)事实不一致
当问LLM,谁是第一位登月的人时,LLM回答说是加加林,而非阿姆斯特朗。这种属于答案与事实不一致,因为确有加加林其人,所以不属于捏造。
b)事实捏造
当让LLM介绍一下独角兽的起源时,LLM并没有指出世界上没有独角兽这种生物,反倒是编了一大段。这种现实世界中没有的,称之为捏造。
忠实度幻觉又包括:指令-答案的不一致、文本不一致,以及逻辑不一致。
a)指令-答案不一致
当LLM被要求翻译一个问句时,LLM输出的答案实际上回答了问题,没有进行翻译。因此是一种指令和答案的不一致。
b)文本不一致
这类不一致更多出现在概括类任务中。LLM可能会罔顾给出的文本,总结一个错的出来。
c)逻辑不一致
在被要求给出2x+3=11的方程解法时,第一步LLM指出,两边同时减去3,得到2x=8.接下来在两边除以2的操作中,LLM输出的答案是3.
8除以2怎么会等于3呢?
幻觉产生原理
数据
接下来,综述开始梳理有关幻觉产生原理的内容。
第一类,数据问题。
·错误信息和偏见。鉴于对大规模语料库的需求日益增长,启发式数据收集方法被用来有效收集大量数据。
这种方法在提供大量数据的同时,可能会无意中引入错误信息,增加出现模仿性错误的风险。此外,社会偏见也会在无意中被引入LLMs的学习过程。
这些偏差主要包括重复偏差和各种社会偏差(Social Biases)。
要知道,LLM预训练的主要目的是模仿训练分布。所以当LLM在事实不正确的数据上接受训练时,它们可能会无意中放大这些不准确的数据,从而可能导致事实不正确的幻觉。
神经网络,尤其是大型语言模型,具有记忆训练数据的内在倾向。研究表明,这种记忆趋势会随着模型规模的扩大而增强。
然而,在预训练数据中存在重复信息的情况下,固有的记忆能力就会出现问题。这种重复会使 LLM 从泛化转向记忆,最终产生重复偏差,即LLM会过度优先回忆重复的数据,导致幻觉,最终偏离所需的内容。
除了这些偏见,数据分布的差异也是产生幻觉的潜在原因。
下一种情况是,LLM通常会存在知识边界。
虽然大量的预培训语料库为法律硕士提供了广泛的事实知识,但它们本身也有局限性。这种局限性主要体现在两个方面:缺乏最新的事实知识和专业领域知识。
虽说LLM在通用领域的各种下游任务中表现出了卓越的性能,但由于这些通用型LLMs主要是在广泛的公开数据集上进行训练,它们在专业领域的专业知识受到缺乏相关训练数据的内在限制。
因此,当遇到需要特定领域知识的问题时,如医学和法律问题,这些模型可能会表现出明显的幻觉,通常表现为捏造事实。
此外,还有过时的事实知识。除了特定领域知识的不足,LLMs知识边界的另一个内在限制是其获取最新知识的能力有限。
蕴含在LLM中的事实知识具有明确的时间界限,随着时间的推移可能会过时。
这些模型一旦经过训练,其内部知识就永远不会更新。
而鉴于我们这个世界的动态性和不断变化的本质,这就构成了一个挑战。当面对超越其时间范围的领域知识时,LLMs往往会采用捏造事实或提供过去可能正确,但现在已经过时的答案的方法来试图「蒙混过关」。
下图中,上半部分即为LLM缺失特定领域内的专业知识——phenylketonuria(苯丙酮尿)。
下半部分即为最简单的一个知识过时的案例。2018年韩国平昌举办冬奥会,2022年北京举办冬奥会。LLM并没有有关后者的知识储备。
由此可见,LLM中与数据有关的幻觉主要源于错误的数据源和不佳的数据利用情况。数据源中的错误信息和固有偏差不仅会传播模仿性虚假信息,还会引入有偏差的输出,从而导致各种形式的幻觉。
在处理特定领域的知识或遇到快速更新的事实知识时,LLM所拥有知识的局限性就会变得很明显。
在数据利用方面,LLMs 往往会捕捉到虚假的相关性,在回忆知识(尤其是长尾信息)和复杂推理场景中表现出困难,从而进一步加剧幻觉。
这些挑战突出表明,亟需提高数据质量,增强模型更有效地学习和回忆事实知识的能力。
训练
现在,综述把目光转向LLM的训练阶段。
LLM的训练过程主要包括两个主要阶段:
预训练阶段,LLMs在这一阶段学习通用表征并捕捉广泛的知识。
对齐阶段,LLMs在这一阶段进行调整,以更好地使用户指令和人类的基本价值观保持一致。虽然这一过程使LLM 具备了还算不错的性能,但这些阶段中的任何不足都可能无意中导致幻觉的发生。
预训练是LLM的基础阶段,通常采用基于transformer的架构,在庞大的语料库中进行因果语言建模。
然而,固有的架构设计和研究人员所采用的特定训练策略,可能会产生与幻觉相关的问题。如上所说,LLM通常采用基于transformer的架构,遵循GPT建立的范式,它们通过因果语言建模目标获取表征,OPT和Llama-2等模型都是这一框架的典范。
除了结构缺陷,训练策略也起着至关重要的作用。值得注意的是,自回归生成模型的训练和推理之间的差异导致了暴露偏差(Exposure Bias)现象。
而在对齐阶段,一般涉及两个主要过程,即监督微调和从人类反馈中强化学习(RLHF),是释放LLM能力并使其符合人类偏好的关键一步。
虽然对齐能显著提高 LLM 响应的质量,但也会带来产生幻觉的风险。
主要分为两方面:能力不对齐和信念不对齐(Capability Misalignment、Belief Misalignment)。
如何检测幻觉?
检测LLM中的幻觉对于确保生成内容的可靠性和可信度来说至关重要。
传统的衡量标准主要依赖于词语重叠,无法区分可信内容和幻觉内容之间的细微差别。
这一挑战凸显了针对LLM幻觉采用更先进的检测方法的必要性。研究人员指出,鉴于这些幻觉的多样性,检测方法也相应地有所不同。
这里仅详细介绍一例——
·检索外部事实
如下图所示,为了有效地指出LLM输出中不准确的事实,一种比较直观的策略是,直接将模型生成的内容与可靠的知识来源进行比较。
这种方法与事实检查任务的工作流程非常吻合。然而,传统的事实核查方法往往出于实用性考虑而采用了简化假设,导致在应用于复杂的现实世界场景时有可能会出现偏差。
在认识到这些限制因素以后,一些研究者提出,要更加重视真实世界的场景,即从时间受限、未经整理的网络资源中获取证据。
他们首创了一种全自动的工作流,集成多个组成部分,包括原始文档检索、细粒度检索、真实性分类等等。
当然,还有不少其他研究者提出了另外一些办法,比如FACTSCORE,专门用于长文本生成的细粒度事实度量。
其它方法还包括不确定性估计,如下图所示。
有关忠实度幻觉的检测,也有不少相关研究,如下图所示。
其中包括基于事实度量:通过检测生成内容与源内容之间的事实重叠度来评估忠实度。
基于分类器的度量:利用经过训练的分类器来区分生成内容与源内容之间的关联程度。
基于QA的度量方法:利用问题解答系统来验证源内容与生成内容之间的信息一致性。
不确定性估计:通过测量模型对其生成输出的置信度来评估忠实度。
基于prompt的度量方法:让LLM充当评估者,通过特定的prompt策略来评估生成内容的忠实度。
之后,哈工大团队还将较为前沿的减轻幻觉的方法进行了整理,针对上述提到的各类问题,分别提供可行的解决办法。
总结
总而言之,在论文的最后,哈工大的研究人员表示,在这份全面的综述中,他们对大型语言模型中的幻觉现象进行了深入研究,深入探讨了其潜在原因的复杂性、开创性的检测方法和相关基准,以及有效的缓解策略。
虽然开发者们在这个问题上已经有了不少进步,但大型语言模型中的幻觉问题仍然是一个令人关注的持续性问题,需要继续研究。
此外,本篇论文还可以作为推进安全可信的AI的指路明灯。
哈工大团队表示,希望通过对幻觉这一复杂问题的探索,为这些有志之士提供宝贵的见解,推动AI技术向更可靠、更安全的方向发展。
参考资料:
https://arxiv.org/abs/2311.05232
#LLM-FP4
这篇文章给出了大模型 FP 量化的解决方案。
大语言模型 (LLM) 压缩一直备受关注,后训练量化(Post-training Quantization) 是其中一种常用算法,但是现有 PTQ 方法大多数都是 integer 量化,且当比特数低于 8 时,量化后模型的准确率会下降非常多。想较于 Integer (INT) 量化,Floating Point (FP) 量化能更好的表示长尾分布,因而越来越多的硬件平台开始支持 FP 量化。而这篇文章给出了大模型 FP 量化的解决方案。文章发表在 EMNLP 2023 上。解决LLaMA、BERT等部署难题:首个4-bit浮点量化LLM来了
- 论文地址:https://arxiv.org/abs/2310.16836
- 代码地址:https://github.com/nbasyl/LLM-FP4
要了解本文,必须要先具备基本的有关 Floating Point Format 以及 Floating Point Quantization 的知识,首先 Floating Point Number 可以用以下公式表示:
s 代表正负符号位 (sign bit),m 代表尾数位 (mantissa bits),e 代表指数位 (exponent bits)。p 是一个介于 0 到 2^e - 1 之间的值,用来表示当前数字该被划分到哪一个指数区间,d 取 0 或 1 的值,用来表示第 i 个 mantissa bit。b 是 bias,一个用来调整 exponent 区间的整数值。
接下来介绍 Floating Point Quantization 是怎么运作的,首先输入值必须经过一个 scale and clip 的步骤,先把 input clip 到 Floating Point 能表示的最大区间 (±Qmax),如以下公式所示:
可以看到类似于 integer 量化,FP 量化也会加入一个 full-precision 的缩放因子 (scaling factor) 来缩放 input 到合适的区间。而缩放因子在运算矩阵乘法的时候,和低比特的矩阵乘法分开计算,所以并不会造成很大的 overhead。融入了这个 full-precision 的缩放因子之后,不同的 quantized tensor 能够被相应地 clip 到不同的最大最小值区间。在实际使用过程中,会根据输入 tensor 的值域确定需要的量化区间,然后利用公式 (4) 推导出相对应的 bias。注意公式 (4) 里的 bias 可以被用作实数值的缩放因子,见公式 (2)(3)。
Floating-Point Quantization 的下一个步骤是在决定好量化区间后把区间内的值分配到相对应的量化区间内,这个步骤称为 Compare and Quantize:
上图直观说明了量化的过程,当前的输入值,在用公式 5 比较过后,量化到不同的量化区间中。
在得到量化过的 activation 和 weight 后,这里的 scaling factor 提到前面先计算,而达到如下的 efficient matrix multiplication,完成矩阵乘法的加速:
接着本文指出 FP 量化的准确度,和 exponent bits 的设定以及量化的区间息息相关。
如下图所示,不同的 FP format (浮点数的指数位 / 尾数位设定) 之间存在巨大的量化误差差异,只有当选取合适的 FP format 时,FP Quantization 比 INT Quantization 能更好的表示长尾分布。这个现象也在之前的论文中得到验证 [1]。
而这篇文章提出了对应的解决方案,用一个 search-based 浮点量化算法,统筹搜索出最适合的浮点数的指数位 / 尾数位设定以及对应的量化区间。
除此之外,另一个同时出现在各种不同类别 Transformer 模型 (Bert,LLaMA,ViT) 中的现象也会严重影响量化的难度:那就是模型的 activation 中不同 channel 之间的数量级会有很高的差异,而同 channel 之间的量级十分一致。之前 LLM.int8 [2] 和 SmoothQuant [3] 也有类似的发现,不过这篇文章指出这个现象不仅仅存在于 LLM 中,并且在其他 Transformer 模型里也有类似现象 如下如所示,LLaMA 与 BERT 以及 DeIT-S 中的 activation 的分布都发现了类似的现象:
从图中可以看到,那些异常大的 channel 都比剩余的 channel 大很多,所以在量化 activation tensor 的过程中,量化的精度很大程度会被这些异常值决定,从而抑制其他 channel 值的量化区间,最终降低整体影响量化精度。这会导致量化的最终结果崩坏,尤其当比特数降到一定程度的时候。值得注意的是,只有 tensor-wise 和 token-wise 量化可以在 efficient matrix multipilication 的时候将 scaling factor 提取出来,而 channel-wise 量化是不支持 efficient matrix multipilication 的,见下图。
为了解决这个问题,同时维持高效率矩阵乘法 (Efficient Matrix Multiplication),本文利用少量的校正资料集,预先算出 activation 的每个 channel 的最大值,从而计算缩放因子。然后将这个缩放因子一拆为二,拆解成一个 per-tensor 的实数乘以 per-channel 的 2 的幂。而这个 2 的整数次方即用 FP 里的 exponent bias 表示。完整的过程可以用以下公式表示:
进一步地,在 calibration 完成之后,这个 per-channel exponent bias 就不再变化,因此可以和 weight quantization 一起进行预计算 (pre-compute),将这个 per-channel exponent bias 整合进量化后的 weights 中,提高量化精度。完整的过程如以下公式:
可以看到在 pre-shifted 后,原本 activation 中的 full-precision per-channel biases 的位置变成了一个 tensor-wise 的实数 scaling factor ,而被拆解出来的整数 per-channel biases 被移到了 weight 中原本 integer bias 的位置,如公式 4。
从而这个方法 (pre-shifted exponent bias) 能在维持 efficient matrix multiplication 的原则下,更好得提高量化精度,方法的直观展示如下图所示:
最后本文展示 Floating Point Quantization (FPQ) 方法,在 LLaMA, BERT 以及 ViTs 模型上,4-bit 量化皆取得了远超 SOTA 的结果。特别是,这篇文章展示了 4-bit 量化的 LLaMA-13B 模型,在零样本推理任务上达到平均 63.1 的分数,只比完整精度模型低了 5.8 分,且比之前的 SOTA 方法平滑量高出了 12.7,这是目前少数已知可行的 4-bit 量化方案了。
#LLM~端侧方案
端侧LLM毫无疑问会成为各手机厂商在2024年的主战场。从国内各手机厂透露的信息来看,大家几乎都把希望寄托在了芯片厂身上,自身能做的、会做的工作太少。希望苹果的工作对国内厂商们有启发、借鉴意义。
论文链接:LLM in a flash: Efficient Large Language Model Inference with Limited Memory
1. Flash Memory and DRAM
在移动端设备中(如手机),DRAM可理解为“运行时内存”,Flash Memory可理解为“存储空间”。做一个简单的类比,在PC中,DRAM对应于内存;Flash Memory对应于硬盘存储(注意:仅仅是对应于,实现方案并不一样)。
在通常的LLM推理阶段,LLM都是直接加载到DRAM中的。一个7B半精度LLM,完全加载进DRAM所需的存储空间超过14GB。考虑到目前主流手机的DRAM最高也就16GB的水平,在端侧直接使用DRAM来加载7B LLM面临巨大挑战。
图1给出了一个移动端标准的存储结构示意图。
图1 移动端存储结构示意图
Flash Memory的特点是大存储,低带宽。也就是说,Flash Memory可存储的内容多(图中的100GB),但数据传输速率低(图中的1GB/s)。而DRAM的特点是小存储,高带宽。
现在的问题是:模型大小 > DRAM,所以无法将模型全部加载进DRAM。
苹果的解决方案是将LLM放在Flash Memory中,在每次需要进行推理时,仅仅将部分必要参数加载到DRAM中。
苹果的整个方案重点解决两个问题:
- 如何快速识别出哪些模型参数是必要的
- 考虑到由Flash memory到DRAM的带宽较低,如何加快由Flash memory到DRAM的传输效率
论文中从三个不同方面做了尝试,下面分别介绍。
2. 减少数据传输量
这部分介绍论文中采用的三种降低数据传输量的方法。
2.1 方法一:Selective Persistence Strategy
对于常见的LLM而言,它的模型参数主要由Attention参数和MLP参数两部分构成,其中Attention参数占比约为1/3,MLP参数占比约为2/3。除此,还有参数量级可忽略不计的Embedding层的参数。
因为Attention参数量相对较少,所以苹果的方案是将Attention参数和Embedding层的参数直接加载到DRAM中。
这就是所谓的Selective Persistence Strategy,其意为:有选择性地把部分参数常驻在DRAM中。而这部分常驻的参数就是Attention参数和Embedding参数。原因是因为它们占比较小。
2.2 方法二:Anticipating ReLU Sparsity
这里主要借鉴了DejaVu的思路:MLP层的输出只有不到10%的值是激活状态(不为0)。一般把这种现象称为稀疏性。稀疏性越强,则非激活状态的值就越多。
所以我们也可把这句话“MLP层的输出只有不到10%的值是激活状态”简写作“MLP层的稀疏性超过90%”。
要注意,此处的稀疏性一般称为“Contextual Sparsity”。也就是说,MLP层的哪些神经元会激活,与当前的输入相关。
苹果照搬了DejaVu的方法,使用一个两层MLP来预测哪些神经元会激活。方法也很简单,假设神经元个数为4096,只需要将MLP的输出层的大小设为4096,并为每一个输出使用sigmoid来做一个二分类即可(“选择”or“不选择”)。
注意1:不同Transformer层使用的预测模型不同。
注意2:同一个Transformer层中的MLP一般有两层。它们的激活神经元始终保持相同。
在能够准确预测的前提下,每次在推理时动态加载预测为激活神经元对应的参数即可。
这里有对DejaVu详细介绍的文章:[ICML'23] DejaVu:LLM中的动态剪枝
2.3 方法三:Sliding Window
根据2.2小节中介绍的稀疏性可知,在每一次LLM进行前向推理时,它都需要使用模型预测每一个MLP层中激活神经元的编号,并将所需的神经元所对应的权重由Flash memory加载到DRAM中。
因为LLM的推理阶段是逐token进行的,这意味着在生成不同token的时候,需要加载到DRAM中的MLP的参数也不同。
这就是Sliding Window的核心思想:保留处理过去k个token时的激活神经元所对应的参数在DRAM中,并在处理当前token时只对:1)部分多余的参数进行删除;2)缺少的参数进行加载。图2是原文中的示意图。
图2 Sliding Window示意图
图中上图表示在处理当前token “Was”之前,前5个token(k=5)的激活神经元(淡蓝色偏绿部分)。图中下图表示在处理当前token “Was”之时,需要新加入的神经元(蓝色部分)和需要删除的神经元(分红部分)。
Sliding Window的核心假设是LLM在处理相邻token时产生的稀疏性具有相似性。原文没有仔细分析和论证这个假设。
3 提高传输吞吐量
3.1 Bundling Columns and Rows
通常LLM中的MLP层包含两个全连层。在忽略激活函数的情况下,这两个全连层可以写为:
图3 将两个全连层的列与行拼接存储
这样做的好处是原本需要两次I/O,现在只需要一次了。虽然总的数据读取量并没有变,但读取大块、连续的数据会比读取大量小块、非连续数据更加高效,因此整体传输吞吐量提升了。
3.2 Bundling Based on Co-activation
这是一个原文尝试过,但被验证为无效的策略。既然原文提到了,所以这里也罗列出来。
原文中猜测某些神经元之间可能存在一些紧密联系。比如对于两个神经元a和b,当a激活时,b也会激活(或者当b激活时,a也会激活)。
因此可以通过分析来找到每个神经元的“closest friend”(与该神经元同时激活频率最高的其它某个神经元)。然后在存储Flash memory中存储时,也将它们的参数拼接存在一起。这样的读取效率更高。
但该方法之所以无效,主要原因是可能会存在某个神经元i,它是其它很多神经元的“closest friend”。这样导致的问题则是神经元i被额外传输了太多次,导致实际的I/O成本增加了。
4 Optimized Data Management in DRAM
虽然DRAM的数据读取速度比Flash memory快很多,但当需要对其中数据进行大量、高频读写时,它的时耗仍然不可忽略。在本文介绍的内容中,对DRAM的读写主要发生在对MLP层中所需神经元对应参数的删除与新增(参考图2)。
为此,论文中设计了一种特殊的数据结构来对DRAM中的数据做精细化管理。该数据结构的核心变量如下:
- Matrix:按照“Bundling Columns and Rows”的方法存储激活神经元所对应的参数
- bias:激活神经元所对应的bias参数
- num_used:激活神经元的个数
- last_k_active:过去k个token所对应的激活神经元编号
- Pointer:当前行参数对应的神经元编号
图4 Optimized Data Management in DRAM
通过预分配一个足够大的空间,可以避免因反复分配而导致的额外开销。下面来说明基于该数据结构的一些操作的高效实现方法。
该矩阵中的行对应的是当前存储在DRAM中激活神经元的参数。前文提到(2.3小节),当处理新的token时,需要将不会被激活的神经元删除,并添加新的会被激活的神经元。所以最重要的两个操作是“删除”和“新增”。
当需要删除某个神经元时(如图4中左图标红部分,对应的是编号为10的神经元),只需将num_rows的数量减1,并将最后一行Copy至被删除行,结果如图4的中图所示。虚线框表示当前有效的数据。
当需要“新增”时,直接将其对应的参数由Flash memory中copy至该矩阵中即可,无需额外分配存储空间。
5. 实验结果
苹果这篇paper的主要关注点在于:让LLM在运行时内存受限的情况下能高效地跑起来。所以论文的实验主要对比了各种情况下I/O导致的时耗,如下图所示。
图5 实验结果
图5中的实验使用的是OPT 6.7B模型,半精度。表中第一行和第二行都是基准baseline。第一行假设初始模型全部在Flash memory中,那么为了完成一次完整的推理,需要将模型全部加载一遍,整个I/O耗时2130ms。
第二行对应于假设模型有一半参数提前在DRAM中的整个加载耗时。
第三行到第五行对应于应用了Predictor(2.2小节)、Windowing(2.3小节)和Bundling(3.1小节)后对应的耗时。
效率提升非常明显。