循环神经网络
1. 动态系统
由外部信号
x
(
t
)
x^{(t)}
x(t)驱动的动态系统:
h
(
t
)
=
f
(
h
(
t
−
1
)
,
x
(
t
)
;
θ
)
.
h^{(t)}=f(h^{(t-1)},x^{(t)};\theta).
h(t)=f(h(t−1),x(t);θ).
从下图中可以看出,对于
h
(
t
)
h^{(t)}
h(t)而言,
h
(
t
)
h^{(t)}
h(t)包含了
h
(
t
−
1
)
h^{(t-1)}
h(t−1)的信息,
⋯
\cdots
⋯,
h
(
2
)
h^{(2)}
h(2)包含了
h
(
1
)
h^{(1)}
h(1)的信息,因此
h
(
t
)
h^{(t)}
h(t)包含了整个过去序列的信息。
f
f
f是涉及循环的函数。

循环神经网络利用了类似上图的循环连接,使其能够对序列中的每一个元素进行递归地处理,并保留过去的信息,从而具备对上下文信息的记忆能力。上图也可认为是没有输出的循环神经网络。
2. 循环神经网络
对于循环神经网络而言,代价函数的计算方式有两种:一种是仅使用最后一个时间步的输出计算代价函数,另一种是对每个时间步的输出计算损失并累加得到代价函数。第一种适合用于序列分类或者序列到单输出的任务,而第二种适合用于序列到序列的任务,如机器翻译、时间序列预测等。
循环神经网络的循环连接有好几种,下面仅介绍三种循环连接构成的RNN——标准RNN,双向RNN,门控RNN。
2.1 标准RNN
以下面的循环神经网络为例子,该循环神经网络的输入层有4个神经元,输出层有3个神经元,隐藏层为两层标准RNN层,有5个神经元,分别记作 R 1 R_1 R1、 R 2 R_2 R2。
![]() | ![]() |
|---|
| 符号 | 含义 | 符号 | 含义 |
|---|---|---|---|
| U 1 U_1 U1 | 输入层到 R 1 R_1 R1的权重矩阵 | U 2 U_2 U2 | R 1 R_1 R1到 R 2 R_2 R2的权重矩阵 |
| V V V | R 2 R_2 R2到输出层的权重矩阵 | W 1 W_1 W1 | R 1 R_1 R1隐藏状态的权重矩阵 |
| h 1 ( 0 ) h_1^{(0)} h1(0) | R 1 R_1 R1隐藏状态的初始值 | h 1 ( t ) h_1^{(t)} h1(t) | R 1 R_1 R1经过 t t t个时间步后的隐藏状态 |
| W 2 W_2 W2 | R 2 R_2 R2隐藏状态的权重矩阵 | h 2 ( 0 ) h_2^{(0)} h2(0) | R 2 R_2 R2隐藏状态的初始值 |
| h 2 ( t ) h_2^{(t)} h2(t) | R 2 R_2 R2经过 t t t个时间步后的隐藏状态 | b ⃗ 1 \vec{b}^1 b1 | 输入层到 R 1 R_1 R1的偏置 |
| b ⃗ 2 \vec{b}^2 b2 | R 1 R_1 R1到 R 2 R_2 R2的偏置 | b ⃗ 3 \vec{b}^3 b3 | R 2 R_2 R2到输出层的偏置 |
| b ⃗ 1 \vec{b}_1 b1 | R 1 R_1 R1隐藏状态的偏置 | b ⃗ 2 \vec{b}_2 b2 | R 2 R_2 R2隐藏状态的偏置 |
| x ⃗ ( t ) \vec{x}^{(t)} x(t) | 输入 X X X第 t t t行(行向量) | f f f | 激活函数 |
输入
X
X
X的形状为
(
5
,
4
)
(5,4)
(5,4),其中5是序列长度,也就是要就计算5个时间步,也就是4是输入的尺寸。
U
1
=
[
u
11
(
1
)
u
12
(
1
)
u
13
(
1
)
u
14
(
1
)
u
15
(
1
)
u
21
(
1
)
u
22
(
1
)
u
23
(
1
)
u
24
(
1
)
u
25
(
1
)
u
31
(
1
)
u
32
(
1
)
u
33
(
1
)
u
34
(
1
)
u
35
(
1
)
u
41
(
1
)
u
42
(
1
)
u
43
(
1
)
u
44
(
1
)
u
45
(
1
)
]
U_1=\begin{bmatrix} u_{11}^{(1)} & u_{12}^{(1)} & u_{13}^{(1)} & u_{14}^{(1)} & u_{15}^{(1)}\\ u_{21}^{(1)} & u_{22}^{(1)} & u_{23}^{(1)} & u_{24}^{(1)} & u_{25}^{(1)}\\ u_{31}^{(1)} & u_{32}^{(1)} & u_{33}^{(1)} & u_{34}^{(1)} & u_{35}^{(1)}\\ u_{41}^{(1)} & u_{42}^{(1)} & u_{43}^{(1)} & u_{44}^{(1)} & u_{45}^{(1)} \end{bmatrix}
U1=
u11(1)u21(1)u31(1)u41(1)u12(1)u22(1)u32(1)u42(1)u13(1)u23(1)u33(1)u43(1)u14(1)u24(1)u34(1)u44(1)u15(1)u25(1)u35(1)u45(1)
,
b
⃗
1
=
[
b
1
(
1
)
,
b
2
(
1
)
,
b
3
(
1
)
,
b
4
(
1
)
,
b
5
(
1
)
]
T
\vec{b}^1=[b_1^{(1)},b_2^{(1)},b_3^{(1)},b_4^{(1)},b_5^{(1)}]^T
b1=[b1(1),b2(1),b3(1),b4(1),b5(1)]T,
W
1
W_1
W1的形状为
5
×
5
5\times5
5×5,
h
1
(
0
)
h_1^{(0)}
h1(0)和
b
⃗
1
\vec{b}_1
b1的形状都为
5
×
1
5\times1
5×1,则
R
1
R_1
R1的输出为
h
1
(
t
)
=
f
(
U
1
T
x
(
t
)
+
b
⃗
1
+
W
1
h
1
(
t
−
1
)
+
b
⃗
1
)
,
t
=
1
,
2
,
3
,
4
,
5
h_1^{(t)}=f(U_1^Tx^{(t)}+\vec{b}^1+W_1h_1^{(t-1)}+\vec{b}_1),t=1,2,3,4,5
h1(t)=f(U1Tx(t)+b1+W1h1(t−1)+b1),t=1,2,3,4,5。
对于堆叠的RNN来说,上一个RNN层的输出作为下一个RNN层的输入。
U
2
=
[
u
11
(
2
)
u
12
(
2
)
u
13
(
2
)
u
14
(
2
)
u
15
(
2
)
u
21
(
2
)
u
22
(
2
)
u
23
(
2
)
u
24
(
2
)
u
25
(
2
)
u
31
(
2
)
u
32
(
2
)
u
33
(
2
)
u
34
(
2
)
u
35
(
2
)
u
41
(
2
)
u
42
(
2
)
u
43
(
2
)
u
44
(
2
)
u
45
(
2
)
u
51
(
2
)
u
52
(
2
)
u
53
(
2
)
u
54
(
2
)
u
55
(
2
)
]
U_2=\begin{bmatrix} u_{11}^{(2)} & u_{12}^{(2)} & u_{13}^{(2)} & u_{14}^{(2)} & u_{15}^{(2)}\\ u_{21}^{(2)} & u_{22}^{(2)} & u_{23}^{(2)} & u_{24}^{(2)} & u_{25}^{(2)}\\ u_{31}^{(2)} & u_{32}^{(2)} & u_{33}^{(2)} & u_{34}^{(2)} & u_{35}^{(2)}\\ u_{41}^{(2)} & u_{42}^{(2)} & u_{43}^{(2)} & u_{44}^{(2)} & u_{45}^{(2)}\\ u_{51}^{(2)} & u_{52}^{(2)} & u_{53}^{(2)} & u_{54}^{(2)} & u_{55}^{(2)} \end{bmatrix}
U2=
u11(2)u21(2)u31(2)u41(2)u51(2)u12(2)u22(2)u32(2)u42(2)u52(2)u13(2)u23(2)u33(2)u43(2)u53(2)u14(2)u24(2)u34(2)u44(2)u54(2)u15(2)u25(2)u35(2)u45(2)u55(2)
,
b
⃗
2
=
[
b
1
(
2
)
,
b
2
(
2
)
,
b
3
(
3
)
,
b
4
(
2
)
,
b
5
(
2
)
]
\vec{b}^2=[b_1^{(2)},b_2^{(2)},b_3^{(3)},b_4^{(2)},b_5^{(2)}]
b2=[b1(2),b2(2),b3(3),b4(2),b5(2)],
W
2
W_2
W2的形状为
5
×
5
5\times5
5×5,
h
2
(
0
)
h_2^{(0)}
h2(0)和
b
⃗
2
\vec{b}_2
b2的形状都是
5
×
1
5\times1
5×1,则
R
2
R_2
R2的输出
h
2
(
t
)
=
f
(
U
2
T
h
1
(
t
)
+
b
⃗
2
+
W
2
h
2
(
t
−
1
)
+
b
⃗
2
)
,
t
=
1
,
2
,
3
,
4
,
5
h_2^{(t)}=f(U_2^Th_1^{(t)}+\vec{b}^2+W_2h_2^{(t-1)}+\vec{b}_2),t=1,2,3,4,5
h2(t)=f(U2Th1(t)+b2+W2h2(t−1)+b2),t=1,2,3,4,5。
V
=
[
v
11
v
12
v
13
v
21
v
22
v
23
v
31
v
32
v
33
v
41
v
42
v
43
v
51
v
52
v
53
]
V=\begin{bmatrix} v_{11} & v_{12} & v_{13}\\ v_{21} & v_{22} & v_{23}\\ v_{31} & v_{32} & v_{33}\\ v_{41} & v_{42} & v_{43}\\ v_{51} & v_{52} & v_{53} \end{bmatrix}
V=
v11v21v31v41v51v12v22v32v42v52v13v23v33v43v53
,
b
⃗
3
\vec{b}^3
b3的形状是
5
×
1
5\times1
5×1,则输出层的输出
y
(
t
)
=
f
(
V
T
h
2
(
t
)
+
b
⃗
3
)
y^{(t)}=f(V^Th_2^{(t)}+\vec{b}^3)
y(t)=f(VTh2(t)+b3)。然后可以根据任务来选择是计算每个时间步的代价累加还是计算最后一个时间步的代价。
2.2 双向RNN
与标准RNN相比,双向RNN多了从序列末尾到起点的反向循环连接,可以更好地捕捉到前后文信息,提升对序列数据的理解。
下面给出了单层双向RNN的循环神经网络(这里
U
U
U仍按照上面的方式填写权重,所以下面公式中U要用转置),序列长度为t。正向隐藏状态
h
(
i
)
=
f
(
W
h
(
i
−
1
)
+
U
T
x
(
i
)
+
b
⃗
)
,
i
=
1
,
2
,
⋯
,
t
h^{(i)}=f(Wh^{(i-1)}+U^Tx^{(i)}+\vec{b}),i=1,2,\cdots,t
h(i)=f(Wh(i−1)+UTx(i)+b),i=1,2,⋯,t,反向隐藏状态
g
(
i
)
=
f
(
W
g
(
i
+
1
)
+
U
T
x
(
i
)
+
b
⃗
)
,
i
=
t
,
t
−
1
,
⋯
,
1
g^{(i)}=f(Wg^{(i+1)}+U^Tx^{(i)}+\vec{b}),i=t,t-1,\cdots,1
g(i)=f(Wg(i+1)+UTx(i)+b),i=t,t−1,⋯,1。在PyTorch的nn.RNN中正向和反向隐藏状态最终是拼接在一起的,当然也有其他方式把正向和反向隐藏状态的信息结合起来。

