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