RNN BPTT算法推导

RNN BPTT算法推导BPTT(沿时反向传播算法)基本原理与BP算法一样,包含三个步骤:前向计算每个神经元的输出值反向计算每个神经元的误差项δjδ_jδj​,它是误差函数E对神经元j的加权输入netjnet_jnetj​的偏导数计算每个权重的梯度最后再用随机梯度下降算法更新权重循环曾如图所示:1.1前向计算循环层的前向计算:隐层:st=f(Uxt+Wst−1)s_t=f(Ux_t+Ws_{t-1})…

大家好,又见面了,我是你们的朋友全栈君。

BPTT(沿时反向传播算法)基本原理与BP算法一样,包含三个步骤:

  • 前向计算每个神经元的输出值
  • 反向计算每个神经元的误差项 δ j δ_j δj,它是误差函数E对神经元j的加权输入 n e t j net_j netj的偏导数
  • 计算每个权重的梯度
  • 最后再用随机梯度下降算法更新权重
    循环曾如图所示:
    在这里插入图片描述
    1.1前向计算
    循环层的前向计算:
    隐层: s t = f ( U x t + W s t − 1 ) s_t=f(Ux_t+Ws_{t-1}) st=f(Uxt+Wst1)
    1.2误差项的计算
    BPTT算法将第l层t时刻的误差项 δ t l δ_t^l δtl值沿两个方向传播,一个方向时传递到上一层网络,得到 δ t l − 1 δ_t^{l-1} δtl1,这部分只和权重矩阵U有关;另一方向是将其沿着时间线传递到初始 t 1 t_1 t1时刻,得到 δ 1 l δ_1^l δ1l,这部分只和权重矩阵W有关。
    用向量 n e t j net_j netj表示神经元在t时刻的加权输入:
    n e t j = U x t + W s t − 1 net_j=Ux_t+Ws_{t-1} netj=Uxt+Wst1
    s t − 1 = f ( n e t t − 1 ) s_{t-1}=f(net_{t-1}) st1=f(nett1)
    因此:
    ∂ n e t t ∂ n e t t − 1 = ∂ n e t t ∂ s t − 1 ∂ s t − 1 ∂ n e t t − 1 \frac{\partial net_t}{\partial net_{t-1}}=\frac{\partial net_t}{\partial s_{t-1}}\frac{\partial s_{t-1}}{\partial net_{t-1}} nett1nett=st1nettnett1st1
    ∂ n e t t ∂ s t − 1 = W \frac{\partial net_t}{\partial s_{t-1}}=W st1nett=W
    第二项是一个jacobian矩阵
    在这里插入图片描述
    在这里插入图片描述
    最后,将两项合在一起,可得:
    ∂ n e t t ∂ n e t t − 1 = ∂ n e t t ∂ s t − 1 ∂ s t − 1 ∂ n e t t − 1 = W ∗ d i a g [ f ′ ( n e t t − 1 ) ] \frac{\partial net_t}{\partial net_{t-1}}=\frac{\partial net_t}{\partial s_{t-1}}\frac{\partial s_{t-1}}{\partial net_{t-1}}=W*diag[f^{'} (net_{t-1})] nett1nett=st1nettnett1st1=Wdiag[f(nett1)]
    上式描述了将 δ \delta δ沿时间向前传递一个时刻的规律,可以求的任意时刻k的误差项 δ k \delta_k δk:
    在这里插入图片描述
    这就是将误差项沿着时间反向传播的算法。

循环层将误差项反向传递到上一层网络,与普通的全连接层是完全一样的。
循环层的加权输入 n e t l net^l netl与上一层的加权输入 n e t l − 1 net^{l-1} netl1关系如下:
n e t t l = U a t l − 1 + W s t − 1 net^l_t=Ua^{l-1}_t+Ws_{t-1} nettl=Uatl1+Wst1
a t l − 1 = f l − 1 ( n e t t l − 1 ) a^{l-1}_t=f^{l-1}(net^{l-1}_t) atl1=fl1(nettl1)
上式中 n e t t l net^l_t nettl是第l层神经元的加权输入; n e t t l − 1 net^{l-1}_t nettl1是l-1层神经元的加权输入; a t l − 1 a^{l-1}_t atl1是第l-1层神经元的输出; f l − 1 f^{l-1} fl1是第l-1层的激活函数。
∂ n e t t l ∂ n e t t l − 1 = ∂ n e t t l ∂ a t l − 1 ∂ a t l − 1 ∂ n e t t l − 1 = U ∗ d i a g [ f ′ l − 1 ( n e t t l − 1 ) ] \frac{\partial net^l_t}{\partial net^{l-1}_t}=\frac{\partial net^l_t}{\partial a^{l-1}_t}\frac{\partial a^{l-1}_t}{\partial net^{l-1}_t}=U*diag[f^{'l-1}(net^{l-1}_t)] nettl1nettl=atl1nettlnettl1atl1=Udiag[fl1(nettl1)]
所以:
δ t l − 1 = ∂ E ∂ n e t t l − 1 = ∂ E ∂ n e t t l ∂ n e t t l ∂ n e t t l − 1 = δ t l ∗ U ∗ d i a g [ f ′ l − 1 ( n e t t l − 1 ) ] \delta^{l-1}_t=\frac{\partial E}{\partial net^{l-1}_t}=\frac{\partial E}{\partial net^l_t}\frac{\partial net^l_t}{\partial net^{l-1}_t}=\delta^l_t*U*diag[f^{'l-1}(net^{l-1}_t)] δtl1=nettl1E=nettlEnettl1nettl=δtlUdiag[fl1(nettl1)]
上式就是将误差项传递到上一层算法。
1.3权重梯度的计算
接下来是BPTT算法的最后一步:计算每个权重的梯度
首先计算误差函数E对权重矩阵W的梯度: ∂ E ∂ W \frac{\partial E}{\partial W} WE
在这里插入图片描述
上图为我们前两步计算得到的量,包括每个时刻t循环层的输出值 s t s_t st,以及误差项 δ t \delta_t δt
我们知道了任意一个时刻的误差项 δ t \delta_t δt,以及上一个时刻循环层的输出值 s t − 1 s_{t-1} st1,就可以按照下面的公式求出权重矩阵在t时刻的梯度:
在这里插入图片描述
上式中, δ i t \delta^t_i δit表示t时刻误差项向量的第i各分量,即第i层的误差项;KaTeX parse error: Double subscript at position 8: s_{t-1}_̲i表示t-1时刻循环层第i各神经元的输出值。
权重梯度推导:
在这里插入图片描述
1.4梯度爆炸与梯度消失

RNNs并不能很好地处理较长的序列。主要原因是RNN在训练中很容易发生梯度爆炸和梯度消失,导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
三种方法应对梯度消失问题:
1)合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
2)使用Relu代替sigmod和tanh作为激活函数。
3)使用其它结构的RNNs,比如长短时记忆网络(LSTM)和Gated Recurrent Unit(GRU),这是最流行的做法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152300.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 灰度测试与AB测试_测试种类有哪些

    灰度测试与AB测试_测试种类有哪些这个“常见”,是说当我们经历多了之后,会发现这个概念其实很常见,在当前你所处的这个人群中,发现大家都挂在嘴上。在最开始的测试学习中,其实很少提到这些概念,在职业生涯的前期,也很少需要考虑这些概念。分级测试一般用在系统测试阶段。分级测试,就是说对测试进行分级,区分什么重要、什么不重要,做区别对待。之所以需要区别对待,我总结有两个原因。一个是因为资源上的限制,时间、人力,让我们没有条件来做无差别覆盖。二是本身的限制,在测试阶段,提测质量往往是不尽人意的,只能是层层深入去做测试。.

    2025年5月22日
    7
  • SecureCRT中文乱码,导致上传到nginx上的文件乱码,访问报404「建议收藏」

    SecureCRT中文乱码,导致上传到nginx上的文件乱码,访问报404「建议收藏」问题背景:因使用secureCRT工具,上传文件到linux系统nginx服务上,因部分文件名包含中文,导致访问路径报错404,查看时显示乱码等问题。一般解决办法1.右键点击SecureCRT的连接标签。2.在弹出的窗口中,左边栏选择“外观”选项卡,在右边的窗口中选择UTF8,如图所示:3.此时,SecureCRT中即可正常显示中文了:此时虽然可以显示中文,但是在SecureF…

    2022年7月17日
    15
  • pycharm鼠标滚动控制字体大小_pycharm窗口放大

    pycharm鼠标滚动控制字体大小_pycharm窗口放大1、放大页面方法第一步:打开file里面的setting,然后打开Keymap,再搜索框中输入increase,点击increaseFontSize,双击AddMouseShortcut(先不用点OK)第二步:点击AddMouseShortcut弹出下面对话框,然后按住ctrl并向上滚动鼠标滑轮,将变成第二个对话框,点击OK;第三步:显示下面页面表示设置放大成功,点击OK即可。2、缩小页面方法与上面方法类似,将increase变成decrease输入即可;…

    2022年8月26日
    6
  • 燃尽图_敏捷燃尽图

    燃尽图_敏捷燃尽图燃尽图(burndownchart)是在项目完成之前,对需要完成的工作的一种可视化表示。燃尽图有一个Y轴(工作)和X轴(时间)。理想情况下,该图表是一个向下的曲线,随着剩余工作的完成,“烧尽”至零

    2022年8月4日
    4
  • RegisterStartupScript 用法

    RegisterStartupScript 用法ClientScript.RegisterStartupScript方法有3个重载:1:RegisterStartupScript(Page,String,String)向ScriptManager控件注册一个启动脚本块并将该脚本块添加到页面中。需要向第三个参数添加脚本标签。第一个参数为页面Page。第二个脚本函数的名字,随便起。第三个是形式的脚本内容。2:RegisterS

    2022年7月20日
    12
  • navicat 15 for my sql 激活码[最新免费获取]

    (navicat 15 for my sql 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL5S9V8F-eyJsaWNlbnNlSWQiOi…

    2022年3月27日
    170

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号