从本篇博文开始总结NLP相关知识。
概率语言模型(Statistical Language Model)
p(sentence)=p(w1,w2,..,wn)
∑sentence∈Lp(sentence)=1(相加之和为1,非常重要)
例如:
- 输入法: P (隔壁老王) > P (隔壁老张)
- 机器翻译:
I have a dream
P (我有个梦想) > P (我有只梦想)
- 语音识别:
P (我向你汇报) > P (我象你汇报)
核心:所以语言模型一般指的是概率语言模型,通过分数来告诉机器怎么说人话。
N-gram 语言模型
N−gram 模型是语言模型里面最经典的模型之一。
计算 p(w1,w2,...,wn)
利用链式法则:
p(A,B,C)=p(A)p(B|A)p(C|A,B)
可得:
p(w1,w2,...,wn)=p(w1)p(w2|w1)...p(wn|w1,w2,...,wn−1)
马尔可夫(Markov) 假设:
基于马尔科夫假设计算 p(w5|w4,w3,w2,w1),有三种版本的结果。
unigram:p(w5)
bigram:p(w5|w4)
trigram:p(w5|w4,w3)
我们以bigram 为例,计算p(w1,w2,...,wn)=p(w1|start)p(w2|w1)...p(wn|wn−1)p(EOS|wn)
显然引入马尔科夫假设,会使得模型变得简单,参数个数减少。

语言模型的评价
Perplexity
测试集的能力
语言模型 ⬆-> P(test set) ⬆ -> Perplexity(test set) ⬇
Wtest={w1,w2,...,wn;wi∈V}
Perplexity(Wtest)=2−1n∑Ni=1log2q(wi)
q(wi) 表示模型对每个词的预测概率。
理解Perplexity

Perplexity 越小表示预测正确的概率越大。
OOV(Out of Vocab)
以Trigram Model 为例:
p(wi|wi−1,wi−2)=count(wi−2,wi−1,wi)count(wi−2,wi−1)

那么有人可能要问:为什么上面公式成立?

下面我们以上面这个训练集为例,利用最大似然估计 的方法来证明上式成立。
max log(L(DTrain))=log(∏ip(wi|wi−1,wi−2))=∑ilog(p(wi|wi−1,wi−2))
=3∗log(p(我|−,−))+log(p(你|−−))+3∗log(p(喜欢|−,我))+log(p(喜欢|−,你))+log(p(开车|我喜欢))+log(p(上网|我喜欢))
+log(p(篮球|我喜欢))+log(p(编程|你喜欢))
我们以首字符举例
约束条件:
p(我|−,−)+p(你|−,−)=1
由拉格朗日乘子法:
L=3∗log(p(我|−,−))+log(p(你|−,−))+lambda∗(p(我|−,−)+p(你|−,−)−1)
L对参数的导数等于零:
dLd(p(我|−,−))=0;dLd(p(你|−,−))=0;dLd(lambda)=0
得:
3/p(我|−,−)+lambda=0;
1/p(你|−,−)+lambda=0;
p(我|−,−)+p(你|−,−)–1=0
可计算得出:
P(我|−,−)=33+1=count(−,−,我)count(−,−,我)+count(−,−,你)
假设我们现在由训练集得出一个模型p,现在由模型给测试集中的”我 喜欢 王者荣耀”打分。
P(王者荣耀|我 喜欢) = 0 (Training 中来没有出现的词)-->OOV(Out of Vocabulary)
按照上面的计算公式P(王者荣耀|我 喜欢) = 0,显然不合理,训练集中没出现”王者荣耀”并不能代表就不喜欢?
同理:
P (编程|我 喜欢) = 0 (Training 中没有出现的trigram)–>Smoothing
那么如何解决OOV 问题呢?
假设Training Set 中出现了|V′| 个不同的词汇,那么我们根据词频选择词频最高的|V|个词汇作为我们的词汇集V。
在Training 和Testing 中,将不属于V 的词汇都替换成特殊词汇UNK。

V′= {我 喜欢 开车 上网 篮球 编程}
V= {我 喜欢 开车 上网 编程 }
P(王者荣耀|我喜欢)=P(UNK|我喜欢)=count(我喜欢UNK)/count(我喜欢)=1/3=0.333
平滑方法
Training 中没有出现的trigram,就是在训练集中没出现这种组合。
共有以下几种方法解决:
- +1 平滑
-
Back−off 回退法
-
Interpolate 插值法
-
Absolute Discount
-
Kneser−Ney Smoothing
-
Modified Kneser−Ney Smoothing (最优的方法)
+1 平滑

该平滑方法在别的分类问题中可能有用,但是在语言模型中表现一般,基本上不用。
Back−off 回退法

Count (我 喜欢 编程) = 0,但是 count (喜欢 编程) > 0
使用 Trigram 如果 count(trigram) 不满足条件,则使用Bigram;再否则使用Unigram;
因为之前已经解决了OOV 问题,所以Unigram 不可能为0。
Interpolate 插值法
将Trigram,Bigram,Unigram 线性组合起来:

这里面的参数如何得出?同理使用极大似然估计得:

log 里面只有几个参数的和求导之后,各个参数耦合在一起。EM 算法 来解决。
更进一步:

根据不同的上下文,选择不同的参数。显然这样处理Perplexity 变小,
Absolute Discounting “绝对折扣”

wi−1i−n+1表示wi−n+1 到 wi−1 的n_gram。显然由公式可知在这种平滑方法中,计算结果和Pabs(wi|wi−1i−n+2) 有很大关系。
Kneser-Ney Smoothing

有钱的,每个人固定的税 D, 建立一个基金;没钱的,根据n−1_gram的“交际广泛”的程度来分了这个基金。
Modified Kneser-Ney Smoothing

有钱的,每个人根据自己的收入交不同的税D, 类似于阶梯税,建立一个基金;没钱的,根据n−1_gram“交际广泛”的程度来分了这个基金。
总结
