语言模型是这样一个模型:对于任意的词序列,**它能够计算出这个序列是一句话的概率。**举两个例子就明白了,比如:词序列A:“知乎|的|文章|真|水|啊”,这个明显是一句话,一个好的语言模型也会给出很高的概率,再看词序列B:“知乎|的|睡觉|苹果|好快”,这明显不是一句话,如果语言模型训练的好,那么序列B的概率就很小很小。
假设我们要为中文创建一个语言模型, V 表示词典, V= {猫,狗,机器,学习,语言,模型,...},$$ w_{i}∈V $$ 。语言模型就是这样一个模型:给定词典 V **,能够计算出任意单词序列 **$$ w_1,w_1,...,w_{n} $$ 是一句话的概率 $$ p(w_1,w_1,...,w_{n}) $$ ,其中 $$ p≥0 $$ 。
现在问题来了,语言模型如何计算 $$ p(w_1,w_1,...,w_{n}) $$ 最简单的方法是数数,假设训练集中共有 N个句子,我们数一下在训练集中$$ w_1,w_1,...,w_{n} $$出现的次数,不妨假定为 n ,则 $$ p(w_1,w_1,...,w_{n}) = = \frac{n}{N} $$ 。
可以想象出这个模型的预测能力几乎为0,一旦单词序列没有在训练集中出现过,模型的输出概率就是0,显然相当不合理。我们可以根据概率论中的链式法则(chain rule)把 p 展开:
p(w1,w2,…,wn)=p(w1)i=2∏np(wi∣w1,…,wi−1)
如果能计算 p(wi∣w1,…,wi−1),那么就能轻松得到 p(w1,w2,…,wn),所以在文献中我们经常看到语言模型的另一种等价定义:能够计算 p(wi∣w1,…,wi−1) 的模型就是语言模型。
在统计学模型横行NLP的时代,语言模型任务的扛把子是N-gram语言模型。
引入一阶马尔可夫假设:每个词只依赖前一个词
p(wi∣w1,…,wi−1)≈p(wi∣wi−1)
此时句子概率近似为:
p(w1,w2,…,wn)=p(w1)i=2∏np(wi∣w1,…,wi−1)≈p(w1)i=2∏np(wi∣wi−1)
引入二阶马尔可夫假设:每个词依赖前两个词
p(wi∣w1,…,wi−1)≈p(wi∣wi−2,wi−1)
此时句子概率近似为:
p(w1,w2,…,wn)=p(w1)i=2∏np(wi∣w1,…,wi−1)≈p(w1)p(w2∣w1)i=3∏np(wi∣wi−2,wi−1)
对于 N=3 的 tri-gram 模型,使用计数法计算条件概率:
p(wi∣wi−2,wi−1)=count(wi−2,wi−1)count(wi−2,wi−1,wi)
这些公式展示了如何通过马尔可夫假设简化语言模型中的条件概率计算,并通过统计频次来估计参数,是传统统计语言模型的核心方法。
N元语法(N-gram) 与 N 阶马尔可夫假设(N-th order Markov Assumption) 是应用与理论基础的关系。
简单来说:
- N阶马尔可夫假设是理论前提:它规定了“当前词只依赖于前 N−1 个词”。
- N元语法是具体实现:它是基于上述假设构建的统计模型,用于计算概率。
二者在命名上存在一个容易混淆的**“偏移量”**(Off-by-one),具体关系如下:
| 模型名称 (N-gram) | N 的含义 | 依赖的历史词数量 | 对应的马尔可夫假设阶数 ( k ) | 公式形式 |
|---|
| Unigram (1-gram) | 1 | 0 个 (独立) | 0阶 马尔可夫 | P(wi) |
| Bigram (2-gram) | 2 | 1 个 ( wi−1 ) | 1阶 马尔可夫 | P(wi∣wi−1) |
| Trigram (3-gram) | 3 | 2 个 ( wi−2,wi−1 ) | 2阶 马尔可夫 | P(wi∣wi−2,wi−1) |
| N-gram | N | N−1 个 | (N−1) 阶 马尔可夫 | P(wi∣wi−N+1,…,wi−1) |
关键结论: N 元语法模型 等价于 (N−1) 阶马尔可夫模型。