当前位置: 首页 > news >正文

【现代深度学习技术】循环神经网络07:通过时间反向传播

在这里插入图片描述

【作者主页】Francek Chen
【专栏介绍】 ⌈ ⌈ PyTorch深度学习 ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。

文章目录

    • 一、循环神经网络的梯度分析
      • (一)完全计算
      • (二)截断时间步
      • (三)随机截断
      • (四)比较策略
    • 二、通过时间反向传播的细节
    • 小结


  到目前为止,我们已经反复提到像梯度爆炸梯度消失,以及需要对循环神经网络分离梯度。例如,在循环神经网络的从零开始实现中,我们在序列上调用了detach函数。为了能够快速构建模型并了解其工作原理,上面所说的这些概念都没有得到充分的解释。本节将更深入地探讨序列模型反向传播的细节,以及相关的数学原理。

  当我们首次实现循环神经网络(循环神经网络的从零开始实现)时,遇到了梯度爆炸的问题。如果做了练习题,就会发现梯度截断对于确保模型收敛至关重要。为了更好地理解此问题,本节将回顾序列模型梯度的计算方式,它的工作原理没有什么新概念,毕竟我们使用的仍然是链式法则来计算梯度。

  我们在前向传播、反向传播和计算图中描述了多层感知机中的前向与反向传播及相关的计算图。循环神经网络中的前向传播相对简单。通过时间反向传播(backpropagation through time,BPTT)实际上是循环神经网络中反向传播技术的一个特定应用。它要求我们将循环神经网络的计算图一次展开一个时间步,以获得模型变量和参数之间的依赖关系。然后,基于链式法则,应用反向传播来计算和存储梯度。由于序列可能相当长,因此依赖关系也可能相当长。例如,某个1000个字符的序列,其第一个词元可能会对最后位置的词元产生重大影响。这在计算上是不可行的(它需要的时间和内存都太多了),并且还需要超过1000个矩阵的乘积才能得到非常难以捉摸的梯度。这个过程充满了计算与统计的不确定性。在下文中,我们将阐明会发生什么以及如何在实践中解决它们。

一、循环神经网络的梯度分析

  我们从一个描述循环神经网络工作原理的简化模型开始,此模型忽略了隐状态的特性及其更新方式的细节。这里的数学表示没有像过去那样明确地区分标量、向量和矩阵,因为这些细节对于分析并不重要,反而只会使本小节中的符号变得混乱。

  在这个简化模型中,我们将时间步 t t t的隐状态表示为 h t h_t ht,输入表示为 x t x_t xt,输出表示为 o t o_t ot。回想一下我们在循环神经网络中的讨论,输入和隐状态可以拼接后与隐藏层中的一个权重变量相乘。因此,我们分别使用 w h w_h wh w o w_o wo来表示隐藏层和输出层的权重。每个时间步的隐状态和输出可以写为:
h t = f ( x t , h t − 1 , w h ) , o t = g ( h t , w o ) , (1) \begin{aligned}h_t &= f(x_t, h_{t-1}, w_h),\\o_t &= g(h_t, w_o),\end{aligned} \tag{1} htot=f(xt,ht1,wh),=g(ht,wo),(1) 其中 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\} {,(xt1,ht1,ot1),(xt,ht,ot),},它们通过循环计算彼此依赖。前向传播相当简单,一次一个时间步的遍历三元组 ( x t , h t , o t ) (x_t, h_t, o_t) (xt,ht,ot),然后通过一个目标函数在所有 T T T个时间步内评估输出 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 ) (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) \tag{2} L(x1,,xT,y1,,yT,wh,wo)=T1t=1Tl(yt,ot)(2)

  对于反向传播,问题则有点棘手,特别是当我们计算目标函数 L L L关于参数 w h w_h wh的梯度时。具体来说,按照链式法则
