本节将介绍循环神经⽹络。它并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来储存之前时间步的信息。⾸先我们回忆⼀下前⾯介绍过的多层感知机,然后描述如何添加隐藏状态来将它变成循环神经⽹络。
一、不含隐藏状态的神经网络
先考虑一个单层的多层感知机:
复习一遍隐藏层的输出、输出层的输出。
隐藏层的输出:
H
=
ϕ
(
X
W
x
h
+
b
h
)
H=\phi (XW_{xh}+b_h)
H=ϕ(XWxh+bh)
其中,
W
x
h
W_{xh}
Wxh表示输入层
x
x
x和隐藏层
h
h
h之间的权重参数,
b
h
b_h
bh为隐藏层h的偏差参数。
输出层的输出:
O
=
H
W
h
q
+
b
q
O=HW_{hq} + b_q
O=HWhq+bq
其中 q q q表示输出个数(例如分类问题的类别数)
可以看到,隐藏层 H H H的输出只由输入 x x x得到。
二、含隐藏状态的循环神经网络
首先说明:隐藏状态是一个变量——隐藏变量的别称。
前面章节说到,语言模型的一段文本,可以看做一段时间序列。这段文本中的每个词为 w t w_t wt,其中 t t t称为时间步。(相当于在原有的最基本的神经网络基础上增加了一个维度——时间维度)。下面我们就考虑这种数据存在时间相关性的情况。
假设 X t ∈ R n × d X_t \in R^{n × d} Xt∈Rn×d是序列中时间步 t t t的小批量输入, H t ∈ R n × h H_t \in R^{n × h} Ht∈Rn×h是该时间步的隐藏层变量( t t t表示时间步。 n n n表示小批量样本数。 d d d表示输入个数,及特征个数)。由于加入了时间的维度,所以每个时间步都会有一个 H H H: H 1 , H 2 , H 3 , . . . , H t − 1 , H t , H t + 1 . . . , H T H_1,H_2,H_3,...,H_{t-1},H_t,H_{t+1}...,H_T H1,H2,H3,...,Ht−1,Ht,Ht+1...,HT。
循环神经网络的做法与多层感知机的不同之处在于:隐藏层
H
t
H_t
Ht的输出由当前时间步的输入
X
t
X_t
Xt和上一时间步的隐藏层变量
H
t
−
1
H_{t-1}
Ht−1得到。具体公式如下:
H
t
=
ϕ
(
X
t
W
x
h
+
H
t
−
1
W
h
h
+
b
h
)
H_t=\phi (X_tW_{xh} + H_{t-1}W_{hh}+b_h)
Ht=ϕ(XtWxh+Ht−1Whh+bh)
与多层感知机的不同,除了输入输出增加了代表当前时间步的下标 t t t之外,还增加了一项 H t − 1 W h h H_{t-1}W_{hh} Ht−1Whh。(通俗地理解,就是:文本可以看成我们平时说的话。而我们平时说话都是有逻辑的,每个字前前后后都是相关联的,反映到这个公式上,就是隐藏变量在不同时间步上的相关性。)
该公式的图示如下:
三、其他说明
- 上述隐藏变量的计算公式表明:当前的隐藏变量捕捉了截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样
- 所有的时间步都使用相同的模型参数
- X t W x h + H t − 1 W h h X_tW_{xh} + H_{t-1}W_{hh} XtWxh+Ht−1Whh等价于 X t X_t Xt与 H t − t H_{t-t} Ht−t连接后(concat)的矩阵乘以 W x h W_{xh} Wxh与 W h h W_{hh} Whh连接后的矩阵