您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页反向传播(BP)及随时间反向传播(back-propagation through time, BPTT)

反向传播(BP)及随时间反向传播(back-propagation through time, BPTT)

来源:尚车旅游网


正向传播字训练神经网络中比较直观,而通过时间反向传播其实是反向传播在循环神经网络中的具体应用。我们需要将循环神经网络按时间步展开,从而得到模型变量和参数之间的依赖关系,并根据链式法则应用反向传播计算并存储梯度。

1. 定义模型

简单起见,我们考虑一个无偏差项的循环神经网络,且激活函数为恒等映射( ϕ ( x ) = x ϕ(x)=x ϕ(x)=x)。设时间步 t t t 的输入为单样本 x t ∈ R d {x}_t \in {R}^d xtRd,标签为 y t y_t yt,那么隐藏状态 h t ∈ R h {h}_t \in R^h htRh 的计算表达式为
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+Whhht1

其中 W h x ∈ R h × d W_{hx} \in R^{h×d} WhxRh×d W h h ∈ R h × h W_{hh} \in R^{h×h} WhhRh×h 是隐藏层权重参数。设输出层权重参数 W q h ∈ R q × h W_{qh} \in R^{q×h} WqhRq×h ,时间步 t 的输出层变量 O t ∈ R q O_t \in R^q OtRq 计算为
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=1T(ot,yt)

我们将 L 陈给有关给定时间步的数据样本的目标函数,并在后续讨论中称为目标函数。

2. 模型计算图

为了可视化循环神经网络中模型变量和参数在计算中的依赖关系,我们可以绘制模型计算图,如图所示。例如,时间步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的循环神经网络模型计算中的依赖关系。方框代表变量(无阴影)或参数(有阴影),圆圈代表运算符

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/otRq 很容易计算:
∂ 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}} otL=Tot(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/WqhRq×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} . WqhL=t=1Tprod(otL,Wqhot)=t=1TotLht.

其次,我们注意到隐藏状态之间也存在依赖关系。 在图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/hTRh 。依据链式法则,我们得到
∂ 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}} hTL=prod(oTL,hToT)=WqhoTL

接下来对于时间步 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/htRh 需 要按照时间步从大到小依次计算:
∂ 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}} htL=prod(ht+1L,htht+1)+prod(otL,htot)=Whhht+1L+WqhotL

将上面的递归公式展开,对任意时间步 1 ≤ t ≤ T 1 \leq t \leq T 1tT, 我们可以得到目标函数有关隐藏状态梯度的通项公式
∂ 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} htL=i=tT(Whh)TiWqhoT+tiL

由上式中的指数项可见, 当时间步数 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/WhxRh×d ∂ L / ∂ W h h ∈ R h × h \partial L / \partial \boldsymbol{W}_{h h} \in \mathbb{R}^{h \times h} L/WhhRh×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} WhxLWhhL=t=1Tprod(htL,Whxht)=t=1ThtLxt=t=1Tprod(htL,Whhht)=t=1ThtLht1.

我们已在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,,T1 的当前值 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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务