Run this notebook online: or Colab:

# 8.7. 通过时间反向传播¶

## 8.7.1. 循环神经网络的梯度分析¶

(8.7.1)\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}

(8.7.2)$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).$

(8.7.3)\begin{split}\begin{aligned}\frac{\partial L}{\partial w_h} & = \frac{1}{T}\sum_{t=1}^T \frac{\partial l(y_t, o_t)}{\partial w_h} \\& = \frac{1}{T}\sum_{t=1}^T \frac{\partial l(y_t, o_t)}{\partial o_t} \frac{\partial g(h_t, w_h)}{\partial h_t} \frac{\partial h_t}{\partial w_h}.\end{aligned}\end{split}

(8.7.4)$\frac{\partial h_t}{\partial w_h}= \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h} +\frac{\partial f(x_{t},h_{t-1},w_h)}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial w_h}.$

(8.7.5)$a_{t}=b_{t}+\sum_{i=1}^{t-1}\left(\prod_{j=i+1}^{t}c_{j}\right)b_{i}.$

$$a_t$$, $$b_t$$, 和 $$c_t$$ 替换为 根据

(8.7.6)\begin{split}\begin{aligned}a_t &= \frac{\partial h_t}{\partial w_h},\\ b_t &= \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h}, \\ c_t &= \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial h_{t-1}},\end{aligned}\end{split}

(8.7.7)$\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}.$

### 8.7.1.3. 随机截断¶

(8.7.8)$z_t= \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial w_h} +\xi_t \frac{\partial f(x_{t},h_{t-1},w_h)}{\partial h_{t-1}} \frac{\partial h_{t-1}}{\partial w_h}.$

### 8.7.1.4. 比较策略¶

Section 8.7.1.4 说明了使用循环神经网络的时间反向传播分析《时间机器》书中前几个字符的三种策略：

• 第一行是随机截断，将文本划分为不同长度的段。

• 第二行是规则截断，将文本拆分为相同长度的子序列。这也是我们在循环神经网络实验中一直在做的。

• 第三行是通过时间的完全反向传播，结果是产生了在计算上不可行的表达式。

## 8.7.2. 通过时间反向传播的细节¶

(8.7.9)\begin{split}\begin{aligned}\mathbf{h}_t &= \mathbf{W}_{hx} \mathbf{x}_t + \mathbf{W}_{hh} \mathbf{h}_{t-1},\\ \mathbf{o}_t &= \mathbf{W}_{qh} \mathbf{h}_{t},\end{aligned}\end{split}

(8.7.10)$L = \frac{1}{T} \sum_{t=1}^T l(\mathbf{o}_t, y_t).$

$$\partial L/\partial \mathbf{W}_{hx}$$, $$\partial L/\partial \mathbf{W}_{hh}$$，和 $$\partial L/\partial \mathbf{W}_{qh}$$。 根据 Section 8.7.2 的依赖关系， 我们可以沿箭头的相反方向遍历计算图，依次计算和存储梯度。 灵活表达乘法 不同形状的矩阵、向量和标量 在链式规则中， 我们继续使用如 Section 4.7中 所述的$$\text{prod}$$运算符。

(8.7.11)$\frac{\partial L}{\partial \mathbf{o}_t} = \frac{\partial l (\mathbf{o}_t, y_t)}{T \cdot \partial \mathbf{o}_t} \in \mathbb{R}^q.$

(8.7.12)$\frac{\partial L}{\partial \mathbf{W}_{qh}} = \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \mathbf{o}_t}, \frac{\partial \mathbf{o}_t}{\partial \mathbf{W}_{qh}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \mathbf{o}_t} \mathbf{h}_t^\top,$

(8.7.13)$\frac{\partial L}{\partial \mathbf{h}_T} = \text{prod}\left(\frac{\partial L}{\partial \mathbf{o}_T}, \frac{\partial \mathbf{o}_T}{\partial \mathbf{h}_T} \right) = \mathbf{W}_{qh}^\top \frac{\partial L}{\partial \mathbf{o}_T}.$

(8.7.14)$\frac{\partial L}{\partial \mathbf{h}_t} = \text{prod}\left(\frac{\partial L}{\partial \mathbf{h}_{t+1}}, \frac{\partial \mathbf{h}_{t+1}}{\partial \mathbf{h}_t} \right) + \text{prod}\left(\frac{\partial L}{\partial \mathbf{o}_t}, \frac{\partial \mathbf{o}_t}{\partial \mathbf{h}_t} \right) = \mathbf{W}_{hh}^\top \frac{\partial L}{\partial \mathbf{h}_{t+1}} + \mathbf{W}_{qh}^\top \frac{\partial L}{\partial \mathbf{o}_t}.$

(8.7.15)$\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}}.$

(8.7.16)\begin{split}\begin{aligned} \frac{\partial L}{\partial \mathbf{W}_{hx}} &= \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \mathbf{h}_t}, \frac{\partial \mathbf{h}_t}{\partial \mathbf{W}_{hx}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \mathbf{h}_t} \mathbf{x}_t^\top,\\ \frac{\partial L}{\partial \mathbf{W}_{hh}} &= \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \mathbf{h}_t}, \frac{\partial \mathbf{h}_t}{\partial \mathbf{W}_{hh}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \mathbf{h}_t} \mathbf{h}_{t-1}^\top, \end{aligned}\end{split}

## 8.7.3. 总结¶

• 通过时间反向传播仅仅适用于反向传播在具有隐状态的序列模型。

• 为了计算方便和数值稳定性，需要进行截断，如正则截断和随机截断。

• 矩阵的高次幂会导致特征值不同或突然消失。这表现为梯度爆炸或梯度消失的形式。

• 为了提高计算效率，在通过时间反向传播计算期间期会缓存中间值。

## 8.7.4. 练习¶

1. 假设我们有一个对称矩阵 $$\mathbf{M} \in \mathbb{R}^{n \times n}$$ 特征值为 $$\lambda_i$$ 其对应的特征向量为 $$\mathbf{v}_i$$ ($$i = 1, \ldots, n$$). 在不丢失一般性的情况下，假设它们按 $$|\lambda_i| \geq |\lambda_{i+1}|$$ 顺序排列。

2. 证明 $$\mathbf{M}^k$$ 具有特征值 $$\lambda_i^k$$.

3. 证明对于一个随机向量 $$\mathbf{x} \in \mathbb{R}^n$$, 极有可能 $$\mathbf{M}^k \mathbf{x}$$ 将与特征向量非常一致 $$\mathbf{v}_1$$$$\mathbf{M}$$。把这句话正式化。

4. 上述结果对RNN中的梯度意味着什么？

5. 除了梯度裁剪外，你能想出其他方法来处理递归神经网络中的梯度爆炸吗？