∂ L ∂ w h = 1 T ∑ t = 1 T ∂ l ( y t , o t ) ∂ w h = 1 T ∑ t = 1 T ∂ l ( y t , o t ) ∂ o t ∂ g ( h t , w o ) ∂ h t ∂ h t ∂ w h . (3) \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_o)}{\partial h_t} \frac{\partial h_t}{\partial w_h}.\end{aligned} \tag{3} whL=T1t=1Twhl(yt,ot)=T1t=1Totl(yt,ot)htg(ht,wo)whht.(3) 式(3)中乘积的第一项和第二项很容易计算,而第三项 ∂ h t / ∂ w h \partial h_t/\partial w_h ht/wh是使事情变得棘手的地方,因为我们需要循环地计算参数 w h w_h wh h t h_t ht的影响。根据式(1)中的递归计算, h t h_t ht既依赖于 h t − 1 h_{t-1} ht1又依赖于 w h w_h wh,其中 h t − 1 h_{t-1} ht1的计算也依赖于 w h w_h wh。因此,使用链式法则产生
∂ h t ∂ w h = ∂ f ( x t , h t − 1 , w h ) ∂ w h + ∂ f ( x t , h t − 1 , w h ) ∂ h t − 1 ∂ h t − 1 ∂ w h (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} \tag{4} whht=whf(xt,ht1,wh)+ht1f(xt,ht1,wh)whht1(4)

  为了导出上述梯度,假设我们有三个序列 { a t } , { b t } , { c t } \{a_{t}\},\{b_{t}\},\{c_{t}\} {at},{bt},{ct},当 t = 1 , 2 , … t=1,2,\ldots t=1,2,时,序列满足 a 0 = 0 a_{0}=0 a0=0 a t = b t + c t a t − 1 a_{t}=b_{t}+c_{t}a_{t-1} at=bt+ctat1。对于 t ≥ 1 t\geq 1 t1,就很容易得出
a t = b t + ∑ i = 1 t − 1 ( ∏ j = i + 1 t c j ) b i (5) a_{t}=b_{t}+\sum_{i=1}^{t-1}\left(\prod_{j=i+1}^{t}c_{j}\right)b_{i} \tag{5} at=bt+i=1t1(j=i+1tcj)bi(5)

  基于下列公式替换 a t a_t at b t b_t bt c t c_t ct
a t = ∂ h t ∂ w h b t = ∂ f ( x t , h t − 1 , w h ) ∂ w h c t = ∂ f ( x t , h t − 1 , w h ) ∂ h t − 1 (6) \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} \tag{6} atbtct=whht=whf(xt,ht1,wh)=ht1f(xt,ht1,wh)(6)

  公式(4)中的梯度计算满足 a t = b t + c t a t − 1 a_{t}=b_{t}+c_{t}a_{t-1} at=bt+ctat1。因此,对于每个式(5),我们可以使用下面的公式移除式(4)中的循环计算:
∂ 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 (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} \tag{7} whht=whf(xt,ht1,wh)+i=1t1(j=i+1thj1f(xj,hj1,wh))whf(xi,hi1,wh)(7)

  虽然我们可以使用链式法则递归地计算 ∂ h t / ∂ w h \partial h_t/\partial w_h ht/wh,但当 t t t很大时这个链就会变得很长。我们需要想想办法来处理这一问题。

(一)完全计算

  显然,我们可以仅仅计算式(7)中的全部总和,然而,这样的计算非常缓慢,并且可能会发生梯度爆炸,因为初始条件的微小变化就可能会对结果产生巨大的影响。也就是说,我们可以观察到类似于蝴蝶效应的现象,即初始条件的很小变化就会导致结果发生不成比例的变化。这对于我们想要估计的模型而言是非常不可取的。毕竟,我们正在寻找的是能够很好地泛化高稳定性模型的估计器。因此,在实践中,这种方法几乎从未使用过。

(二)截断时间步

  或者,我们可以在 τ \tau τ步后截断中的求和计算。这是我们到目前为止一直在讨论的内容,例如在循环神经网络的从零开始实现中分离梯度时。这会带来真实梯度的近似,只需将求和终止为 ∂ h t − τ / ∂ w h \partial h_{t-\tau}/\partial w_h htτ/wh。在实践中,这种方式工作得很好。它通常被称为截断的通过时间反向传播。这样做导致该模型主要侧重于短期影响,而不是长期影响。这在现实中是可取的,因为它会将估计值偏向更简单和更稳定的模型。

(三)随机截断

  最后,我们可以用一个随机变量替换 ∂ h t / ∂ w h \partial h_t/\partial w_h ht/wh,该随机变量在预期中是正确的,但是会截断序列。这个随机变量是通过使用序列 ξ t \xi_t ξt来实现的,序列预定义了 0 ≤ π t ≤ 1 0 \leq \pi_t \leq 1 0πt1,其中 P ( ξ t = 0 ) = 1 − π t P(\xi_t = 0) = 1-\pi_t P(ξt=0)=1πt P ( ξ t = π t − 1 ) = π t P(\xi_t = \pi_t^{-1}) = \pi_t P(ξt=πt1)=πt,因此 E [ ξ t ] = 1 E[\xi_t] = 1 E[ξt]=1。我们使用它来替换式(4)中的梯度 ∂ h t / ∂ w h \partial h_t/\partial w_h ht/wh得到
