赞
踩
语言模型是计算一个句子是一个句子的概率的模型,一个句子既需要符合语法规则,同时也需要符合语义,只有两方面都满足的情况下,语言模型才会给出一个较高的概率值。语言模型是一个无监督的模型,不需要任何的语料标注。
所谓的基于专家知识的语言模型就是语言学家企图总结出一套通用的语法规则,例如形容词后接名词,但是这种方法并无法当今网络用语频繁出现的这样一种情况,因此现在不用常用这种方法
所谓的统计语言模型是指通过概率计算来刻画语言模型
P
(
s
)
=
P
(
w
1
,
w
2
,
…
,
w
n
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
w
2
)
…
P
(
w
n
∣
w
1
w
2
…
w
n
−
1
)
某一个词语出现概率的求解方法:用语料的频率代替概率(频率学派)
p
(
w
i
)
=
c
o
u
n
t
(
w
i
)
N
p(w_i) = \frac{count(w_i)}{N}
p(wi)=Ncount(wi)
条件概率如 P ( w 2 ∣ w 1 ) P(w_2 | w_1) P(w2∣w1)的求解方法:频率学派+条件概率
p ( w i ∣ w i − 1 ) = p ( w i − 1 , w i ) p ( w i − 1 ) = c o u n t ( w i − 1 , w i ) c o u n t ( w i − 1 ) p\left(w_{i} | w_{i-1}\right)=\frac{p\left(w_{i-1}, w_{i}\right)}{p\left(w_{i-1}\right)} = \frac{count(w_{i-1},w_i)}{count(w_{i-1})} p(wi∣wi−1)=p(wi−1)p(wi−1,wi)=count(wi−1)count(wi−1,wi)
通常概率表达的方式,我们就能构造出一个较好的语言模型,但仍然存在下面两个问题:
如何对上面两个问题进行解决呢? ⇒ \Rightarrow ⇒ 平滑操作
在统计语言模型中的马尔可夫假设主要内容就是:下一个词出现的概率仅依赖于前面的一个词或几个词,如果与前 k k k个词有关,则称为 k − g r a m k-gram k−gram模型
u
n
i
g
r
a
m
P
(
s
)
=
P
(
w
1
)
P
(
w
2
)
…
P
(
w
n
)
b
i
g
r
a
m
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
…
P
(
w
n
∣
w
n
−
1
)
t
r
i
g
r
a
m
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
2
w
1
)
…
P
(
w
n
∣
w
n
−
1
w
n
−
2
)
k
−
g
r
a
m
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
2
w
1
)
…
P
(
w
n
∣
w
n
−
k
+
1
…
w
n
−
1
)
注意: k − g r a m k-gram k−gram模型的参数空间为 V + V 2 + … + V k V+V^2+\ldots+V^k V+V2+…+Vk, V V V为语料库词语总数
语言模型本质上是一个多分类问题,这里可以通过困惑度(Perplexity)进行模型的评价:
P P ( s ) = P ( w 1 , w 2 , … , w n ) − 1 n = 1 P ( w 1 , w 2 , … , w n ) n = 1 P ( s ) n PP(s) = P(w_1, w_2, \ldots, w_n)^{-\frac{1}{n}}=\sqrt[n]{\frac{1}{P\left(w_{1}, w_{2}, \dots, w_{n}\right)}} = \sqrt[n]{\frac{1}{P(s)}} PP(s)=P(w1,w2,…,wn)−n1=nP(w1,w2,…,wn)1 =nP(s)1
因此,句子概率越大,语言模型越好,困惑度越小
所谓的独热表示,就是一个向量,只有一个地方为1,其他位置都为0。这种表示方法的优点是:表示简单,但是缺点也十分明显,那就是当词非常多的时候,表示向量的维度非常高,需要的空间非常大,同时还有一个问题就是这种表示方法无法表示词与词之间的关系
分布式表示也称为稠密表示,对于每一个词,仅需要一个 D D D维的向量就能表示,这里的 D D D是远远小于总的词语个数 V V V,对于独热表示,每一个都需要一个 V V V维的向量,而分布式表示相当于是把 V V V维压缩到了 D D D维,但 D D D维向量中某一位置的数值大小需要通过训练得到。同时,分布式表示有一个很大的好处,那就是可以表示词与词之间的相似性(利用余弦相似度)—— Word embedding
1986年, Hinton 第一次提出了 Distributed Representation ,目的是将离散形式的词输入到神经网络中,由于神经网络需要的是连续的值,因此提出了一种 Distributed Representation 的表示方法,把离散形式的词进行连续的分布式表示;2003年,在文章 A Neural Probabilistic Language Model首次使用了词向量,而在2003年到2013年间,提出了很多训练词向量的方法,但共同的缺点就是非常慢,无法在大的预料上训练,在2013年提出的 word2vec 模型解决了训练速度慢的问题,能够在大的语料上进行训练,得到更好的词向量,推动了自然语言处理的发展
对于两个词的相似度,可以用公式:
s i m ( w o r d 1 , w o r d 2 ) = cos ( w o r d v e c 1 , w o r d v e c 2 ) sim(word1, word2) = \cos(wordvec1, wordvec2) sim(word1,word2)=cos(wordvec1,wordvec2)
进行计算,计算得到的值越接近于1,则两个词越相似,一种更客观的评价方式是词类比(analogy),计算公式为
cos ( w o r d v e c 1 − w o r d v e c 2 + w o r d v e c 3 , w o r d v e c 4 ) \cos(wordvec1-wordvec2+wordvec3,wordvec4) cos(wordvec1−wordvec2+wordvec3,wordvec4)
通过这种方式,能够学习到词与词之间的关系,例如 France 和 Paris 与 Italy 和 Rome 这两个词对就是非常相似的,因此 V ( F r a n c e ) − V ( P a r i s ) ≈ V ( I t a l y ) − V ( R o m e ) V(France) - V(Paris) \approx V(Italy) - V(Rome) V(France)−V(Paris)≈V(Italy)−V(Rome),这种模型的训练就能得到非常多在语义上相似的词对
可以将训练得到的词向量可以用于外部任务比如命名实体识别、文本分类;也可以应用于其他NLP任务上,相当于一个半监督任务,可以有效地提高模型的泛化能力
对比模型主要对比两种模型,一种是前馈神经网络语言模型(NNLM),一种是循环神经网络模型(RNNLM)
前馈神经网络语言模型最早由 Bengio 在2003年提出,网络结构如下图所示:
从上图中可以看出,NNLM的结构分为三层,最下面为输入层: input layer ,输入的是词的索引而非词本身, 输入后,将每个 index 映射为一个向量,最后将这些向量 contact 在一起;中间一层为隐藏层: hidden layer ,即将输入层的向量接上一个全连接层,用 t a n h tanh tanh作为激活函数激活;最上面为输出层: output layer,也是接上一个全连接层,利用 s o f t m a x softmax softmax输出概率。这里输入的是前 n − 1 n-1 n−1个词语,最后输出的是第 n n n个位置单词的概率。下面详细介绍三个层:
对于一句话, L o s s Loss Loss的定义和困惑度的定义如下:
讨论: Bingio 在2003年的文章中提出的 N N L M NNLM NNLM是一篇开山之作,也为后面的研究提出了几个研究的思路,具体如下:
如上图所示,
R
N
N
L
M
RNNLM
RNNLM也有三层:
定义:将语言模型的建立看成个多分类问题,相当于线性分类器加上 s o f t m a x softmax softmax,这样就构成了一个 L o g − Log- Log−线性模型: Y = s o f t m a x ( W x + b ) Y = softmax(Wx+b) Y=softmax(Wx+b),多分类的逻辑回归模型就是一个 L o g − Log- Log−线性模型, w o r d 2 v e c word2vec word2vec中的两种模型: s k i p − g r a m skip-gram skip−gram和 C B O W CBOW CBOW都是 L o g − Log- Log−线性模型
S k i p − g r a m Skip-gram Skip−gram是用中心词预测周围词,若中心词为 w i w_i wi,这里需要定义在中心词附近多大的范围才是中心词,既需要一个 w i n d o w window window,例如我们取 w i n d o w = 2 window=2 window=2,则我们需要计算的就是: P ( w i − 1 ∣ w i ) , P ( w i − 2 ∣ w i ) , P ( w i + 1 ∣ w i ) , P ( w i + 2 ∣ w i ) P(w_{i-1} | w_i), P(w_{i-2} | w_i), P(w_{i+1} | w_i), P(w_{i+2} | w_i) P(wi−1∣wi),P(wi−2∣wi),P(wi+1∣wi),P(wi+2∣wi),那么 S k i p − g r a m Skip-gram Skip−gram是如何求取这些概率值的呢?前面讲到,求这种概率的问题本质上是一个多分类问题,以 P ( w i − 1 ∣ w i ) P(w_{i-1}| w_i) P(wi−1∣wi)为例,输入的是 w i w_i wi, l a b e l label label是 w i − 1 w_{i-1} wi−1,计算过程如下图所示:
注意:
S k i p − g r a m Skip-gram Skip−gram的损失函数:
J ( θ ) = 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log p ( w t + j ∣ w t ) J(\theta)=\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m, j \neq 0} \log p\left(w_{t+j} \mid w_{t}\right) J(θ)=T1t=1∑T−m≤j≤m,j=0∑logp(wt+j∣wt)
需要对 J ( θ ) J(\theta) J(θ)求最大值,或者对 J ( θ ) J(\theta) J(θ)取相反数并求取最小值
C B O W CBOW CBOW的结构如上图所示,是通过周围词预测中心词, B O W BOW BOW指的是 B a g o f w o r d Bag \ of \ word Bag of word,即词袋模型,因此 C B O W CBOW CBOW是基于词袋模型的一种模型,具体细节如下图所示:
从上面可以看出, C B O W CBOW CBOW也是使用了 W W W和 W ′ W^{\prime} W′,只是中间进行了一个加和,最后的优化过程仍然是优化 W W W和 W ′ W^{\prime} W′
损失函数:
J
(
θ
)
=
1
T
∑
T
∑
log
P
(
c
∣
o
)
=
1
T
∑
exp
{
u
o
T
v
c
}
∑
j
=
1
V
exp
{
u
o
T
v
j
}
J(\theta)=\frac{1}{T} \sum_{T} \sum \log P(c \mid o)=\frac{1}{T} \sum \frac{\exp \left\{u_{o}^{T} v_{c}\right\}}{\sum_{j=1}^{V} \exp \left\{u_{o}^{T} v_{j}\right\}}
J(θ)=T1T∑∑logP(c∣o)=T1∑∑j=1Vexp{uoTvj}exp{uoTvc}
其中,
P
(
c
∣
o
)
=
exp
{
u
o
T
v
c
}
∑
j
=
1
V
exp
{
u
o
T
v
j
}
P(c \mid o)=\frac{\exp \left\{u_{o}^{T} v_{c}\right\}}{\sum_{j=1}^{V} \exp \left\{u_{o}^{T} v_{j}\right\}}
P(c∣o)=∑j=1Vexp{uoTvj}exp{uoTvc}
u
0
u_0
u0是窗口内上下文词向量之和,
v
c
v_c
vc、
v
j
v_j
vj是中心词向量‘
w o r d 2 v e c word2vec word2vec中,最后一层需要输出 V V V个概率,因此需要一些降低复杂度的方法:
下面分别介绍这三种方法
层次 s o f t m a x softmax softmax的基本思想是将求 s o f t m a x softmax softmax操作转化为求 s i g m o i d sigmoid sigmoid操作,对于 s o f t m a x softmax softmax,我们需要做 V V V次操作,而如何转化为 s i g m o i d sigmoid sigmoid,则可以采用树结构,这样就只需要 log 2 V \log_2^V log2V次操作。如下图所示,如果是一个8字符的情况( a ∼ h a \sim h a∼h),则需要对每个字符做 s o f t m a x softmax softmax,而如果将其构建为下图所示的满二叉树的结构,则对于任意字符,仅需要3次就能找到,即 log 2 V \log_2V log2V次
能否找到比 log 2 V \log_2^V log2V还要快的结构呢?答案是肯定的,通过构建 Huffman 树,找到带权重路径最短的二叉树,可以进一步加速,层次 s o f t m a x softmax softmax就是通过这种方式进行构建,具体的构建方法( S k i p − g r a m Skip-gram Skip−gram模型)如下图所示:
公式表达:
p
(
w
∣
w
I
)
=
∏
j
=
1
L
(
w
)
−
1
σ
(
[
[
n
(
w
,
j
+
1
)
=
ch
(
n
(
w
,
j
)
)
]
]
⋅
v
n
(
w
,
j
)
′
⊤
v
w
I
)
p\left(w \mid w_{I}\right)=\prod_{j=1}^{L(w)-1} \sigma \left([\![ n(w, j+1)=\operatorname{ch}(n(w, j))]\!] \cdot {v_{n(w, j)}^{\prime}}^{\top} v_{w_{I}}\right)
p(w∣wI)=j=1∏L(w)−1σ([[n(w,j+1)=ch(n(w,j))]]⋅vn(w,j)′⊤vwI)
n ( w , j ) n(w,j) n(w,j)表示词 w w w在第 j j j个节点上, n ( w , 1 ) n(w,1) n(w,1)表示 root 节点, n ( w , L ( w ) ) n(w,L(w)) n(w,L(w))表示叶子节点
ch ( n ( w , j ) ) \operatorname{ch}(n(w,j)) ch(n(w,j))表示节点 n ( w , j ) n(w,j) n(w,j)的 right child node
双中括号表示,如果括号中为 true ,则为1,否则为-1,即:
[
[
x
]
]
=
{
1
,
if
x
is true
−
1
,
else
[\![ x]\!]=\left\{
v W I v_{W_{I}} vWI为中心词的词向量, v n ( w , j ) ′ {v_{n(w, j)}^{\prime}} vn(w,j)′为词 w w w在树上的第 j j j个节点的参数
CBOW中的层次
s
o
f
t
m
a
x
softmax
softmax:
前面提到的层次
s
o
f
t
m
a
x
softmax
softmax是基于
S
k
i
p
−
g
r
a
m
Skip-gram
Skip−gram模型进行构建的,而针对
C
B
O
W
CBOW
CBOW模型的构建方法如下图所示:
可以看到, C B O W CBOW CBOW中的层次 s o f t m a x softmax softmax构建方式与 S k i p − g r a m Skip-gram Skip−gram相似,唯一 的区别在于 u 0 u_0 u0,这里的 u 0 u_0 u0是值窗口内上下文词向量的平均
核心思想:
负采样的核心思想是:舍弃多分类以提高速度,在现在的研究中,层次
s
o
f
t
m
a
x
softmax
softmax并不常用,因为本质上仍然是一个多分类问题,而负采样在现在的研究中应用十分广泛,原因就在于直接舍弃了多分类,将其变为了一个二分类问题。例如有一个训练样本,中心词是
w
w
w,它周围上下文共有
2
c
2c
2c个词,记为
c
o
n
t
e
x
t
(
w
)
context(w)
context(w)。由于这个中心词
w
w
w的确和
c
o
n
t
e
x
t
(
w
)
context(w)
context(w)相关存在,因此它是一个真实的正例。通过负采样,我们得到
n
e
g
neg
neg个和
w
w
w不同的中心词
w
i
,
i
=
1
,
2
,
…
,
n
e
g
w_i,i=1,2,\ldots,neg
wi,i=1,2,…,neg,这样
c
o
n
t
e
x
t
(
w
)
context(w)
context(w)和
w
i
w_i
wi就组成了
n
e
g
neg
neg个并不真实存在的负例。利用这一个正例和
n
e
g
neg
neg个负例,我们进行二元逻辑回归,得到负采样对应每个词
w
i
w_i
wi对应的模型参数
θ
i
\theta_i
θi,和每个词的词向量
损失函数:
J
neg
−
sample
(
θ
)
=
log
σ
(
u
o
T
v
c
)
+
∑
k
=
1
K
E
k
∼
P
(
w
)
[
log
σ
(
−
u
k
T
v
c
)
]
J_{\operatorname{neg}-\operatorname{sample}}(\theta)=\log \sigma\left(u_{o}^{T} v_{c}\right)+\sum_{k=1}^{K} E_{k \sim P(w)}\left[\log \sigma\left(-u_{k}^{T} v_{c}\right)\right]
Jneg−sample(θ)=logσ(uoTvc)+k=1∑KEk∼P(w)[logσ(−ukTvc)]
采样方法:
P ( w ) = U ( w ) 3 4 Z P(w)=\frac{U(w)^{\frac{3}{4}}}{Z} P(w)=ZU(w)43
U ( w ) U(w) U(w)是词 w w w在数据集中出现的频率, Z Z Z为归一化的参数,使得求解之后的概率和依旧为1
例如 U ( a ) = 0.01 , U ( b ) = 0.99 U(a)=0.01, U(b)=0.99 U(a)=0.01,U(b)=0.99,则
通过这样的采样方法,可以减少频率大的词的抽样概率,增加评率小的词的抽样概率
CBOW中的负采样
C
B
O
W
CBOW
CBOW中的负采样与
S
k
i
p
−
g
r
a
m
Skip-gram
Skip−gram中的负采样形式相似,损失函数为:
J
(
θ
)
=
log
σ
(
u
o
T
v
c
)
+
∑
i
=
1
k
E
j
∼
P
(
w
)
[
log
σ
(
−
u
o
T
v
j
)
]
J(\theta)=\log \sigma\left(u_{o}^{T} v_{c}\right)+\sum_{i=1}^{k} E_{j \sim P(w)}\left[\log \sigma\left(-u_{o}^{T} v_{j}\right)\right]
J(θ)=logσ(uoTvc)+i=1∑kEj∼P(w)[logσ(−uoTvj)]
自然语言处理有一个共识,即文档或者数据集中出现频率高的词往往携带信息较少,比如 the, is, a, and等,而出现频率低的词往往携带信息多。因此应当重点关注这些低频词,这也是重采样的目的,而进行重采样的原因有以下两个:
重采样的方法
P ( w i ) = 1 − t f ( w i ) P\left(w_{i}\right)=1-\sqrt{\frac{t}{f\left(w_{i}\right)}} P(wi)=1−f(wi)t
f ( w ) f(w) f(w)为词 w i w_i wi在数据集中出现的频率, t t t为一个超参数,文中 t t t选取为 1 0 − 5 10^{-5} 10−5,训练集中的词 w i w_i wi会以 P ( w i ) P(w_i) P(wi)的概率被删除。词频越大, f ( w i ) f(w_i) f(wi)越大, P ( w i ) P(w_i) P(wi)越大,那么词 w i w_i wi就有更大的概率被删除,反之亦然。如果词 w i w_i wi的词频小于等于 t t t,那么 w i w_i wi则不会被别除,这样就加速训练,能够得到更好的词向量。
w o r d 2 v e c word2vec word2vec可以总结为“ 2 + 3 2+3 2+3”或者“ 2 + 2 + 1 2+2+1 2+2+1”,第一个“ 2 2 2”表示两种模型,一种是 S k i p − g r a m Skip-gram Skip−gram模型,是用中心词预测周围词,一种是 C B O W CBOW CBOW模型,是用周围词预测中心词”“ 3 3 3“表示的是三种关键技术:层次 s o f t m a x softmax softmax、负采样、重采样;也可以分为“ 2 + 1 2+1 2+1”,本质上是一样的
模型复杂度用 O O O表示,代表的是训练的复杂度,计算公式为:
O = E × T × Q O=E \times T \times Q O=E×T×Q
对不同的模型进行复杂度比较时,需要保证 E E E和 T T T相同,因此实际上是比较 Q Q Q的大小,而 Q Q Q的计算可以通过计算模型的参数个数来等价代替,从而进行模型之间复杂度的比较
N
N
L
M
NNLM
NNLM是输入
N
−
1
N-1
N−1个词,预测第
N
N
N个词,每个输入的词都会被映射为一个
D
D
D维的向量,因此输入层的参数
x
x
x的维度为
N
×
D
N\times D
N×D,隐藏层
W
W
W是一个全连接层,因此
W
W
W的维度为
N
×
D
×
H
N \times D \times H
N×D×H,输出层
U
U
U也是一个全连接层,因此
U
U
U的维度为
H
×
V
H\times V
H×V,因此
N
N
L
M
NNLM
NNLM的复杂度
Q
Q
Q为:
Q
=
V
×
H
+
N
×
D
×
H
+
N
×
D
Q=V \times H+N \times D \times H+N \times D
Q=V×H+N×D×H+N×D
如果使用层次
s
o
f
t
m
a
x
softmax
softmax,则复杂度可降为
Q
=
log
2
V
×
H
+
N
×
D
×
H
+
N
×
D
Q=\log_2^V \times H+N \times D \times H+N \times D
Q=log2V×H+N×D×H+N×D
N
N
L
M
NNLM
NNLM输入的是
w
(
t
)
w(t)
w(t),维度
1
×
D
1\times D
1×D,
U
U
U为全连接层,维度为
D
×
H
D \times H
D×H,
W
W
W为
H
×
H
H \times H
H×H,输出层
V
V
V为
H
×
V
H \times V
H×V,因此
Q
=
1
×
D
+
D
×
H
+
H
×
H
+
H
×
V
Q = 1\times D + D\times H + H \times H + H \times V
Q=1×D+D×H+H×H+H×V
由于
D
≈
H
D \approx H
D≈H,因此
Q
=
H
(
2
H
+
1
)
+
H
×
V
Q = H(2H +1)+H\times V
Q=H(2H+1)+H×V,因此可以写为:
Q = H × H + H × V Q = H \times H + H \times V Q=H×H+H×V
如果使用层次 s o f t m a x softmax softmax,则 Q = H × H + H × log 2 V Q = H \times H + H \times \log_2^V Q=H×H+H×log2V
如果周围词个数为
N
N
N,则输入层的维度为
N
×
D
N\times D
N×D,输出层为
D
×
V
D\times V
D×V,因此
Q
=
N
×
D
+
D
×
V
Q = N\times D + D\times V
Q=N×D+D×V
对于一个中心词,维度为
D
D
D,周围词矩阵
W
∗
W^{*}
W∗为
D
×
V
D\times V
D×V,同时需要求解
C
C
C个周围词,因此
Q
Q
Q为:
Q
=
C
(
D
+
D
×
V
)
Q=C(D+D \times V)
Q=C(D+D×V)
不同模型的复杂度
Q
Q
Q如下:
NNLM:
Q
=
N
×
D
+
N
×
D
×
H
+
H
×
log
2
V
Q = N \times D+N \times D \times H+H \times \log _{2} V
Q=N×D+N×D×H+H×log2V
RNNLM:
Q
=
H
×
H
+
H
×
log
2
V
Q= H \times H+H \times \log _{2} V
Q=H×H+H×log2V
CBOW + HS:
Q
=
N
×
D
+
D
×
log
2
V
Q=N \times D+D \times \log _{2} V
Q=N×D+D×log2V
Skip-gram + HS:
Q
=
C
(
D
+
D
×
log
2
V
)
Q=C\left(D+D \times \log _{2} V\right)
Q=C(D+D×log2V)
CBOW + NEG:
Q
=
N
×
D
+
D
×
(
K
+
1
)
)
Q=N \times D+D \times(K+1))
Q=N×D+D×(K+1))
Skip-gram + NEG:
Q
=
C
(
D
+
D
×
(
K
+
1
)
)
Q=C(D+D \times (K+1))
Q=C(D+D×(K+1))
实现 S k i p − g r a m Skip-gram Skip−gram和 C B O W CBOW CBOW以及 H S HS HS和 N G E NGE NGE,具体代码见我的Github
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。