[隐藏左侧目录栏][显示左侧目录栏]

评估指标#

1、BLEU#

1.1 基本公式#

BLEU 的计算公式如下:

\begin{equation}\text{score} = \frac{\sum_{C \in \{\text{Candidates}\}}\sum_{\text{n-gram} \in C} \text{Count}_{\text{clip}}(\text{n-gram})}{\sum_{C^{\prime} \in \{\text{Candidates}\}}\sum_{\text{n-gram}^{\prime} \in C^{\prime}} \text{Count} (\text{n-gram}^{\prime})}\end{equation}

其中 \{\text{Candidates}\} 表示机器翻译生成的多条样本,当然在这里举的例子中只有一条样本;\text{n-gram} 表示对文本做 n-gram 之后得到的结果,在 BLEU 中n一般取值为 \{1,2,3,4\}\text{Count}_{\text{clip}}(\text{n-gram}) 表示机器翻译生成的样本中做 n-gram 之后得到的结果中有多少个出现在人工标注的译文中;\text{Count}(\text{n-gram}^{\prime}) 表示机器翻译生成的样本做 n-gram 之后总共有多少个。所以看起来 BLEU 计算的是准确率。

1.2 举例说明计算方式#

下面以机器翻译为例,举例说明如何计算 BLEU 的值。

原始待翻译的文本为法语,文本如下:

J’ai mangé trois filberts.

要翻译成的语言是英语,下面两句是上述法语的人工标注译文:

I have eaten three hazelnuts.
I ate three filberts.

下面这句是机器翻译模型生成的翻译结果:

I ate three hazelnuts.

计算 1-gram 的分值

机器翻译生成的结果做 1-gram 得到的结果为:

['I', 'ate', 'three', 'hazelnuts']

人工标注的译文做 1-gram 得到的结果为:

['I', 'have', 'eaten', 'three', 'hazelnuts']
['I', 'ate', 'three', 'filberts']

可以看出机器翻译生成的结果做 1-gram 之后得到的结果中出现在人工标注译文中的个数为 4 个,机器翻译生成的结果中也是 4 个,所以得分为 4/4 = 1.0

计算 2-gram 的分值

机器翻译生成的结果做 2-gram 得到的结果为:

['I ate', 'ate three', 'three hazelnuts']

人工标注的译文做 2-gram 得到的结果为:

['I have', 'have eaten', 'eaten three', 'three hazelnuts']
['I ate', 'ate three', 'three filberts']

可以看出机器翻译生成的结果做 2-gram 之后得到的结果中出现在人工标注译文中的个数为 3 个,机器翻译生成的结果中也是 3 个,所以得分为 3/3 = 1.0

计算 3-gram 的分值

机器翻译生成的结果做 3-gram 得到的结果为:

['I ate three', 'ate three hazelnuts']

人工标注的译文做 3-gram 得到的结果为:

['I have eaten', 'have eaten three', 'eaten three hazelnuts']
['I ate three', 'ate three filberts']

可以看出机器翻译生成的结果做 3-gram 之后得到的结果中出现在人工标注译文中的个数为 1 个,机器翻译生成的结果中是 2 个,所以得分为 1/2 = 0.5

计算 4-gram 的分值

机器翻译生成的结果做 1-gram 得到的结果为:

['I ate three hazelnuts']

人工标注的译文做 1-gram 得到的结果为:

['I have eaten three', 'have eaten three hazelnuts']
['I ate three filberts']

可以看出机器翻译生成的结果做 4-gram 之后得到的结果中出现在人工标注译文中的个数为 0 个,机器翻译生成的结果中是 1 个,所以得分为 0/1 = 0.0

最终的 BLUE 的得分是 1-gram、2-gram、3-gram、4-gram 的平均得分,即 (1.0 + 1.0 + 0.5 + 0.0) / 4 = 0.625

由上面的例子可以看出,在做 n-gram 划分时,随着 n 的增大得分越来越低。这个是很直观的,当 n 非常大时就等于是要求生成的结果必须和人工标注的译文一摸一样才能得分。

