循环神经网络
文本预处理
文本预处理通常包括四个步骤:
- 读入文本。
- 分词:
对每个句子进行分词,也就是将一个句子划分成若干个词(token),转换为一个词的序列。 - 建立字典,将每个词映射到一个唯一的索引:
将字符串转换为数字,需要先构建一个字典,将每个词映射到一个唯一的索引编号。 - 将文本从词的序列转换为索引的序列,方便输入模型:
使用字典,将原文本中的句子从单词序列转换为索引序列。
语言模型
一段自然语言文本可以看作是一个离散时间序列,假设一段长度为
T
T
T的文本中词依次为
w
1
,
w
2
,
…
,
w
T
w_1, w_2,\ldots,w_T
w1,w2,…,wT,那么在离散的时间序列中,
w
t
(
1
≤
t
≤
T
)
w_t(1\leq t \leq T)
wt(1≤t≤T)可看作在时间步
t
t
t的输出或者标签。语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
P
(
w
1
,
w
2
,
…
,
w
T
)
.
P(w_1, w_2,\ldots,w_T).
P(w1,w2,…,wT).
语言模型的计算
假设序列
w
1
,
w
2
,
…
,
w
T
w_1, w_2,\ldots,w_T
w1,w2,…,wT中的每个词是依次生成的,我们有
P
(
w
1
,
w
2
,
…
,
w
T
)
=
∏
t
=
1
T
P
(
w
t
∣
w
1
,
…
,
w
t
−
1
)
.
P(w_1, w_2,\dots,w_T)=\prod_{t=1}^T P(w_t \mid w_1, \ldots, w_{t-1}).
P(w1,w2,…,wT)=t=1∏TP(wt∣w1,…,wt−1).
为了计算语言模型,我们需要计算词的概率,以及一个词在给定前几个词的情况下的条件概率,即语言模型参数。词的概率可以通过该词在训练数据集中的相对词频来计算,例如,
w
1
w_1
w1的概率可以计算为:
P
^
(
w
1
)
=
n
(
w
1
)
n
\hat{P}(w_1)=\frac{n(w_1)}{n}
P^(w1)=nn(w1)
其中
n
(
w
1
)
n(w_1)
n(w1)为语料库中以
w
1
w_1
w1作为第一个词的文本的数量,
n
n
n为语料库中文本的总数量。
类似的,给定
w
1
w_1
w1情况下,
w
2
w_2
w2的条件概率可以计算为:
P
^
(
w
2
∣
w
1
)
=
n
(
w
1
,
w
2
)
n
(
w
1
)
\hat{P}(w_2\mid w_1)=\frac{n(w_1,w_2)}{n(w_1)}
P^(w2∣w1)=n(w1)n(w1,w2)
其中 $n(w_1,w_2) $为语料库中以
w
1
w_1
w1作为第一个词,
w
2
w_2
w2作为第二个词的文本的数量。
n n n元语法
当序列长度增加时,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。
n
n
n元语法通过马尔可夫假设(虽然并不一定成立)简化了语言模型的计算。这里的马尔可夫假设是指一个词的出现只与前面
n
n
n个词相关,即
n
n
n阶马尔可夫链。如果
n
=
1
n=1
n=1,那么有
P
(
w
3
∣
w
1
,
w
2
)
=
P
(
w
3
∣
w
2
)
P(w3∣w1,w2)=P(w3∣w2)
P(w3∣w1,w2)=P(w3∣w2)。如果基于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,\dots,w_T)=\prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}).
P(w1,w2,…,wT)=t=1∏TP(wt∣wt−(n−1),…,wt−1).
这就是
n
n
n元语法,它是基于 n−1 阶马尔可夫链的概率语言模型。显然,当n较小时,n元语法往往并不准确;当n较大时,n元语法需要计算并存储大量的词频和多词相邻频率。
n
n
n元语法存在以下两点缺陷:
- 参数空间过大;
- 数据稀疏。
循环神经网络
我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量
H
H
H,用
H
t
H_t
Ht表示
H
H
H在时间步
t
t
t的值。
H
t
H_t
Ht的计算基于
X
t
X_t
Xt和
H
t
−
1
H_{t−1}
Ht−1,可以认为
H
t
H_t
Ht记录了到当前字符为止的序列信息,利用
H
t
H_t
Ht对序列的下一个字符进行预测。