上一篇文章 中,我们已经介绍了文本生成基于统计的集中评测方法:BLEU、Rouge、Meteor、TER 等方法。除了这些基于统计的自动评测方法,随着 word2vec 技术的兴起,各种基于语义表示的评测方法也逐渐被提出,接下来,我们就介绍一些基于语义表示的评测方法。
基于语言模型的评估方法: PPL
应用场景
PPL(困惑度)一般用于评价语言模型,算的是一个句子流畅度的概率。正常来说,我们在训练一个生成模型的时候,最后都能得到 ppl的值。
计算方法
PPL 给定句子 S,包含 了 N 个单词 w1,w2,...,wN,则语言模型判断产生第 i 单词的概率为 p(wi) = p(wi|w1, w2, ...wi−1),语言模型越好,产生句子的概率越大,本质上就是在计算一个马尔科夫链的概率。
- 困惑度计算方法:
<math xmlns="http://www.w3.org/1998/Math/MathML"> P P L = P ( w 1 , w 2 , . . . w N ) ( − 1 / N ) PPL=P(w1,w2,...wN)^{(-1/N)} </math>PPL=P(w1,w2,...wN)(−1/N)
<math xmlns="http://www.w3.org/1998/Math/MathML"> P = ∏ i = 0 n p ( w i ∣ w k , 0 < = k < = i ) P = \prod \limits_{i=0}^{n} p(w_i|w_k,0<=k<=i) </math>P=i=0∏np(wi∣wk,0<=k<=i)
其中,P 代表 P(w1, w2, ...wN ) 的计算方法,P 表示当前词序列构成一个自然语言句子的概率,用每个位置对应词的采样概率之乘表示。其实,困惑度本质上是在算句子的平均交叉熵。
- 离线评估方法
- 需要先训练一个 indomain 的 language model
- 利用训好的language model,做 inference 做模型概率评估
基于词向量表示
应用场景
词向量的表示评估方法,是计算句子中词向量的距离,评估是否相似。但实际应用中,比较少用这种方法来评估。因为一般训练模型的时候,我们已经能得到一个比较好的表示了,并且是 in-domain数据训练的表示,这会比直接用词向量表示效果更好。因此下面简单介绍一下这种方法,作为了解即可。
评估方法
基于词向量的表示,其实是在word2vec 技术兴起之后,被提出的一种评估方法。因为传统的统计指标,只能根据句子判断评估相似度,没有语义方面的度量。而 word2vec 将词从离散空间,表示到一个低维连续空间,用向量的方法表示词语,并且相似词语在空间中的距离更近。
embedding average
embedding average 方法是比较常见的一种方法,思路也比较简单,就是先算出句子中,每个词向量的加权平均,然后得到句子表示,再利用余弦相似度来计算两个句向量之间的相似度。
- 计算方法
<math xmlns="http://www.w3.org/1998/Math/MathML"> e r = ∑ w e w / ∣ ∑ w e w / ∣ e_r = \sum_{w}e_w/|\sum_{w}e_w/| </math>er=∑wew/∣∑wew/∣
<math xmlns="http://www.w3.org/1998/Math/MathML"> c o s = e r ∗ e g cos = e_r * e_g </math>cos=er∗eg
- 最终cos余弦计算句子相似度。e_r 一般用 word2vec 直接获取词向量。
基于bert表示的评估方法
应用场景
bert 的提出,是nlp发展史的一个里程碑。由于 bert 强大的表征能力,自然会想到利用 bert 来评估文本生成,希望 bert 利用强大的表征和理解能力,达到与人工评测接近的水平。可以用于各种生成、翻译的任务;但对image多模态下的评估任务表现比较差一点。
方法介绍
bertscore
-
核心思路
- 整体想法就是利用 bert 做表征提取,然后计算两个句子的相似矩阵,用相似矩阵做最大似然的加权平均得到相似度。这里权重引入了idl的方法。
-
计算方法
<math xmlns="http://www.w3.org/1998/Math/MathML"> G b = ∑ x i m a x X i ∗ X j T ∗ i d f ( x i ) / ∑ x i i d f ( x i ) G_{b} = \sum_{x_i} max X_i*Xj^T *idf(x_i)/\sum_{x_i}idf(x_i) </math>Gb=∑ximaxXi∗XjT∗idf(xi)/∑xiidf(xi)
<math xmlns="http://www.w3.org/1998/Math/MathML"> i d f ( w ) = − l o g 1 / M ∗ ∑ ∏ [ w ∈ x i ] idf(w) = -log1/M *\sum \prod [w∈ x^{i}] </math>idf(w)=−log1/M∗∑∏[w∈xi]
其实就是两个句子的点积,加上了一个 idf 的权重。
-
应用
- 安装:
pip install bert-score
- 还可以看相似度矩阵:
plot_example(cands[0], refs[0], lang="en", rescale_with_baseline=True)
- 计算 p、r、f1
- 安装:
arduino
from bert_score import score
with open("hyps.txt") as f:
cands = [line.strip() for line in f]
with open("refs.txt") as f:
refs = [line.strip() for line in f]
P, R, F1 = score(cands, refs, lang='en', verbose=True)
除了 bertscore 之外,还有一些一些将 BLEU 和 bertscore 思路融合的方法, 例如 BlueRT,将bleu、rouge、meteor等信息作为预热信息加入到模型训练过程,可以更好的增强文本的鲁棒性,此外不是直接算乘积,而是将一个句子过一个线形层,再和另一个句子算相似度。
总结
本文介绍了三种不同于统计方法的文本评估思路,这三种思路其实也代表了 nlp 技术发展的历程: 从语言模型、基于 word2vec 的词向量表示、基于 bert 的句子表征。神经网络的兴起,是的评估任务不再只是关注流畅度和词片段,更加关心整个句子的含义,是否有被机器清晰表达出来。
然而在实际业务评测中,发现目前的句子表征,对相似但语义不同的句子,很难评估是否语义相近。因为模型还不能完全取代人类评估,对比较复杂的场景很难制定评测标准。因此还需要针对实际业务,做一些评估标准的制定,更好的对模型的能力、可用性做公正的判断。
在下一篇文章中,我将介绍一些在实际业务场景中,常用的评估方法。