前面介绍了RNN在语言模型上的应用,本章介绍另一个特定应用——通过时间反向传播(backpropagation through time,BPTT)
1 循环神经网络的梯度分析
本章使用一个RNN的简化模型,此模型忽略了隐状态的特性及其更新方式的细节。我们将时间步
t
t
t的隐状态表示为
h
t
h_t
ht,输入表示为
x
t
x_t
xt,输出表示为
o
t
o_t
ot,使用
w
t
w_t
wt和
w
o
w_o
wo表示隐藏层和输入层的权重。每个时间步的隐状态和输出写为:
h
t
=
f
(
x
t
,
h
t
−
1
,
w
h
)
,
o
t
=
g
(
h
t
,
w
o
)
,
\begin{split}\begin{aligned}h_t &= f(x_t, h_{t-1}, w_h),\\o_t &= g(h_t, w_o),\end{aligned}\end{split}
htot=f(xt,ht−1,wh),=g(ht,wo),
其中
f
f
f和
g
g
g分别是隐藏层和输出层的变换。
因此我们有一个链条
{
…
,
(
x
t
−
1
,
h
t
−
1
,
o
t
−
1
)
,
(
x
t
,
h
t
,
o
t
)
,
…
}
\{\ldots, (x_{t-1}, h_{t-1}, o_{t-1}), (x_{t}, h_{t}, o_t), \ldots\}
{…,(xt−1,ht−1,ot−1),(xt,ht,ot),…},通过循环计算彼此的依赖。前向传播一个时间步遍历一个三元组
(
x
t
,
h
t
,
o
t
)
(x_t, h_t, o_t)
(xt,ht,ot),然后通过一个目标函数在所有
T
T
Tg个时间步内,评估输出
o
t
o_t
ot和对应的标签
y
t
y_t
yt之间的差异:
L
(
x
1
,
…
,
x
T
,
y
1
,
…
,
y
T
,
w
h
,
w
o
)
=
1
T
∑
t
=
1
T
l
(
y
t
,
o
t
)
.
L(x_1, \ldots, x_T, y_1, \ldots, y_T, w_h, w_o) = \frac{1}{T}\sum_{t=1}^T l(y_t, o_t).
L(x1,…,xT,y1,…,yT,wh,wo)=T1t=1∑Tl(yt,ot).但是反向传播很棘手,可以通过链式法则表示为:
∂
h
t
∂
w
h
=
∂
f
(
x
t
,
h
t
−
1
,
w
h
)
∂
w
h
+
∑
i
=
1
t
−
1
(
∏
j
=
i
+
1
t
∂
f
(
x
j
,
h
j
−
1
,
w
h
)
∂
h
j
−
1
)
∂
f
(
x
i
,
h
i
−
1
,
w
h
)
∂
w
h
.
\frac{\partial h_t}{\partial w_h}=\frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h}+\sum_{i=1}^{t-1}\left(\prod_{j=i+1}^{t} \frac{\partial f(x_{j},h_{j-1},w_h)}{\partial h_{j-1}} \right) \frac{\partial f(x_{i},h_{i-1},w_h)}{\partial w_h}.
∂wh∂ht=∂wh∂f(xt,ht−1,wh)+i=1∑t−1(j=i+1∏t∂hj−1∂f(xj,hj−1,wh))∂wh∂f(xi,hi−1,wh).
当
t
t
t非常大时,这个链就会变得很长,需要想办法解决这个问题。
1.1完全计算
第一种方式计算全部总和,这样的计算非常缓慢,并且可能会发生梯度爆炸, 因为初始条件的微小变化就可能会对结果产生巨大的影响。 所以这种方法没有使用过。
1.2 截断时间步
或者在 τ \tau τ后截断链式法则的计算,得到真实梯度的近似。样做导致该模型主要侧重于短期影响,而不是长期影响。 这在现实中是可取的,因为它会将估计值偏向更简单和更稳定的模型。
1.3 随机截断
在不同的训练迭代中随机选择截断的时间步长。这样做可以提供对不同时间尺度依赖性的学习,同时保持计算效率。
1.4 比较策略
比较RNN中计算梯度的策略,3行自上而下分别为:随机截断、常规截断、完整计算。
- 第一行采用随机截断,方法是将文本划分为不同长度的片断;
- 第二行采用常规截断,方法是将文本分解为相同长度的子序列。 这也是我们在循环神经网络实验中一直在做的;
- 第三行采用通过时间的完全反向传播,结果是产生了在计算上不可行的表达式。
虽然随机截断在理论上具有吸引力, 但很可能是由于多种因素在实践中并不比常规截断更好。
- 在对过去若干个时间步经过反向传播后, 观测结果足以捕获实际的依赖关系。
- 增加的方差抵消了时间步数越多梯度越精确的事实。
- 我们真正想要的是只有短范围交互的模型。
因此,模型需要的正是截断的通过时间反向传播方法所具备的轻度正则化效果。
2 通过时间反向传播的细节
为了在循环神经网络的计算过程中可视化模型变量和参数之间的依赖关系, 我们可以为模型绘制一个计算图
x
t
x_t
xt是输入,
h
t
h_t
ht表示隐状态,
o
t
o_t
ot表示输出,
W
W
W是权重,
L
L
L是目标函数的总体损失,
y
t
y_t
yt是输出的真实值。我们可以沿箭头的相反方向遍历计算图,依次计算和存储梯度。经过计算,我们可以得到对于任何时间步
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 \mathbf{h}_t}= \sum_{i=t}^T {\left(\mathbf{W}_{hh}^\top\right)}^{T-i} \mathbf{W}_{qh}^\top \frac{\partial L}{\partial \mathbf{o}_{T+t-i}}.
∂ht∂L=i=t∑T(Whh⊤)T−iWqh⊤∂oT+t−i∂L.
我们发现
W
h
h
⊤
\mathbf{W}_{hh}^\top
Whh⊤有可能存在超大幂计算的情况,表现形式为梯度消失或梯度爆炸。
解决此问题的一种方法是按照计算方便的需要截断时间步长的尺寸,即通过在给定数量的时间步之后分离梯度来实现的。还有其他方法来还建这一问题(比如LSTM)