2.3 门控RNN
与标准RNN相比,门控RNN能避免梯度消失和爆炸,能更好地选择记住或者遗忘信息,能更快地收敛,减少对初始隐藏状态的依赖。
2.3.1 LSTM
LSTM单元比标准RNN单元的输入和输出多了一个单元状态 c c c。下面左图是单层LSTM的循环神经网络,右图是一个LSTM单元的结构,LSTM单元由四部分构成:遗忘门、输入门、候选记忆单元和输出门。
![]() | ![]() |
|---|
| 符号 | 含义 | 符号 | 含义 |
|---|---|---|---|
| x ( t ) x^{(t)} x(t) | 输入 X X X第 t t t行构成的列向量 | z | LSTM单元中隐藏层神经元个数 |
| W f W_f Wf | 输入到遗忘门的权重矩阵 | W i W_i Wi | 输入到输入门的权重矩阵 |
| W c W_c Wc | 输入到候选记忆单元的权重矩阵 | W o W_o Wo | 输入到输出门的权重矩阵 |
| W h f W_{hf} Whf | 隐藏状态到遗忘门的权重矩阵 | W h i W_{hi} Whi | 隐藏状态到输入门的权重矩阵 |
| W h c W_{hc} Whc | 隐藏状态到候选记忆单元的权重矩阵 | W h o W_{ho} Who | 隐藏状态到输出门的权重矩阵 |
| b f b_f bf | 输入到遗忘门的偏置 | b i b_i bi | 输入到输入门的偏置 |
| b c b_c bc | 输入到候选记忆单元的偏置 | b o b_o bo | 输入到输出门的偏置 |
| b h f b_{hf} bhf | 隐藏状态到遗忘门的偏置 | b h i b_{hi} bhi | 隐藏状态到输入门的偏置 |
| b h c b_{hc} bhc | 隐藏状态到候选记忆单元的偏置 | b h o b_{ho} bho | 隐藏状态到输出门的偏置 |
输入
X
X
X的形状为
(
m
,
n
)
(m,n)
(m,n),
W
f
W_f
Wf、
W
i
W_i
Wi、
W
c
W_c
Wc和
W
o
W_o
Wo的形状都为
z
×
n
z\times n
z×n,
W
h
f
W_{hf}
Whf、
W
h
i
W_{hi}
Whi、
W
h
c
W_{hc}
Whc、和
W
h
o
W_{ho}
Who的形状都为
z
×
z
z\times z
z×z,偏置的形状都为
z
×
1
z\times1
z×1。遗忘门的输出为
F
(
t
)
=
σ
(
W
f
x
(
t
)
+
b
f
+
W
h
f
h
(
t
−
1
)
+
b
h
f
)
F^{(t)}=\sigma(W_fx^{(t)}+b_f+W_{hf}h^{(t-1)}+b_{hf})
F(t)=σ(Wfx(t)+bf+Whfh(t−1)+bhf),输入门的输出为
I
(
t
)
=
σ
(
W
i
x
(
t
)
+
b
i
+
W
h
i
h
(
t
−
1
)
+
b
h
i
)
I^{(t)}=\sigma(W_ix^{(t)}+b_i+W_{hi}h^{(t-1)}+b_{hi})
I(t)=σ(Wix(t)+bi+Whih(t−1)+bhi),候选记忆单元的输出为
C
(
t
)
=
t
a
n
h
(
W
c
x
(
t
)
+
b
c
+
W
h
c
h
(
t
−
1
)
+
b
h
c
)
C^{(t)}=tanh(W_cx^{(t)}+b_c+W_{hc}h^{(t-1)}+b_{hc})
C(t)=tanh(Wcx(t)+bc+Whch(t−1)+bhc),输出门的输出为
O
(
t
)
=
σ
(
W
o
x
(
t
)
+
b
o
+
W
h
o
h
t
−
1
+
b
h
o
)
O^{(t)}=\sigma(W_ox^{(t)}+b_o+W_{ho}h^{t-1}+b_{ho})
O(t)=σ(Wox(t)+bo+Whoht−1+bho)。
遗忘门的作用是决定上一步的单元状态有多少传递到当前时间步。遗忘门输出中元素的范围为
[
0
,
1
]
[0,1]
[0,1],数值越接近0,该部分信息会被遗忘,反之数值越接近1,这部分信息会被记住。
候选记忆单元生成了当前时间步的新信息,输入门的作用是决定当前时间步候选记忆单元的信息有多少会被允许存入单元状态中。遗忘门、输入门和候选记忆单元共同参与对单元状态的更新,当前时间步的单元状态为
c
(
t
)
=
c
(
t
−
1
)
⊙
F
(
t
)
+
I
(
t
)
⊙
C
(
t
)
c^{(t)}=c^{(t-1)}\odot F^{(t)}+I^{(t)}\odot C^{(t)}
c(t)=c(t−1)⊙F(t)+I(t)⊙C(t)。(
⊙
\odot
⊙表示逐元素乘法)
输出门的作用是控制当前单元状态中输出多少信息作为隐藏状态,当前时间步的隐藏状态为
h
(
t
)
=
O
(
t
)
⊙
t
a
n
h
(
c
(
t
)
)
h^{(t)}=O^{(t)}\odot tanh(c^{(t)})
h(t)=O(t)⊙tanh(c(t))。
此外,当前单元状态
c
(
t
)
c^{(t)}
c(t)通过
t
a
n
h
tanh
tanh激活函数的主要作用是对其数值范围进行压缩,限制在 -1 到 1 之间,从而保持计算的稳定性并避免梯度爆炸问题。
2.3.2 GRU

