1. 引入
语言模型是两种系统的基础
- 语音识别系统
- 机器翻译系统
所谓语言模型,能够告诉你,某个特定的句子(序列),出现的概率是多少。
举个例子,假设一个人说了一句话,这句话可能是如下两种文本中的一种
- The apple and pair salad.
- The apple and pear salad.
你觉得这个人说的是1的可能性大,还是2的可能性大?
语言模型能给你这两句话各自的可能性,p(text1)=0.002, p(text1)=0.003。所以是2的可能性更高。
2. 语言模型的构建过程
- Tokenize
首先,我们得有corpus(语料),就是大量的文本数据。
然后,我们要做Tokenize:建立一个字典,将每个单词都转化成对应的one-hot向量。
如果你需要模型能准确识别句子结尾,那你还需要定义句子的结尾,一般用EOS(end of sentence)。
如果句子中有些词并没有在你的字典中出现过,那你就可以把这个单词替换为UNK(unique token),即代表未知词。
- 构建RNN
假设输入的文本为:
- Cats average 15 hours of sleep a day.
(1)在第0个时刻,输入向量(x<1>)为0向量,对应的输入a<0>也为0向量,输出层用一个softmax来输出概率。他只是预测第一个词的概率,而不去管结果是什么。这个步骤在下图的1处表示。
(2)接下来的时刻,我们告诉模型,第一个词是Cats(把Cats的向量作为输入),让模型告诉我们Cats后面应该接一个什么词,也就是此时y<2>=p(average|Cats)。这个步骤在下图的2处表示
(3)接下来的时刻,y<3> = p(?|“Cats average”)
(4)接下来每个步骤的RNN,都会考虑前面出现过的词
为了训练RNN,我们要定义Cost Function,即下图的3处的公式。有hat的符号,表示预测值。
3. 一些细节
- RNN模型训练时,需要知道y<2>=p(average|Cats),就是条件概率(Cats出现时,后面出现average的概率),那这个条件概率怎么计算呢?
- 可以在语料中,直接统计而得到,这也是我们需要大量语料做模型训练的原因
- 除了RNN,还有其他方法构建语言模型吗?
- wikipedia上给出了一种直接用统计方法构建语言模型的方法
这是基于NGRAM的语言模型(概率)计算方式。要注意句子开头会被看做一个字符,句子结束也会被看做一个字符。通过对语料中的单词进行统计,就能算出各个单词出现的条件概率。条件概率乘在一起,就能算出一个序列(一句话)的概率。
4. 总结
A statistical language model is a probability distribution over sequences of words. Given such a sequence, say of length m, it assigns a probability p(w1,w2,…,wm) to the whole sequence.
参考
- [1]. Andrew Ng. Sequence Model class
- [2]. https://en.wikipedia.org/wiki/Language_model
- [3]. 如何用python构建一个语言模型, https://nlpforhackers.io/language-models/