[NLP --- 4] 统计语言模型与神经网络语言模型

一. 语言模型

        引例: 假设给定三个单词"I", "love", "money",在单词不重复的情况下共可构成6种组合,但能组成的最通顺的一句话为"I love money",可以肯定我们大概率会将这句话判断为一个通顺的句子。而如果出现句子"love I money",这句话能构成通顺句子的概率则接近0

        抽象地,语言模型即用来计算(多个单词组合)能够构成一个通顺的句子的概率的模型,即用来判断一句话是否合理的概率,假设给定一个只包含三个单词的句子(词语序列)S=w_{1}, w_{2}, w_{3},语言模型可表示为

P(S) = P(w_{1}, w_{2}, w_{3}) = P(w_{1}) P(w_{2} | w_{1}) P(w_{3} | w_{1} w_{2})

        在引例中,P(I, love, money) > P(love, I, money),S为由一连串特定顺序排列的词构成的一个有意义的句子,一个句子是否有意义,取决于这个句子被人用来正常交流的可能性有多大,若某个句子很少被人使用,则这个句子的概率P(S)基本接近0。反之,如果一个句子的概率P(S)越高,则这个句子的流利度越高。

1. 统计语言模型

        语言模型的核心是判断一个句子在语料库中出现的概率P(S),更细化的情况,即计算单词wt出现在字符串w_{1}, w_{2}, ..., w_{t - 1}之后的概率,如何通过统计的方法得到上述结果?

假设一个词的出现的概率只与它前面出现的词相关,则上述公式变为

P(S) = P(w_{1}, w_{2}, w_{3}) = P(w_{1}) P(w_{2} | P(w_{1})) P(w_{3} | w_{2})

      P(w2|w1) = \frac{Count(w1w2)}{Count(w1)}

错误想法:

        首先想到的做法是统计字符串在语料库中出现的次数,P(money | I love) = count(I love money) / count(I love),考虑为字符串"I love money" 在语料库中出现的次数,除以字符串"I love" 在语料库中出现的次数。看似上述方法在上述句子中是很合理的做法,但作为语言模型,需要考虑到词典中的所有单词所构成的句子是否合理的概率。注意两个字,"所有",考虑一个大小为100的词典,长度为10的字符串,要统计所有句子的合理性,长度为10的句子在语料库中出现的次数需要考虑的可能情况有100^{10}种;其次,并非所有字符串在文本中的概率都很大,还存在很多稀疏的情况,有些句子的条件概率本身就接近0。

        正确做法: 统计语言模型到底如何计算上式中的条件概率P(money | I love),甚至更抽象一些P(w_{t} | w_{1}, w_{2}, ..., w_{t - 1})

马尔科夫假设: 模型的当前状态仅仅依赖于前面的几个状态。类比到本问题中,假设句子中的第 i 个词仅仅与之前 k 个词相关。通过马尔科夫假设,上述条件概率公式得以简化,

P(w_{t} | w_{1}, w_{2}, ..., w_{t - 1}) = P(w_{t} | w_{t - k}, ..., w_{t - 1})

  • 当k == 0时,w_{i}不与任何词相关,因此每一个词可看做是相互独立的。
  • 当k == 1是,w_{i}仅仅与前1个词相关。
  • 同样的,也可以让k == 2, k == 3, ... 即模型称为n元模型,即n-gram

但上述的n-gram模型仍然存在一个不足,即语言之间存在长距离的依赖关系,而n-gram无法捕捉到语言中的长距离依赖。例如对于句子: “The computer which I had just put into the machine room on the fifth floor crashed.”,若需要预测单词"crashed","crashed"自身与"flashed"相关性不大,但却与"computer"存在较强的相关性,但n-grams并没有捕捉到上述信息。

 

2. 神经网络语言模型

        假设存在一个庞大的语料库,则P(I, love, money) = (I love money在语料库中出现的次数) / (语料库中句子的总数)。假设用神经网络来训练一个语言模型,则输入为一个句子,输出为预测句子在语料库中出现的概率,而标准答案(ground truth)为实际句子在语料库中出现的概率,二者可构成一个监督学习模型, 这种做法仍然会存在刚才所说的参数爆炸的情况

       神经网络语言模型可通过模型训练的方法得到条件概率P(w_{t} | w_{1}, w_{2}, ..., w_{t - 1}),实际上在早期的神经网络语言模型NNLM中,输入为一个句子的前k - 1个词,预测第k个词为"GT"的概率,标准答案即为"GT",其中词表大小为|V|,输出层最后会得到一个|V|维度的向量,经过softmax后,与"GT"在词典中的标签计算交叉熵损失函数。如果需要的话,我们可以将模型的输出用公式描述即为P(w_{t} | w_{1}, w_{2}, ..., w_{t - 1}),一个句子是否通顺的概率即可用多个输出概率的乘积实现。

        换句话说,神经网络语言模型通过学习神经网络的参数构建起一个网络,即可得到多个单词组合能否构成一个通顺的句子的概率。       

 

参考资料: 

1. A Neural Probabilistic Language Model

2. Statistical language model 统计语言模型

3. 深入浅出讲解语言模型

4. 从经典结构到改进方法,神经网络语言模型综述

5. Pre-trained Models for Natural Language Processing: A Survey

6. 统计语言模型


版权声明:本文为smilesooo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。