1.3 BLEU 优缺点#

上述描述 BLEU 在计算时要分别计算 1-gram、2-gram、3-gram、4-gram 然后再取均值,如果只计算 1-gram 会有什么问题?使用如下例子进行说明。

待翻译的法语文本和人工标注的英文译文还是上述描述的不变,假设现在机器翻译生成的结果如下所示:

three three three three three

将该机器翻译生成的结果做 1-gram 得到的结果为:

['three', 'three', 'three', 'three', 'three']

再放一下人工标注的译文做 1-gram 得到的结果为:

['I', 'have', 'eaten', 'three', 'hazelnuts']
['I', 'ate', 'three', 'filberts']

这样就会发现机器翻译生成的结果做 1-gram 之后得到的结果中出现在人工标注译文中的个数为 5 个,机器翻译生成的结果中也是 5 个,所以最终得分是 5/5 = 1.0。但是很明显这个翻译结果是非常差的,这个 1.0 的得分不是想要的。所以需要 2-gram、3-gram、4-gram,因为对于该例子来说这几项得分都是 0.0 分。

另外在本文描述 BLEU 公式的部分已经写了,BLEU 是在计算准确率,所以该指标不能很好的衡量召回的质量。使用如下例子进行说明。

待翻译的法语文本和人工标注的英文译文还是上述描述的不变,假设现在机器翻译生成的结果如下所示:

I ate

在这个生成的结果下,计算 1-gram、2-gram、3-gram、4-gram 的得分都是 1.0 分。

除了上述详细描述的两点以外,BLEU 还有如下优缺点:

优点:

  • BLEU 快速且易于计算,特别是与人工翻译速率模型输出相比的话尤为明显。
  • BLEU 无处不在,这使你将模型与同一任务的基准进行比较变得更为轻松。

缺点:

  • 它不考虑意义;
  • 它不直接考虑句子结构;
  • 它不能很好地处理形态丰富的语言;
  • 它与人类的判断并不相符;

2、ROUGE指标#

ROUGE指标总共有四种:\text{Rouge-N}\text{Rouge-L}\text{Rouge-W}\text{Rouge-S}。相比于 BLEU 计算的是准确率,ROUGE 指标计算的是召回率。

2.1 \text{Rouge-N} 指标#

\text{Rouge-N} 的全称为 N-gram Co-Occurrence Statistics。

简单来说 \text{Rouge-N} 就是将模型生成结果和标注结果按照 n-gram 划分后,计算召回率。公式为:

\begin{equation}\text{Rouge-N} = \frac{\sum_{S \in \text{ReferenceSummaries}}\sum_{\text{gram}_n \in S} \text{Count}_{\text{match}}(\text{gram}_n)}{\sum_{S \in \text{ReferenceSummaries}}\sum_{\text{gram}_n \in S} \text{Count}(\text{gram}_n)}\end{equation}

其中分子表示所有样本的标注结果按 n-gram 拆分后与生成结果按 n-gram 拆分后匹配上个数的和;分母表示所有样本的标注结果按 n-gram 拆分后的和。下面举例说明计算方式。

假设一个翻译任务,人工标注的结果如下所示:

the cat was under the bed

模型生成的结果如下所示:

the cat was found under the bed

人工标注的结果做 1-gram 之后的结果如下:

['the', 'cat', 'was', 'under', 'the', 'bed']

模型生成的结果做 1-gram 之后的结果如下:

['the', 'cat', 'was', 'found', 'under', 'the', 'bed']

可以看出上述公式的分子为 6,分母为 6,所以最终得分 \text{Rouge-N} = 6/ 6 = 1.0。至于 n 大于1时的计算方式和这个是类似的。然后和 BLEU 一样,n 越大,得分越低。

2.2 \text{Rouge-L} 指标#

\text{Rouge-L} 的全称为 Longest Common Subsequence。

