NLP入门系列之语言模型
- 学习nlp半年了,一直说写点什么,记录自己学习的历程。希望自己能坚持下去。
- 为什么将语言模型写在最前面呢?第一,我觉得语言模型是一个很基础并且重要的概念;第二,目前预训练语言模型如此之火,那了解语言模型也是必不可少的。
- 随后我应该会介绍词向量的相关知识
1 什么是语言模型
- 为单词序列分配概率的模型就叫做语言模型。即对于单词序列 w_1,w_2,w_3,...w_n ,计算 P(w_1,w_2,w_3,...w_n) 的模型就是语言模型
- 通俗来说,语言模型就是这样一个模型:对于任意的词序列,它能够计算出这个序列是一句话的概率。或者说语言模型能预测单词序列的下一个词是什么。
那这个概率该怎么算呢?
用频率估计概率的思想,假设我们可以找到足够大的一个语料(例如网络上的所有中文或者英文网页)。我们计算出单词序列 (w_1,w_2,w_3,...w_n) 出现的次数 n ,其中 w_i\in V , V = \left\{ v_1,v_2,v_3...x_{|V|}\right\} 表示字典,而所有的序列个数记为 N ,则 P(w_1,w_2,w_3,...w_n)=\frac{n}{N} 。
可以看出这个模型有一个问题,一旦单词序列没有在训练集中出现过,模型的输出概率就是0,并且我们知道,语言是具有创造性的,所以这样计算相当不合理。并且这样计算一个给定序列的概率也需要语料足够的大才有实际意义。因此我们需要更聪明的方法来计算 P(w_1,w_2,w_3,...w_n) 。
我们知道概率的链式规则,即
根据概率的链式规则,我们有
由1.2可以看出,我们的语言模型其实是在计算 P(w_t|w_{1}^{t-1}) ,即预测下一个单词 w_t 。但是 P(w_t|w_{1}^{t-1}) 又该怎么计算呢?由上面分析我们知道,我们可以计算出 count(w_1,w_2,w_3,...w_t) 和 count(w_1,w_2,w_3,...x_{t-1}) ,则 P(w_t|w_{1}^{t-1})\approx\frac{count(w_1,w_2,w_3,...x_{t}) }{count(w_1,w_2,w_3,...w_{t-1}) } 。但是我们知道,语言是具有创造性的,任何特定的上下文也许在语料中从未出现过。
2 n-gram Language Models
如何学习一个语言模型呢,在深度学习没由火起来前,都是学习一个n-gram Language Model
n-gram模型做了一个假设, w_{t-1} 只取决于前 n-1 个词,即 P(w_{t+1}|w_{t},w_{t-1},...,w_1)=P(w_{t+1}|w_{t},...,w_{t-n+2}) =\frac{P(w_{t+1},w_{t},w_{t-1},...,w_{t-n+2})}{P(w_{t},w_{t-1},...,w_{t-n+2})}
可以看出,n-gram模型可以减轻单词序列没有在训练集中出现过而引起的问题,即数据稀疏问题
那问题来了, n-gram (w_{t+1},w_{t},w_{t-1},...,w_{t-n+2}) 和n-1gram (w_{t},w_{t-1},...,w_{t-n+2}) 的概率 P(w_{t+1},w_{t},w_{t-1},...,w_{t-n+2}) 、 P(w_{t},w_{t-1},...,w_{t-n+2}) 怎么计算呢?
Answer: By counting them in some large corpus of text!
\approx\frac{count(w_{t+1},w_{t},w_{t-1},...,w_{t-n+2})}{count(w_{t},w_{t-1},...,w_{t-n+2})} ,为什么用约等于呢?因为是统计近似。
3 n-gram模型举例
对于句子 as the proctor started the clock, the students opened their ___ w __, w\in V 假设我们用一个四元模型,则
P(w|students\quad opened\quad their) = \frac{count(students\quad opened\quad their\quad w) }{count(students\quad opened\quad their)}
假设在语料中,我们算的P(books | students opened their) = 0.4,而P(exams | students opened their) = 0.1,那么我们就可以预测出 w 更应该为books而不是exams(这个例子中还有0.5的概率没写出来,大家明白意思就行),但实际上根据上下文你就知道,这里应该exams而不是books。所以这该怎么办呢,显然最之间的办法就是让n变大一些,这样我们可以看到的历史信息就更多,但是从上面分析我们其实知道,n越大,数据稀疏问题会越严重(没看懂的请回看1 什么是语言模型)。
4 n-gram模型问题
我有点懒,就直接吧Stanford cs224n中的ppt贴上来吧。对于n-gram模型的问题,这两页ppt说的很明白,我就不再解释了
嗯,终于抄完了,真的太感谢国外大牛们开源他们辛苦辛苦写的书籍,做的ppt。
想更详细了解n-gram语言模型的话,可以看参考文献2
5 参考文献
写在最后:虽然n-gram模型准确率不高,但是它很简单,在一个语言模型任务中,它可以充当baseline的作用。我一直认为对于一个问题而言,从0到1是最重要的,后面再考虑从1到1.5或者到2等等。
以上全是个人理解,肯定会有不正确或者不准确之处,大家看出来可以评论指正,我看到就会修改过来。
看到这篇文章的小伙伴,如果觉得对你有用,就为我点个赞吧!
注:本文可以任意转载,转载时请标明作者和出处。