本文主要介绍困惑度在语言模型评估中的作用
如何评价一个语言模型的好坏
直接评估法
- 将语言模型应用到实际的具体问题中去,比如机器翻译,词性标注,拼写矫正等
- 评估语言模型在这些实际问题中的具体表现
优点
- 准确
- 能精确评估在具体应用场景中的效果
缺点
- 费时
- 难以操作
困惑度(Perplexity)
基本思想
- 给测试集的句子赋予较高概率值的语言模型较好
- 当一个语言模型训练完成后,测试集中的句子(正常的自然语言句子)出现概率越高越好
困惑度的定义
- 如果存在测试文本\(d = (w_{1}, w_{2},,,w_{N})\),那么该文本在模型Model中的困惑度为:
$$
\begin{align}
Perplexity(d|Model) &= P(d|Model)^{-\frac{1}{N}} \\
&= P(w_{1}, w_{2},,,w_{N}|Model)^{-\frac{1}{N}} \\
&= \sqrt[N]{\frac{1}{P(w_{1}, w_{2},,,w_{N}|Model)}}
\end{align}
$$ - 两边取log有
$$
\begin{align}
Log(Perplexity(d|Model)) &= -\frac{1}{N}logP(w_{1}, w_{2},,,w_{N}|Model) \\
\end{align}
$$ - 一般来说计算时使用公式
$$
\begin{align}
Perplexity(d|Model) &= e^{-\frac{1}{N}logP(w_{1}, w_{2},,,w_{N}|Model)} \\
&= exp\left (-\frac{1}{N}logP(w_{1}, w_{2},,,w_{N}|Model)\right ) \\
\end{align}
$$ - 如果在已知模型Model参数时,文档\(d\)中的词独立,即\(w_{1},w_{2},,,w_{N}\)互相独立,则有:
$$
\begin{align}
P(w_{1}, w_{2},,,w_{N}|Model) = \prod_{n=1}^{N}P(w_{n}|Model) \\
\end{align}
$$ - 进一步有
$$
\begin{align}
Perplexity(d|Model) &= exp\left (-\frac{1}{N}logP(w_{1}, w_{2},,,w_{N}|Model)\right ) \\
&= exp\left (-\frac{1}{N}log\prod_{n=1}^{N}P(w_{n}|Model)\right ) \\
&= exp\left (-\frac{1}{N}\sum_{n=1}^{N}logP(w_{n}|Model)\right ) \\
\end{align}
$$ - 以上是一个文档的表述,对于多个文档\(D = (d_{1}, d_{2},,,d_{M})\)
$$
\begin{align}
Perplexity(D|Model) &= P(D|Model)^{-\frac{1}{\sum_{m=1}^{M}N_{m}}} \\
&= \prod_{m=1}^{M} P(d_{m}|Model)^{-\frac{1}{\sum_{m=1}^{M}N_{m}}} \\
&= \sqrt[(\sum_{m=1}^{M}N_{m})]{\frac{1}{\prod_{m=1}^{M}P(d_{m}|Model)}}
\end{align}
$$ - 两边取log
$$
\begin{align}
Log(Perplexity(D|Model)) &= -\frac{1}{\sum_{m=1}^{M}N_{m}}log(\prod_{m=1}^{M}P(d_{m}|Model)) \\
&= -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(d_{m}|Model) \\
&= -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model) \\
\end{align}
$$ - 一般来说计算公式
$$
\begin{align}
Perplexity(D|Model) &= e^{-\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model)} \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model) \right )
\end{align}
$$ - 如果在已知Model参数的情况下,每个文档中的词都相互独立,即任取文档\(d_{m}\)有\(w_{1}^{m},w_{2}^{m},,,w_{N_{m}}^{m}\)互相独立,则有
$$
\begin{align}
P(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model) = \prod_{n=1}^{N_{m}}P(w_{n}^{m}|Model) \\
\end{align}
$$ - 进一步可得
$$
\begin{align}
Perplexity(D|Model) &= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model) \right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}log\prod_{n=1}^{N_{m}}P(w_{n}^{m}|Model) \right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}\sum_{n=1}^{N_{m}}logP(w_{n}^{m}|Model) \right ) \\
\end{align}
$$ - 注意,多个文档的困惑度不等于所有文档困惑度的积,而是等于把所有文档合并成一个大文档,大文档的困惑度则是最终所有文档的困惑度
- 在给定模型中,测试句子出现的概率越大,对应的困惑度越小,模型越好
LDA的困惑度
- LDA中\(w_{1},w_{2},,,w_{n}\)在参数已知的情况下是互相独立的,则有
$$
\begin{align}
Perplexity(D|Model) &= e^{-\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model)} \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}logP(w_{1}^{m}, w_{2}^{m},,,w_{N_{m}}^{m}|Model) \right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}log\prod_{n=1}^{N_{m}}P(w_{n}|Model) \right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}log\prod_{n=1}^{N_{m}}\sum_{k=1}^{K}P(w_{n}=t|z_{n}=k;Model)P(z_{n}=k|d=d_{m};Model)\right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}log\prod_{n=1}^{N_{m}}\sum_{k=1}^{K}\theta_{m,k}\phi_{k,t}\right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}log\prod_{n=1}^{N_{m}}\theta_{m,:}\phi_{:,t}\right ) \\
&= exp \left ( -\frac{1}{\sum_{m=1}^{M}N_{m}}\sum_{m=1}^{M}\sum_{n=1}^{N_{m}}log\theta_{m,:}\phi_{:,t}\right ) \\
\end{align}
$$ - 其中\(\phi_{k,t}\)表示单词t在主题k中出现的概率,\(\theta_{m,k}\)表示主题k在文档m中出现的概率
- \(\sum_{k=1}^{K}\theta_{m,k}\phi_{k,t} = (\theta_{m,:}\phi_{:,t})\)就是单词t出现在文档m中的概率(对隐变量主题k积分)
- 上面式子中\((\theta_{m,:}\phi_{:,t})\)就是两个向量的内积,在这里:\(\theta_{m,:}\)代表行向量,表示当前文档\(d_{m}\)的主题分布,\(\phi_{:,t}\)代表列向量,表示当前每个主题生成词\(w_{t}\)的概率
- 计算公式的代码可参考L-LDA模型的实现GitHub仓库: Labeled-LDA-Python 中的
perplexity
函数和log_perplexity
函数