语言模型主要有统计语言模型(n-gram语言模型)和 神经网络语言模型等。下面分别介绍这两个语言模型以及两个模型之间的异同
n-gram语言模型
语言模型简单来讲,就是计算一个句子的概率,更确切的说是计算组成这个句子一系列词语的概率。举个简单的例子:
s = “The cat jumped over the paddle”
一个好的语言模型应该会给这个句子比较高的概率。因为这个句子在语义语法上都没有任何问题。我们可以用如下的公式来计算概率
P(w1,w2,...,wn)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,...wn−1)P(w1,w2,...,wn)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,...wn−1)
在统计语言模型中为了减少参数数量,基于马尔可夫假设,通常采用n-gram模型,我们可以认为下一个词的出现仅依赖于他前面的一个或者 n 个词,如果n=1,即假设每个单词之间相互独立,那么就会得到uni-gram表达式或者n=2的bi-gram模型去表示,因为,下一个单词和之前一个单词是有很强的关联性
Unigram model
P(w1,w2,w3,...,wn)=∏ni=1P(wi)P(w1,w2,w3,...,wn)=∏i=1nP(wi)
Bigram model
- P(w1,w2,w3,...,wn)=∏ni=2P(wi|wi−1)P(w1,w2,w3,...,wn)=∏i=2nP(wi|wi−1)
一般来讲,n一般不会超过3, 否则参数空间过大,数据稀疏严重,对于非常对多词对的组合,在语料库中没有出现,依据最大似然估计得到的概率将会是0。
当然,对于n-gram模型来说,有很多的平滑方法。即对频率为0的n元对进行估计,典型的平滑算法有加法平滑、Good-Turing平滑、Katz平滑、插值平滑,等等。
例如加法平滑
P(wi|wi−n+1,...,wi)=C(wi−n+1,...,wi−1,wi)+δC(wi−n+1,...,wi−1)+NδP(wi|wi−n+1,...,wi)=C(wi−n+1,...,wi−1,wi)+δC(wi−n+1,...,wi−1)+Nδ
神经网络语言模型
循环神经网络可以将任意长度的上下文信息存储在隐藏状态中,而不仅限于n-gram模型中的窗口限制,RNN的神经语言模型结构如下图1所示,假如针对一句话“大海的颜色是蓝色的”,其中包括了三个部分:
- Embedding层 将输入单词 w_i 表示为实数向量
- 循环神经网络
- Softmax层,针对输入 xixi 输出为 y^iy^i 为一个向量 [y^i,1,y^i,2,...,y^i,|V|][y^i,1,y^i,2,...,y^i,|V|]
因此每一步的输出结果表示在上下文的情况下,该位置的单词是单词表中单词的概率,我们希望概率最大的单词就是真实的结果输出:
n-gram语言模型和神经语言模型的异同:
- 共同点:都是计算语言模型,将句子看作一个词序列,来计算句子的概率
- 不同点:
- 计算概率方式不同,n-gram基于马尔可夫假设只考虑前n个词,nnlm要考虑整个句子的上下文
- 训练模型的方式不同,n-gram基于最大似然估计来计算参数,nnlm基于RNN的优化方法来训练模型,并且这个过程中往往会有word embedding作为输入,这样对于相似的词可以有比较好的计算结果,但n-gram是严格基于词本身的
- 循环神经网络可以将任意长度的上下文信息存储在隐藏状态中,而不仅限于n-gram模型中的窗口限制
语言模型评价指标
PPL(Perplexity)是用在自然语言处理领域(NLP)中,衡量语言模型好坏的指标。它主要是根据每个词来估计一句话出现的概率,并用句子长度作normalize,公式为
PP(s)=P(w1,w2,...,wn)−1NPP(s)=P(w1,w2,...,wn)−1N
=1(w1,w2,...,wn)−−−−−−−−−√n=1(w1,w2,...,wn)n
这个式子可以这样理解,PPL越小,p(s)则越大,一句我们期望的sentence出现的概率就越高
训练n-gram语言模型的工具
参考文献:
https://www.zhihu.com/question/29456588