自然语言处理 - Language model和RNN

本文翻译和精简自stanford cs224n lec 6.

1. Language Model

通俗的说,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(t1),...x(1))

1.1 统计学方法:n-gram language model

简化:一个词出现的概率只和它前面的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(t1),...x(1))=P(x(t+1)x(t),x(t1),...x(tn+2))=P(x(t),x(t1),...x(tn+2))P(x(t+1),x(t),x(t1),...x(tn+2))=count(x(t),x(t1),...x(tn+2))count(x(t+1),x(t),x(t1),...x(tn+2))

n-gram model 是不使用深度学习的方法,直接利用条件概率来预测下一个单词是什么。但这个模型有几个问题:

  1. 由于丢弃了比较远的单词,它不能够把握全局信息。例如,“as the proctor started the clock” 暗示这应该是一场考试,所以应该是students opened their exam. 但如果只考虑4-gram,的确是book出现的概率更大。

  2. sparsity problem. 有些短语根本没有在语料中出现过,比如"student opened their petri dishes". 所以,petri dishes的概率为0. 但是这的确是一个合理的情况。解决这个问题的办法是做拉普拉斯平滑,对每个词都给一个小权重。

  3. sparsity problem的一个更加糟糕的情况是,如果我们甚至没有见过"student open their",那么分母直接就是0了。对于这种情况,可以回退到二元组,比如"student open".这叫做backoff

  4. 存储空间也需要很大。

1.2 neural language model

想要求"the students opened their"的下一个词出现的概率,首先将这四个词分别embedding,之后过两层全连接,再过一层softmax,得到词汇表中每个词的概率分布。我们只需要取最大的那个词语作为下一个词即可。
在这里插入图片描述

  • 好处
  • 解决了sparsity problem, 词汇表中的每一个词语经过softmax都有相应的概率。
  • 解决了存储空间的问题,不用存储所有的n-gram,只需存储每个词语对应的word embedding即可。
  • 坏处
  • 窗口的大小还是不能无限大,不能涵盖之前的所有信息。
  • 更何况,增加了窗口大小,就要相应的增加权重矩阵W的大小。
  • 每个词语的word embedding只和权重矩阵W的列相乘,而这些列是完全分开的。所以这几个不同的块都要学习相同的pattern,造成了浪费。在这里插入图片描述

2. RNN

2.1 模型介绍

正因为上面所说的缺点,需要引入RNN。
在这里插入图片描述
RNN的结构:

  • 首先,将输入序列的每个词语都做embedding,之后再和矩阵 W e W_e We做点乘,作为hidden state的输入。
  • 中间的hidden state层: 初始hidden state h ( 0 ) h^{(0)} h(0)是一个随机初始化的值,之后每个hidden state的输出值都由前一个hidden state的输出和当前的输入决定。
  • 最后的输出,即词汇表V的概率密度函数是由最后一个hidden states决定的。

RNN的好处

  • 可以处理任意长的输入序列
  • 前面很远的信息也不会丢失(这样我们就可以看到前面的"as the proctor start the clock",从而确定应该是"student opened their exam"而不是"student opened their books").
  • 模型的大小不会随着输入序列变长而变大。因为我们只需要 W e W_e We W h W_h Wh这两个参数
  • W h W_h Wh对于每一步都是一样的(共享权重),每一步都能学习 W h W_h Wh,更加efficient

RNN的坏处:

  • 慢。因为只能串行不能并行
  • 实际上,不太能够利用到很久以前的信息,因为梯度消失

2.2 RNN模型的训练

  • 首先拿到一个非常大的文本序列 x ( 1 ) , . . . x ( T ) x^{(1)},...x^{(T)} x(1),...x(T)
  • 输入给RNN language model,对于每一步 t ,都计算此时的输出概率分布 y ^ ( t ) \hat y^{(t)} y^(t)。(i.e. predict probability distribution of every word, given the words so far)
  • 对于每一步 t,损失函数 J ( t ) ( θ ) J^{(t)}(\theta) J(t)(θ)就是我们预测的概率分布 y ^ ( t ) \hat y^{(t)} y^(t)和真实的下一个词语 y ( t ) y^{(t)} y(t)(one-hot编码)的交叉熵损失。
  • 对每一步求平均得到总体的loss:
    J ( θ ) = 1 T ∑ t = 1 T J ( t ) ( θ ) J(\theta) = \frac{1}{T} \sum_{t=1}^T J^{(t)}(\theta) J(θ)=T1t=1TJ(t)(θ)

例如:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在实际应用中,如果在整个语料库上计算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=1TJ(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=1T(y^xt+1t1)T1=exp(T1i=1Tlogyxt+1t)=exp(J(θ))
即,困惑度和交叉熵loss的指数相等。

2.3 RNN的应用

2.3.1 language model:生成句子序列

在这里插入图片描述
每一步最可能的输出作为下一个的输入词,这个过程可以一直持续下去,生成任意长的序列。

2.3.2 词性标注

在这里插入图片描述
每个隐藏层都会输出

2.3.3 文本分类

其实RNN在这个问题上就是为了将一长串文本找到一个合适的embedding。
当使用最后一个隐藏状态作为embedding时:
在这里插入图片描述
当使用所有隐藏状态输出的平均值作为embedding时:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41332009/article/details/114023882