z t = ∂ f ( x t , h t − 1 , w h ) ∂ w h + ξ t ∂ f ( x t , h t − 1 , w h ) ∂ h t − 1 ∂ h t − 1 ∂ w h (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} \tag{8} zt=whf(xt,ht1,wh)+ξtht1f(xt,ht1,wh)whht1(8)

  从 ξ t \xi_t ξt的定义中推导出来 E [ z t ] = ∂ h t / ∂ w h E[z_t] = \partial h_t/\partial w_h E[zt]=ht/wh。每当 ξ t = 0 \xi_t = 0 ξt=0时,递归计算终止在这个 t t t时间步。这导致了不同长度序列的加权和,其中长序列出现的很少,所以将适当地加大权重。这个想法是由塔莱克和奥利维尔提出的。

(四)比较策略

在这里插入图片描述

图1 比较RNN中计算梯度的策略,3行自上而下分别为:随机截断、常规截断、完整计算

  图1说明了当基于循环神经网络使用通过时间反向传播分析《时间机器》书中前几个字符的三种策略:

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

  遗憾的是,虽然随机截断在理论上具有吸引力,但很可能是由于多种因素在实践中并不比常规截断更好。首先,在对过去若干个时间步经过反向传播后,观测结果足以捕获实际的依赖关系。其次,增加的方差抵消了时间步数越多梯度越精确的事实。第三,我们真正想要的是只有短范围交互的模型。因此,模型需要的正是截断的通过时间反向传播方法所具备的轻度正则化效果。

二、通过时间反向传播的细节

  在讨论一般性原则之后,我们看一下通过时间反向传播问题的细节。与循环神经网络的梯度分析中的分析不同,下面我们将展示如何计算目标函数相对于所有分解模型参数的梯度。为了保持简单,我们考虑一个没有偏置参数的循环神经网络,其在隐藏层中的激活函数使用恒等映射( ϕ ( x ) = x \phi(x)=x ϕ(x)=x)。对于时间步 t t t,设单个样本的输入及其对应的标签分别为 x t ∈ R d \mathbf{x}_t \in \mathbb{R}^d xtRd y t y_t yt。计算隐状态 h t ∈ R h \mathbf{h}_t \in \mathbb{R}^h htRh和输出 o t ∈ R q \mathbf{o}_t \in \mathbb{R}^q otRq的方式为
h t = W h x x t + W h h h t − 1 o t = W q h h t (9) \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} \tag{9} htot=Whxxt+Whhht1=Wqhht(9) 其中权重参数为 W h x ∈ R h × d \mathbf{W}_{hx} \in \mathbb{R}^{h \times d} WhxRh×d W h h ∈ R h × h \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} WhhRh×h W q h ∈ R q × h \mathbf{W}_{qh} \in \mathbb{R}^{q \times h} WqhRq×h。用 l ( o t , y t ) l(\mathbf{o}_t, y_t) l(ot,yt)表示时间步 t t t处(即从序列开始起的超过 T T T个时间步)的损失函数,则我们的目标函数的总体损失是:
L = 1 T ∑ t = 1 T l ( o t , y t ) (10) L = \frac{1}{T} \sum_{t=1}^T l(\mathbf{o}_t, y_t) \tag{10} L=T1t=1Tl(ot,yt)(10)

  为了在循环神经网络的计算过程中可视化模型变量和参数之间的依赖关系,我们可以为模型绘制一个计算图,如图2所示。例如,时间步3的隐状态 h 3 \mathbf{h}_3 h3的计算取决于模型参数 W h x \mathbf{W}_{hx} Whx W h h \mathbf{W}_{hh} Whh,以及最终时间步的隐状态 h 2 \mathbf{h}_2 h2以及当前时间步的输入 x 3 \mathbf{x}_3 x3

在这里插入图片描述

图2 具有三个时间步的循环神经网络模型依赖关系的计算图。未着色的方框表示变量,着色的方框表示参数,圆表示运算符

  正如上面所说,图2中的模型参数是 W h x \mathbf{W}_{hx} Whx W h h \mathbf{W}_{hh} Whh W q h \mathbf{W}_{qh} Wqh。通常,训练该模型需要对这些参数进行梯度计算: ∂ L / ∂ W h x \partial L/\partial \mathbf{W}_{hx} L/Whx ∂ L / ∂ W h h \partial L/\partial \mathbf{W}_{hh} L/Whh ∂ L / ∂ W q h \partial L/\partial \mathbf{W}_{qh} L/Wqh。根据图2中的依赖关系,我们可以沿箭头的相反方向遍历计算图,依次计算和存储梯度。为了灵活地表示链式法则中不同形状的矩阵、向量和标量的乘法,我们继续使用如前向传播、反向传播和计算图中所述的 prod \text{prod} prod运算符。

  首先,在任意时间步 t t t,目标函数关于模型输出的微分计算是相当简单的:
