赞
踩
本文翻译和精简自stanford cs224n lec 6.
通俗的说,language model就是用来预测下一个出现的词的概率,即:
P
(
x
(
t
+
1
)
∣
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
1
)
)
P(x^{(t+1)}|x^{(t)},x^{(t-1)},...x^{(1)})
P(x(t+1)∣x(t),x(t−1),...x(1))
简化:一个词出现的概率只和它前面的n-1个词有关系,这就是"n-gram"的含义。因此有:
P
(
x
(
t
+
1
)
∣
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
1
)
)
=
P
(
x
(
t
+
1
)
∣
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
t
−
n
+
2
)
)
=
P
(
x
(
t
+
1
)
,
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
t
−
n
+
2
)
)
P
(
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
t
−
n
+
2
)
)
=
c
o
u
n
t
(
x
(
t
+
1
)
,
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
t
−
n
+
2
)
)
c
o
u
n
t
(
x
(
t
)
,
x
(
t
−
1
)
,
.
.
.
x
(
t
−
n
+
2
)
)
P(x^{(t+1)}|x^{(t)},x^{(t-1)},...x^{(1)}) =P(x^{(t+1)}|x^{(t)},x^{(t-1)},...x^{(t-n+2)}) \\ = \frac{P(x^{(t+1)},x^{(t)},x^{(t-1)},...x^{(t-n+2)})}{P(x^{(t)},x^{(t-1)},...x^{(t-n+2)})} \\ = \frac{count(x^{(t+1)},x^{(t)},x^{(t-1)},...x^{(t-n+2)})}{count(x^{(t)},x^{(t-1)},...x^{(t-n+2)})}
P(x(t+1)∣x(t),x(t−1),...x(1))=P(x(t+1)∣x(t),x(t−1),...x(t−n+2))=P(x(t),x(t−1),...x(t−n+2))P(x(t+1),x(t),x(t−1),...x(t−n+2))=count(x(t),x(t−1),...x(t−n+2))count(x(t+1),x(t),x(t−1),...x(t−n+2))
n-gram model 是不使用深度学习的方法,直接利用条件概率来预测下一个单词是什么。但这个模型有几个问题:
由于丢弃了比较远的单词,它不能够把握全局信息。例如,“as the proctor started the clock” 暗示这应该是一场考试,所以应该是students opened their exam. 但如果只考虑4-gram,的确是book出现的概率更大。
sparsity problem. 有些短语根本没有在语料中出现过,比如"student opened their petri dishes". 所以,petri dishes的概率为0. 但是这的确是一个合理的情况。解决这个问题的办法是做拉普拉斯平滑,对每个词都给一个小权重。
sparsity problem的一个更加糟糕的情况是,如果我们甚至没有见过"student open their",那么分母直接就是0了。对于这种情况,可以回退到二元组,比如"student open".这叫做backoff
存储空间也需要很大。
想要求"the students opened their"的下一个词出现的概率,首先将这四个词分别embedding,之后过两层全连接,再过一层softmax,得到词汇表中每个词的概率分布。我们只需要取最大的那个词语作为下一个词即可。
正因为上面所说的缺点,需要引入RNN。
RNN的结构:
RNN的好处:
RNN的坏处:
例如:
在实际应用中,如果在整个语料库上计算loss和梯度实在是太expensive了!(computing loss and gradient across the entire corpus
x
(
1
)
.
.
.
x
(
T
)
x^{(1)}...x^{(T)}
x(1)...x(T) is too expensive):
J
(
θ
)
=
1
T
∑
t
=
1
T
J
(
t
)
(
θ
)
J(\theta) = \frac{1}{T} \sum_{t=1}^T J^{(t)}(\theta)
J(θ)=T1t=1∑TJ(t)(θ)
所以,我们可以对每个句子进行训练(consider
x
(
1
)
.
.
.
x
(
T
)
x^{(1)}...x^{(T)}
x(1)...x(T) as a sentence), 还可以使用小批量梯度下降来并行训练。
【language model中的重要概念:perplexity(困惑度)】
我们已知一个真实的词语序列 x ( 1 ) . . . x ( T ) x^{(1)}...x^{(T)} x(1)...x(T),
即:
p e r p l e x i t y = ( 1 p ( x ( 1 ) ) p ( x ( 2 ) ∣ x ( 1 ) ) p ( x ( 3 ) ∣ x ( 2 ) x ( 1 ) ) . . . ) 1 T perplexity =(\frac{1}{p(x^{(1)})p(x^{(2)}|x^{(1)})p(x^{(3)}|x^{(2)}x^{(1)})...})^{\frac{1}{T}} perplexity=(p(x(1))p(x(2)∣x(1))p(x(3)∣x(2)x(1))...1)T1
有没有发现这个式子分母的每一项就是刚才讲过的RNN训练时的交叉熵损失!(见下图)
所以有: p e r p l e x i t y = ∏ i = 1 T ( 1 y ^ x t + 1 t ) 1 T = e x p ( 1 T ∑ i = 1 T − l o g y x t + 1 t ) = e x p ( J ( θ ) ) perplexity = \prod _{i=1}^T(\frac{1}{\hat y^t_{x_{t+1}}})^{\frac{1}{T}} = exp(\frac{1}{T}\sum_{i=1}^T -logy^t_{x_{t+1}}) = exp(J(\theta)) perplexity=i=1∏T(y^xt+1t1)T1=exp(T1i=1∑T−logyxt+1t)=exp(J(θ))
即,困惑度和交叉熵loss的指数相等。
每一步最可能的输出作为下一个的输入词,这个过程可以一直持续下去,生成任意长的序列。
每个隐藏层都会输出
其实RNN在这个问题上就是为了将一长串文本找到一个合适的embedding。
当使用最后一个隐藏状态作为embedding时:
当使用所有隐藏状态输出的平均值作为embedding时:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。