NLP-N元语法语言模型

N元语法语言模型

1. 语言模型

\(\qquad\)将概率分配给单词序列的模型称为语言模型 (language model,LM) 。n 元语法是最简单的一种语言模型,该模型将概率分配给句子和单词序列。n-gram 是由 n 个单词组成的序列:2-gram(bigram) 是由两个单词组成的序列,如“please turn”,“turn your”,或“your homework”;3-gram(trigram) 是由三个单词组成的序列,如“please turn your” 。
\(\qquad\)要了解如何通过n-gram模型,在给定一个单词的情况下来估计n-gram后一个单词的概率,并为整个序列分配概率。

2. N元语法(N-gram)

学习目标:分配一个概率给一个句子

相关的任务:计算下一个单词的概率

  • 如: \(P \text{(the|its water is so transparent that)}\) :表示 “its water is so transparent that” 一句下一个单词是 "the" 的概率

条件概率的定义: \(P(B|A) = \dfrac{P(A,B)}{P(A)} \longrightarrow P(A,B) = P(A)P(B|A)\)

  • 推广至多变量:\(P(A,B,C,D) = P(A)P(B|A)P(C|A,B)P(D|A,B,C)\)

链式法则: \(P(x_1,x_2,x_3,…,x_n) = P(x_1)P(x_2|x_1)P(x_3|x_1,x_2)…P(x_n|x_1,…,x_{n-1})\)

  • 链式法则显示了计算序列的联合概率,和计算给定先前单词的单词条件概率之间的联系。 上式表明我们可以通过将多个条件概率相乘来估计整个单词序列的联合概率。
  • 但是使用链式法则似乎对我们没有帮助:给定一长串前面的单词 \(P(w_n|w_{1:n−1})\),我们不知道有什么方法可以计算一个单词的确切概率。 我们不能只通过计算每个单词出现在每个长字符串之后的次数来估计,因为语言是创造性的,任何特定的上下文可能以前从未出现过!

2.1. 相对频率计数与链式规则

\(\qquad\)估计上述概率P的一种方法是通过相对频率计数:取一个非常大(理想)的语料库,计算我们看到 “its water is so transparent that” 的次数,并计算它后面跟着"the"的次数。这就可以回答“根据我们看到历史h的次数,有多少次它后面跟着w”,如下所示:

\[P(\text{the|its water is so transparent that}) = \frac{Count(\text{its water is so transparent that the})}{Count(\text{its water is so transparent that})} \]

\(\qquad\)但现实中无法取到理想大的库,我们永远无法获取到足够多的相关数据(句子)去计算这些概率,同时语言具有创造力,我们无法统计所有的句子。若想利用链式规则来分解这个概率,通过多个条件概率条件概率相乘来估计,也同样会遇到类似的问题。因此引入n-gram,思路是仅通过最后几个单词来估计历史记录。

  • n-gram 模型的直觉是,我们可以仅通过最后几个单词来近似历史,而不是计算一个单词给定其整个历史的概率。

2.2. 二元语法(bigram)

\(\qquad\)二元语法模型仅通过使用一个先前单词 \(P(w_n|w_{n-1})\) 的条件概率来近似给定所有先前单词 \(P(w_n|w_{1:n-1})\) 的单词概率,即计算 \(P(\text{the}|\text{that})\) 来近似 \(P \text{(the|its water is so transparent that)}\) 。于是有:

\[P(w_n|w_{1:n-1}) \approx P(w_n|w_{n-1}) \]

\(\qquad\)这种一个词的概率只取决于前一个词的假设被称为马尔科夫(Markov)假设。马尔可夫模型是概率模型的一类,它们假定我们可以预测某些未来单元的概率而不会过多地考虑过去。我们可以将二元语法(向过去看一个单词)推广到三元语法(向过去看两个单词),然后推广到 n 元语法(n-gram)(向过去看n-1个单词)。于是有:

\[P(w_n|w_{1:n-1}) \approx P(w_n|w_{n-N+1}:w_{n-1}) \]

