从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)

相关推荐
L_cl22 分钟前
【NLP 3、深度学习简介】
人工智能·深度学习
黄卷青灯7724 分钟前
NLP自然语言处理包含哪些方面?
人工智能·自然语言处理·nlp
Guofu_Liao28 分钟前
大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景
人工智能·语言模型·自然语言处理
Elastic 中国社区官方博客31 分钟前
使用 Spring AI + Elasticsearch 让 RAG 变得简单
java·大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
weixin_543662861 小时前
BERT的中文问答系统35
人工智能·深度学习·bert
kejijianwen1 小时前
Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新
人工智能
想你依然心痛1 小时前
【AI赋能电商】探索人工智能在购物推荐、会员管理和商品定价中的创新应用及其对销售效率和用户体验的影响
人工智能·ux
baijin_cha2 小时前
深度学习基础02_损失函数&BP算法(上)
人工智能·笔记·深度学习
青石横刀策马2 小时前
从0开始深度学习(33)——循环神经网络的简洁实现
人工智能·rnn·深度学习
Captain823Jack2 小时前
深度学习中的正则化模型是什么意思?
人工智能·python·深度学习