从本篇博文开始总结NLPNLPNLP相关知识。
概率语言模型(Statistical Language Model)(Statistical\ Language\ Model)(Statistical Language Model)
p(sentence)=p(w1,w2,..,wn){p}(sentence)={p}({w}_{1},{w}_{2},..,{w}_{n})p(sentence)=p(w1,w2,..,wn)
∑sentence∈Lp(sentence)=1\sum_{sentence\in L}^{}{p}(sentence)=1∑sentence∈Lp(sentence)=1(相加之和为1,非常重要)
例如:
- 输入法: PPP (隔壁老王) > PPP (隔壁老张)
- 机器翻译:
I have a dreamI\ have\ a\ dreamI have a dream
PPP (我有个梦想) > PPP (我有只梦想) - 语音识别:
PPP (我向你汇报) > PPP (我象你汇报)
核心:所以语言模型一般指的是概率语言模型,通过分数来告诉机器怎么说人话。
N-gram 语言模型
N−gramN-gramN−gram 模型是语言模型里面最经典的模型之一。
计算 p(w1,w2,...,wn)p({w}_{1},{w}_{2},...,{w}_{n})p(w1,w2,...,wn)
利用链式法则:
p(A,B,C)=p(A)p(B∣A)p(C∣A,B)p(A,B,C)=p(A)p(B|A)p(C|A,B)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)p({w}_{1},{w}_{2},...,{w}_{n})=p({w}_{1})p({w}_{2}|{w}_{1})...p({w}_{n}|{w}_{1},{w}_{2},...,{w}_{n-1})p(w1,w2,...,wn)=p(w1)p(w2∣w1)...p(wn∣w1,w2,...,wn−1)
马尔可夫(Markov)(Markov)(Markov) 假设:
- “无记忆性”: 未来的事件,只取决于有限的历史。
基于马尔科夫假设计算 p(w5∣w4,w3,w2,w1)p({w}_{5}|{w}_{4},{w}_{3},{w}_{2},{w}_{1})p(w5∣w4,w3,w2,w1),有三种版本的结果。
unigramunigramunigram:p(w5)p({w}_{5})p(w5)
bigrambigrambigram:p(w5∣w4)p({w}_{5}|{w}_{4})p(w5∣w4)
trigramtrigramtrigram:p(w5∣w4,w3)p({w}_{5}|{w}_{4},{w}_{3})p(w5∣w4,w3)
我们以bigrambigrambigram 为例,计算p(w1,w2,...,wn)=p(w1∣start)p(w2∣w1)...p(wn∣wn−1)p(EOS∣wn)p({w}_{1},{w}_{2},...,{w}_{n})=p({w}_{1}|start)p({w}_{2}|{w}_{1})...p({w}_{n}|{w}_{n-1})p(EOS|{w}_{n})p(w1,w2,...,wn)=p(w1∣start)p(w2∣w1)...p(wn∣wn−1)p(EOS∣wn)
显然引入马尔科夫假设,会使得模型变得简单,参数个数减少。
语言模型的评价
PerplexityPerplexityPerplexity
测试集的能力
语言模型 ⬆-> P(test set)P(test\ set)P(test set) ⬆ -> Perplexity(test set)Perplexity(test\ set)Perplexity(test set) ⬇
Wtest={w1,w2,...,wn;wi∈V}{W}_{test}=\{{w}_{1},{w}_{2},...,{w}_{n};{w}_{i}\in V\}Wtest={w1,w2,...,wn;wi∈V}
Perplexity(Wtest)=2−1n∑i=1Nlog2q(wi)Perplexity({W}_{test})={2}^{-\frac{1}{n}\sum_{i=1}^{N}{log}_{2}q({w}_{i})}Perplexity(Wtest)=2−n1∑i=1Nlog2q(wi)
q(wi)q({w}_{i})q(wi) 表示模型对每个词的预测概率。
理解PerplexityPerplexityPerplexity
-
−log2p(vi)-{log}_{2}p({v}_{i})−log2p(vi):如果用概率ppp 来编码vi{v}_{i}vi,需要多少比特。
-
−∑i=1∣V∣p^(vi)log2q(vi)-\sum_{i=1}^{|V|}\hat{p}({v}_{i}){log}_{2}q({v}_{i})−∑i=1∣V∣p^(vi)log2q(vi):表示vi{v}_{i}vi 服从ppp,qqq 来编码vi{v}_{i}vi 比特数的期望。
-
2−1n∑i=1Nlog2q(wi){2}^{-\frac{1}{n}\sum_{i=1}^{N}{log}_{2}q({w}_{i})}2−n1∑i=1Nlog2q(wi),WtestW_{test}Wtest 的等效状态数目。
PerplexityPerplexityPerplexity 越小表示预测正确的概率越大。
##OOV(Out of Vocab)OOV(Out\ of\ Vocab)OOV(Out of Vocab)
以Trigram ModelTrigram\ ModelTrigram Model 为例:
p(wi∣wi−1,wi−2)=count(wi−2,wi−1,wi)count(wi−2,wi−1)p({w}_{i}|{w}_{i-1},{w}_{i-2})=\frac{count({w}_{i-2},{w}_{i-1},{w}_{i})}{count({w}_{i-2},{w}_{i-1})}p(wi∣wi−1,wi−2)=count(wi−2,wi−1)count(wi−2,wi−1,wi)
那么有人可能要问:为什么上面公式成立?
下面我们以上面这个训练集为例,利用***最大似然估计*** 的方法来证明上式成立。
max log(L(DTrain))=log(∏ip(wi∣wi−1,wi−2))=∑ilog(p(wi∣wi−1,wi−2))max\ log(L({D}_{Train}))=log(\prod_{i}^{}p({w}_{i}|{w}_{i-1},{w}_{i-2}))=\sum_{i}^{}log(p({w}_{i}|{w}_{i-1},{w}_{i-2}))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(上网∣我喜欢))=3*log(p(我|-,-))+log(p(你|--))+3*log(p(喜欢|-, 我)) + log(p(喜欢|-,你))+log(p(开车|我 喜欢)) + log(p(上网|我 喜欢))=3∗log(p(我∣−,−))+log(p(你∣−−))+3∗log(p(喜欢∣−,我))+log(p(喜欢∣−,你))+log(p(开车∣我喜欢))+log(p(上网∣我喜欢))
+log(p(篮球∣我喜欢))+log(p(编程∣你喜欢))+log(p(篮球|我 喜欢)) + log(p(编程|你 喜欢))+log(p(篮球∣我喜欢))+log(p(编程∣你喜欢))
我们以首字符举例
约束条件:p(我∣−,−)+p(你∣−,−)=1p(我|-,-) + p(你|-,-) = 1p(我∣−,−)+p(你∣−,−)=1
由拉格朗日乘子法:$$L = 3*log(p(我|-,-)) + log(p(你|-, -))
- lambda * (p(我|-,-) + p(你|-,-) - 1)$$
L对参数的导数等于零:dLd(p(我∣−,−))=0;dLd(p(你∣−,−))=0;dLd(lambda)=0\frac{dL}{d(p(我|-,-))} = 0; \frac{dL}{d(p(你|-,-))}= 0; \frac{dL}{d(lambda)}= 0d(p(我∣−,−))dL=0;d(p(你∣−,−))dL=0;d(lambda)dL=0
得:3/p(我∣−,−)+lambda=0;3 / p(我|-,-) + lambda = 0;3/p(我∣−,−)+lambda=0;
1/p(你∣−,−)+lambda=0;1 / p(你|-,-) + lambda = 0;1/p(你∣−,−)+lambda=0;
p(我∣−,−)+p(你∣−,−)–1=0p(我|-,-) + p(你|-,-) – 1 = 0p(我∣−,−)+p(你∣−,−)–1=0
可计算得出:P(我∣−,−)=33+1=count(−,−,我)count(−,−,我)+count(−,−,你)P(我|-,-) = \frac{3} {3 + 1} = \frac{count(-,-,我)}{count(-,-,我) + count(-,-,你)}P(我∣−,−)=3+13=count(−,−,我)+count(−,−,你)count(−,−,我)
假设我们现在由训练集得出一个模型ppp,现在由模型给测试集中的"我 喜欢 王者荣耀"打分。
PPP(王者荣耀|我 喜欢) = 000 (TrainingTrainingTraining 中来没有出现的词)-->OOV(Out of Vocabulary)OOV (Out\ of\ Vocabulary)OOV(Out of Vocabulary)
按照上面的计算公式PPP(王者荣耀|我 喜欢) = 0,显然不合理,训练集中没出现"王者荣耀"并不能代表就不喜欢?
同理:
PPP (编程|我 喜欢) = 000 (TrainingTrainingTraining 中没有出现的trigramtrigramtrigram)–>Smoothing
那么如何解决OOVOOVOOV 问题呢?
-
假设Training SetTraining\ SetTraining Set 中出现了∣V′∣|V'|∣V′∣ 个不同的词汇,那么我们根据词频***选择词频最高的∣V∣|V|∣V∣个词汇作为我们的词汇集VVV。***
-
在TrainingTrainingTraining 和TestingTestingTesting 中,将不属于VVV 的词汇都替换成特殊词汇UNKUNKUNK。
V′=V'=V′= {我 喜欢 开车 上网 篮球 编程}
V=V =V= {我 喜欢 开车 上网 编程 }
P(王者荣耀∣我喜欢)=P(UNK∣我喜欢)=count(我喜欢UNK)/count(我喜欢)=1/3=0.333P(王者荣耀|我 喜欢) = P(UNK|我 喜欢) = count(我 喜欢 UNK) / count(我 喜欢) = 1 / 3 = 0.333P(王者荣耀∣我喜欢)=P(UNK∣我喜欢)=count(我喜欢UNK)/count(我喜欢)=1/3=0.333
平滑方法
TrainingTrainingTraining 中没有出现的trigramtrigramtrigram,就是在训练集中没出现这种组合。
共有以下几种方法解决:
- +1 平滑
- Back−offBack-offBack−off 回退法
- InterpolateInterpolateInterpolate 插值法
- Absolute DiscountAbsolute\ DiscountAbsolute Discount
- Kneser−Ney SmoothingKneser-Ney\ SmoothingKneser−Ney Smoothing
- Modified Kneser−Ney SmoothingModified\ Kneser-Ney\ SmoothingModified Kneser−Ney Smoothing (最优的方法)
+1 平滑
该平滑方法在别的分类问题中可能有用,但是在语言模型中表现一般,基本上不用。
Back−offBack-offBack−off 回退法
CountCountCount (我 喜欢 编程) = 0,但是 countcountcount (喜欢 编程) > 0
使用 TrigramTrigramTrigram 如果 count(trigram)count(trigram)count(trigram) 不满足条件,则使用BigramBigramBigram;再否则使用UnigramUnigramUnigram;
因为之前已经解决了OOVOOVOOV 问题,所以UnigramUnigramUnigram 不可能为0。
Interpolate 插值法
将Trigram,Bigram,UnigramTrigram, Bigram, UnigramTrigram,Bigram,Unigram 线性组合起来:
这里面的参数如何得出?同理使用极大似然估计得:
logloglog 里面只有几个参数的和求导之后,各个参数耦合在一起。EM 算法 来解决。
更进一步:
根据不同的上下文,选择不同的参数。显然这样处理PerplexityPerplexityPerplexity 变小,
Absolute Discounting “绝对折扣”
wi−n+1i−1{w}^{i-1}_{i-n+1}wi−n+1i−1表示wi−n+1{w}_{i-n+1}wi−n+1 到 wi−1{w}_{i-1}wi−1 的n_gramn\_gramn_gram。显然由公式可知在这种平滑方法中,计算结果和Pabs(wi∣wi−n+2i−1){P}_{abs}({w}_{i}|{w}^{i-1}_{i-n+2})Pabs(wi∣wi−n+2i−1) 有很大关系。
Kneser-Ney Smoothing
有钱的,每个人固定的税 D, 建立一个基金;没钱的,根据n−1_gramn-1\_gramn−1_gram的“交际广泛”的程度来分了这个基金。
Modified Kneser-Ney Smoothing
有钱的,每个人根据自己的收入交不同的税D, 类似于阶梯税,建立一个基金;没钱的,根据n−1_gramn-1\_gramn−1_gram“交际广泛”的程度来分了这个基金。