3. 计算N元概率

3.1 估计二元概率

\(\qquad\)根据二元语法假设要计算单词序列的概率 \(P(w_{1:n}) = \prod_{k=1}^{n} P(w_k|w_{1:k-1})\) ,通过对计数的归一化(normalize)最大似然估计(MLE) 有:

\[P(w_n|w_{n-1}) = \frac{C(w_{n-1},w_n)}{\sum_w C(w_{n-1},w)} \quad \text{简化为:} \quad P(w_n|w_{n-1}) = \frac{C(w_{n-1},w_n)}{C(w_{n-1})} \]

3.2 实际计算问题

\(\qquad\)我们总是将log形式的语言模型概率表示和计算为log概率。 由于概率(根据定义)小于或等于 1,所以我们相乘的概率越多,乘积就越小。 当足够多的 n-gram 相乘时,会导致数值下溢,指当要表示的数据的绝对值小于计算机所能表示的最小绝对值。 而通过使用对数概率而不是原始概率,我们得到的数字并不那么小。

  • 在对数空间中相加相当于在线性空间中相乘,所以我们通过相加来组合对数概率。 形如:

    \(\log(p_1 \times p_2 \times p_3) = \log{p_1} + \log{p_2} + \log{p_3}\)

  • 如果我们需要在最后报告它们,我们只需通过 exp() 转换回概率,形如

    \(p_1 \times p_2 \times p_3 = \exp(\log{p_1} + \log{p_2} + \log{p_3})\)

4. 评估语言模型

4.1 如何评估一个语言模型是好的

  • 该模型可以生成好的句子还是坏的句子?

    • 赋予“真实”或者“经常被观测到的”句子以更高的概率
    • 赋予“不合语法”或者“少有被观测到的”句子以更低的概率
  • 对外评估

    • 评估语言模型性能的最佳方法是将其嵌入应用程序并衡量应用程序的改进程度。 这种端到端的评估称为外部评估

    • 外部评估是了解组件的特定改进是否真的有助于手头任务的唯一方法。 因此,对于语音识别,我们可以通过两次运行语音识别器来比较两种语言模型的性能,每种语言模型一次,然后查看哪个提供更准确的结果。

    • 哪个模型为测试集分配了更高的概率,这意味着它更准确地预测了测试集,是一个更好的模型。

    • 给定两个概率模型,更好的模型是与测试数据具有更紧密拟合或更好地预测测试数据细节的模型,因此将为测试数据分配更高的概率

  • 训练集和测试集

    • 使用训练数据集来训练模型的参数

    • 使用测试集来测试训练好的模型

      • 用于测试的数据是从未用于训练模型的
      • 使用评估标准 (evaluation metric) 来估计训练好的模型在测试集上的效果
      • 哪个模型为测试集分配了更高的概率,这意味着它更准确地预测了测试集,是一个更好的模型
      • 给定两个概率模型,更好的模型是与测试数据具有更紧密拟合或更好地预测测试数据细节的模型,因此将为测试数据分配更高的概率

4.2 对N元模型进行评估

  • 对外评估:耗时,通常需要几天或者几周来实现他人的工作
  • 需要使用对内评估:困惑度
    • 对内评估时测试集不能类似于训练集
    • 对内评估仅仅可用于前导实验 (pilot experiment)

4.3 困惑度(perplexity)

  • 在实践中,我们不使用原始概率作为评估语言模型的度量,而是使用一种称为困惑的变体:困惑度(PPL)

  • 困惑度是测试集的逆向概率,并由单词总数 N 进行归一化处理

    \[PP(W) = P(w_1w_2 \cdots w_N)^{-\frac{1}{N}} = \sqrt[N]{\frac{1}{P(w_1w_2 \cdots w_N)}} \]

  • 引入链式法则

    \[PP(W) = \sqrt[N]{\prod_{i=1}^N \frac{1}{P(w_i|w_{1:{i-1}})}} \]

  • 单词序列的条件概率越高,困惑度越低。 因此,最小化困惑度相当于根据语言模型最大化测试集概率。即困惑度越小,则概率越大,则模型越好

