1.文本预处理
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:
读入文本
分词
建立字典,将每个词映射到一个唯一的索引(index)
将文本从词的序列转换为索引的序列,方便输入模型
2语言模型
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为T T T 的词的序列w 1 , w 2 , … , w T w_1, w_2, \ldots, w_T w 1 , w 2 , … , w T ,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
P ( w 1 , w 2 , … , w T ) .
P(w_1, w_2, \ldots, w_T).
P ( w 1 , w 2 , … , w T ) .
本节我们介绍基于统计的语言模型,主要是n n n 元语法(n n n -gram)。在后续内容中,我们将会介绍基于神经网络的语言模型。
假设序列w 1 , w 2 , … , w T w_1, w_2, \ldots, w_T w 1 , w 2 , … , 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_2\cdots w_{T-1})
\end{align*}
$$
例如,一段含有4个词的文本序列的概率
P ( w 1 , w 2 , w 3 , w 4 ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) P ( w 4 ∣ w 1 , w 2 , 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_1, w_2, w_3).
P ( w 1 , w 2 , w 3 , w 4 ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) P ( w 4 ∣ w 1 , w 2 , w 3 ) .
语言模型的参数就是词的概率以及给定前几个词情况下的条件概率。设训练数据集为一个大型文本语料库,如维基百科的所有条目,词的概率可以通过该词在训练数据集中的相对词频来计算,例如,w 1 w_1 w 1 的概率可以计算为:
$$
\hat P(w_1) = \frac{n(w_1)}{n}
$$
其中n ( w 1 ) n(w_1) n ( w 1 ) 为语料库中以w 1 w_1 w 1 作为第一个词的文本的数量,n n n 为语料库中文本的总数量。
类似的,给定w 1 w_1 w 1 情况下,w 2 w_2 w 2 的条件概率可以计算为:
$$
\hat P(w_2 \mid w_1) = \frac{n(w_1, w_2)}{n(w_1)}
$$
其中n ( w 1 , w 2 ) n(w_1, w_2) n ( w 1 , w 2 ) 为语料库中以w 1 w_1 w 1 作为第一个词,w 2 w_2 w 2 作为第二个词的文本的数量。
n元语法
序列长度增加,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。n n n 元语法通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面n n n 个词相关,即n n n 阶马尔可夫链(Markov chain of order n n n ),如果n = 1 n=1 n = 1 ,那么有P ( w 3 ∣ w 1 , w 2 ) = P ( w 3 ∣ w 2 ) P(w_3 \mid w_1, w_2) = P(w_3 \mid w_2) P ( w 3 ∣ w 1 , w 2 ) = P ( w 3 ∣ w 2 ) 。基于n − 1 n-1 n − 1 阶马尔可夫链,我们可以将语言模型改写为
P ( w 1 , w 2 , … , w T ) = ∏ t = 1 T P ( w t ∣ w t − ( n − 1 ) , … , w t − 1 ) .
P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}) .
P ( w 1 , w 2 , … , w T ) = t = 1 ∏ T P ( w t ∣ w t − ( n − 1 ) , … , w t − 1 ) .
以上也叫n n n 元语法(n n n -grams),它是基于n − 1 n - 1 n − 1 阶马尔可夫链的概率语言模型。例如,当n = 2 n=2 n = 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*}
$$
当n n n 分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。例如,长度为4的序列w 1 , w 2 , w 3 , w 4 w_1, w_2, w_3, w_4 w 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}
$$
当n n n 较小时,n n n 元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当n n n 较大时,n n n 元语法需要计算并存储大量的词频和多词相邻频率。3.循环神经网络
本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量H H H ,用H t H_{t} H t 表示H H H 在时间步t t t 的值。H t H_{t} H t 的计算基于X t X_{t} X t 和H t − 1 H_{t-1} H t − 1 ,可以认为H t H_{t} H t 记录了到当前字符为止的序列信息,利用H t H_{t} H t 对序列的下一个字符进行预测。
循环神经网络的构造
我们先看循环神经网络的具体构造。假设X t ∈ R n × d \boldsymbol{X}_t \in \mathbb{R}^{n \times d} X t ∈ R n × d 是时间步t t t 的小批量输入,H t ∈ R n × h \boldsymbol{H}_t \in \mathbb{R}^{n \times h} H t ∈ R n × h 是该时间步的隐藏变量,则:
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) .
\boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol{b}_h).
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) .
其中,W x h ∈ R d × h \boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h} W x h ∈ R d × h ,W h h ∈ R h × h \boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h} W h h ∈ R h × h ,b h ∈ R 1 × h \boldsymbol{b}_{h} \in \mathbb{R}^{1 \times h} b h ∈ R 1 × h ,ϕ \phi ϕ 函数是非线性**函数。由于引入了H t − 1 W h h \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} H t − 1 W h h ,H t H_{t} H t 能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。由于H t H_{t} H t 的计算基于H t − 1 H_{t-1} H t − 1 ,上式的计算是循环的,使用循环计算的网络即循环神经网络(recurrent neural network)。
在时间步t t t ,输出层的输出为:
O t = H t W h q + b q .
\boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_q.
O t = H t W h q + b q .
其中W h q ∈ R h × q \boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q} W h q ∈ R h × q ,b q ∈ R 1 × q \boldsymbol{b}_q \in \mathbb{R}^{1 \times q} b q ∈ R 1 × q 。
GRU
RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT)
⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系RNN :
H t = ϕ ( X t W x h + H t − 1 W h h + b h )
H_{t} = ϕ(X_{t}W_{xh} + H_{t-1}W_{hh} + b_{h})
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) GRU :
R t = σ ( X t W x r + H t − 1 W h r + b r ) Z t = σ ( X t W x z + H t − 1 W h z + b z ) H ~ t = t a n h ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t
R_{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
R t = σ ( X t W x r + H t − 1 W h r + b r ) Z t = σ ( X t W x z + H t − 1 W h z + b z ) H t = t a n h ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H t
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
• 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。