赞
踩
Word2vec的出现改变了OneHot的高维稀疏的困境,自此之后各种xxx2vec如雨后春笋般冒了出来,用来解决各种嵌入式编码,包括后来的各种Embedding方式其实很多本质上都是Word2vec的延伸和优化。在本公众号「搜索与推荐Wiki」上也发布了不少Embedding相关的文章,后续也会持续的发布相关文章,欢迎关注。
万物皆可Embedding系列会结合论文和实践经验进行介绍,前期主要集中在论文中,后期会加入实践经验和案例,目前已更新:
后续会持续更新Embedding相关的文章,欢迎持续关注「搜索与推荐Wiki」
语言模型(Language model)是自然语言处理的重要技术,自然语言处理中最常见的是文本数据,我们可以把一段自然语言文本看作是一段离散的时间序列,假设一段长度为
T
T
T的文本中的词依次是
w
1
,
w
2
,
.
.
.
,
w
T
w_1, w_2, ..., w_T
w1,w2,...,wT,语言模型就是计算他的概率:
P
(
w
1
,
w
2
,
.
.
.
,
w
T
)
P(w_1, w_2,..., w_T)
P(w1,w2,...,wT)
也就是说语言模型是对语句的概率分布的建模。
语言模型可以分为:统计语言模型和神经网络语言模型。
假设 S S S 表示一个有意义的句子,eg:今天天气晴朗,适合户外爬山,可以将这个句子表示为: S = w 1 , w 2 , . . . , w n S = w_1, w_2, ..., w_n S=w1,w2,...,wn,换成例子中的句子: w 1 = 今 天 , w 2 = 天 气 , w 3 = 晴 朗 , w 4 = 适 合 , w 5 = 户 外 , w 6 = 爬 山 w_1=今天, w_2=天气, w_3=晴朗, w_4=适合, w_5=户外, w_6=爬山 w1=今天,w2=天气,w3=晴朗,w4=适合,w5=户外,w6=爬山。
用
P
(
S
)
P(S)
P(S) 表示这个句子出现的概率,展开为:
P
(
S
)
=
P
(
w
1
,
w
2
,
.
.
.
,
w
n
)
P(S)=P(w_1, w_2, ..., w_n)
P(S)=P(w1,w2,...,wn)
利用条件概率可以转化为:
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(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(S)=P(w1,w2,...,wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wn∣w1,w2,...,wn−1)
其中
P
(
w
1
)
P(w_1)
P(w1) 表示第一个词出现的概率,即「今天」在整个语料库中出现的概率,
P
(
w
2
∣
w
1
)
P(w_2|w_1)
P(w2∣w1) 表示在给定第一个词的情况下,第二个词出现的概率,即在整个语料库中给定「今天」这个词,「天气」这个词也出现的概率,后边的依次类推。
其中的 P ( w 1 ) P(w_1) P(w1)和 P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2∣w1)很容易计算得到,但是 P ( w 3 ∣ w 1 , w 2 ) P(w_3|w_1,w_2) P(w3∣w1,w2)及以后涉及变量较多,计算的复杂度也会变得更加复杂。
为了解决上面的过于复杂难以计算的问题,需要引入马尔可夫假设,马尔科夫假设中很重要的一点是有限视野假设,即每一个状态只与它前面的 n − 1 n-1 n−1个状态有关,这被称为 n n n 阶马尔可夫链
当应用在语言模型中时,就是指每一个词的概率只与前边的
n
−
1
n-1
n−1 个词有关系,这就被称为
n
n
n 元语言模型,当
n
=
2
n=2
n=2 时,被称为二元模型,此时上述公式展开为:
P
(
S
)
=
P
(
w
1
,
w
2
,
.
.
.
,
w
n
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
2
)
.
.
.
P
(
w
n
∣
n
1
)
P(S) = P(w_1, w_2, ..., w_n) = P(w_1) P(w_2|w_1)P(w_3|w_2)...P(w_n|n_1)
P(S)=P(w1,w2,...,wn)=P(w1)P(w2∣w1)P(w3∣w2)...P(wn∣n1)
经过马尔可夫假设的简化,计算
P
(
S
)
P(S)
P(S)的概率也会变得容易很多,当然随着
n
n
n的增加,相应的计算复杂度也会增加,而
n
n
n 越大,越逼近数据的真实分布,
n
n
n 通常取值为2、3、4、5。
通过上面的描述,可以明确的是:
以二元模型为例,如何计算
P
(
w
i
∣
w
i
−
1
)
P(w_i|w_{i-1})
P(wi∣wi−1)?从概率统计中可知:
P
(
w
i
∣
w
i
−
1
)
=
P
(
w
i
,
w
i
−
1
)
P
(
w
i
)
P(w_i|w_{i-1}) = \frac{P(w_i, w_{i-1})}{ P(w_i) }
P(wi∣wi−1)=P(wi)P(wi,wi−1)
在大语料的情况下,基于大数定理,词语
<
w
i
,
w
i
−
1
>
<w_i, w_{i-1}>
<wi,wi−1>的共同出现次数除以
w
i
w_i
wi的出现次数可以近似等于
P
(
w
i
∣
w
i
−
1
)
P(w_i|w_{i-1})
P(wi∣wi−1),所以有:
P
(
w
i
∣
w
i
−
1
)
=
P
(
w
i
,
w
i
−
1
)
P
(
w
i
)
=
N
(
w
i
,
w
i
−
1
)
N
(
w
i
)
P(w_i|w_{i-1}) = \frac{P(w_i, w_{i-1})}{ P(w_i) } = \frac{N(w_i, w_{i-1})}{ N(w_i)}
P(wi∣wi−1)=P(wi)P(wi,wi−1)=N(wi)N(wi,wi−1)
所以一般情况下,统计语言模型都要求语料足够大,这样得到的结果相对会准确一些。但这里边也存在一个问题,如果 N ( w i , w i − 1 ) = N ( w i ) = 1 N(w_i, w_{i-1}) = N(w_i) = 1 N(wi,wi−1)=N(wi)=1 或者都等于0的话,计算出来得结果显然是不合理的。因此引入了平滑技术。
平滑技术就是为了解决 c)中描述的次数统计比值不合理的情况。常见的平滑技术有(这里不展开描述,感兴趣的可以自行搜索了解):
优点:
缺点:
NNLM论文:《A Neural Probabilistic Language Model》
下载链接:http://www.ai.mit.edu/projects/jmlr/papers/volume3/bengio03a/bengio03a.pdf
NNLM模型的网络是一个三层的网络结构图,如下所示:
其中最下层为输出词前 n − 1 n-1 n−1 个词,NNLM模型的目标是急于这 n − 1 n-1 n−1 个词计算 第 t t t 个词 w t w_t wt 的概率。
N
N
L
M
NNLM
NNLM的训练目标是:
f
(
w
t
,
.
.
.
,
w
t
−
n
+
1
)
=
P
(
w
t
∣
w
1
t
−
1
)
f(w_t, ..., w_{t-n+1}) = P(w_t|w_1^{t-1})
f(wt,...,wt−n+1)=P(wt∣w1t−1)
其中
w
t
w_t
wt 表示第
t
t
t 个单词,
w
1
t
−
1
w_1^{t-1}
w1t−1 表示从第1个单词到第
t
−
1
t-1
t−1 个词组成的子序列,模型需要满足的约束条件是:
上面模型的意思是当给定一段序列时,由其前面的 t − 1 t-1 t−1个词预测第 n n n个词的概率。
N N L M NNLM NNLM 模型的训练目标可以分解为两部分:
N
N
L
M
NNLM
NNLM 模型的输出为一个
s
o
f
t
m
a
x
softmax
softmax 函数,形式如下:
P
(
w
t
∣
w
t
−
1
,
.
.
.
,
w
t
−
n
+
1
)
=
e
y
w
t
∑
i
e
y
w
t
P(w_t|w_{t-1}, ... ,w_{t-n+1}) = \frac{e^{y_{w_t}}}{ \sum_{i} e^{y_{w_t}} }
P(wt∣wt−1,...,wt−n+1)=∑ieywteywt
其中
y
i
y_i
yi 表示的是第
i
i
i 个单词没有进行归一化的概率,其计算公式为:
y
=
b
+
W
x
+
U
t
a
n
h
(
d
+
H
x
)
y = b+W_x + U \, tanh( d + H_x)
y=b+Wx+Utanh(d+Hx)
其中模型参数为:
θ
=
(
b
,
d
,
W
,
U
,
H
,
C
)
\theta = (b, d, W, U, H, C)
θ=(b,d,W,U,H,C)
一般的神经网络不需要对输入进行训练,但是在该模型中的输入 x x x是词向量,也是需要训练的参数,由此可见模型的权重参数和词向量是同时训练的,模型训练完成后同时得到网络的权重参数和词向量
N
N
L
M
NNLM
NNLM 的训练目标是最大化似然函数,即:
L
=
1
T
∑
i
l
o
g
f
(
w
t
,
w
t
−
1
,
.
.
.
,
w
t
−
n
+
1
,
;
θ
)
+
R
(
θ
)
L = \frac{1}{T} \sum_{i} log f (w_t, w_{t-1}, ..., w_{t-n+1},; \theta) + R(\theta)
L=T1i∑logf(wt,wt−1,...,wt−n+1,;θ)+R(θ)
其中
θ
\theta
θ为所有模型参数,
R
(
θ
)
R(\theta)
R(θ)为正则化项(在论文对应的实验中,
R
R
R 表示的是权重衰减参数,仅适用于神经网络和单词对应的向量矩阵)。
然后使用梯度下降法更新参数:
θ
←
θ
+
ϵ
ϑ
l
o
g
p
(
w
t
∣
w
t
−
1
,
.
.
.
,
w
t
−
n
+
1
)
ϑ
θ
\theta \leftarrow \theta + \epsilon \frac{ \vartheta log p(w_t|w_{t-1},...,w_{t-n+1}) }{\vartheta \theta}
θ←θ+ϵϑθϑlogp(wt∣wt−1,...,wt−n+1)
其中
ϵ
\epsilon
ϵ为学习率(步长)。
基于Pytorch和Tf实现的代码参考:https://www.jianshu.com/p/be242ed3f314
RNNLM 论文:《Recurrent neural network based language model》
下载连接:https://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf
RNNLM模型的思想比较简单,主要改进的是NNLM中的前馈神经网络,其主要的结构图如下所示:
读者乍看可能不知道这个描述的是什么,不着急,先来补一下简单的RNN知识。
一个简答的RNN结构如下图所示:
其包含输入层、隐藏层和输出层, X X X 表示的是输入层的向量, U U U 表示输入层到隐藏层的权重矩阵, S S S 表示隐藏层的向量值, V V V 表示的是隐藏层到输出层的权重矩阵, O O O 表示的是输出层的向量值, w w w 表示隐藏层上一次的值。
将上面的图展开为:
现在看上去就比较清楚了,这个网络在 t t t时刻接收到输入 x t x_t xt 之后,隐藏层的值是 s t s_t st ,输出值是 o t o_t ot 。关键一点是, s t s_t st 的值不仅仅取决于 x t x_t xt ,还取决于 s t − 1 s_{t-1} st−1。
接着看RNNLM模型的结构图, I N P U T ( t ) INPUT(t) INPUT(t) 表示的就是 t t t时刻的输入 x t x_t xt, C O N T E X T ( t ) CONTEXT(t) CONTEXT(t) 表示的就是 t t t时刻的隐藏层( s t s_t st), C O N T E X T ( t − 1 ) CONTEXT(t-1) CONTEXT(t−1) 则表示 t − 1 t-1 t−1时刻的隐藏层的值( s t − 1 s_{t-1} st−1), O U T P U T ( t ) OUTPUT(t) OUTPUT(t) 表示的就是 t t t时刻的输出( o t o_t ot)。
其中:
x
(
t
)
=
w
(
t
)
+
s
(
t
−
1
)
s
j
(
t
)
=
f
(
∑
i
x
i
(
t
)
u
j
i
)
y
k
(
t
)
=
g
(
∑
i
s
j
(
t
)
v
k
j
)
x(t) = w(t) + s(t-1) \\ s_j(t) = f(\sum_{i} x_i(t)u_{ji}) \\ y_k(t) = g(\sum_{i}s_j(t)v_{kj})
x(t)=w(t)+s(t−1)sj(t)=f(i∑xi(t)uji)yk(t)=g(i∑sj(t)vkj)
其中
f
(
z
)
f(z)
f(z) 表示的是
s
i
g
m
o
i
d
sigmoid
sigmoid 函数:
f
(
z
)
=
1
1
+
e
−
z
f(z) = \frac{1}{1+e^{-z}}
f(z)=1+e−z1
g
(
z
)
g(z)
g(z)表示的是
s
o
f
t
m
a
x
softmax
softmax函数:
g
(
z
m
)
=
e
z
m
∑
k
e
z
k
g(z_m) = \frac{e^{z_m}} {\sum_{k} e^{z_k}}
g(zm)=∑kezkezm
其中有一些细节需要注意:
每一epoch结束之后,向量的误差基于交叉熵准则进行计算:
e
r
r
o
r
(
t
)
=
d
e
s
i
r
e
d
(
t
)
−
y
(
t
)
error(t) = desired(t) - y(t)
error(t)=desired(t)−y(t)
其中 d e s i r e d ( t ) desired(t) desired(t) 表示预测值, y ( t ) y(t) y(t)为真实值。
最终单词出现概率计算公式为:
P
(
w
i
(
t
+
1
)
∣
w
i
,
s
(
t
−
1
)
)
=
{
y
r
a
r
e
(
t
)
C
r
a
r
e
i
f
w
i
(
t
+
1
)
i
s
r
a
r
e
y
i
(
t
)
o
t
h
e
r
w
i
s
e
P(w_i(t+1) | w{i},s(t-1)) = \left\{yrare(t)Crareifwi(t+1)israreyi(t)otherwise\right.
P(wi(t+1)∣wi,s(t−1))={Crareyrare(t)yi(t)ifwi(t+1)israreotherwise
其中 C r a r e C_{rare} Crare 表示的是词汇表中单词出现次数小于阈值的单词数。文中提到在 B r o w n c o r p u s Brown corpus Browncorpus数据集中(有80万单词),阈值设置的为5,隐藏层单元数为100。
关于RNNLM代码实现可以参考:https://www.jianshu.com/p/f53f606944c6
扫一扫关注「搜索与推荐Wiki」!号主「专注于搜索和推荐系统,以系列分享为主,持续打造精品内容!」
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。