无论 BLEU 指标还是 \text{Rouge-N} 指标使用的都是词袋模型,它们都不考虑词语之间的相对顺序,而 \text{Rouge-L} 指标则是考虑了词语之间的相对顺序。这个名字里的 L 表示的是Longest Common Subsequence(最长公共子序列:注意这个非连续的)。

计算公式如下所示:

\begin{equation}R_{lcs} = \frac{\text{LCS}(X, Y)}{m}\end{equation}
\begin{equation}P_{lcs} = \frac{\text{LCS}(X, Y)}{n}\end{equation}
\begin{equation}F_{lcs} = \frac{(1+\beta^2) R_{lcs} P_{lcs}}{R_{lcs} + \beta^2 P_{lcs}}\end{equation}

其中 X 表示人工标注的结果,Y 表示模型预测的结果,m 表示 X 的长度,n 表示 Y 的长度。\text{LCS}(X, Y) 表示 XY 的最长公共子序列,\beta 是一个超参数。

上述公式中的 \beta 的作用还不清楚是怎么回事。

下面举例说明 \text{Rouge-L} 指标如何计算。假设一个翻译任务,人工标注的结果如下所示:

the cat was under the bed

模型生成的结果如下所示:

the cat was found under the bed

人工标注的结果做 1-gram 之后的结果如下:

['the', 'cat', 'was', 'under', 'the', 'bed']

模型生成的结果做 1-gram 之后的结果如下:

['the', 'cat', 'was', 'found', 'under', 'the', 'bed']

可以得出 m=6n=7\text{LCS}(X, Y) = 6,代入到公式中:

\begin{equation}R_{lcs} = \frac{\text{LCS}(X, Y)}{m}=\frac{6}{6} = 1.0\end{equation}
\begin{equation}P_{lcs} = \frac{\text{LCS}(X, Y)}{n}=\frac{6}{7} = 0.86\end{equation}
\begin{equation}F_{lcs} = \frac{(1+\beta^2) R_{lcs} P_{lcs}}{R_{lcs} + \beta^2 P_{lcs}} = \frac{(1+\beta^2) * 1.0 * 0.86}{1.0 + \beta^2 \cdot 0.86}\end{equation}

假设超参数 \beta=1.0,则最终的得分为 F_{lcs} = \frac{2 * 1.0 * 0.86}{1.0 + 0.86} = 0.9247

2.3 \text{Rouge-W} 指标#

\text{Rouge-W} 的全称为 Weighted Longest Common Subsequence。

\text{Rouge-L} 指标虽然考虑了词语之间的相对顺序,但是由于其使用最长公共子序列,所以没有考虑到词语之间是否连续的问题。还是以机器翻译为例,假设人工标注的文本如下所示:

A B C D E F G

现在有两个机器翻译模型,翻译结果分别如下所示:

模型1:

A B C D H I K

模型2:

A H B K C I D

可以看出这两个预测结果和标注结果的最长公共子序列都是 "A B C D",不过该子序列在模型1的预测结果中是连续的,在模型2的预测结果中是不连续的,所以希望模型1的预测结果的得分要高于模型2的预测结果的得分。如果使用 \text{Rouge-L} 计算的话,得分是相同的。所以提出了 \text{Rouge-W} 指标。简单来说,\text{Rouge-W} 就是给连续匹配到的子序列更高的权重,最终让连续匹配的结果要比非连续匹配的结果得分更高一些。

\text{Rouge-W} 的计算公式如下:

\begin{equation}R_{wlcs} = f^{-1} \Big( \frac{\text{WLCS}(X, Y)}{f(m)} \Big) \end{equation}
\begin{equation}P_{wlcs} = f^{-1} \Big( \frac{\text{WLCS}(X, Y)}{f(n)} \Big)\end{equation}
\begin{equation}F_{wlcs} = \frac{(1+\beta^2) R_{wlcs} P_{wlcs}}{R_{wlcs} + \beta^2 P_{wlcs}}\end{equation}

