一. 语言模型
引例: 假设给定三个单词"I", "love", "money",在单词不重复的情况下共可构成6种组合,但能组成的最通顺的一句话为"I love money",可以肯定我们大概率会将这句话判断为一个通顺的句子。而如果出现句子"love I money",这句话能构成通顺句子的概率则接近0。
抽象地,语言模型即用来计算(多个单词组合)能够构成一个通顺的句子的概率的模型,即用来判断一句话是否合理的概率,假设给定一个只包含三个单词的句子(词语序列),语言模型可表示为
在引例中,,S为由一连串特定顺序排列的词构成的一个有意义的句子,一个句子是否有意义,取决于这个句子被人用来正常交流的可能性有多大,若某个句子很少被人使用,则这个句子的概率P(S)基本接近0。反之,如果一个句子的概率P(S)越高,则这个句子的流利度越高。
1. 统计语言模型
语言模型的核心是判断一个句子在语料库中出现的概率P(S),更细化的情况,即计算单词wt出现在字符串之后的概率,如何通过统计的方法得到上述结果?
假设一个词的出现的概率只与它前面出现的词相关,则上述公式变为
错误想法:
首先想到的做法是统计字符串在语料库中出现的次数,P(money | I love) = count(I love money) / count(I love),考虑为字符串"I love money" 在语料库中出现的次数,除以字符串"I love" 在语料库中出现的次数。看似上述方法在上述句子中是很合理的做法,但作为语言模型,需要考虑到词典中的所有单词所构成的句子是否合理的概率。注意两个字,"所有",考虑一个大小为100的词典,长度为10的字符串,要统计所有句子的合理性,长度为10的句子在语料库中出现的次数需要考虑的可能情况有种;其次,并非所有字符串在文本中的概率都很大,还存在很多稀疏的情况,有些句子的条件概率本身就接近0。
正确做法: 统计语言模型到底如何计算上式中的条件概率P(money | I love),甚至更抽象一些。
马尔科夫假设: 模型的当前状态仅仅依赖于前面的几个状态。类比到本问题中,假设句子中的第 个词仅仅与之前
个词相关。通过马尔科夫假设,上述条件概率公式得以简化,
- 当k == 0时,
不与任何词相关,因此每一个词可看做是相互独立的。
- 当k == 1是,
仅仅与前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. 神经网络语言模型
假设存在一个庞大的语料库,则 = (I love money在语料库中出现的次数) / (语料库中句子的总数)。假设用神经网络来训练一个语言模型,则输入为一个句子,输出为预测句子在语料库中出现的概率,而标准答案(ground truth)为实际句子在语料库中出现的概率,二者可构成一个监督学习模型, 这种做法仍然会存在刚才所说的参数爆炸的情况。
神经网络语言模型可通过模型训练的方法得到条件概率,实际上在早期的神经网络语言模型NNLM中,输入为一个句子的前k - 1个词,预测第k个词为"GT"的概率,标准答案即为"GT",其中词表大小为|V|,输出层最后会得到一个|V|维度的向量,经过softmax后,与"GT"在词典中的标签计算交叉熵损失函数。如果需要的话,我们可以将模型的输出用公式描述即为
,一个句子是否通顺的概率即可用多个输出概率的乘积实现。
换句话说,神经网络语言模型通过学习神经网络的参数构建起一个网络,即可得到多个单词组合能否构成一个通顺的句子的概率。
参考资料:
1. A Neural Probabilistic Language Model
2. Statistical language model 统计语言模型
3. 深入浅出讲解语言模型
5. Pre-trained Models for Natural Language Processing: A Survey
6. 统计语言模型