最近开始啃LSTM,发现BPTT这块还是不是很清晰,结合RNN,把这块整理整理

RNN

前馈神经网络(feedforward neural networks)如下图所示(这块内容可见我的博客神经网络BP算法):

假设我们的训练集只有一个实例(x(1),y(1)x(1),y(1)),我们的神经网络是一个三层的神经网络,即隐藏层只有1层。
以中间层神经元SjS_j,(j=1,2)为例,它只模仿了生物神经元所具有的三个最基本也是最重要的功能:加权、求和与转移。其中x1、x2、x3分别代表来自输入层(Input Layer)神经元1、2、3的输入;wj1、wj2、wj3则分别表示神经元1、2、3与第j个神经元的连接强度,即权值;wj0为阈值;f(·)为传递函数;yj为第j个神经元的输出。
第1个神经元的净输入值 S1S_1为:

Sj=∑i=13wjixi+wj0=WTjX

S_j = \sum_{i=1}^3 w_{ji} x_i+w_{j0} = W_j^TX
其中, wj0w_{j0} 是偏置单元 x0对应的权值, x0x_0为1。
用上图的 S1S_1 为例, S1=w11x1+w12x2+w13x3+w10x0S_1 = w_{11}x_1+w_{12}x_2+w_{13}x_3+w_{10}x_0

净输入SjS_j通过传递函数(Transfer Function)f (·)后,便得到第j个神经元的输出yjy_j :

yj=f(Sj)=f(∑i=03wjixi)

y_j = f(S_j) = f(\sum_{i=0}^3 w_{ji} x_i)

好了,我们用抽象的形式进行表述(图摘自Jiaxun Cai’s Blog):

对每一层,因为考虑time step,所以都有:

netj(t)=∑iwjixi(t)+bj

net_j(t)= \sum_{i}w_{ji}x_i(t)+b_j

yj(t)=f(netj(t))

y_j(t)=f(net_j(t))
其中图中的 netj(t)net_j(t)即对应上面的 SjS_j, yj(t)y_j(t)即对应上面的 yjy_j, θj即为bj\theta_j即为b_j。

前馈神经网络从输入节点接受信息,它只能对输入空间进行操作,对不同时序下的输入是没有“记忆”的。在前馈神经网络中,信息只能从输入层流向隐藏层,再流向输出层。这种网络无法解决带有时序性的问题,比如预测句子中的下一个单词,这种情况下,往往需要使用到前面已知的单词。假设要预测这样一句话:今天天气_
由于受到前面的词语“天气”的影响,横线中填入“晴”的概率应该是挺大的,但是由于不考虑时序,即相当于每次输入的单词:“今天”“天气”都变换成输入向量,那我们无法有效的做出预测,因此,科学家们提出了RNN(Recurrent neural network)来解决在深度学习领域处理时序问题

RNN与前馈神经网络最大的不同是,它维持有一个内部的空间,来维持/保存上下文的状态信息

可以看到,RNN的隐藏层多了一条连向自己的边。因此,它的输入不仅包括输入层的数据,还包括了来自上一时刻的隐藏层的输出。
将其横向展开为:

传统的RNN

2015年发表在Nature杂志的Deep Learning中,将RNN定义为:RNNs, once unfolded in time, can be seen as very deep feedforward networks in which all the layers share the same weights.
即值得注意的是,在展开的RNN中,每一层隐藏层实际上是相同的(只是在不同时刻的副本),也就是说,它们最后得到的权值参数(不包括内部状态权值)——这个涉及到内部必须是一致的。在训练过程中,不同时刻的隐藏层的参数可能会不一致,最后可以将它们的平均数作为模型的参数。

RNN的BPTT算法导致的梯度消失与梯度爆炸

先看一下比较典型的BPTT一个展开的结构,如下图,这里只考虑了部分图,因为其他部分不是这里要讨论的内容。(思路基于论文Long Short-Term Memory)

其中误差信号δj(t)\delta_j(t)的计算和正常的BP一样,误差取msemse(均方误差),以t时刻为例:

δj(t+1)=f′j(netj(t+1))(dj(t+1)−yj(t+1))