5. 泛化

\(\qquad\)对于深度学习或机器学习模型而言,我们不仅要求它对训练数据集有很好的拟合(训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差。度量泛化能力的好坏,最直观的表现就是模型的过拟合。

  • 有一种泛化为:零,也就是从未出现在训练集中,但出现在测试集中

6. 加一平滑(add-one)

  • 加一平滑也成为拉普拉斯平滑((Laplace smoothing)

  • 假设所有的单词次数都多一次,即计数加一

    \[\begin{aligned} & \text{模型语言估计(MLE):} P_{MLE}(w_i|w_{i-1}) = \frac{C(w_{i-1},w_i)}{C(w_{i-1})} \\ & \text{加一估计(add-one):} P_{add-one}(w_i|w_{i-1}) = \frac{C(w_{i-1},w_i)+1}{C(w_{i-1}) + V} \quad \text{(V 为词库大小)} \end{aligned} \]

  • 加一平滑的适用性

    • NLP 文本分类模型
    • 或者当某些任务中零的数量不是很多时
    • 不适用于 N 元模型(有更好的方法,如 Backoff 回退法、Interpolation 插值法)

Interpolation 插值法:

  • 混合使用多种N-grams

    • 如:\(P_{int}(w_i|w_{i-1}w_{i-2}) = \lambda_3 P_{ML}(w_i|w_{i-1}w_{i-2}) + \lambda_2 P_{ML}(w_i|w_{i-1}) + \lambda_1 P_{ML}(w_i)\)
  • 插值法和回退法适用于有更少上下文的训练集,且插值法有更好的性能

练习题

1. 给出以下一个小型语料库,在最大似然一元模型和二元模型之间使用加一平滑法进行平滑, 请计算P(Sam|am)。注意要将tokens \(\text{<s>}\)  和与 \(\text{</s>}\) 其他单词一样看待。

\(\text{<s>}\) I am Sam \(\text{</s>}\)

\(\text{<s>}\)Sam I am \(\text{</s>}\)

\(\text{<s>}\) I am Sam \(\text{</s>}\)

\(\text{<s>}\) I do not like green eggs and Sam \(\text{</s>}\)

\(\because P_{Add-1}(w_i|w_{i-1}) = \dfrac{C(w_{i-1}w_i) + 1}{C(w_{i-1}) + V}\)

\(\therefore P(\text{Sam}|\text{am}) = \dfrac{2+1}{3+11} = \dfrac{3}{14}\)

2. 与上题类似,请使用线性插值法,其中假设 λ1 = 1/2, λ2 =1/2,请计算P(Sam|am)。注意要将tokens \(\text{<s>}\)\(\text{</s>}\)与其他单词一样看待。

\(\because P_{int}(w_i|w_{i-1}) = \lambda_2 P_{ML}(w_i|w_{i-1}) + \lambda_1 P_{ML}(w_i), \quad (λ1 + λ2 = 1)\)

\(\begin{aligned} \therefore P(\text{Sam}|\text{am}) & = \lambda_2 P(\text{Sam}|\text{am}) + \lambda_1 P(\text{Sam})\\ & =\frac{1}{2} \times \frac{2}{3} + \frac{1}{2} \times \frac{4}{25} \\ & =\frac{31}{75} \end{aligned}\)

3. 给定一个包含 100 个数字的训练集,其中包含 91 个0和 1-9 其他数字中的每个数字。 有以下的测试集:0 0 0 0 0 3 0 0 0 0。计算该问题的一元困惑度 unigram perplexity。

\(PP(W) = P(w_1w_2 \cdots w_{10})^{-\frac{1}{10}} = (0.91^9 \times 0.01)^{-\frac{1}{10}} = 1.725\)

参考

Speech and Language Processing

posted @ 2024-01-17 15:52  犹离忧也  阅读(7)  评论(0)    收藏  举报