NLP——困惑度-Perplexity

本文主要介绍困惑度在语言模型评估中的作用


如何评价一个语言模型的好坏

直接评估法

  • 将语言模型应用到实际的具体问题中去,比如机器翻译,词性标注,拼写矫正等
  • 评估语言模型在这些实际问题中的具体表现
优点
  • 准确
  • 能精确评估在具体应用场景中的效果
缺点
  • 费时
  • 难以操作

困惑度(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函数