自然语言处理预备知识
信息熵
-
信息量
信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大:
I ( x ) = − l o g ( P ( x ) ) I(x)=-log(P(x)) I(x)=−log(P(x)) -
信息熵也被称为熵,用来表示所有信息量的期望。
所以信息量的熵可表示为:
H
(
X
)
=
E
(
I
(
x
)
)
=
∑
n
p
(
x
i
)
I
(
x
i
)
=
−
∑
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(X)=E(I(x))=\sum_n{p(x_i)I(x_i)}=-\sum_n{p(x_i)log(p(x_i))}
H(X)=E(I(x))=n∑p(xi)I(xi)=−n∑p(xi)log(p(xi))
相对熵(KL散度)
如果对于同一个随机变量X有两个单独的概率分布P(x)和Q(x),则我们可以使用KL散度来衡量这两个概率分布之间的差异。
KL散度:
D
k
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
D_{kL}(p||q)=\sum_{i=1}^{n}p(x_i)log(\frac{p(x_i)}{q(x_i)})
DkL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))
在机器学习中,常使用P(x)来表示样本的真实分布,Q(x)来表示模型所预测的分布,比如在一个三分类任务中(例如,猫狗马分类器)x1,x2,x3分别代表猫,狗,马。例如一张猫的图片真实分布P ( X ) = [ 1 , 0 , 0 ],预测分布Q ( X ) = [ 0.7 , 0.2 , 0.1 ] ,计算KL散度:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
q
(
x
i
)
)
=
p
(
x
1
)
l
o
g
(
p
(
x
1
)
q
(
x
1
)
)
+
p
(
x
2
)
l
o
g
(
p
(
x
2
)
q
(
x
2
)
)
+
p
(
x
3
)
l
o
g
(
p
(
x
3
)
q
(
x
3
)
)
=
0.36
D_{KL}(p||q)=\sum_{i=1}^{n}p(x_i)log(\frac{p(x_i)}{q(x_i)})\\ = p(x_1)log(\frac{p(x_1)}{q(x_1)})+p(x_2)log(\frac{p(x_2)}{q(x_2)})+p(x_3)log(\frac{p(x_3)}{q(x_3)})\\ =0.36
DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=p(x1)log(q(x1)p(x1))+p(x2)log(q(x2)p(x2))+p(x3)log(q(x3)p(x3))=0.36
KL散度越小,表示P(x)与Q(x)的分布更加接近,可以通过反复训练Q(x)来使Q(x)的分布逼近P(x)。
交叉熵误差
-
进行多类别分类的神经网络通常使用交叉熵(cross entropy error)误差作为损失函数。此时,交叉熵误差有神经网络输出的各类别的概率和监督标签求得。
-
交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性。在这里可以理解为度量真实分布和softmax输出预测分布的概率之间的差异性,我们的目标是将该差异缩小。
L o s s = − ∑ k t k l o g y k Loss = -\sum_k{t_klogy_k} Loss=−k∑tklogyk
t k t_k tk是对应于第 k k k个类别的监督标签, y k y_k yk对应于第 k k k个类别的softmax函数的输出,log是以e为底的对数。
因为只有正确解标签为1,其余都为0,因此该式实际上只是在计算标签为1的元素所对应的softmax输出的自然对数。
在考虑了小批量mini batch的情况下,交叉熵误差可以由下式表示:
L o s s = − 1 N ∑ n ∑ k t n k l o g y n k Loss = -\frac{1}{N}\sum_n\sum_k{t_{nk}logy_{nk}} Loss=−N1n∑k∑tnklogynk -
将KL散度公式拆开
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) = ∑ i = 1 n [ p ( x i ) l o g p ( x i ) − p ( x i ) l o g q ( x i ) ] = − H ( X ) − ∑ i = 1 n p ( x i ) l o g q ( x i ) D_{KL}(p||q)=\sum_{i=1}^{n}p(x_i)log(\frac{p(x_i)}{q(x_i)})\\ =\sum_{i=1}^{n}[p(x_i)logp(x_i)-p(x_i)logq(x_i)]\\ =-H(X)-\sum_{i=1}^{n}p(x_i)logq(x_i) DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=i=1∑n[p(xi)logp(xi)−p(xi)logq(xi)]=−H(X)−i=1∑np(xi)logq(xi)
即,KL散度 = 交叉熵 - 信息熵
其中,P(X)表示真实分布,Q(X)表示预测分布。
交叉熵可以重写为更为熟悉的形式:
L
o
s
s
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
q
(
x
i
)
Loss = -\sum_{i=1}^np(x_i)logq(x_i)
Loss=−i=1∑np(xi)logq(xi)
重点!!!
在机器学习训练网络时,输入数据与标签常常已经确定,那么真实概率分布P(x)也就确定下来了,所以信息熵在这里就是一个常量。由于KL散度的值表示真实概率分布P(x)与预测概率分布Q(x)之间的差异,值越小表示预测的结果越好,所以需要最小化KL散度。而交叉熵等于KL散度加上一个常量(信息熵),且公式相比KL散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算loss就行了。
即最小化KL散度 ==> 最小化交叉熵
条件熵
𝐻(X|Y)定义为在给定条件𝑌下,X 的条件概率分布的熵对Y的数学期望:
H ( X ∣ Y ) = ∑ y ∈ Y p ( y ) H ( X ∣ Y = y ) = − ∑ y ∈ Y p ( y ) ∑ x ∈ X p ( x ∣ y ) l o g p ( x ∣ y ) = − ∑ y ∈ Y ∑ x ∈ X p ( y ) p ( x ∣ y ) l o g p ( x ∣ y ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x ∣ y ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x , y ) p ( y ) = − ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x , y ) + ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( y ) = = − ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x , y ) + ∑ y ∈ Y p ( y ) l o g p ( y ) = H ( X , Y ) − H ( Y ) H(X|Y)=\sum_{y\in Y} p(y)H(X|Y=y)\\ =-\sum_{y\in Y} p(y)\sum_{x\in X}p(x|y)logp(x|y)\\ =-\sum_{y\in Y}\sum_{x\in X}p(y)p(x|y)logp(x|y)\\ =-\sum_{x\in X,y\in Y}p(x,y)logp(x|y)\\ =-\sum_{x\in X,y\in Y}p(x,y)log\frac{p(x,y)}{p(y)}\\ =-\sum_{x\in X,y\in Y}p(x,y)log{p(x,y)}+\sum_{x\in X,y\in Y}p(x,y)log{p(y)}\\ ==-\sum_{x\in X,y\in Y}p(x,y)log{p(x,y)}+\sum_{y\in Y}p(y)log{p(y)}\\ =H(X,Y)-H(Y) H(X∣Y)=y∈Y∑p(y)H(X∣Y=y)=−y∈Y∑p(y)x∈X∑p(x∣y)logp(x∣y)=−y∈Y∑x∈X∑p(y)p(x∣y)logp(x∣y)=−x∈X,y∈Y∑p(x,y)logp(x∣y)=−x∈X,y∈Y∑p(x,y)logp(y)p(x,y)=−x∈X,y∈Y∑p(x,y)logp(x,y)+x∈X,y∈Y∑p(x,y)logp(y)==−x∈X,y∈Y∑p(x,y)logp(x,y)+y∈Y∑p(y)logp(y)=H(X,Y)−H(Y)
互信息
度量X的熵和已知Y情况下X的熵之间的差异。显然,互信息越小,证明Y与X越无关(可以想到极限情况下I(X;Y)=0,此时是否已知Y都与X的熵无关)
I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) = − ∑ x ∈ X p ( x ) l o g p ( x ) + ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x ∣ y ) = ∑ x ∈ X , y ∈ Y [ − p ( x , y ) l o g p ( x ) + p ( x , y ) l o g p ( x ∣ y ) ] = ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I(X;Y)=H(X)-H(X|Y)\\ =-\sum_{x\in X}p(x)logp(x)+\sum_{x\in X,y\in Y} p(x,y)logp(x|y)\\ =\sum_{x\in X,y\in Y}[-p(x,y)logp(x)+p(x,y)logp(x|y)]\\ =\sum_{x\in X,y\in Y} p(x,y)log\frac{p(x,y)}{p(x)p(y)} I(X;Y)=H(X)−H(X∣Y)=−x∈X∑p(x)logp(x)+x∈X,y∈Y∑p(x,y)logp(x∣y)=x∈X,y∈Y∑[−p(x,y)logp(x)+p(x,y)logp(x∣y)]=x∈X,y∈Y∑p(x,y)logp(x)p(y)p(x,y)
联合熵
H ( X , Y ) = ∑ x ∈ X , y ∈ Y p ( x , y ) l o g p ( x , y ) H(X,Y)=\sum_{x\in X,y\in Y}p(x,y)logp(x,y) H(X,Y)=x∈X,y∈Y∑p(x,y)logp(x,y)
熵的链式法则
H
(
X
,
Y
)
=
H
(
X
)
+
H
(
Y
∣
X
)
H(X,Y)=H(X)+H(Y|X)
H(X,Y)=H(X)+H(Y∣X)
分词
生成式分词
步骤:
- 找出所有可能的分词,形成词图。
- 根据大规模语料,利用最大似然估计求得词转移的概率,即DAG中的权重。
- 用最短路径算法(如Viterbi)算法找出最短路径
优点:
在训练语料规模足够大和覆盖领域足够多的情况下,可以获得较高的切分正确率(>=95%)
缺点:
- 需要很大的训练语料
- 新词识别能力弱
- 解码速度相对较慢
判别式统计分词
把分词问题转化为确定句中每个字在词中位置问题(B/M/E)
示例:
分词结果:毛/B新/M年/E2/B0/M0/M0/M年/E毕/B业/E/于/B东/B北/M大/M学/E 还原:毛新年/2000年/毕业/于/东北大学
优点:
- 能充分利用各种来源的知识
- 需要较少的训练语料
- 解码速度快
- 新词识别性能好
缺点:
- 训练速度慢
- 需要高配置的机器训练
神经网络分词算法
公认效果最好的模型是BiLSTM+CRF
优点:
- 解码速度快
- 分词精度高
- 新词识别能力强
- 所需学习素材少
缺点:
- 训练速度慢
- 需要高配置的机器训练
分词系统
ICTCLAS、jieba分词、IK、Paoding(庖丁解牛分词)、MMSEG4J、盘古分词、BosonNLP
词向量表示方法
One-Hot、PPMI、LSA(潜在语义分析)、词嵌入
Word-Embedding优点:
- 维度低(100-500维)
- 无监督学习,不需要去掉停用词
- 天然有聚类后的效果
- 连续向量,方便机器学习模型处理
- 罕见词:“风姿绰约”≈“漂亮”
词向量模型
NNLM、Word2vec(CBOW、skipgram)
- CBOW模型主要用当前词的上下文预测当前词
- Skip-gram模型主要用当前词来预测上下文
N-gram语言模型
语言建模(Language Modeling)
对于一个句子空间A(所有可能的),其概率分布D表示任意可能句子的概率分布。估计句子空间A的概率分布D的过程被称作语言建模。
根据语言样本估计出的概率分布D就称为语言(空间)A的语言模型:
∑ a ∈ A P ( a ) = 1 ∀ a ∈ A , P ( a ) = ? \sum_{a\in A}P(a)=1\\ \forall a\in A,P(a)=? a∈A∑P(a)=1∀a∈A,P(a)=?
在语音识别中,如果识别结果有多个,则可以根据语言模型
计算每个识别结果的可能性,然后挑选一个可能性较大的识
别结果链式规则:
对于给定的句子 a = w 1 w 2 . . . w m a=w_1w_2...w_m a=w1w2...wm,如何计算 P ( a ) P(a) P(a)?
P ( a ) = P ( w 1 , w 2 , . . . w m ) = P ( w 1 ) P ( w 2 ∣ w 1 ) . . . P ( w m ∣ w 1 , w 2 , . . . w m − 1 ) P(a)=P(w_1,w_2,...w_m)=P(w_1)P(w_2|w_1)...P(w_m|w_1,w_2,...w_{m-1}) P(a)=P(w1,w2,...wm)=P(w1)P(w2∣w1)...P(wm∣w1,w2,...wm−1)
为了便于计算,一般只考虑前面n-1个次构成的历史:
P ( a ) = ∏ k = 1 m P ( w k ∣ w k − 1 . . . w k − n + 1 ) P(a)=\prod_{k=1}^{m}P(w_k|w_{k-1}...w_{k-n+1}) P(a)=∏k=1mP(wk∣wk−1...wk−n+1)
建立N-gram
N-gram的最大似然估计:
选择一组参数,使得训练样本的概率最大
选择能使训练样本取得最大概率值的分布作为总体分布
令 c ( w 1 , . . , w n ) c(w_1,..,w_n) c(w1,..,wn)表示N-gram w 1 , . . , w n w_1,..,w_n w1,..,wn在训练语料中出现的次数,则
P M L E ( w n ∣ w 1 , w 2 , . . . w n − 1 ) = c ( w 1 , c 2 , . . . c n ) c ( w 1 , w 2 , . . . w n − 1 ) P_{MLE}(w_n|w_1,w_2,...w_{n-1})=\frac{c(w_1,c_2,...c_n)}{c(w_1,w_2,...w_{n-1})} PMLE(wn∣w1,w2,...wn−1)=c(w1,w2,...wn−1)c(w1,c2,...cn)
用2-gram(bigram)语言模型进行计算:
句子的概率表现为若干bigram参数的乘积,若句子太长,计算时,会引起下溢(underflow),可以采用取对数并相加的方式:
纯对数层计算避免下溢的方法:
l o g ( e x + e y ) = l o g ( e x ( 1 + e y − x ) ) = x + l o g ( 1 + e y − x ) log(e^x+e^y)=log(e^x(1+e^{y-x}))=x+log(1+e^{y-x}) log(ex+ey)=log(ex(1+ey−x))=x+log(1+ey−x)
数据稀疏问题
若某n-gram在训练语料中没有出现,则该n-gram的概率必定是0
Zipf定律:
针对某个语料库,若某个词w的词频是f,并且该词在词频
表中的序号为r (即w是所统计的语料中第r常用词),则
f × r = k ( k 是一个常数 ) f × r = k (k是一个常数) f×r=k(k是一个常数)对语言而言,由于数据稀疏的存在,MLE不是一种很好的参数估计方法。解决办法——平滑技术。
平滑技术
Add-one平滑:
- 规定任何一个n-gram在训练语料至少出现一次(即规定
没有出现过的n-gram在训练语料中出现了一次)- 即 n e w _ c o u n t n − g r a m = o l d _ c o u n t n − g r a m + 1 new\_count_{n-gram} = old\_count_{n-gram}+1 new_countn−gram=old_countn−gram+1,那么有 P a d d 1 ( w 1 , w 2 , . . . w n ) = c ( w 1 , w 2 , . . . w n ) + 1 N + V P_{add1}(w_1,w_2,...w_n)=\frac{c(w_1,w_2,...w_n)+1}{N+V} Padd1(w1,w2,...wn)=N+Vc(w1,w2,...wn)+1
- N:训练语料中所有的n-gram的数量(token)
V:所有的可能的不同的n-gram的数量(type)- P ( w n ∣ w 1 , w 2 , . . . w n − 1 ) = c ( w 1 , c 2 , . . . c n ) + 1 c ( w 1 , w 2 , . . . w n − 1 ) + 1 P(w_n|w_1,w_2,...w_{n-1})=\frac{c(w_1,c_2,...c_n)+1}{c(w_1,w_2,...w_{n-1})+1} P(wn∣w1,w2,...wn−1)=c(w1,w2,...wn−1)+1c(w1,c2,...cn)+1
Add-delta平滑:
- 与Add-one相比把+1变成了加一个小于1的正数 δ \delta δ