∂ L ∂ o t = ∂ l ( o t , y t ) T ⋅ ∂ o t ∈ R q (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 \tag{11} otL=Totl(ot,yt)Rq(11)

  现在,我们可以计算目标函数关于输出层中参数 W q h \mathbf{W}_{qh} Wqh的梯度: ∂ L / ∂ W q h ∈ R q × h \partial L/\partial \mathbf{W}_{qh} \in \mathbb{R}^{q \times h} L/WqhRq×h。基于图2,目标函数 L L L通过 o 1 , … , o T \mathbf{o}_1, \ldots, \mathbf{o}_T o1,,oT依赖于 W q h \mathbf{W}_{qh} 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 ⊤ (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 \tag{12} WqhL=t=1Tprod(otL,Wqhot)=t=1TotLht(12) 其中, ∂ L / ∂ o t \partial L/\partial \mathbf{o}_t L/ot是由式(11)给出的。

  接下来,如图2所示,在最后的时间步 T T T,目标函数 L L L仅通过 o T \mathbf{o}_T oT依赖于隐状态 h T \mathbf{h}_T hT。因此,我们通过使用链式法可以很容易地得到梯度 ∂ L / ∂ h T ∈ R h \partial L/\partial \mathbf{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 (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} \tag{13} hTL=prod(oTL,hToT)=WqhoTL(13)

  当目标函数 L L L通过 h t + 1 \mathbf{h}_{t+1} ht+1 o t \mathbf{o}_t ot依赖 h t \mathbf{h}_t ht时,对任意时间步 t < T t < T t<T来说都变得更加棘手。根据链式法则,隐状态的梯度 ∂ L / ∂ h t ∈ R h \partial L/\partial \mathbf{h}_t \in \mathbb{R}^h L/htRh在任何时间步骤 t < T t < T t<T时都可以递归地计算为
∂ 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 (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} \tag{14} htL=prod(ht+1L,htht+1)+prod(otL,htot)=Whhht+1L+WqhotL(14)

  为了进行分析,对于任何时间步 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 (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}} \tag{15} htL=i=tT(Whh)TiWqhoT+tiL(15)

  我们可以从式(15)中看到,这个简单的线性例子已经展现了长序列模型的一些关键问题:它陷入到 W h h ⊤ \mathbf{W}_{hh}^\top Whh的潜在的非常大的幂。在这个幂中,小于1的特征值将会消失,大于1的特征值将会发散。这在数值上是不稳定的,表现形式为梯度消失或梯度爆炸。解决此问题的一种方法是按照计算方便的需要截断时间步长的尺寸如循环神经网络的梯度分析中所述。实际上,这种截断是通过在给定数量的时间步之后分离梯度来实现的。稍后,我们将学习更复杂的序列模型(如长短期记忆模型)是如何进一步缓解这一问题的。

  最后,图2表明:目标函数 L L L通过隐状态 h 1 , … , h T \mathbf{h}_1, \ldots, \mathbf{h}_T h1,,hT依赖于隐藏层中的模型参数 W h x \mathbf{W}_{hx} Whx W h h \mathbf{W}_{hh} Whh。为了计算有关这些参数的梯度 ∂ L / ∂ W h x ∈ R h × d \partial L / \partial \mathbf{W}_{hx} \in \mathbb{R}^{h \times d} L/WhxRh×d ∂ L / ∂ W h h ∈ R h × h \partial L / \partial \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} L/WhhRh×h,我们应用链式规则得
∂ 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 ⊤ (16) \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} \tag{16} WhxLWhhL=t=1Tprod(htL,Whxht)=t=1ThtLxt=t=1Tprod(htL,Whhht)=t=1ThtLht1(16) 其中, ∂ L / ∂ h t \partial L/\partial \mathbf{h}_t L/ht是由式(13)和式(14)递归计算得到的,是影响数值稳定性的关键量。

  正如我们在前向传播、反向传播和计算图中所解释的那样,由于通过时间反向传播是反向传播在循环神经网络中的应用方式,所以训练循环神经网络交替使用前向传播和通过时间反向传播。通过时间反向传播依次计算并存储上述梯度。具体而言,存储的中间值会被重复使用,以避免重复计算,例如存储 ∂ L / ∂ h t \partial L/\partial \mathbf{h}_t L/ht,以便在计算 ∂ L / ∂ W h x \partial L / \partial \mathbf{W}_{hx} L/Whx ∂ L / ∂ W h h \partial L / \partial \mathbf{W}_{hh} L/Whh时使用。

小结

  • “通过时间反向传播”仅仅适用于反向传播在具有隐状态的序列模型。
  • 截断是计算方便性和数值稳定性的需要。截断包括:规则截断和随机截断。
  • 矩阵的高次幂可能导致神经网络特征值的发散或消失,将以梯度爆炸或梯度消失的形式表现。
  • 为了计算的效率,“通过时间反向传播”在计算期间会缓存中间值。

相关文章:

【现代深度学习技术】循环神经网络07:通过时间反向传播

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

如何在idea中写spark程序

一、环境准备 1. 安装 IntelliJ IDEA&#xff1a; 下载并安装 IntelliJ IDEA&#xff08;推荐使用 Community 版本&#xff0c;它已经支持 Scala 和 Spark 开发&#xff09;。 官方下载地址&#xff1a;[JetBrains IntelliJ IDEA](https://www.jetbrains.com/idea/downlo…...

硬件加密+本地部署,大模型一体机如何打造AI安全护城河?

2025年&#xff0c;大模型技术加速渗透千行百业&#xff0c;但随之而来的安全风险也引发广泛关注。数据显示&#xff0c;近九成企业部署的大模型服务器存在“裸奔”隐患&#xff0c;数据泄露、模型篡改、算力劫持等问题频发。 在此背景下&#xff0c;大模型一体机凭借“开箱即…...

在另外一台可以科学下载的电脑用ollama下载模型后,怎么导入到另外一台服务器的ollama使用

环境&#xff1a; Win10专业版 Ubuntu20.04 问题描述&#xff1a; 在另外一台可以科学下载的电脑用ollama下载模型后&#xff0c;怎么导入到另外一台服务器的ollama使用&#xff0c;原电脑win10上的ollama下载的模型,复制到ubuntu20.04的ollama上推理 解决方案&#xff1a;…...

鼠标滚动字体缩放

在VsCode中编辑文件时&#xff0c;有时候发现Ctrl鼠标滚轮并不能缩放字体&#xff0c;下面是启用这个功能的方法。 第一步&#xff1a; 进入设置&#xff0c;可以从左下角按钮菜单进入&#xff0c;也可以使用【Ctrl,】。 第二步&#xff1a; 启用鼠标滚轮缩放功能 第三步&…...

什么是VR相机?VR相机的发展历史

VR相机&#xff1a;沉浸式体验的未来科技 VR相机&#xff0c;全称为虚拟现实相机&#xff0c;是专门用于捕捉和记录三维空间和场景的设备&#xff0c;能够拍摄360度全景照片和视频。通过模拟人的双眼视觉差异&#xff0c;利用多个镜头和传感器同时捕捉周围环境的图像&#xff…...

Java面试:Spring及Spring Cloud技术深度剖析

Spring及Spring Cloud技术深度剖析 前言 在Java开发领域&#xff0c;Spring框架一直是企业级应用开发的中流砥柱&#xff0c;而Spring Boot的出现更是极大地简化了Spring应用的开发过程。同时&#xff0c;Spring Cloud为构建分布式系统提供了强大的支持。本文将围绕Spring及S…...

论文阅读_Search-R1_大模型+搜索引擎

英文名称&#xff1a;Search-R1: Training LLMs to Reason and Leverage Search Engines with Reinforcement Learning 中文名称&#xff1a;Search-R1&#xff1a;训练大型语言模型进行推理并利用搜索引擎的强化学习 链接: http://arxiv.org/pdf/2503.09516v2 代码: https://g…...

零成本AI抠图终极指南:蓝耘元生代AIDC OS+ComfyUI实现商业级效果

引言&#xff1a;AI抠图革命已经到来 在数字内容创作爆炸式增长的今天&#xff0c;高质量的图像处理已成为刚需。无论是电商平台的商品展示、自媒体博主的封面设计&#xff0c;还是摄影爱好者的后期处理&#xff0c;抠图都是最基础也是最繁琐的工作之一。 传统抠图方式面临三…...

深入理解CSS3:Flex/Grid布局、动画与媒体查询实战指南

引言 在现代Web开发中&#xff0c;CSS3已经成为构建响应式、美观且高性能网站的核心技术。它不仅提供了更强大的布局系统&#xff08;Flexbox和Grid&#xff09;&#xff0c;还引入了令人惊艳的动画效果和精准的媒体查询能力。本文将深入探讨这些关键技术&#xff0c;帮助您提…...

VLM-E2E:通过多模态驾驶员注意融合增强端到端自动驾驶——论文阅读

《VLM-E2E Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion》2025年2月发表&#xff0c;来自香港科大广州分校、理想汽车和厦门大学的论文。 一、核心问题与动机 现有端到端&#xff08;E2E&#xff09;自动驾驶系统直接从传感器输入映射到…...

蓝牙BLE

1、简介 蓝牙BR/EDR和BLE是蓝牙技术的两个重要分支&#xff0c;它们各自具有独特的特点和应用场景。 1.1、蓝牙BR/EDR 蓝牙BR&#xff08;Basic Rate&#xff09; 定义&#xff1a;蓝牙技术的首个开发版本&#xff0c;采用高斯频移键控&#xff08;GFSK&#xff09;调制技术…...

在VS2022中使用Lua与c交互(二)

一、核心交互机制&#xff1a;Lua 虚拟栈 Lua 与 C 的交互通过一个 ​​虚拟栈&#xff08;Stack&#xff09;​​ 完成&#xff0c;所有数据传递、函数调用均通过此栈实现。栈的每个元素可以是任意 Lua 类型&#xff08;如数字、字符串、表、函数等&#xff09;。 栈的结构与…...

论文阅读_Citrus_在医学语言模型中利用专家认知路径以支持高级医疗决策

英文名称&#xff1a;Citrus: Leveraging Expert Cognitive Pathways in a Medical Language Model for Advanced Medical Decision Support 中文名称&#xff1a;Citrus&#xff1a;在医学语言模型中利用专家认知路径以支持高级医疗决策 链接: http://arxiv.org/pdf/2502.18…...

浅谈PCB传输线(一)

前言&#xff1a;浅谈传输线的类型&#xff0c;以及传输线的一些行为特性。 1.传输线的种类 2.互连线被视为传输线的场景 3.传输线的行为特性*** 1.传输线的种类 PCB 中的信号传输线通常有两种基本类型: 微带线和带状线。此外&#xff0c;还有第三种类型–共面线(没有参考平面…...

Spring-全面详解(学习总结)

一&#xff1a;概述 1.1 为什么学 解决了两个主要问题 1. 2 学什么 1.3 怎么学 二&#xff1a;系统架构 作用&#xff1a;web开发、微服务开发、分布式系统开发 容器&#xff1a;用于管理对象 AOP:面向切面编程&#xff08;不惊动原始程序下对其进行加强&#xff09; 事…...

突破JVM边界:类加载三重门与栈帧的生存法则

类加载子系统 文件验证阶段 类加载子系统在加载Class文件时&#xff0c;首先会验证文件格式规范&#xff0c;检查文件开头的魔数标识&#xff0c;确保这是一个合法的JVM字节码文件。 职责边界 该子系统仅负责将Class文件加载到内存中&#xff0c;并不关心后续能否成功执行—…...

VSCode 查看文件的本地修改历史

1. 使用时间线视图&#xff08;Timeline&#xff09; 新版 VSCode 内置了一个叫 Timeline&#xff08;时间线&#xff09; 的功能&#xff0c;可以查看&#xff1a; 本地文件修改记录&#xff08;包括保存历史&#xff09;Git 提交历史&#xff08;如果仓库是 Git 管理的&…...

在QGraphicsView中精确地以鼠标为锚缩放图片

在pyqt中以鼠标所在位置为锚点缩放图片-CSDN博客中的第一个示例中&#xff0c;通过简单设置&#xff1a; self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) 使得QGraphicsView具有了以鼠标为锚进行缩放的功能。但是&#xff0c;其内部应当是利用了滚动条的移动来…...

【Python数据驱动决策】数据分析与可视化全流程实战指南

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:销售数据清洗案例2:月度销售趋势分析案例3:产品关联分析(热力图)运行结果验证三、性能对…...

报错解决:ModuleNotFoundError: No module named ‘triton.ops‘

报错原因&#xff1a;2024.5.21之后, triton.ops 被移动到另一个工程 triton-lang/kernels中。 参考链接&#xff1a;官方解释 解决方案&#xff1a;换用2024.5.21之前发布的版本。 pip3 install triton2.3.0...

相机-IMU联合标定:相机-IMU外参标定

文章目录 📚简介🚀标定工具kalibr🚀标定数据录制🚀相机-IMU外参标定📚简介 在 VINS(视觉惯性导航系统) 中,相机-IMU外参标定 是确保多传感器数据时空统一的核心环节,其作用可概括为以下关键点: 坐标系对齐(空间同步),外参误差会导致视觉特征点投影与IMU预积…...

Qt C++数据库实验

一、实验目的和要求 1、掌握Qt中数据库SQL类数据库的查询、插入和更新操作。 2、熟悉Qt界面设计中常用的控件。 3、了解数据库相关类。 二、实验内容 1、设计一个数据库操作软件&#xff0c;完成数据库的相关操作。 2、建立按钮的信号与槽函数&#xff0c;实现点击按钮进…...

相机-IMU联合标定:IMU标定

文章目录 📚 简介🚀标定工具安装📌 IMU标定工具 code_utils📌 IMU标定工具 imu_utils:🚀标定数据录制🚀IMU标定📚 简介 在 VINS(Visual-Inertial Navigation System,视觉惯性导航系统) 中,IMU标定 是确保系统高精度运行的关键环节。IMU(惯性测量单元)本身…...

榕壹云信用租赁系统:基于ThinkPHP+MySQL+UniApp的全链路免押租赁解决方案

信用租赁时代的全流程数字化革新 随着共享经济与信用体系的深度融合,传统租赁行业正面临效率与信任的双重挑战。榕壹云信用租赁系统依托ThinkPHP高性能框架、MySQL数据库与UniApp跨平台开发技术,构建了一套覆盖设备租赁全生命周期的数字化解决方案。通过整合多因子身份认证、…...

C语言中的指针详解

指针是C语言中非常强大且复杂的特性之一&#xff0c;它为我们提供了更灵活的内存管理方式&#xff0c;使得程序能够直接操作内存&#xff0c;提升效率和性能。尽管指针非常强大&#xff0c;但如果不理解它的概念和使用方式&#xff0c;很容易出现错误。因此&#xff0c;理解指针…...

NIPS2021 | 视觉 Transformer 的有趣特性

Intriguing Properties of Vision Transformers 摘要-Abstract引言-Introduction相关工作-Related Work视觉Transformer的有趣特性-Intriguing Properties of Vision Transformers视觉Transformer对遮挡具有鲁棒性吗&#xff1f;-Are Vision Transformers Robust to Occlusions…...

贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)

一、题目解析 这里要注意恰好这个字眼&#xff0c;说明对任意数减小一半是不需要向上取整的&#xff0c;所以我们需要定义double类型的数据。 二、算法解析 我们需要将数组和减小为一半的次数最少&#xff0c;所以根据贪心算法&#xff0c;我们需要取数组中最大的数进行减半操…...

如何搭建spark yarn 模式的集群集群。

下载 App 如何搭建spark yarn 模式的集群集群。 搭建Spark on YARN集群的详细步骤 Spark on YARN模式允许Spark作业在Hadoop YARN资源管理器上运行&#xff0c;利用YARN进行资源调度。以下是搭建步骤&#xff1a; 一、前提条件 已安装并配置好的Hadoop集群&#xff08;包括HDF…...

嵌入式开发面试典型编程题解析:排序算法、指针操作、字符处理、递归原理等基础原理的深度解析。

在嵌入式开发面试中&#xff0c;编程题是常见的考察形式&#xff0c;旨在检验求职者对基础编程知识的掌握和应用能力。以下是几道典型的嵌入式面试编程题及详细解析&#xff0c;帮助新手逐步理解和掌握相关知识点。 一、用交换法对学生成绩降序排序 题目描述 在嵌入式系统开…...

DeepSeek+即梦:AI视频创作从0到1全突破

目录 一、开启 AI 视频创作大门&#xff1a;前期准备1.1 注册与登录1.2 熟悉工具界面1.3 硬件与网络要求 二、用 DeepSeek 构思视频脚本2.1 明确创作主题与目标2.2 编写优质提示词2.3 生成并优化脚本 三、即梦 AI 实现画面生成3.1 文生图基础操作3.2 调整参数提升画质3.3 保持人…...

npm init、换源问题踩坑

文章目录 一、 问题复现二、问题解决 一、 问题复现 成功安装nodejs 以及 npm 版本如下&#xff1a; > node -v > v20.18.0 > npm -v > 10.8.2使用 npm init 命令时延时过长&#xff0c;考虑换源&#xff0c;使用指令 npm config set registry https://registr…...

TRex 控制台命令解析

TRex 是一种高性能的网络测试工具&#xff0c;用于生成和分析网络流量。以下是对这些命令的简要解释&#xff1a; 一、help Console Commands&#xff08;控制台命令&#xff09; capture&#xff1a;管理 PCAP 捕获。debug&#xff1a;用于开发的内部调试器。events&#x…...

【Shell 脚本入门】轻松上手的实战指南

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Shell脚本编程 目录 一&#xff1a;&#x1f525; 什么是 Shell &#x1f98b; 常见的 Shell 类型 二&#xff1a;&#x1f525; 什么是 Shell 脚本 &#x1f98b; Shell 脚本规则&#x1f98b; 第…...

数据结构*栈

栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈&#xff0c;它是JVM内存的一部分&#xff0c;用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间&#xff0c;当线程启动时&#xff0c;栈就会被创建&#xff1b;线程结束&#xff0c…...

零基础制作Freertos智能小车(教程非常简易)持续更新中....

从现开始&#xff0c;将陆续推出各类简单的DIY电子设计&#xff0c;由简入深&#xff0c;将自己的制作过程全部分享出来&#xff0c;巩固自己知识的同时希望借此机会认识更多喜欢电子设计的小伙伴。 本次小车的主控芯片采用stm32f103c8t6&#xff0c;主要是便宜好用&am…...

Leetcode - 双周赛155

目录 一&#xff0c;3527. 找到最常见的回答二&#xff0c;3528. 单位转换 I三&#xff0c;3529. 统计水平子串和垂直子串重叠格子的数目四&#xff0c;3530. 有向无环图中合法拓扑排序的最大利润 一&#xff0c;3527. 找到最常见的回答 题目列表 本题是一道模拟题&#xff0…...

详解RabbitMQ工作模式之工作队列模式

目录 工作队列模式 概念 特点 应用场景 工作原理 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 编写消费者2代码 先运行生产者&#xff0c;后运行消费者 先运行消费者&#xff0c;后运行生产者 工作队列模式 概念 在工作队列模式中&#x…...

QGIS+mcp的安装和使用

QGISmcp的安装和使用 安装qgis_mcp 下载qgis_mcp&#xff1a; git clone https://github.com/jjsantos01/qgis_mcp.git安装uv uv是一个由Rust语言编写的python包管理工具&#xff0c;旨在提供比传统工具&#xff08;如 pip&#xff09;更高效的依赖管理和虚拟环境操作。 p…...

Java基础361问第16问——枚举为什么导致空指针?

我们看一段代码 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 极具迷惑性&#xff0c;大家日常开发肯定这么写过switch (color) {case RED:break;c…...

在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战

JSON (JavaScript Object Notation) 已经成为现代 Web 应用和服务之间数据交换的通用语言。无论你是开发后端 API、与第三方服务集成&#xff0c;还是处理配置文件&#xff0c;都绕不开 JSON 的解析与生成。在 C# .NET 世界里&#xff0c;处理 JSON 有多种选择&#xff0c;其中…...

CentOS7——Docker部署java服务

1、安装Docker 首先要确保系统已安装 Docker&#xff0c;若未安装&#xff0c;可以参考我的另一篇文章现在CentOS7上安装Docker&#xff0c;文章地址如下&#xff1a; CentOS7系统安装Docker教程-CSDN博客 Docker当中要安装必备的软件&#xff0c;比如Java运行必要的JDK&#…...

Python-Part2-集合、字典与推导式

Python-Part2-集合、字典与推导式 1. set集合 ⽆序&#xff0c;去掉重复数据。 set1 {1,2,3,4,5,5,4,3,2,1}print(type(set1))print(set1)set2.add(66666)set2.remove(55)#不能使用下标访问set&#xff0c;所以修改操作一般为remove操作 add操作2.dict 字典 字典&#xff…...

《AI大模型应知应会100篇》第39篇:多模态大模型应用:文本、图像和音频的协同处理

第39篇&#xff1a;多模态大模型应用&#xff1a;文本、图像和音频的协同处理 摘要 随着人工智能技术的发展&#xff0c;多模态大模型&#xff08;Multimodal Large Models&#xff09;已经成为AI领域的热点之一。这些模型能够同时处理文本、图像、音频等多种模态数据&#xf…...

kvm学习小结

安装相关包 安装虚拟化相关包 apt install qemu-kvm qemu-system libvirt-clients libvirt-daemon-system vlan bridge-utils 安装界面相关包 apt install xinit gdmd 配置机器允许root登录 检查cpu是否支持虚拟化 egrep -o vmx|svm /proc/cpuinfo 执行命令systemctl s…...

k8s基本概念-YAML

YAML介绍 YAML是“YAML Aint a Markup Language” (YAML不是一种置标语言)的递归缩进写,早先YAML的意思其实是:“Yet Another Markup Language”(另一种置标语言) YAML是一个类似XML、JSON的标记性语言。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义…...

wps批注线条怎么取消去掉wps批注后有竖线

wps批注线条怎么取消去掉wps批注后有竖线 问题 图片 解决方案 图片 word批注线条取消的方法&#xff1a; 1.打开Word文档,点击需要删除的批注。 2.然后点击工具栏“审阅”选项。 3.接着点击“接受“ 4.接受对文档所做的所有修订(H)...

深度解析算法之分治(归并)

48.排序数组 题目链接 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a; nums [5,2,3,1] 输出&am…...

僵尸进程是什么?

僵尸进程&#xff08;Zombie Process&#xff09;是指在 Unix/Linux 系统中&#xff0c;一个子进程已经终止&#xff0c;但其父进程尚未对它进行善后处理&#xff08;即没有读取其退出状态&#xff09;&#xff0c;导致子进程的进程表项仍然保留在系统中。由于这个进程已经结束…...

城市群出行需求的时空分形

城市群出行需求的时空分形 原文&#xff1a;He, Zhengbing. “Spatial-temporal fractal of urban agglomeration travel demand.” Physica A: Statistical Mechanics and its Applications 549 (2020): 124503. 1. Introduction&#xff08;引言&#xff09; 城市区域的重…...