Github:https://github.com/nayeon7lee/FactualityPrompt
目前一个很大的挑战是如何评估模型的事实性,尤其是开放文本生成领域内,其需要涉及到定位真实知识在无数个世界知识内的位置。对于知识资源,我们选择wikipedia。
主要构建factual和nonfactual prompts。
挑选FEVER数据集的验证集作为评估数据。
FEVER is a fact-checking dataset consisting of claims that are SUPPORTED, REFUTED or unverifiable (NOTENOUGHINFO) by Wikipedia documents. These claims are created by annotators who were asked to alter or paraphrase the sentences from Wikipedia. We leverage the SUPPORTED and REFUTED claims from FEVER validation set
FEVER相关工作:《FEVER: a large-scale dataset for fact extraction and verification》
当模型生成出一段文本时,我们需要准备相关的事实知识来评估这个文本的事实性。
我们将知识分为document-level和sentence-level两种类型:
(1)NE-related metric
如果模型生成出了一短文本,其中包含了一个实体,但是这个实体没有在ground truth knowledge中出现过,我们认为这个实体是幻觉的
相关论文:Entity-level factual consistency of abstractive text summarization
NE Error:a model is hallucinating (making factual errors) if it generates a NE that does not appear in the ground-truth knowledge source.
N
E
E
R
=
∣
H
A
L
L
N
E
∣
∣
A
L
L
N
E
∣
NE_{ER}=\frac{|HALL_{NE}|}{|ALL_{NE}|}
NEER=∣ALLNE∣∣HALLNE∣
判断生成的文本中的实体以及其是否存在ground truth knowledge中,采用spacy进行实体匹配。
该指标越小越好。
(2)Entailment Ratio
参考NLI的思想,即判断模型生成的文本与ground truth knowledge是否存在蕴含关系。
E
n
t
a
i
l
R
=
∣
E
N
T
A
I
L
g
e
n
∣
∣
A
L
L
g
e
n
∣
Entail_{R}=\frac{|ENTAIL_{gen}|}{|ALL_{gen}|}
EntailR=∣ALLgen∣∣ENTAILgen∣
NLI模型直接选择现有的基于RoBERTa在MNLI上微调的的NLI模型:https://pytorch.org/hub/pytorch_fairseq_roberta/
该指标越大越好
(3)Generation Quality Evaluation
评价指标的相关性分析
上述提出的两个knowledge方面的指标是否与人类的事实评价具有相关性呢?我们随机挑选200个样本,并获得NE和Entail两个指标,同时也让标注人员从这两个方面对样本生成的内容进行打分;
与人类相关性如图所示:
我们对 530B LM greedy生成的事实错误进行了定性分析,以了解当解码选择的随机性受到严格限制时,剩余的错误是什么。
为了能够在生成的质量(Diversity和Repetition)和事实性上进行trade-off,我们需要改进现有的生成采样策略。
模型的生成是逐个字符生成的,因此如果模型在没有任何prefix的前提下生成文本时,生成的最开始阶段的一些词是不会存在幻觉的,而随着不断地生成过程中,后面生成的词会促使整个文本产生幻觉。
There is no preceding text at the start of a sentence, so it is safe for LM to generate anything as long as it is grammatical and contextual.
例如“Samuel Witwer’s father is”是一个nonfactual文本,但是当后面生成了“Lutheran minister”时,就导致了幻觉问题。
为了缓解这个问题,提出一种动态的necleus probability
p
p
p:
p
t
=
max
{
ω
,
p
×
λ
t
−
1
}
p_t=\max\{\omega, p\times\lambda^{t-1}\}
pt=max{ω,p×λt−1}
不同的消融以及对应不同prompt的实验结果:
(1)Prepending TopicPreifx
对于一些语料,有一些含有人称代词He、She等,导致并不知道He具体是谁。而往往为了降低GPU显存,通常采用chunk机制,导致很多文档被分割化,这些被分割后的文档可能只有一些代词,这会导致信息“碎片化”,并导致出现在具有相似上下文的独立文档中的实体的错误关联。
为了解决这个问题,在每个document之前都拼接一个前缀。例如wikipedia语料中,每个trunk之后的文本前都拼接一个对应于wikipedia的页面title(一般wikipedia页面的title都是entity)作为topic prefix。即告诉模型这段话讲的是什么entity。
(2)Sentence Completion Loss
我们认为,LM 被统一训练来预测句子中的每个子词标记,而确保句子后半部分的正确预测对于事实性更为关键。
因此,在训练阶段设置一个句子补全的loss。对于一个句子,获得一个划分点,划分点之后的部分计算loss。
划分点可以有三种策略:
我么推荐使用第一个。
实验结果如下所示:
可以发现,当同时结合使用Factual Nucleus 和两个ContinualPre-training策略时,提升了模型的事实性。
sentence completion loss可以认为是让模型更加关注句子后半部分,因为前半部分的句子通常不会产生幻觉,可以认为是初期阶段构造上下文,而后半部分的生成的内容会有很大概率与前半部分产生冲突,因此期望模型更加关注后半部分的生成。