| 符号 | 含义 | 符号 | 含义 |
|---|---|---|---|
| W r W_r Wr | 输入到重置门的权重矩阵 | W z W_z Wz | 输入到更新门的权重矩阵 |
| W h W_h Wh | 输入到候选隐藏状态的权重矩阵 | W h h W_{hh} Whh | 隐藏状态到候选隐藏状态的权重矩阵 |
| W h r W_{hr} Whr | 隐藏状态到重置门的权重矩阵 | W h z W_{hz} Whz | 隐藏状态到更新门的权重矩阵 |
| b r b_r br | 输入到重置门的偏置 | b z b_z bz | 输入到更新门的偏置 |
| b h b_h bh | 输入到候选隐藏状态的偏置 | b h h b_{hh} bhh | 隐藏状态到候选隐藏状态的偏置 |
| b h r b_{hr} bhr | 隐藏状态到重置门的偏置 | b h z b_{hz} bhz | 隐藏状态到更新门的偏置 |
输入
X
X
X的形状为
(
m
,
n
)
(m,n)
(m,n),隐藏层的神经元个数为
a
a
a,
W
r
W_r
Wr、
W
z
W_z
Wz和
W
h
W_h
Wh的形状为
a
×
n
a\times n
a×n,
W
h
h
W_{hh}
Whh、
W
h
r
W_{hr}
Whr和
W
h
z
W_{hz}
Whz的形状为
a
×
a
a\times a
a×a,偏置的形状为
a
×
1
a\times 1
a×1。重置门的输出为
R
(
t
)
=
σ
(
W
r
x
(
t
)
+
b
r
+
W
h
r
h
(
t
−
1
)
+
b
h
r
)
R^{(t)}=\sigma(W_rx^{(t)}+b_r+W_{hr}h^{(t-1)}+b_{hr})
R(t)=σ(Wrx(t)+br+Whrh(t−1)+bhr),更新门的输出为
Z
(
t
)
=
σ
(
W
z
x
(
t
)
+
b
z
+
W
h
z
h
(
t
−
1
)
+
b
h
z
)
Z^{(t)}=\sigma(W_zx^{(t)}+b_z+W_{hz}h^{(t-1)}+b_{hz})
Z(t)=σ(Wzx(t)+bz+Whzh(t−1)+bhz),候选隐藏状态的输出为
H
(
t
)
=
t
a
n
h
(
W
h
x
(
t
)
+
b
h
+
W
h
h
(
h
(
t
−
1
)
⊙
R
(
t
)
)
+
b
h
h
)
H^{(t)}=tanh(W_hx^{(t)}+b_h+W_{hh}(h^{(t-1)}\odot R^{(t)})+b_{hh})
H(t)=tanh(Whx(t)+bh+Whh(h(t−1)⊙R(t))+bhh)。
重置门的作用是决定上一步的隐藏状态有多少信息被允许进入候选隐藏状态。候选隐藏状态受重置门的调节接受上一步的隐藏状态,并且引入了当前时间步的新信息。
更新门的作用是决定上一步的隐藏状态和候选隐藏状态的结合程度。当前隐藏状态为
h
(
t
)
=
h
(
t
−
1
)
⊙
Z
(
t
)
+
(
1
−
Z
(
t
)
)
⊙
H
(
t
)
h^{(t)}=h^{(t-1)}\odot Z^{(t)}+(1-Z^{(t)})\odot H^{(t)}
h(t)=h(t−1)⊙Z(t)+(1−Z(t))⊙H(t)。
2.3.3 LSTM与GRU的比较
LSTM 有独立的输入、输出和遗忘门,使得它在管理长期和短期记忆方面更加灵活,可以更好地学习复杂的依赖关系;更擅长处理长序列数据,特别是在语言建模、机器翻译等需要长时间依赖的任务中,通常能获得更好的表现。
GRU 结构更简单,没有遗忘门,只有重置门和更新门。参数较少,训练速度更快,占用内存也更少,适合在资源有限的环境中使用;在一些小数据集或不太复杂的任务上,GRU 往往表现不逊于 LSTM,甚至在短序列任务上效果更佳。
参考
[美]伊恩·古德费洛(lan Goodfellow)[加]约书亚·本吉奥(Yoshua Bengio)[加]亚伦·库维尔(Aaron Courville) 深度学习(中文翻译版)
动手学深度学习 8. 循环神经网络
更多推荐




所有评论(0)