\delta_j(t+1) = f^{'}_j (net_j(t+1))(d_j(t+1)-y_j(t+1))

δj(t)=f′j(netj(t))∑i=1nwijδi(t+1)

\delta_j(t) = f^{'}_j (net_j(t))\sum_{i=1}^{n}w_{ij}\delta_i(t+1)
即: 当前层单元jj的误差信号为:此单元的激活函数的导数 * ∑ni=1\sum_{i=1}^n(本层(m)单元j对其后一层(m+1)的单元i权值参数 * 单元i的m+1层误差信号)

其中,yj(t+1)=fj(netj(t+1))y_j(t+1)=f_j(net_j(t+1))为预测值,dj(t+1)d_j(t+1)为实际值,nn为每个RNN层的单元个数,这里统一都设置为nn。

每一层的权值调整公式为

Δwjk(t)=−δj(t)yk(t−1)

\Delta w_{jk}(t) = -\delta_j(t)y_k(t-1)

对不同时刻tt和t−qt-q,分别取单元UU和单元VV为目标单元,分析误差信号的关系

对RNN网络,在t−qt-q时刻的的误差信号的比较可以通过以下递归函数来求解:

对q>1q>1的情况,将上面的递归式展开后可以得到:

显然,这是连乘积的形式,当出现下图情形时:

梯度就会随着q的增大而呈指数增长,那么网络的参数更新会引起非常大的震荡。
如果出现:

梯度就会慢慢消失(趋近于0),导致学习无效。一般激活函数用simoid函数,它的导数最大值是0.25, 权值最大值要小于4才能保证不会小于1,所以一般的CNN/RNN中选用tanh比较多了。

为了避免梯度消失和梯度爆炸,一个简单(Naive)的做法是强制让流过每个神经元的误差都为1(也可以理解成:“误差信号不随时间步的变化而发生变化“)
思路是这样的:

  • ① 假设每一个LSTM层只有一个单元jj,那么误差信号的传递公式变为:

    δj(t)=f′j(netj(t))wjjδj(t+1)

    \delta_j(t) = f^{'}_j (net_j(t))w_{jj}\delta_j(t+1)

  • ② 这里假设f′j(netj(t))wjj=1.0f^{'}_j (net_j(t))w_{jj} = 1.0,即 δj(t)=δj(t+1)\delta_j(t) = \delta_j(t+1)
    并且,可以推出fj(netj(t))f_j (net_j(t))的形式为:

    fj(netj(t))=netj(t)wjj

    f_j (net_j(t)) = \frac{net_j(t)}{w_{jj}}

其中,wjjw_{jj}为RNN单元自己到自己的权值(不同time step),激活函数fj(netj(t))f_j (net_j(t))是线性的。这样就保证了误差将以常数的形式在网络中流动,不会出现梯度爆炸或者梯度消失的问题,把这样的结构称为CEC(constant error carousel)。但是这种做法存在着权重冲突的问题,所以加上了门结构做控制(这里不细说了,参考LSTM那篇译文。)

误差呈指数增长的现象比较少,误差消失在BPTT中很常见。在原论文中还有更详细的数学分析,但是了解到此个人觉的已经足够理解问题所在了。


参考资料

①LSTM学习笔记
②知乎:LSTM如何来避免梯度弥散和梯度爆炸?
③LSTM简介以及数学推导

RNN中BPTT的推导和可能的问题相关推荐

  1. 对 RNN 中 BPTT 求导过程的解析尝试

    (转载一次对 RNN 中 BPTT 求导过程的解析尝试 - 知乎 其中关于雅可比的内容 参考: 学习笔记之--Jacobian matrix(雅可比矩阵)学习笔记之--Jacobian matrix( ...

  2. DNN中的BP和RNN中的BPTT推导

    1.5.BP和BPTT 参考博客:http://www.cnblogs.com/pinard/p/6509630.html 1.反向传播算法(Backpropagation) 反向传播算法要解决的问题 ...

  3. RNN BPTT算法推导

    目录 BPTT算法推导 注1:激活函数tanh(x)求导 注2 softmax求导 BPTT算法推导 对于一个普通的RNN来说,其前向传播过程为: 先介绍一下等下计算过程中会用到的偏导数:   关于t ...

  4. 【keras】rnn中的LSTM

    keras rnn中常见的rnn layer 1. LSTM LSTM内部结构如下, 公式为 inputgate:it=σ(Wixt+Uih(t−1))forgetgate:ft=σ(Wfxt+Ufh ...

  5. python中的字典推导式_python 字典推导式(经典代码)(22)

    文章首发微信公众号,微信搜索:猿说python 在昨天的文章中,我们介绍了关于字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要 ...

  6. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable

    TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable 目录 输出结果 代码设计 输出结果 代码设计 # tensorflow中的两种定义scope(命 ...

  7. CNN和RNN中如何引入BatchNorm

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 Batch Normalization的基本思路和价值在之前一篇文章"Batch Norma ...

  8. python中的字典推导式_17.python 字典推导式(经典代码)

    在昨天的文章中,我们介绍了关于** python列表推导式** 的使用,字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{ ...

  9. Python 中的列表推导式

    Python 中的列表推导式 简单用法 添加多个条件 多个列表使用 替换 Reduce 和 Lambda 嵌套列表推导式 列表推导式是一种 Python 构造,可减少生成新列表或过滤现有列表所需的代码 ...

最新文章

  1. 从源码分析DEARGUI之add_menu
  2. 0902 - Preferences Permission
  3. 博图wincc连接数据块_西门子博途WINCC 可通过创建画面模板提高编程效率
  4. Linux下查看进程对应的命令绝对路径
  5. item不可见 recycleview_你不知道的 TypeScript 高级技巧
  6. 任务状态段(Task State Segment)
  7. 用差分法求解burger方程 matlab,偏微分方程数值解上机实验.doc
  8. sql 2000 数据库置疑
  9. 记录阿里技术面试全流程
  10. fences卸载_fences是什么意思?WIN10专业版彻底删除fences的技巧
  11. 雅思备考-口语词组积累-第二章
  12. Prometheus监控kubernetes
  13. ubuntu下搭建pptp服务器
  14. PostgreSQL16中pg_dump的LZ4和ZSTD压缩
  15. C++设计原则——开闭原则(持续更新中)
  16. Presto(4)presto客户端查询保存成文件
  17. 2个硬盘对拷操作图解步骤
  18. 欧盟RoHS测试新规来了
  19. python 特效字_Python的文字特效,炫酷了!
  20. 计算机一级重点知识,计算机一级重点知识.doc

热门文章

  1. linux内核漏洞分类,blog/linux kernel double-free类型漏洞的利用.md at master · snorez/blog · GitHub...
  2. linux下打开png图片不显示,r – 无法显示png
  3. Python编程入门教程(以在线评测平台为载体)
  4. 利用requests库抓取猫眼电影排行
  5. 无监督学习 聚类分析②
  6. android实现电话通信原理,电话通信原理.pdf
  7. 想转SAP FICO顾问的必看(转)
  8. js判断一个对象是否是空对象
  9. JavaFX 皮肤功能
  10. foxmail皮肤_七大改变!Foxmail 6.5新功能体验