语言模型
p(S) 就是语言模型,即用来计算一个句子 S 概率的模型。
那么,如何计算呢?最简单、直接的方法是计数后做除法,即最大似然估计(Maximum Likelihood Estimate,MLE),如下:
其中,count(w1,w2,…,wi?1,wi) 表示词序列(w1,w2,…,wi?1,wi) 在语料库中出现的频率。这里面临两个重要的问题:数据稀疏严重和参数空间过大,导致无法实用。
实际中,我们一般较常使用的是 N 元语法模型(N-Gram),它采用了马尔科夫假设(Markov Assumption),即认为语言中每个单词只与其前面长度 N-1 的上下文有关。
- 假设下一个词的出现依赖它前面的一个词,即 bigram,则有:
- 假设下一个词的出现依赖它前面的两个词,即 trigram,则有:
那么,我们在面临实际问题时,如何选择依赖词的个数,即 N 呢?
- 更大的 n:对下一个词出现的约束信息更多,具有更大的辨别力;
- 更小的 n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。
理论上,n 越大越好,经验上,trigram 用的最多,尽管如此,原则上,能用 bigram 解决,绝不使用 trigram。
从本质上说,这种统计语言模型描述的是有限状态的正则文法语言,而自然语言是不确定性语言,因此与真实语言差异较大,表达能力有限,尤其无法较好的处理长距离依赖语言现象。但是,其抓住了自然语言中的局部性约束(Local Constrain)性质,因此该模型在实际应用中取得了较大的成功。
言模型效果评估
语言模型构造完成后,如何确定其好坏呢?目前主要有两种评价方法:
- 实用方法:通过查看该模型在实际应用(如拼写检查、机器翻译)中的表现来评价,优点是直观、实用,缺点是缺乏针对性、不够客观;
- 理论方法:迷惑度/困惑度/混乱度(preplexity),其基本思想是给测试集赋予较高概率值的语言模型较好,公式如下:
由公式可知,迷惑度越小,句子概率越大,语言模型越好。
数据稀疏与平滑技术
大规模数据统计方法与有限的训练语料之间必然产生数据稀疏问题,导致零概率问题,符合经典的 zip’f 定律。如 IBM Brown:366M 英语语料训练 trigram,在测试语料中,有14.7% 的 trigram 和 2.2% 的bigram 在训练语料中未出现。
为了解决数据稀疏问题,人们为理论模型实用化而进行了众多尝试与努力,诞生了一系列经典的平滑技术,它们的基本思想是“降低已出现 n-gram 的条件概率分布,以使未出现的 n-gram 条件概率分布非零”,且经数据平滑后一定保证概率和为1,数据平滑前后如下图所示:
- Add-one(Laplace) Smoothing
加一平滑法,又称拉普拉斯定律,其保证每个 n-gram 在训练语料中至少出现 1次,以 bigram 为例,公式如下:
其中,V 是所有 bigram 的个数。
在V>>c(wi?1,wi)时,即训练语料库中绝大部分 n-gram 未出现的情况(一般都是如此),Add-one Smoothing后有些“喧宾夺主”的现象,效果不佳。
一种简单的改进方法是 add-δ smoothing (Lidstone, 1920; Jeffreys, 1948)。δ 是一个小于 1 的数。
- Good-Turing Smoothing
其基本思想是利用频率的类别信息对频率进行平滑。如下图所示:
其中,Nc表示出现次数为 c 的 n-gram 的个数。调整出现频率为 c 的 n-gram 折扣频率为 c?:
但是,对于较大的 c,可能出现Nc+1=0 或者 Nc>Nc+1的情况,反而使得模型质量变差,如下图所示:
直接的改进策略就是“对出现次数超过某个阈值的 gram 不进行平滑,阈值一般取8~10。
- Interpolation Smoothing
不管是 Add-one,还是 Good Turing 平滑技术,对于未出现的 n-gram 都一视同仁,难免存在不合理性(事件发生概率存在差别),所以这里再介绍一种线性插值平滑技术,其基本思想是将高阶模型和低阶模型作线性组合,利用低元 n-gram 模型对高元 n-gram 模型进行线性插值。因为在没有足够的数据对高元 n-gram 模型进行概率估计时,低元 n-gram 模型通常可以提供有用的信息。
- Katz Backoff
其基本思想是如果 n-gram 出现频率为 0,就回退到(n-1)-gram 近似求解。