从0开始深度学习(34)——通过时间反向传播

前面介绍了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行自上而下分别为:随机截断、常规截断、完整计算。

  • 第一行采用随机截断,方法是将文本划分为不同长度的片断;
  • 第二行采用常规截断,方法是将文本分解为相同长度的子序列。 这也是我们在循环神经网络实验中一直在做的;
  • 第三行采用通过时间的完全反向传播,结果是产生了在计算上不可行的表达式。

虽然随机截断在理论上具有吸引力, 但很可能是由于多种因素在实践中并不比常规截断更好。

  1. 在对过去若干个时间步经过反向传播后, 观测结果足以捕获实际的依赖关系。
  2. 增加的方差抵消了时间步数越多梯度越精确的事实。
  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)

相关推荐
天涯海风1 小时前
检索增强生成(RAG) 缓存增强生成(CAG) 生成中检索(RICHES) 知识库增强语言模型(KBLAM)
人工智能·缓存·语言模型
lxmyzzs2 小时前
基于深度学习CenterPoint的3D目标检测部署实战
人工智能·深度学习·目标检测·自动驾驶·ros·激光雷达·3d目标检测
跟着珅聪学java3 小时前
Apache OpenNLP简介
人工智能·知识图谱
AwhiteV3 小时前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
Black_Rock_br3 小时前
AI on Mac, Your Way!全本地化智能代理,隐私与性能兼得
人工智能·macos
☺����4 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
fsnine4 小时前
机器学习——数据清洗
人工智能·机器学习
小猿姐5 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
算法_小学生5 小时前
循环神经网络(RNN, Recurrent Neural Network)
人工智能·rnn·深度学习
吱吱企业安全通讯软件6 小时前
吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
大数据·网络·人工智能·安全·信息与通信·吱吱办公通讯