其中函数 f(\cdot) 就是实现给予连续匹配的序列更高权重的函数,比如连续的、相邻的 xy 的权重 f(xy) 要比不连续的单独的 f(x)f(y) 的分值要高,即:f(xy) > f(x) + f(y)。函数 f^{-1}(\cdot) 是函数 f(\cdot) 的逆函数。\text{WLCS}(\cdot) 表示带有加权的最长公共子序列,这里加权的权重就是给连续匹配的子序列更高的权重。其他部分的计算和 \text{Rouge-L} 是一致的。

该算法还是比较复杂的,关于函数 f(\cdot) 和其逆函数 f^{-1}(\cdot) 更多的性质,以及其具体的公式。还有 \text{WLCS}(\cdot) 算法的细节,请看原始论文:https://aclanthology.org/W04-1013.pdf

2.4 \text{Rouge-S} 指标#

\text{Rouge-S} 的全称为 Skip-Bigram Co-Occurrence Statistics。

\text{Rouge-N} 中对文本做 2-gram 划分(也称 bigram 划分)时,都是连续的进行划分。在 \text{Rouge-S} 中使用的 skip-bigram 则是在划分时允许跳过一些词。下面先放上计算公式,然后举例进行说明如何计算。

\text{Rouge-S} 的计算公式如下:

\begin{equation}R_{skip2} = \frac{\text{SKIP2}(X, Y)}{C(m, 2)}\end{equation}
\begin{equation}P_{skip2} = \frac{\text{SKIP2}(X, Y)}{C(n, 2)}\end{equation}
\begin{equation}F_{skip2} = \frac{(1+\beta^2) R_{skip2}P_{skip2}}{R_{skip2} + \beta^2 P_{skip2}}\end{equation}

其中 X 表示人工标注的结果,Y 表示模型预测的结果,\text{SKIP2}(X, Y) 表示标注结果按照 skip-bigram 拆分后与预测结果按照 skip-bigram 拆分后匹配上的个数。C(m,2) 表示人工标注结果按照 skip-bigram 拆分后的个数,C(n, 2) 表示预测结果按照 skip-bigram 拆分后的个数。\beta 是超参数。

其中 \text{SKIP2}(X, Y) 表示所有样本的标注结果按 n-gram 拆分后与生成结果按 n-gram 拆分后匹配上个数的和;分母表示所有样本的标注结果按 n-gram 拆分后的和。下面举例说明计算方式。

以机器翻译任务为例,人工标注结果为:

police killed the gunman

模型预测结果为:

police kill the gunman

人工标注结果做 skip-bigram 划分之后的结果为:

['police killed', 'police the', 'police gunman', 'killed the', 'killed gunman', 'the gunman']

模型预测结果做 skip-bigram 划分之后的结果为:

['police kill', 'police the', 'police gunman', 'kill the', 'kill gunman', 'the gunman']

可以看出人工标注结果和模型预测结果的 skip-bigram 个数都是6个,即 C(m,2)=C(4,2)=6C(n,2)=C(4,2)=6;其共同的部分有3个,即 'police the'、'police gunman'、'the gunman',所以 \text{SKIP2}(X, Y)=3,假设超参数 \beta=1.0,代入上述公式可得:

\begin{equation}R_{skip2} = \frac{\text{SKIP2}(X, Y)}{C(m, 2)}=\frac{3}{6}=0.5\end{equation}
\begin{equation}P_{skip2} = \frac{\text{SKIP2}(X, Y)}{C(n, 2)}=\frac{3}{6}=0.5\end{equation}
\begin{equation}F_{skip2} = \frac{(1 + 1.0^2) R_{skip2}P_{skip2}}{R_{skip2} + 1.0^2 P_{skip2}}=\frac{2 * 0.5 * 0.5}{0.5 + 1.0 * 0.5} = 0.5\end{equation}

3、precision、recall、f1指标#

4、ROC-AUC#

Reference#