现代循环神经网络
1. 深度循环神经网络
目前为止介绍的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。下图中展示了一个有 L L L 个隐藏层的深度循环神经网络,每个隐藏状态不断传递至当前层的下一时间步和当前时间步的下一层。
具体来说,在时间步
t
t
t 里,设小批量的输入
X
t
∈
R
n
×
d
X_t \in R^{n \times d}
Xt∈Rn×d (样本数为
n
n
n, 输入特征维度为
d
d
d) ,第
l
l
l 隐藏层
(
l
=
1
,
2
,
⋯
,
L
)
(l=1,2,\cdots,L)
(l=1,2,⋯,L) 的隐藏状态为
H
t
(
l
)
∈
R
n
×
h
H_t^{(l)} \in R^{n \times h}
Ht(l)∈Rn×h (隐藏单元个数为
h
h
h),输出层变量为
O
t
∈
R
n
×
q
O_t \in R^{n \times q}
Ot∈Rn×q (输出个数为
q
q
q ),且隐藏层的激活函数为
ϕ
\phi
ϕ。第 1 隐藏层的隐藏状态和之前的计算一样:
H
t
(
1
)
=
ϕ
(
X
t
W
d
h
(
1
)
+
H
t
−
1
(
1
)
W
h
h
(
1
)
+
b
h
(
1
)
)
H_t^{(1)}=\phi(X_tW_{dh}^{(1)}+H_{t-1}^{(1)}W_{hh}^{(1)}+b_h^{(1)})
Ht(1)=ϕ(XtWdh(1)+Ht−1(1)Whh(1)+bh(1))
其中权重
W
d
h
(
1
)
∈
R
d
×
h
W_{dh}^{(1)} \in R^{d \times h}
Wdh(1)∈Rd×h、
W
h
h
(
1
)
∈
R
h
×
h
W_{hh}^{(1)} \in R^{h \times h}
Whh(1)∈Rh×h 和偏置项
b
h
(
1
)
∈
R
(
1
×
h
)
b_{h}^{(1)} \in R^{(1 \times h)}
bh(1)∈R(1×h) 分别是第 1 隐藏层的模型参数。
当
1
≤
l
≤
L
1 \le l \le L
1≤l≤L 时,第
l
l
l 隐藏层的隐藏状态的表达式为:
H
t
(
l
)
=
ϕ
(
H
t
(
l
−
1
)
W
d
h
(
l
)
+
H
t
−
1
(
l
)
W
h
h
(
l
)
+
b
h
(
l
)
)
H_t^{(l)}=\phi(H_t^{(l-1)}W_{dh}^{(l)}+H_{t-1}^{(l)}W_{hh}^{(l)}+b_h^{(l)})
Ht(l)=ϕ(Ht(l−1)Wdh(l)+Ht−1(l)Whh(l)+bh(l))
其中权重
W
d
h
(
l
)
∈
R
d
×
h
W_{dh}^{(l)} \in R^{d \times h}
Wdh(l)∈Rd×h、
W
h
h
(
l
)
∈
R
h
×
h
W_{hh}^{(l)} \in R^{h \times h}
Whh(l)∈Rh×h 和偏置项
b
h
(
l
)
∈
R
(
1
×
h
)
b_{h}^{(l)} \in R^{(1 \times h)}
bh(l)∈R(1×h) 分别是第 1 隐藏层的模型参数。
最终,输出层的输出只需基于第
L
L
L 隐藏层(最后的隐藏层)的隐藏状态:
O
t
=
H
t
(
L
)
W
h
q
+
b
q
O_t=H_{t}^{(L)}W_{hq}+b_q
Ot=Ht(L)Whq+bq
其中权重
W
h
q
∈
R
h
×
q
W_{hq} \in R^{h \times q}
Whq∈Rh×q 和偏置项
b
q
∈
R
1
×
q
b_q \in R^{1 \times q}
bq∈R1×q 为输出层的模型参数。
和多层感知机一样,隐藏层个数 L L L 和每一层隐藏单元 h h h 都是超参数。此外,如果将隐藏状态的计算换成门控循环单元或者长短期记忆的计算,我们就可以得到深度门控循环神经网络。
总之,在深度循环神经网络中,隐藏状态的信息不断传递至当前层的下一时间步和当前时间步的下一层。同一隐藏层单元的参数是共享的,而不同隐藏层之间的参数是不同的。
2. 双向循环神经网络
之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此他们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后⾯时间步决定。例如,当我们写下⼀个句子时,可能会根据句子后面的词来修改句子前面的用词。
双向循环神经网络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。下图展示了一个含单隐藏层的双向循环神经网络的架构,下面我们来介绍具体的定义。
给定时间步 t t t 的小批量输入 X t ∈ R n × d X_t \in R^{n \times d} Xt∈Rn×d (样本数为 n n n,输入个数为 d d d) 和隐藏层激活函数为 ϕ \phi ϕ 。在双向循环神经网络的架构中,设该时间步正向隐藏状态为 H t → ∈ R n × h \overrightarrow{H_{t}} \in R^{n \times h} Ht∈Rn×h (正向隐藏单元个数为 h h h ),反向隐藏状态为 H t ← ∈ R n × h \overleftarrow{H_{t}} \in R^{n \times h} Ht∈Rn×h (反向隐藏单元个数为 h h h)。我们可以分别计算正向隐藏状态和反向隐藏状态:
- 正向隐藏状态:
H t → = ϕ ( X t W d h ( f ) + H → t − 1 W h h ( f ) + b h ( f ) ) \overrightarrow{H_t}=\phi(X_tW_{dh}^{(f)}+\overrightarrow{H}_{t-1}W_{hh}^{(f)}+b_h^{(f)}) Ht=ϕ(XtWdh(f)+Ht−1Whh(f)+bh(f))
- 反向隐藏状态:
H t ← = ϕ ( X t W d h ( b ) + H ← t + 1 W h h ( b ) + b h ( b ) ) \overleftarrow{H_{t}} = \phi(X_tW_{dh}^{(b)}+\overleftarrow{H}_{t+1}W_{hh}^{(b)}+b_{h}^{(b)}) Ht=ϕ(XtWdh(b)+Ht+1Whh(b)+bh(b))
其中权重 W d h ( f ) ∈ R d × h W_{dh}^{(f)} \in R^{d \times h} Wdh(f)∈Rd×h、 W h h ( f ) ∈ R h × h W_{hh}^{(f)} \in R^{h \times h} Whh(f)∈Rh×h 、 W d h ( b ) ∈ R d × h W_{dh}^{(b)} \in R^{d \times h} Wdh(b)∈Rd×h、 W h h ( b ) ∈ R h × h W_{hh}^{(b)} \in R^{h \times h} Whh(b)∈Rh×h 和偏置项 b h ( f ) ∈ R 1 × h b_h^{(f)} \in R^{1 \times h} bh(f)∈R1×h 、 b h ( b ) ∈ R 1 × h b_h^{(b)} \in R^{1 \times h} bh(b)∈R1×h 均为模型参数。
然后我们连结两个⽅向的隐藏状态
H
t
→
\overrightarrow{H_t}
Ht 和
H
t
←
\overleftarrow{H_{t}}
Ht 来得到隐藏状态
H
t
∈
R
n
×
2
h
H_t \in R^{n \times 2h}
Ht∈Rn×2h,并将其输入到输出层,输出层计算输出
O
t
∈
R
n
×
q
O_t \in R^{n \times q}
Ot∈Rn×q (输出个数为
q
q
q):
O
t
=
H
t
W
2
h
×
q
+
b
q
O_t=H_tW_{2h \times q}+b_q
Ot=HtW2h×q+bq
其中权重
W
2
h
×
q
∈
R
2
h
×
q
W_{2h \times q} \in R^{2h \times q}
W2h×q∈R2h×q 和偏置项
b
q
∈
R
1
×
q
b_q \in R^{1 \times q}
bq∈R1×q 为输出层的模型参数,不同方向上的隐藏单元也可能不一样。
双向循环神经网络在每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输⼊)。