循环神经网络
在循环神经网络中输入数据是存在时间相关性的,也就是说,前一个时间点的数据会对后一时间点的数据产生影响。假设
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
−
1
\boldsymbol{H}_{t-1}
H t − 1 ,并引入一个新的权重参数
W
h
h
∈
R
h
×
h
\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}
W h h ∈ R h × h ,该参数用来描述在当前时间步如何使用上一时间步的隐藏变量。具体来说,时间步
t
t
t 的隐藏变量的计算由当前时间步的输入和上一时间步的隐藏变量共同决定:
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 ) .
与多层感知机相比,我们在这里添加了
H
t
−
1
W
h
h
\boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}
H t − 1 W h h 一项。由上式中相邻时间步的隐藏变量
H
t
\boldsymbol{H}_t
H t 和
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 之间的关系可知,这里的隐藏变量能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。因此,该隐藏变量也称为隐藏状态。隐藏状态中
X
t
W
x
h
+
H
t
−
1
W
h
h
\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}
X t W x h + H t − 1 W h h 的计算等价于
X
t
\boldsymbol{X}_t
X t 与
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 连结后的矩阵乘以
W
x
h
\boldsymbol{W}_{xh}
W x h 与
W
h
h
\boldsymbol{W}_{hh}
W h h 连结后的矩阵。由于隐藏状态在当前时间步的定义使用了上一时间步的隐藏状态,上式的计算是循环的。使用循环计算的网络即循环神经网络(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
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 ,以及输出层的权重
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 。值得一提的是,即便在不同时间步,循环神经网络也始终使用这些模型参数。因此,循环神经网络模型参数的数量不随时间步的增加而增长。 上图展示了循环神经网络在3个相邻时间步的计算逻辑。在时间步
t
t
t ,隐藏状态的计算可以看成是将输入
X
t
\boldsymbol{X}_t
X t 和前一时间步隐藏状态
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 连结后输入一个激活函数为
ϕ
\phi
ϕ 的全连接层。该全连接层的输出就是当前时间步的隐藏状态
H
t
\boldsymbol{H}_t
H t ,且模型参数为
W
x
h
\boldsymbol{W}_{xh}
W x h 与
W
h
h
\boldsymbol{W}_{hh}
W h h 的连结,偏差为
b
h
\boldsymbol{b}_h
b h 。当前时间步
t
t
t 的隐藏状态
H
t
\boldsymbol{H}_t
H t 将参与下一个时间步
t
+
1
t+1
t + 1 的隐藏状态
H
t
+
1
\boldsymbol{H}_{t+1}
H t + 1 的计算,并输入到当前时间步的全连接输出层。
门控循环单元(GRU)
循环神经网络中如何通过时间反向传播? 一文中介绍了循环神经网络中的梯度计算方法。我们发现,当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题。通常由于这个原因,循环神经网络在实际中较难捕捉时间序列中时间步距离较大的依赖关系。
门控循环单元
门控循环神经网络(gated recurrent neural network)的提出,正是为了更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可以学习的门来控制信息的流动。其中,门控循环单元(gated recurrent unit,GRU)是一种常用的门控循环神经网络。
重置门和更新门
如下图所示,门控循环单元中的重置门和更新门的输入均为当前时间步输入
X
t
\boldsymbol{X}_t
X t 与上一时间步隐藏状态
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 ,输出由激活函数为 sigmoid 函数的全连接层计算得到。 具体来说,假设样本数为
n
n
n 、输入个数为
d
d
d (即每个样本包含的元素数,一般为词典大小)、隐藏单元个数为
h
h
h ,给定时间步
t
t
t 的小批量输入
X
t
∈
R
n
×
d
\boldsymbol{X}_t \in \mathbb{R}^{n \times d}
X t ∈ R n × d 和上一时间步隐藏状态
H
t
−
1
∈
R
n
×
h
\boldsymbol{H}_{t-1} \in \mathbb{R}^{n \times h}
H t − 1 ∈ R n × h 。重置门
R
t
∈
R
n
×
h
\boldsymbol{R}_t \in \mathbb{R}^{n \times h}
R t ∈ R n × h 和更新门
Z
t
∈
R
n
×
h
\boldsymbol{Z}_t \in \mathbb{R}^{n \times h}
Z t ∈ R n × h 的计算如下:
R
t
=
σ
(
X
t
W
x
r
+
H
t
−
1
W
h
r
+
b
r
)
\boldsymbol{R}_t = \sigma(\boldsymbol{X}_t \boldsymbol{W}_{xr} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hr} + \boldsymbol{b}_r)
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
)
\boldsymbol{Z}_t = \sigma(\boldsymbol{X}_t \boldsymbol{W}_{xz} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hz} + \boldsymbol{b}_z)
Z t = σ ( X t W x z + H t − 1 W h z + b z )
其中
W
x
r
,
W
x
z
∈
R
d
×
h
\boldsymbol{W}_{xr}, \boldsymbol{W}_{xz} \in \mathbb{R}^{d \times h}
W x r , W x z ∈ R d × h 和
W
h
r
,
W
h
z
∈
R
h
×
h
\boldsymbol{W}_{hr}, \boldsymbol{W}_{hz} \in \mathbb{R}^{h \times h}
W h r , W h z ∈ R h × h 是权重参数,
b
r
,
b
z
∈
R
1
×
h
\boldsymbol{b}_r, \boldsymbol{b}_z \in \mathbb{R}^{1 \times h}
b r , b z ∈ R 1 × h 是偏差参数。sigmoid 函数可以将元素的值变换到0和1之间。因此,重置门
R
t
\boldsymbol{R}_t
R t 和更新门
Z
t
\boldsymbol{Z}_t
Z t 中每个元素的值域都是
[
0
,
1
]
[0, 1]
[ 0 , 1 ] 。
候选隐藏状态
接下来,门控循环单元将计算候选隐藏状态来辅助稍后的隐藏状态计算。如下图所示,我们将当前时间步重置门的输出与上一时间步隐藏状态做按元素乘法(符号为
⊙
\odot
⊙ )。如果重置门中元素值接近0,那么意味着重置对应隐藏状态元素为0,即丢弃上一时间步的隐藏状态。如果元素值接近1,那么表示保留上一时间步的隐藏状态。然后,将按元素乘法的结果与当前时间步的输入连结,再通过含激活函数 tanh 的全连接层计算出候选隐藏状态,其所有元素的值域为
[
−
1
,
1
]
[-1, 1]
[ − 1 , 1 ] 。 具体来说,时间步
t
t
t 的候选隐藏状态
H
~
t
∈
R
n
×
h
\tilde{\boldsymbol{H}}_t \in \mathbb{R}^{n \times h}
H ~ t ∈ R n × h 的计算为:
H
~
t
=
tanh
(
X
t
W
x
h
+
(
R
t
⊙
H
t
−
1
)
W
h
h
+
b
h
)
\tilde{\boldsymbol{H}}_t = \text{tanh}(\boldsymbol{X}_t \boldsymbol{W}_{xh} + \left(\boldsymbol{R}_t \odot \boldsymbol{H}_{t-1}\right) \boldsymbol{W}_{hh} + \boldsymbol{b}_h)
H ~ t = tanh ( X t W x h + ( R t ⊙ 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 是偏差参数。从上面这个公式可以看出,重置门控制了上一时间步的隐藏状态如何流入当前时间步的候选隐藏状态。而上一时间步的隐藏状态可能包含了时间序列截至上一时间步的全部历史信息。因此,重置门可以用来丢弃与预测无关的历史信息从而有助于捕捉时间序列里短期的依赖关系
隐藏状态
最后,时间步
t
t
t 的隐藏状态
H
t
∈
R
n
×
h
\boldsymbol{H}_t \in \mathbb{R}^{n \times h}
H t ∈ R n × h 的计算使用当前时间步的更新门
Z
t
\boldsymbol{Z}_t
Z t 来对上一时间步的隐藏状态
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 和当前时间步的候选隐藏状态
H
~
t
\tilde{\boldsymbol{H}}_t
H ~ t 做组合:
H
t
=
Z
t
⊙
H
t
−
1
+
(
1
−
Z
t
)
⊙
H
~
t
\boldsymbol{H}_t = \boldsymbol{Z}_t \odot \boldsymbol{H}_{t-1} + (1 - \boldsymbol{Z}_t) \odot \tilde{\boldsymbol{H}}_t
H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t 值得注意的是,更新门可以控制隐藏状态应该如何被包含当前时间步信息的候选隐藏状态所更新,如上图所示。假设更新门在时间步
t
′
t'
t ′ 到
t
t
t (
t
′
<
t
t' < t
t ′ < t )之间一直近似于1。那么,在时间步
t
′
t'
t ′ 到
t
t
t 之间的输入信息几乎没有流入时间步
t
t
t 的隐藏状态
H
t
\boldsymbol{H}_t
H t 。实际上,这可以看作是较早时刻的隐藏状态
H
t
′
−
1
\boldsymbol{H}_{t'-1}
H t ′ − 1 一直通过时间保存并传递至当前时间步
t
t
t 。这个设计可以应对循环神经网络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较大的依赖关系(即长期的依赖关系)。
输出结果
将上面得到的隐藏状态
H
t
H_t
H t 输入神经网络,得到结果
Y
t
∈
R
n
×
q
\boldsymbol{Y}_t \in \mathbb{R}^{n \times q}
Y t ∈ R n × q :
Y
t
=
H
t
W
h
q
+
b
q
\boldsymbol{Y}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_q
Y t = H t W h q + b q
总结来说:
重置门有助于捕捉时间序列里短期的依赖关系;
更新门有助于捕捉时间序列里长期的依赖关系。
长短期记忆(LSTM)
LSTM 中引入了3个门,即输入门(input gate)、遗忘门(forget gate)和输出门(output gate),以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细胞当成一种特殊的隐藏状态),从而记录额外的信息。
输入门、遗忘门和输出门
与门控循环单元中的重置门和更新门一样,如下图所示,长短期记忆的门的输入均为当前时间步输入
X
t
\boldsymbol{X}_t
X t 与上一时间步隐藏状态
H
t
−
1
\boldsymbol{H}_{t-1}
H t − 1 ,输出由激活函数为 sigmoid 函数的全连接层计算得到。如此一来,这3个门元素的值域均为
[
0
,
1
]
[0,1]
[ 0 , 1 ] 。 具体来说,假设样本数为
n
n
n ,输入个数为
d
d
d ,隐藏单元个数为
h
h
h ,给定时间步
t
t
t 的小批量输入
X
t
∈
R
n
×
d
\boldsymbol{X}_t \in \mathbb{R}^{n \times d}
X t ∈ R n × d 和上一时间步隐藏状态
H
t
−
1
∈
R
n
×
h
\boldsymbol{H}_{t-1} \in \mathbb{R}^{n \times h}
H t − 1 ∈ R n × h 。 时间步
t
t
t 的输入门
I
t
∈
R
n
×
h
\boldsymbol{I}_t \in \mathbb{R}^{n \times h}
I t ∈ R n × h 、遗忘门
F
t
∈
R
n
×
h
\boldsymbol{F}_t \in \mathbb{R}^{n \times h}
F t ∈ R n × h 和输出门
O
t
∈
R
n
×
h
\boldsymbol{O}_t \in \mathbb{R}^{n \times h}
O t ∈ R n × h 分别计算如下:
I
t
=
σ
(
X
t
W
x
i
+
H
t
−
1
W
h
i
+
b
i
)
\boldsymbol{I}_t = \sigma(\boldsymbol{X}_t \boldsymbol{W}_{xi} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hi} + \boldsymbol{b}_i)
I t = σ ( X t W x i + H t − 1 W h i + b i )
F
t
=
σ
(
X
t
W
x
f
+
H
t
−
1
W
h
f
+
b
f
)
\boldsymbol{F}_t = \sigma(\boldsymbol{X}_t \boldsymbol{W}_{xf} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hf} + \boldsymbol{b}_f)
F t = σ ( X t W x f + H t − 1 W h f + b f )
O
t
=
σ
(
X
t
W
x
o
+
H
t
−
1
W
h
o
+
b
o
)
\boldsymbol{O}_t = \sigma(\boldsymbol{X}_t \boldsymbol{W}_{xo} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{ho} + \boldsymbol{b}_o)
O t = σ ( X t W x o + H t − 1 W h o + b o )
其中的
W
x
i
,
W
x
f
,
W
x
o
∈
R
d
×
h
\boldsymbol{W}_{xi}, \boldsymbol{W}_{xf}, \boldsymbol{W}_{xo} \in \mathbb{R}^{d \times h}
W x i , W x f , W x o ∈ R d × h 和
W
h
i
,
W
h
f
,
W
h
o
∈
R
h
×
h
\boldsymbol{W}_{hi}, \boldsymbol{W}_{hf}, \boldsymbol{W}_{ho} \in \mathbb{R}^{h \times h}
W h i , W h f , W h o ∈ R h × h 是权重参数,
b
i
,
b
f
,
b
o
∈
R
1
×
h
\boldsymbol{b}_i, \boldsymbol{b}_f, \boldsymbol{b}_o \in \mathbb{R}^{1 \times h}
b i , b f , b o ∈ R 1 × h 是偏差参数。
候选记忆细胞
接下来,长短期记忆需要计算候选记忆细胞
C
~
t
\tilde{\boldsymbol{C}}_t
C ~ t 。它的计算与上面介绍的3个门类似,但使用了值域在
[
−
1
,
1
]
[-1, 1]
[ − 1 , 1 ] 的 tanh 函数作为激活函数,如下图所示。 具体来说,时间步
t
t
t 的候选记忆细胞
C
~
t
∈
R
n
×
h
\tilde{\boldsymbol{C}}_t \in \mathbb{R}^{n \times h}
C ~ t ∈ R n × h 的计算为
C
~
t
=
tanh
(
X
t
W
x
c
+
H
t
−
1
W
h
c
+
b
c
)
\tilde{\boldsymbol{C}}_t = \text{tanh}(\boldsymbol{X}_t \boldsymbol{W}_{xc} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hc} + \boldsymbol{b}_c)
C ~ t = tanh ( X t W x c + H t − 1 W h c + b c )
其中
W
x
c
∈
R
d
×
h
\boldsymbol{W}_{xc} \in \mathbb{R}^{d \times h}
W x c ∈ R d × h 和
W
h
c
∈
R
h
×
h
\boldsymbol{W}_{hc} \in \mathbb{R}^{h \times h}
W h c ∈ R h × h 是权重参数,
b
c
∈
R
1
×
h
\boldsymbol{b}_c \in \mathbb{R}^{1 \times h}
b c ∈ R 1 × h 是偏差参数。
记忆细胞
我们可以通过元素值域在
[
0
,
1
]
[0, 1]
[ 0 , 1 ] 的输入门、遗忘门和输出门来控制隐藏状态中信息的流动,这一般也是通过使用按元素乘法(符号为
⊙
\odot
⊙ )来实现的。当前时间步记忆细胞
C
t
∈
R
n
×
h
\boldsymbol{C}_t \in \mathbb{R}^{n \times h}
C t ∈ R n × h 的计算组合了上一时间步记忆细胞和当前时间步候选记忆细胞的信息,并通过遗忘门和输入门来控制信息的流动:
C
t
=
F
t
⊙
C
t
−
1
+
I
t
⊙
C
~
t
.
\boldsymbol{C}_t = \boldsymbol{F}_t \odot \boldsymbol{C}_{t-1} + \boldsymbol{I}_t \odot \tilde{\boldsymbol{C}}_t.
C t = F t ⊙ C t − 1 + I t ⊙ C ~ t .
如下图所示,遗忘门控制上一时间步的记忆细胞
C
t
−
1
\boldsymbol{C}_{t-1}
C t − 1 中的信息是否传递到当前时间步,而输入门则控制当前时间步的输入
X
t
\boldsymbol{X}_t
X t 通过候选记忆细胞
C
~
t
\tilde{\boldsymbol{C}}_t
C ~ t 如何流入当前时间步的记忆细胞。如果遗忘门一直近似1且输入门一直近似0,过去的记忆细胞将一直通过时间保存并传递至当前时间步。这个设计可以应对循环神经网络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较大的依赖关系。
隐藏状态
有了记忆细胞以后,接下来我们还可以通过输出门来控制从记忆细胞到隐藏状态
H
t
∈
R
n
×
h
\boldsymbol{H}_t \in \mathbb{R}^{n \times h}
H t ∈ R n × h 的信息的流动:
H
t
=
O
t
⊙
tanh
(
C
t
)
.
\boldsymbol{H}_t = \boldsymbol{O}_t \odot \text{tanh}(\boldsymbol{C}_t).
H t = O t ⊙ tanh ( C t ) .
这里的 tanh 函数确保隐藏状态元素值在-1到1之间。需要注意的是,当输出门近似1时,记忆细胞信息将传递到隐藏状态供输出层使用;当输出门近似0时,记忆细胞信息只自己保留。下图展示了长短期记忆中隐藏状态的计算。
输出结果
长短期记忆的隐藏层输出包括隐藏状态和记忆细胞,但只有隐藏状态会传递到输出层,而记忆细胞不参与输出层的计算。 将上面得到的隐藏状态
H
t
H_t
H t 输入神经网络,得到结果
Y
t
∈
R
n
×
q
\boldsymbol{Y}_t \in \mathbb{R}^{n \times q}
Y t ∈ R n × q :
Y
t
=
H
t
W
h
q
+
b
q
\boldsymbol{Y}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_q
Y t = H t W h q + b q
深度循环神经网络
到目前为止所涉及的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。下图演示了一个有
L
L
L 个隐藏层的深度循环神经网络,每个隐藏状态不断传递至当前层的下一时间步和当前时间步的下一层。在之前的介绍中,我们只包含输入层、第一层隐藏层和输出层。 具体来说,在时间步
t
t
t 里,设小批量输入
X
t
∈
R
n
×
d
\boldsymbol{X}_t \in \mathbb{R}^{n \times d}
X t ∈ R n × d (样本数为
n
n
n ,输入个数为
d
d
d ),第
ℓ
\ell
ℓ 隐藏层(
ℓ
=
1
,
…
,
L
\ell=1,\ldots,L
ℓ = 1 , … , L )的隐藏状态为
H
t
(
ℓ
)
∈
R
n
×
h
\boldsymbol{H}_t^{(\ell)} \in \mathbb{R}^{n \times h}
H t ( ℓ ) ∈ R n × h (隐藏单元个数为
h
h
h ),输出层变量为
O
t
∈
R
n
×
q
\boldsymbol{O}_t \in \mathbb{R}^{n \times q}
O t ∈ R n × q (输出个数为
q
q
q ),且隐藏层的激活函数为
ϕ
\phi
ϕ 。第一层隐藏层的隐藏状态和之前的计算一样:
H
t
(
1
)
=
ϕ
(
X
t
W
x
h
(
1
)
+
H
t
−
1
(
1
)
W
h
h
(
1
)
+
b
h
(
1
)
)
,
\boldsymbol{H}_t^{(1)} = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(1)} + \boldsymbol{H}_{t-1}^{(1)} \boldsymbol{W}_{hh}^{(1)} + \boldsymbol{b}_h^{(1)}),
H t ( 1 ) = ϕ ( X t W x h ( 1 ) + H t − 1 ( 1 ) W h h ( 1 ) + b h ( 1 ) ) ,
其中权重
W
x
h
(
1
)
∈
R
d
×
h
\boldsymbol{W}_{xh}^{(1)} \in \mathbb{R}^{d \times h}
W x h ( 1 ) ∈ R d × h 、
W
h
h
(
1
)
∈
R
h
×
h
\boldsymbol{W}_{hh}^{(1)} \in \mathbb{R}^{h \times h}
W h h ( 1 ) ∈ R h × h 和偏差
b
h
(
1
)
∈
R
1
×
h
\boldsymbol{b}_h^{(1)} \in \mathbb{R}^{1 \times h}
b h ( 1 ) ∈ R 1 × h 分别为第一层隐藏层的模型参数。
当
1
<
ℓ
≤
L
1 < \ell \leq L
1 < ℓ ≤ L 时,第
ℓ
\ell
ℓ 隐藏层的隐藏状态的表达式为
H
t
(
ℓ
)
=
ϕ
(
H
t
(
ℓ
−
1
)
W
x
h
(
ℓ
)
+
H
t
−
1
(
ℓ
)
W
h
h
(
ℓ
)
+
b
h
(
ℓ
)
)
,
\boldsymbol{H}_t^{(\ell)} = \phi(\boldsymbol{H}_t^{(\ell-1)} \boldsymbol{W}_{xh}^{(\ell)} + \boldsymbol{H}_{t-1}^{(\ell)} \boldsymbol{W}_{hh}^{(\ell)} + \boldsymbol{b}_h^{(\ell)}),
H t ( ℓ ) = ϕ ( H t ( ℓ − 1 ) W x h ( ℓ ) + H t − 1 ( ℓ ) W h h ( ℓ ) + b h ( ℓ ) ) ,
其中权重
W
x
h
(
ℓ
)
∈
R
h
×
h
\boldsymbol{W}_{xh}^{(\ell)} \in \mathbb{R}^{h \times h}
W x h ( ℓ ) ∈ R h × h 、
W
h
h
(
ℓ
)
∈
R
h
×
h
\boldsymbol{W}_{hh}^{(\ell)} \in \mathbb{R}^{h \times h}
W h h ( ℓ ) ∈ R h × h 和偏差
b
h
(
ℓ
)
∈
R
1
×
h
\boldsymbol{b}_h^{(\ell)} \in \mathbb{R}^{1 \times h}
b h ( ℓ ) ∈ R 1 × h 分别为第
ℓ
\ell
ℓ 隐藏层的模型参数。
最终,输出层的输出只需基于第
L
L
L 隐藏层的隐藏状态:
O
t
=
H
t
(
L
)
W
h
q
+
b
q
,
\boldsymbol{O}_t = \boldsymbol{H}_t^{(L)} \boldsymbol{W}_{hq} + \boldsymbol{b}_q,
O t = H t ( L ) 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 为输出层的模型参数。
同多层感知机一样,隐藏层个数
L
L
L 和隐藏单元个数
h
h
h 都是超参数。此外,如果将隐藏状态的计算换成门控循环单元或者长短期记忆的计算,我们可以得到深度门控循环神经网络。
双向循环神经网络
之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后面时间步决定。例如,当我们写下一个句子时,可能会根据句子后面的词来修改句子前面的用词。双向循环神经网络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。下图演示了一个含单隐藏层的双向循环神经网络的架构。 下面我们来介绍具体的定义。 给定时间步
t
t
t 的小批量输入
X
t
∈
R
n
×
d
\boldsymbol{X}_t \in \mathbb{R}^{n \times d}
X t ∈ R n × d (样本数为
n
n
n ,输入个数为
d
d
d )和隐藏层激活函数为
ϕ
\phi
ϕ 。在双向循环神经网络的架构中, 设该时间步正向隐藏状态为
H
→
t
∈
R
n
×
h
\overrightarrow{\boldsymbol{H}}_t \in \mathbb{R}^{n \times h}
H
t ∈ R n × h (正向隐藏单元个数为
h
h
h ), 反向隐藏状态为
H
←
t
∈
R
n
×
h
\overleftarrow{\boldsymbol{H}}_t \in \mathbb{R}^{n \times h}
H
t ∈ R n × h (反向隐藏单元个数为
h
h
h )。我们可以分别计算正向隐藏状态和反向隐藏状态:
H
→
t
=
ϕ
(
X
t
W
x
h
(
f
)
+
H
→
t
−
1
W
h
h
(
f
)
+
b
h
(
f
)
)
,
H
←
t
=
ϕ
(
X
t
W
x
h
(
b
)
+
H
←
t
+
1
W
h
h
(
b
)
+
b
h
(
b
)
)
\begin{aligned} \overrightarrow{\boldsymbol{H}}_t &= \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(f)} + \overrightarrow{\boldsymbol{H}}_{t-1} \boldsymbol{W}_{hh}^{(f)} + \boldsymbol{b}_h^{(f)}),\ \overleftarrow{\boldsymbol{H}}_t &= \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(b)} + \overleftarrow{\boldsymbol{H}}_{t+1} \boldsymbol{W}_{hh}^{(b)} + \boldsymbol{b}_h^{(b)}) \end{aligned}
H
t = ϕ ( X t W x h ( f ) + H
t − 1 W h h ( f ) + b h ( f ) ) , H
t = ϕ ( X t W x h ( b ) + H
t + 1 W h h ( b ) + b h ( b ) )
其中权重
W
x
h
(
f
)
∈
R
d
×
h
\boldsymbol{W}_{xh}^{(f)} \in \mathbb{R}^{d \times h}
W x h ( f ) ∈ R d × h 、
W
h
h
(
f
)
∈
R
h
×
h
\boldsymbol{W}_{hh}^{(f)} \in \mathbb{R}^{h \times h}
W h h ( f ) ∈ R h × h 、
W
x
h
(
b
)
∈
R
d
×
h
\boldsymbol{W}_{xh}^{(b)} \in \mathbb{R}^{d \times h}
W x h ( b ) ∈ R d × h 、
W
h
h
(
b
)
∈
R
h
×
h
\boldsymbol{W}_{hh}^{(b)} \in \mathbb{R}^{h \times h}
W h h ( b ) ∈ R h × h 和偏差
b
h
(
f
)
∈
R
1
×
h
\boldsymbol{b}_h^{(f)} \in \mathbb{R}^{1 \times h}
b h ( f ) ∈ R 1 × h 、
b
h
(
b
)
∈
R
1
×
h
\boldsymbol{b}_h^{(b)} \in \mathbb{R}^{1 \times h}
b h ( b ) ∈ R 1 × h 均为模型参数。
然后我们连结两个方向的隐藏状态
H
→
t
\overrightarrow{\boldsymbol{H}}_t
H
t 和
H
←
t
\overleftarrow{\boldsymbol{H}}_t
H
t 来得到隐藏状态
H
t
∈
R
n
×
2
h
\boldsymbol{H}_t \in \mathbb{R}^{n \times 2h}
H t ∈ R n × 2 h ,并将其输入到输出层。输出层计算输出
O
t
∈
R
n
×
q
\boldsymbol{O}_t \in \mathbb{R}^{n \times q}
O t ∈ R n × q (输出个数为
q
q
q ):
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
2
h
×
q
\boldsymbol{W}_{hq} \in \mathbb{R}^{2h \times q}
W h q ∈ R 2 h × q 和偏差
b
q
∈
R
1
×
q
\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}
b q ∈ R 1 × q 为输出层的模型参数。不同方向上的隐藏单元个数也可以不同。