正向传播字训练神经网络中比较直观,而通过时间反向传播其实是反向传播在循环神经网络中的具体应用。我们需要将循环神经网络按时间步展开,从而得到模型变量和参数之间的依赖关系,并根据链式法则应用反向传播计算并存储梯度。
简单起见,我们考虑一个无偏差项的循环神经网络,且激活函数为恒等映射(
ϕ
(
x
)
=
x
ϕ(x)=x
ϕ(x)=x)。设时间步
t
t
t 的输入为单样本
x
t
∈
R
d
{x}_t \in {R}^d
xt∈Rd,标签为
y
t
y_t
yt,那么隐藏状态
h
t
∈
R
h
{h}_t \in R^h
ht∈Rh 的计算表达式为
h
t
=
W
h
x
x
t
+
W
h
h
h
t
−
1
{h}_t = {W}_{hx} {x}_{t} + {W}_{hh} {h}_{t-1}
ht=Whxxt+Whhht−1
其中
W
h
x
∈
R
h
×
d
W_{hx} \in R^{h×d}
Whx∈Rh×d 和
W
h
h
∈
R
h
×
h
W_{hh} \in R^{h×h}
Whh∈Rh×h 是隐藏层权重参数。设输出层权重参数
W
q
h
∈
R
q
×
h
W_{qh} \in R^{q×h}
Wqh∈Rq×h ,时间步 t 的输出层变量
O
t
∈
R
q
O_t \in R^q
Ot∈Rq 计算为
o
t
=
W
q
h
h
t
o_t = W_{qh} h_t
ot=Wqhht
设时间步 t 的损失为
ℓ
(
o
t
,
y
t
)
\ell(o_t, y_t)
ℓ(ot,yt)。时间步数为 T 的损失函数 L 定义为、
L
=
1
T
∑
t
=
1
T
ℓ
(
o
t
,
y
t
)
L = \frac{1}{T} \sum^T_{t=1} \ell(o_t, y_t)
L=T1t=1∑Tℓ(ot,yt)
我们将 L 陈给有关给定时间步的数据样本的目标函数,并在后续讨论中称为目标函数。
为了可视化循环神经网络中模型变量和参数在计算中的依赖关系,我们可以绘制模型计算图,如图所示。例如,时间步3的隐藏状态 h 3 h_3 h3 的计算依赖模型参数 W h x , W h h W_{hx},W_{hh} Whx,Whh 上一时间步隐藏状态 h 2 h_2 h2 以及当前时间步输入 x 3 x_3 x3
时间步数为3的循环神经网络模型计算中的依赖关系。方框代表变量(无阴影)或参数(有阴影),圆圈代表运算符
刚刚提到,图中的模型的参数是 W h x , W h h \boldsymbol{W}_{h x}, \boldsymbol{W}_{h h} Whx,Whh 和 W q h \boldsymbol{W}_{q h} Wqh。与3.14节(正向传播、反向传播和计算图)中类似,训练模型通常需要模型参数的梯度 ∂ L / ∂ W h x , ∂ L / ∂ W h h \partial L / \partial \boldsymbol{W}_{h x}, \partial L / \partial \boldsymbol{W}_{h h} ∂L/∂Whx,∂L/∂Whh 和 ∂ L / ∂ W q h \partial L / \partial \boldsymbol{W}_{q h} ∂L/∂Wqh。根据图中的依赖关系,我们可以按照其中箭头所指的反方向一次计算并存储梯度。为了表述方便,我们依然采用3.14节中表达链式法则的运算符 prod。
首先,目标函数有关各时间步输出层变量的梯度
∂
L
/
∂
o
t
∈
R
q
\partial L / \partial \boldsymbol{o}_{t} \in \mathbb{R}^{q}
∂L/∂ot∈Rq 很容易计算:
∂
L
∂
o
t
=
∂
ℓ
(
o
t
,
y
t
)
T
⋅
∂
o
t
\frac{\partial L}{\partial o_{t}}=\frac{\partial \ell\left(o_{t}, y_{t}\right)}{T \cdot \partial o_{t}}
∂ot∂L=T⋅∂ot∂ℓ(ot,yt)
下面,我们可以计算目标函数有关模型参数
W
q
h
\boldsymbol{W}_{q h}
Wqh 的梯度
∂
L
/
∂
W
q
h
∈
R
q
×
h
\partial L / \partial \boldsymbol{W}_{q h} \in \mathbb{R}^{q \times h}
∂L/∂Wqh∈Rq×h 。 根据图6.3,
L
L
L 通过
o
1
,
…
,
o
T
\boldsymbol{o}_{1}, \ldots, \boldsymbol{o}_{T}
o1,…,oT 依赖
W
q
h
\boldsymbol{W}_{q h}
Wqh 依据链式法则,
∂
L
∂
W
q
h
=
∑
t
=
1
T
prod
(
∂
L
∂
o
t
,
∂
o
t
∂
W
q
h
)
=
∑
t
=
1
T
∂
L
∂
o
t
h
t
⊤
.
\frac{\partial L}{\partial \boldsymbol{W}_{q h}}=\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial o_{t}}, \frac{\partial o_{t}}{\partial \boldsymbol{W}_{q h}}\right)=\sum_{t=1}^{T} \frac{\partial L}{\partial \boldsymbol{o}_{t}} \boldsymbol{h}_{t}^{\top} .
∂Wqh∂L=t=1∑Tprod(∂ot∂L,∂Wqh∂ot)=t=1∑T∂ot∂Lht⊤.
其次,我们注意到隐藏状态之间也存在依赖关系。 在图6.3中,
L
L
L 只通过
O
T
\boldsymbol{O}_{T}
OT 依赖最终时间步
T
T
T 的隐藏状态
h
T
。
\boldsymbol{h}_{T \text { 。 }}
hT 。 。因此,我们先计算目标函数有关最终时间步隐藏状态的梯度
∂
L
/
∂
h
T
∈
R
h
\partial L / \partial \boldsymbol{h}_{T} \in \mathbb{R}^{h}
∂L/∂hT∈Rh 。依据链式法则,我们得到
∂
L
∂
h
T
=
prod
(
∂
L
∂
o
T
,
∂
o
T
∂
h
T
)
=
W
q
h
⊤
∂
L
∂
o
T
\frac{\partial L}{\partial \boldsymbol{h}_{T}}=\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_{T}}, \frac{\partial \boldsymbol{o T}}{\partial \boldsymbol{h}_{T}}\right)=\boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o}_{T}}
∂hT∂L=prod(∂oT∂L,∂hT∂oT)=Wqh⊤∂oT∂L
接下来对于时间步
t
<
T
t<T
t<T, 在图6.3中,
L
L
L 通过
h
t
+
1
\boldsymbol{h}_{t+1}
ht+1 和
o
t
\boldsymbol{o}_{t}
ot 依赖
h
t
\boldsymbol{h}_{t}
ht 。 依据链式法则, 目标函数有关时间步
t
<
T
t<T
t<T 的隐藏状态的梯度
∂
L
/
∂
h
t
∈
R
h
\partial L / \partial \boldsymbol{h}_{t} \in \mathbb{R}^{h}
∂L/∂ht∈Rh 需 要按照时间步从大到小依次计算:
∂
L
∂
h
t
=
prod
(
∂
L
∂
h
t
+
1
,
∂
h
t
+
1
∂
h
t
)
+
prod
(
∂
L
∂
o
t
,
∂
o
t
∂
h
t
)
=
W
h
h
⊤
∂
L
∂
h
t
+
1
+
W
q
h
⊤
∂
L
∂
o
t
\frac{\partial L}{\partial \boldsymbol{h}_{t}}=\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t+1}}, \frac{\partial h_{t+1}}{\partial \boldsymbol{h}_{t}}\right)+\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_{t}}, \frac{\partial \boldsymbol{o t}}{\partial \boldsymbol{h}_{t}}\right)=\boldsymbol{W}_{h h}^{\top} \frac{\partial L}{\partial \boldsymbol{h}_{t+1}}+\boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o}_{t}}
∂ht∂L=prod(∂ht+1∂L,∂ht∂ht+1)+prod(∂ot∂L,∂ht∂ot)=Whh⊤∂ht+1∂L+Wqh⊤∂ot∂L
将上面的递归公式展开,对任意时间步
1
≤
t
≤
T
1 \leq t \leq T
1≤t≤T, 我们可以得到目标函数有关隐藏状态梯度的通项公式
∂
L
∂
h
t
=
∑
i
=
t
T
(
W
h
h
⊤
)
T
−
i
W
q
h
⊤
∂
L
∂
o
T
+
t
−
i
\frac{\partial L}{\partial \boldsymbol{h} t}=\sum_{i=t}^{T}\left(\boldsymbol{W}_{h h}^{\top}\right)^{T-i} \boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o} T+t-i}
∂ht∂L=i=t∑T(Whh⊤)T−iWqh⊤∂oT+t−i∂L
由上式中的指数项可见, 当时间步数
T
T
T 较大或者时间步
t
t
t 较小时,目标函数有关隐藏状态的梯度较容易出现衰减和爆炸。这也会影响其他包含
∂
L
/
∂
h
t
\partial L / \partial \boldsymbol{h}_{t}
∂L/∂ht 项的梯度, 例如隐藏层中模型参数的梯度
∂
L
/
∂
W
h
x
∈
R
h
×
d
\partial L / \partial \boldsymbol{W}_{h x} \in \mathbb{R}^{h \times d}
∂L/∂Whx∈Rh×d 和
∂
L
/
∂
W
h
h
∈
R
h
×
h
\partial L / \partial \boldsymbol{W}_{h h} \in \mathbb{R}^{h \times h}
∂L/∂Whh∈Rh×h 。在图6.3中,
L
L
L 通过
h
1
,
…
,
h
T
\boldsymbol{h}_{1}, \ldots, \boldsymbol{h}_{T}
h1,…,hT 依赖这些模型参数。依据链式法则, 我们有
∂
L
∂
W
h
x
=
∑
t
=
1
T
prod
(
∂
L
∂
h
t
,
∂
h
t
∂
W
h
x
)
=
∑
t
=
1
T
∂
L
∂
h
t
x
t
⊤
∂
L
∂
W
h
h
=
∑
t
=
1
T
prod
(
∂
L
∂
h
t
,
∂
h
t
∂
W
h
h
)
=
∑
t
=
1
T
∂
L
∂
h
t
h
t
−
1
⊤
.
\begin{aligned} \frac{\partial L}{\partial \boldsymbol{W}_{h x}} &=\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t}}, \frac{\partial \boldsymbol{h}_{t}}{\partial \boldsymbol{W}_{h x}}\right)=\sum_{t=1}^{T} \frac{\partial L}{\partial \boldsymbol{h}_{t}} \boldsymbol{x}_{t}^{\top} \\ \frac{\partial L}{\partial \boldsymbol{W}_{h h}} &=\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t}}, \frac{\partial \boldsymbol{h}_{t}}{\partial \boldsymbol{W}_{h h}}\right)=\sum_{t=1}^{T} \frac{\partial L}{\partial \boldsymbol{h}_{t}} \boldsymbol{h}_{t-1}^{\top} . \end{aligned}
∂Whx∂L∂Whh∂L=t=1∑Tprod(∂ht∂L,∂Whx∂ht)=t=1∑T∂ht∂Lxt⊤=t=1∑Tprod(∂ht∂L,∂Whh∂ht)=t=1∑T∂ht∂Lht−1⊤.
我们已在3.14节里解释过, 每次迭代中, 我们在依次计算完以上各个梯度后, 会将它们存储起来, 从而避免重复计算。例如, 由于隐藏状态梯度 ∂ L / ∂ h t \partial L / \partial \boldsymbol{h}_{t} ∂L/∂ht 被计算和存储, 之后的模型参数梯度 ∂ L / ∂ W h x \partial L / \partial \boldsymbol{W}_{h x} ∂L/∂Whx 和 ∂ L / ∂ W h h \partial L / \partial \boldsymbol{W}_{h h} ∂L/∂Whh 的计算可以直接读取 ∂ L / ∂ h t \partial L / \partial \boldsymbol{h}_{t} ∂L/∂ht 的值, 而无须重复计算它们。此外, 反向传播中的梯度计算可能会依赖变量的当前值。它们正是通过正向传播计算出来的。举例来说, 参数梯度 ∂ L / ∂ W h h \partial L / \partial \boldsymbol{W}_{h h} ∂L/∂Whh 的计算需要依赖隐藏状态在时间 步 t = 0 , … , T − 1 t=0, \ldots, T-1 t=0,…,T−1 的当前值 h t ( h 0 h_{t}\left(h_{0}\right. ht(h0 是初始化得到的) 。这些值是通过从输入层到输出层的正向传播计算并存储得到的。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务