SelfCheckGPT_Neural Path Hunter
SELFCHECKGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models
大语言模型会产生幻觉并输出虚假的内容,这对于我们的医疗GPT是需要尽量杜绝的。现有的检查方法要么需要访问输出概率分布,要么需要通过单独的、复杂的接口访问外部数据库。因此在这项工作中,作者提出了一种简单的,基于采样的方法,可以以零资源的方式对黑盒模型进行事实性检查,而不需要外部数据库。其基本思想是:如果LLMs了解给定的概念,那么采样的响应应当是相似的,并且包含一致的事实信息。然而,对于幻觉的内容,随机抽样到的响应可能会彼此矛盾。
以往方法
以往的工作中,大家主要从不确定性角度分析了幻觉现象产生的原因:在预训练和微调阶段,假如某个知识被多次提及,那么模型就可以记住这个知识,并在推理阶段输出具有极高可能性以及极小熵的token;相反的,如果某个知识未曾提及,那么模型就要从一个更加平坦的概率分布中采样出结果,这样的结果具有很高的不确定性,极有可能包含幻觉内容。基于这样的分析,就有了以往工作中常用的灰盒测试————利用词表中的某个词在某个token出现的概率以及对应的熵来评估文本,并进一步判断是否是幻觉。GPT-3等大语言模型在输出文本的时候就可以输出每个token的概率,便于我们计算概率及熵,如下图所示。
在这样的灰盒测试中,常用的评价指标有四个:
$$
\begin{aligned}
\mathrm{Avg}(-\mathrm{log},p)&=-\frac{1}{J}\sum\mathrm{log},p_{ij}\\
\mathrm{Max}(-\mathrm{log},p)&=\mathrm{max}(-\mathrm{log},p_{ij})\\
\mathrm{Avg}(\mathcal{H})&=\frac{1}{J}\sum\mathcal{H}_{ij}\\
\mathrm{Max}(\mathcal{H})&=\mathrm{max}[\mathcal{H}_{ij}]\\
\end{aligned}
$$
其中,$i$代表所有采样响应中的第$i$个句子,$j$代表第$i$个句子中的第$j$个token,$J$代表句子中token的数目,$p_{ij}$代表词表$\mathcal{W}$中的某个单词在这句话这个token被输出的概率,$\mathcal{H}_{ij}=-\sum_{\tilde{w}\in\mathcal{W}} p_{ij}(\tilde{w})\mathrm{log}, p_{ij}(\tilde{w})$展示了熵的定义。
SelfCheckGPT
SelfCheckGPT实际上使用了一个混合模型框架,结合了BERTScore、mutiple-choice question answering generation、n-gram这三种方法,通过计算三者的归一化分数组合来获得最后的结果。具体来说,首先先要获得一个给定的用户query以及LLM产生的相应的response,然后再针对同样的query额外采样多个响应。接着评价response和这些额外响应之间的一致性,$\mathcal{S}(i)$越接近1则越可能是幻觉,越接近0则越可能是真实信息。下面分别介绍这三种方法:
BERTScore
该方法计算了一个句子跟额外响应中与其最相似句子的平均BERTScore(对于候选文本(candidate)和参考文本(reference)都做token级别的编码,进而根据token编码的余弦相似度计算token级别的Precision,Recall和F1。由于是采用了余弦相似度,解决了精准匹配带来的死板问题。此外由于BERT编码会考虑上下文,所以每个token的编码已经融合了上下文信息,所以可以不用考虑n-gram级别的匹配)。其公式如下所示:
$$
\mathcal{S}_{\mathrm{BERT}}(i)=1-\frac{1}{N}\sum_{n=1}^{N}\mathrm{max}(\mathcal{B}(r_i,s_k^n))
$$
其中$r_i$表示response中的第$i$句,$s_k^n$表示第$n$个额外响应中的第$k$句话,$\mathcal{B}$表示BERTScore。
QA
该方法使用了一个automatic multiple-choice question answering generation (MQAG)框架,这个框架由一个QA生成系统G1,一个干扰项生成系统G2,一个回答系统A组成。作者首先使用G1为参考文本生成qa对,然后使用G2根据参考文本和qa对生成其他干扰项,并将a和干扰项拼接获得候选项o,接着使用A根据问题q和候选项o分别为参考文本和额外采样文本生成答案。到此为止,系统中有了参考文本,额外采样文本,问题q,参考回答a,候选项o以及额外采样文本的回答a2,于是接下来就可以计算参考回答和额外采样文本回答之间是否匹配,将匹配的数目记为$N_m$,不匹配的数目记为$N_n$,最后根据匹配数目占据的比例即可获得$\mathcal{S}_{QA}(i)$。SelfCheckGPT中QA部分的整体流程如下图所示:
n-gram
该方法使用response以及额外的响应训练了一个简单的n-gram模型,然后分别计算平均和最大的负对数概率,公式分别如下所示:
$$
\begin{aligned}
\mathcal{S}_{\mathrm{n-gram}}^{\mathrm{Avg}}(i)&=-\frac{1}{J}\sum\mathrm{log},\tilde{p}_{ij}\\
\mathcal{S}_{\mathrm{n-gram}}^{\mathrm{Max}}(i)&=\mathrm{max}(-\mathrm{log},\tilde{p}_{ij})
\end{aligned}
$$
Neural Path Hunter: Reducing Hallucination in Dialogue Systems via Path Grounding
为了缓解对话系统中的幻觉问题并提高其忠实性,作者在这项工作中遵循了生成-细化的策略来使用knowledge graph生成更好的响应。具体来说,Neural Path Hunter利用一个单独的token级的critic来识别幻觉来源,然后在接下来的由两个LM组成的链的细化阶段中通过发送一个在k跳子图上传播的查询信号来检索正确的实体。Neural Path Hunter的整体流程如下图所示:
作者认为从知识图谱的角度来讲,如果LLMs生成的文本无法被某个实体周围的k跳子图中的有效路径所支持,那它就是幻觉。于是作者设计了一个对话修缮系统,能够修复生成的话语,使它们在给定的对话历史中具有语义相关性,并在提供的KG中得到支持,这个系统由两部分组成:token级幻觉批判器以及实体提及检索器,前者标记并mask掉现有响应中的幻觉实体,后者接受由前者识别的掩码表示,并构建这些token的上下文表示,然后通过在知识图谱上进行查询来检索更忠实的实体。我们使用$\mathcal{D}=(x_1,\ldots,x_n)$来表示历史对话,用$\mathcal{K}_n=(t_1,\ldots,t_j)$来表示知识图谱中的三元组,用$x_{n+1}$表示本轮生成的响应。
token级幻觉批判器
根据以往的工作,可以知道大多数幻觉错误通常与实体相关,因此作者设计了一个token级别的判别器C,输入$\mathcal{D},mathcal{K},x_{n+1}$,输出幻觉实体提及标记$M_c$。这是一个序列二分类任务,要为每个位置赋予一个标签来指出其是幻觉还是真实信息。使用的数据集是通过两种方法改造的参考对话数据集,这两种方法分别是将实体替换为同类但是未在历史对话及知识图谱中出现过的实体(Extrinsic)以及交换三元组中的两个实体的位置(Intrinsic)。构造好数据集之后需要将LLMs在这个二分类人物上进行微调。
实体提及检索器
作者使用CompGCN(用于多关系图,即带有多种类型的有向图)模型构建了知识图谱。此外,在该模块中首先要根据$\mathcal{D},mathcal{K},M_c$来获取幻觉实体的上下文隐状态表示H,接着对其使用最大池化操作获得每个实体的表示h,然后将其与检索到的上一个实体的embedding拼接并送入自回归语言模型LM之中获得对应的查询,最后根据查询嵌入从知识图谱中检索出得分最高的实体(分数由DistMult函数获得)即可。
NPH方法的具体示意图如下所示: