(pytorch-深度学习)通过时间反向传播

通过时间反向传播

介绍循环神经网络中梯度的计算和存储方法,即通过时间反向传播(back-propagation through time)。

  • 正向传播和反向传播相互依赖。
  • 正向传播在循环神经网络中比较直观,而通过时间反向传播其实是反向传播在循环神经网络中的具体应用。
  • 我们需要将循环神经网络按时间步展开,从而得到模型变量和参数之间的依赖关系,并依据链式法则应用反向传播计算并存储梯度。

定义模型

考虑一个简单的无偏差项的循环神经网络,且激活函数为恒等映射(ϕ(x)=x\phi(x)=xϕ(x)=x)。设时间步 ttt 的输入为单样本 xt∈Rd\boldsymbol{x}_t \in \mathbb{R}^dxtRd,标签为 yty_tyt,那么隐藏状态 ht∈Rh\boldsymbol{h}_t \in \mathbb{R}^hhtRh的计算表达式为

ht=Whxxt+Whhht−1,\boldsymbol{h}_t = \boldsymbol{W}_{hx} \boldsymbol{x}_t + \boldsymbol{W}_{hh} \boldsymbol{h}_{t-1}, ht=Whxxt+Whhht1,

其中Whx∈Rh×d\boldsymbol{W}_{hx} \in \mathbb{R}^{h \times d}WhxRh×dWhh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}WhhRh×h是隐藏层权重参数。设输出层权重参数Wqh∈Rq×h\boldsymbol{W}_{qh} \in \mathbb{R}^{q \times h}WqhRq×h,时间步ttt的输出层变量ot∈Rq\boldsymbol{o}_t \in \mathbb{R}^qotRq计算为

ot=Wqhht.\boldsymbol{o}_t = \boldsymbol{W}_{qh} \boldsymbol{h}_{t}. ot=Wqhht.

设时间步ttt的损失为ℓ(ot,yt)\ell(\boldsymbol{o}_t, y_t)(ot,yt)。时间步数为TTT的损失函数LLL定义为

L=1T∑t=1Tℓ(ot,yt).L = \frac{1}{T} \sum_{t=1}^T \ell (\boldsymbol{o}_t, y_t). L=T1t=1T(ot,yt).

LLL称为有关给定时间步的数据样本的目标函数。

模型计算图

为了可视化循环神经网络中模型变量和参数在计算中的依赖关系,我们可以绘制模型计算图,像下图。例如,时间步3的隐藏状态h3\boldsymbol{h}_3h3的计算依赖模型参数Whx\boldsymbol{W}_{hx}WhxWhh\boldsymbol{W}_{hh}Whh、上一时间步隐藏状态h2\boldsymbol{h}_2h2以及当前时间步输入x3\boldsymbol{x}_3x3
在这里插入图片描述
表示了时间步数为3的循环神经网络模型计算中的依赖关系。

  • 方框代表变量(无阴影)或参数(有阴影),圆圈代表运算符

方法

图中的模型的参数是 Whx\boldsymbol{W}_{hx}Whx, Whh\boldsymbol{W}_{hh}WhhWqh\boldsymbol{W}_{qh}Wqh。训练模型通常需要模型参数的梯度∂L/∂Whx\partial L/\partial \boldsymbol{W}_{hx}L/Whx∂L/∂Whh\partial L/\partial \boldsymbol{W}_{hh}L/Whh∂L/∂Wqh\partial L/\partial \boldsymbol{W}_{qh}L/Wqh。 图中的依赖关系,我们可以按照其中箭头所指的反方向依次计算并存储梯度。

  • 首先,目标函数有关各时间步输出层变量的梯度∂L/∂ot∈Rq\partial L/\partial \boldsymbol{o}_t \in \mathbb{R}^qL/otRq很容易计算:

∂L∂ot=∂ℓ(ot,yt)T⋅∂ot.\frac{\partial L}{\partial \boldsymbol{o}_t} = \frac{\partial \ell (\boldsymbol{o}_t, y_t)}{T \cdot \partial \boldsymbol{o}_t}.otL=Tot(ot,yt).

  • 之后,可以计算目标函数有关模型参数Wqh\boldsymbol{W}_{qh}Wqh的梯度∂L/∂Wqh∈Rq×h\partial L/\partial \boldsymbol{W}_{qh} \in \mathbb{R}^{q \times h}L/WqhRq×h。根据计算图,LLL通过o1,…,oT\boldsymbol{o}_1, \ldots, \boldsymbol{o}_To1,,oT依赖Wqh\boldsymbol{W}_{qh}Wqh。依据链式法则,

∂L∂Wqh=∑t=1Tprod(∂L∂ot,∂ot∂Wqh)=∑t=1T∂L∂otht⊤.\frac{\partial L}{\partial \boldsymbol{W}_{qh}} = \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_t}, \frac{\partial \boldsymbol{o}_t}{\partial \boldsymbol{W}_{qh}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{o}_t} \boldsymbol{h}_t^\top. WqhL=t=1Tprod(otL,Wqhot)=t=1TotLht.

  • 其次,隐藏状态之间也存在依赖关系。 在计算图中,LLL只通过oT\boldsymbol{o}_ToT依赖最终时间步TTT的隐藏状态hT\boldsymbol{h}_ThT。因此,我们先计算目标函数有关最终时间步隐藏状态的梯度∂L/∂hT∈Rh\partial L/\partial \boldsymbol{h}_T \in \mathbb{R}^hL/hTRh。依据链式法则,我们得到

∂L∂hT=prod(∂L∂oT,∂oT∂hT)=Wqh⊤∂L∂oT.\frac{\partial L}{\partial \boldsymbol{h}_T} = \text{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_T}, \frac{\partial \boldsymbol{o}_T}{\partial \boldsymbol{h}_T} \right) = \boldsymbol{W}_{qh}^\top \frac{\partial L}{\partial \boldsymbol{o}_T}. hTL=prod(oTL,hToT)=WqhoTL.

  • 接下来对于时间步t<Tt < Tt<T, 在计算图中,LLL通过ht+1\boldsymbol{h}_{t+1}ht+1ot\boldsymbol{o}_tot依赖ht\boldsymbol{h}_tht。依据链式法则, 目标函数有关时间步t<Tt < Tt<T的隐藏状态的梯度∂L/∂ht∈Rh\partial L/\partial \boldsymbol{h}_t \in \mathbb{R}^hL/htRh需要按照时间步从大到小依次计算:
    ∂L∂ht=prod(∂L∂ht+1,∂ht+1∂ht)+prod(∂L∂ot,∂ot∂ht)=Whh⊤∂L∂ht+1+Wqh⊤∂L∂ot\frac{\partial L}{\partial \boldsymbol{h}_t} = \text{prod} (\frac{\partial L}{\partial \boldsymbol{h}{t+1}}, \frac{\partial \boldsymbol{h}{t+1}}{\partial \boldsymbol{h}_t}) + \text{prod} (\frac{\partial L}{\partial \boldsymbol{o}_t}, \frac{\partial \boldsymbol{o}_t}{\partial \boldsymbol{h}_t} ) = \boldsymbol{W}_{hh}^\top \frac{\partial L}{\partial \boldsymbol{h}_{t+1}} + \boldsymbol{W}_{qh}^\top \frac{\partial L}{\partial \boldsymbol{o}_t} htL=prod(ht+1L,htht+1)+prod(otL,htot)=Whhht+1L+WqhotL

  • 将上面的递归公式展开,对任意时间步1≤t≤T1 \leq t \leq T1tT,我们可以得到目标函数有关隐藏状态梯度的通项公式

∂L∂ht=∑i=tT(Whh⊤)T−iWqh⊤∂L∂oT+t−i.\frac{\partial L}{\partial \boldsymbol{h}_t} = \sum_{i=t}^T {\left(\boldsymbol{W}_{hh}^\top\right)}^{T-i} \boldsymbol{W}_{qh}^\top \frac{\partial L}{\partial \boldsymbol{o}_{T+t-i}}. htL=i=tT(Whh)TiWqhoT+tiL.

由上式中的指数项可见,当时间步数 TTT 较大或者时间步 ttt 较小时,目标函数有关隐藏状态的梯度较容易出现衰减和爆炸。这也会影响其他包含∂L/∂ht\partial L / \partial \boldsymbol{h}_tL/ht项的梯度,例如隐藏层中模型参数的梯度∂L/∂Whx∈Rh×d\partial L / \partial \boldsymbol{W}_{hx} \in \mathbb{R}^{h \times d}L/WhxRh×d∂L/∂Whh∈Rh×h\partial L / \partial \boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}L/WhhRh×h。 在图中,LLL通过h1,…,hT\boldsymbol{h}_1, \ldots, \boldsymbol{h}_Th1,,hT依赖这些模型参数。 依据链式法则,有

∂L∂Whx=∑t=1Tprod(∂L∂ht,∂ht∂Whx)=∑t=1T∂L∂htxt⊤,∂L∂Whh=∑t=1Tprod(∂L∂ht,∂ht∂Whh)=∑t=1T∂L∂htht−1⊤.\begin{aligned} \frac{\partial L}{\partial \boldsymbol{W}_{hx}} &= \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_t}, \frac{\partial \boldsymbol{h}_t}{\partial \boldsymbol{W}_{hx}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{h}_t} \boldsymbol{x}_t^\top,\\ \ \frac{\partial L}{\partial \boldsymbol{W}_{hh}} &= \sum_{t=1}^T \text{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_t}, \frac{\partial \boldsymbol{h}_t}{\partial \boldsymbol{W}_{hh}}\right) = \sum_{t=1}^T \frac{\partial L}{\partial \boldsymbol{h}_t} \boldsymbol{h}_{t-1}^\top. \end{aligned} WhxL WhhL=t=1Tprod(htL,Whxht)=t=1ThtLxt,=t=1Tprod(htL,Whhht)=t=1ThtLht1.

每次迭代中,我们在依次计算完以上各个梯度后,会将它们存储起来,从而避免重复计算。

  • 例如,由于隐藏状态梯度∂L/∂ht\partial L/\partial \boldsymbol{h}_tL/ht被计算和存储,之后的模型参数梯度∂L/∂Whx\partial L/\partial \boldsymbol{W}_{hx}L/Whx∂L/∂Whh\partial L/\partial \boldsymbol{W}_{hh}L/Whh的计算可以直接读取∂L/∂ht\partial L/\partial \boldsymbol{h}_tL/ht的值,而无须重复计算它们。
  • 此外,反向传播中的梯度计算可能会依赖变量的当前值。它们正是通过正向传播计算出来的。 举例来说,参数梯度∂L/∂Whh\partial L/\partial \boldsymbol{W}_{hh}L/Whh的计算需要依赖隐藏状态在时间步t=0,…,T−1t = 0, \ldots, T-1t=0,,T1的当前值ht\boldsymbol{h}_thth0\boldsymbol{h}_0h0是初始化得到的)。这些值是通过从输入层到输出层的正向传播计算并存储得到的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(pytorch-深度学习)门控循环单元(GRU)

门控循环单元&#xff08;GRU&#xff09; 循环神经网络中的梯度计算 当时间步数较大或者时间步较小时&#xff0c;循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸&#xff0c;但无法解决梯度衰减的问题。通常由于这个原因&#xff0c;循环神经网络在…

(pytorch-深度学习)长短期记忆(LSTM)

长短期记忆&#xff08;LSTM&#xff09; LSTM 中引入了3个门&#xff0c;即 输入门&#xff08;input gate&#xff09;遗忘门&#xff08;forget gate&#xff09;输出门&#xff08;output gate&#xff09;以及与隐藏状态形状相同的记忆细胞&#xff08;某些文献把记忆细…

(pytorch-深度学习)深度循环神经网络

深度循环神经网络 循环神经网络只有一个单向的隐藏层&#xff0c;在深度学习应用里&#xff0c;我们通常会用到含有多个隐藏层的循环神经网络&#xff0c;也称作深度循环神经网络。 下图演示了一个有LLL个隐藏层的深度循环神经网络&#xff0c;每个隐藏状态不断传递至当前层的…

(pytorch-深度学习)双向循环神经网络

双向循环神经网络 一般&#xff0c;我们认为循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的&#xff0c;因此它们都将信息通过隐藏状态从前往后传递。 有时候&#xff0c;当前时间步也可能由后面时间步决定。 例如&#xff0c;当我们写下一个句子时&…

pytorch实现梯度下降、随机梯度下降-图像直观展示

深度学习与优化算法原理 优化函数与深度学习 在一个深度学习问题中&#xff0c;通常需要预先定义一个损失函数。有了损失函数以后&#xff0c;使用优化算法试图将其最小化。 在优化中&#xff0c;这样的损失函数通常被称作优化问题的目标函数&#xff08;objective function…

小批量随机梯度下降

小批量随机梯度下降 在每一次迭代中&#xff0c;梯度下降使用整个训练数据集来计算梯度&#xff0c;因此它有时也被称为批量梯度下降&#xff08;batch gradient descent&#xff09;。 随机梯度下降在每次迭代中只随机采样一个样本来计算梯度。可以在每轮迭代中随机均匀采样…

动量法解决梯度下降的一些问题

动量法 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向&#xff0c;因此&#xff0c;梯度下降也叫作最陡下降&#xff08;steepest descent&#xff09;。在每次迭代中&#xff0c;梯度下降根据自变量当前位置&#xff0c;沿着当前位置的梯度更新自变…

深度学习AdaGrad算法

AdaGrad算法 在一般的优化算法中&#xff0c;目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。 例如&#xff0c;假设目标函数为fff&#xff0c;自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤&#xff0c;该向量中每一个元素在迭代时都使…

深度学习优化算法:RMSProp算法

RMSProp算法 在AdaGrad算法中&#xff0c;因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度&#xff0c;所以目标函数自变量每个元素的学习率在迭代过程中一直在降低&#xff08;或不变&#xff09;。因此&#xff0c;当学习率在迭代…

深度学习优化算法-AdaDelta算法

AdaDelta算法 除了RMSProp算法以外&#xff0c;另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。 不一样的是&#xff0c;AdaDelta算法没有学习率这个超参数。 它通过使用有关自变量更新量平方的指数加权移动平均的项来替代…

深度学习优化算法-Adam算法

Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。Adam算法可以看做是RMSProp算法与动量法的结合。 算法内容 Adam算法使用了动量变量vt\boldsymbol{v}_tvt​和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st\boldsymbol{s}_…

深度学习-计算机视觉--图像增广

图像增广 大规模数据集是成功应用深度神经网络的前提。图像增广&#xff08;image augmentation&#xff09;技术通过对训练图像做一系列随机改变&#xff0c;来产生相似但又不同的训练样本&#xff0c;从而扩大训练数据集的规模。 图像增广的另一种解释是&#xff0c;随机改…

pytorch深度学习-微调(fine tuning)

微调&#xff08;fine tuning&#xff09; 首先举一个例子&#xff0c;假设我们想从图像中识别出不同种类的椅子&#xff0c;然后将购买链接推荐给用户。一种可能的方法是先找出100种常见的椅子&#xff0c;为每种椅子拍摄1,000张不同角度的图像&#xff0c;然后在收集到的图像…

c语言封闭曲线分割平面_高手的平面课堂:8种常用的设计排版方式,告别通宵加班...

重复、对比、对齐以及亲密性是传统平面排版的四大原则&#xff0c;即将元素重复运用(包括颜色、形状、材质、字体、空间关系等)以增加画面的条理性和整体性&#xff1b;避免页面上的元素形态与关系构建过于相似&#xff1b;画面上的每一元素都应该与另一个元素存在某种视觉联系…

我的世界java版和基岩版对比_基岩版Beta1.11.0.1发布

本帖来自好游快爆-我的世界精选推荐原帖作者:好游快爆用户3302482我的世界基岩版1.11.0.1测试版发布了&#xff0c;Minecraft基岩版1.11仍未发布&#xff0c;1.11.0.1为测试版本&#xff0c;Beta版本可能不稳定&#xff0c;并不代表最终版本质量&#xff0c;请在加入测试版之前…

机器人电焊电流电压怎么调_【华光】HG1000型电焊机现场校准仪

机器简介HG-1000型电焊机现场校准仪是依据检定规程JJG124&#xff0d;2005《电流表、电压表、功率表和电阻表检定规程》、JJG(航天)38-1987《直流标准电流源检定规程》、JJG(航天)51-1999《交流标准电流源检定规程》的要求而设计的校准设备。主要用来校验各种用电焊机(如交流手…

循环机换变速箱油教程_变速箱油用循环机换还是重力换更好?一次讲清楚,新手司机学学...

现在换变速箱油有些只要几百块钱&#xff0c;有些要一两千&#xff0c;之所以差价这么大是因为这里面涉及到换变速箱油时用什么方法去换油的问题。目前比较常见换油法是重力换油法和循环换油法。重力换油法就跟平时换机油是一样的&#xff0c;把变速箱底部的螺丝拧开之后让油滴…

pytorch深度学习-机器视觉-目标检测和边界框简介

机器视觉之目标检测和边界框简介 在图像分类任务里&#xff0c;我们假设图像里只有一个主体目标&#xff0c;并关注如何识别该目标的类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知道它们的类别&#xff0c;还想得到它们在图像中的具体…

消防荷载楼板按弹性还是塑性计算_第二节 消防登高面、消防救援场地和灭火救援窗...

一、定义1、消防登高面&#xff1a;登高消防车能够靠近高层主体建筑&#xff0c;便于消防车作业和消防人员进入高层建筑进行抢救人员和扑救火灾的建筑立面称为该建筑的消防登高面&#xff0c;也称建筑的消防扑救面。2、消防救援场地&#xff1a;在高层建筑的消防登高面一侧&…

深度学习-词嵌入(word2vec)

词嵌入&#xff08;word2vec&#xff09; 自然语言是一套用来表达含义的复杂系统。在这套系统中&#xff0c;词是表义的基本单元。顾名思义&#xff0c;词向量是用来表示词的向量&#xff0c;也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入&#xff0…