1.文本预处理
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:

  1. 读入文本
  2. 分词
  3. 建立字典,将每个词映射到一个唯一的索引(index)
  4. 将文本从词的序列转换为索引的序列,方便输入模型

2语言模型
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为TT的词的序列w1,w2,,wTw_1, w_2, ldots, w_T,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:

P(w1,w2,,wT).P(w_1, w_2, ldots, w_T).

本节我们介绍基于统计的语言模型,主要是nn元语法(nn-gram)。在后续内容中,我们将会介绍基于神经网络的语言模型。
假设序列w1,w2,,wTw_1, w_2, ldots, w_T中的每个词是依次生成的,我们有

$$

begin{align*}
P(w_1, w_2, ldots, w_T)
&= prod_{t=1}^T P(w_t mid w_1, ldots, w_{t-1})
&= P(w_1)P(w_2 mid w_1) cdots P(w_T mid w_1w_2cdots w_{T-1})
end{align*}

$$

例如,一段含有4个词的文本序列的概率

P(w1,w2,w3,w4)=P(w1)P(w2w1)P(w3w1,w2)P(w4w1,w2,w3).P(w_1, w_2, w_3, w_4) = P(w_1) P(w_2 mid w_1) P(w_3 mid w_1, w_2) P(w_4 mid w_1, w_2, w_3).

语言模型的参数就是词的概率以及给定前几个词情况下的条件概率。设训练数据集为一个大型文本语料库,如维基百科的所有条目,词的概率可以通过该词在训练数据集中的相对词频来计算,例如,w1w_1的概率可以计算为:

$$

hat P(w_1) = frac{n(w_1)}{n}

$$

其中n(w1)n(w_1)为语料库中以w1w_1作为第一个词的文本的数量,nn为语料库中文本的总数量。

类似的,给定w1w_1情况下,w2w_2的条件概率可以计算为:

$$

hat P(w_2 mid w_1) = frac{n(w_1, w_2)}{n(w_1)}

$$

其中n(w1,w2)n(w_1, w_2)为语料库中以w1w_1作为第一个词,w2w_2作为第二个词的文本的数量。

n元语法

序列长度增加,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。nn元语法通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面nn个词相关,即nn阶马尔可夫链(Markov chain of order nn),如果n=1n=1,那么有P(w3w1,w2)=P(w3w2)P(w_3 mid w_1, w_2) = P(w_3 mid w_2)。基于n1n-1阶马尔可夫链,我们可以将语言模型改写为

P(w1,w2,,wT)=t=1TP(wtwt(n1),,wt1).P(w_1, w_2, ldots, w_T) = prod_{t=1}^T P(w_t mid w_{t-(n-1)}, ldots, w_{t-1}) .

以上也叫nn元语法(nn-grams),它是基于n1n - 1阶马尔可夫链的概率语言模型。例如,当n=2n=2时,含有4个词的文本序列的概率就可以改写为:

$$

begin{align*}
P(w_1, w_2, w_3, w_4)
&= P(w_1) P(w_2 mid w_1) P(w_3 mid w_1, w_2) P(w_4 mid w_1, w_2, w_3)
&= P(w_1) P(w_2 mid w_1) P(w_3 mid w_2) P(w_4 mid w_3)
end{align*}

$$

nn分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。例如,长度为4的序列w1,w2,w3,w4w_1, w_2, w_3, w_4在一元语法、二元语法和三元语法中的概率分别为

$$

begin{aligned}
P(w_1, w_2, w_3, w_4) &= P(w_1) P(w_2) P(w_3) P(w_4) ,
P(w_1, w_2, w_3, w_4) &= P(w_1) P(w_2 mid w_1) P(w_3 mid w_2) P(w_4 mid w_3) ,
P(w_1, w_2, w_3, w_4) &= P(w_1) P(w_2 mid w_1) P(w_3 mid w_1, w_2) P(w_4 mid w_2, w_3) .
end{aligned}

$$

nn较小时,nn元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当nn较大时,nn元语法需要计算并存储大量的词频和多词相邻频率。
3.循环神经网络
本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量HH,用HtH_{t}表示HH在时间步tt的值。HtH_{t}的计算基于XtX_{t}Ht1H_{t-1},可以认为HtH_{t}记录了到当前字符为止的序列信息,利用HtH_{t}对序列的下一个字符进行预测。
文本预处理,语言模型,循环神经网络

循环神经网络的构造

我们先看循环神经网络的具体构造。假设XtRn×dboldsymbol{X}_t in mathbb{R}^{n times d}是时间步tt的小批量输入,HtRn×hboldsymbol{H}_t in mathbb{R}^{n times h}是该时间步的隐藏变量,则:

Ht=ϕ(XtWxh+Ht1Whh+bh).boldsymbol{H}_t = phi(boldsymbol{X}_t boldsymbol{W}_{xh} + boldsymbol{H}_{t-1} boldsymbol{W}_{hh} + boldsymbol{b}_h).

其中,WxhRd×hboldsymbol{W}_{xh} in mathbb{R}^{d times h}WhhRh×hboldsymbol{W}_{hh} in mathbb{R}^{h times h}bhR1×hboldsymbol{b}_{h} in mathbb{R}^{1 times h}ϕphi函数是非线性**函数。由于引入了Ht1Whhboldsymbol{H}_{t-1} boldsymbol{W}_{hh}HtH_{t}能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。由于HtH_{t}的计算基于Ht1H_{t-1},上式的计算是循环的,使用循环计算的网络即循环神经网络(recurrent neural network)。

在时间步tt,输出层的输出为:

Ot=HtWhq+bq.boldsymbol{O}_t = boldsymbol{H}_t boldsymbol{W}_{hq} + boldsymbol{b}_q.

其中WhqRh×qboldsymbol{W}_{hq} in mathbb{R}^{h times q}bqR1×qboldsymbol{b}_q in mathbb{R}^{1 times q}

GRU

RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT)
⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系
RNN:

文本预处理,语言模型,循环神经网络

Ht=ϕ(XtWxh+Ht1Whh+bh)H_{t} = ϕ(X_{t}W_{xh} + H_{t-1}W_{hh} + b_{h})
GRU:

文本预处理,语言模型,循环神经网络

Rt=σ(XtWxr+Ht1Whr+br)Zt=σ(XtWxz+Ht1Whz+bz)H~t=tanh(XtWxh+(RtHt1)Whh+bh)Ht=ZtHt1+(1Zt)H~tR_{t} = σ(X_tW_{xr} + H_{t−1}W_{hr} + b_r)\Z_{t} = σ(X_tW_{xz} + H_{t−1}W_{hz} + b_z)\widetilde{H}_t = tanh(X_tW_{xh} + (R_t ⊙H_{t−1})W_{hh} + b_h)\H_t = Z_t⊙H_{t−1} + (1−Z_t)⊙widetilde{H}_t
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
• 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。