目录

  • 朴素RNN与LSTM
    • 从NN到RNN
    • RNN结构
    • LSTM
  • RNN的扩展模型
    • 多层RNN
    • 双向RNN
    • 递归网络Recursive Network

注意:本篇是RNN的内容补充,关于RNN模型和BPTT可回顾:pytorch笔记本-第五课.语言模型

朴素RNN与LSTM

从NN到RNN

严格来说,全连接网络与卷积网络不适合对序列型数据进行建模,NN(Neural Networks)与ConvNN总是习惯将一个片段作为一个整体处理,没有考虑该片段以前的历史信息。因此提出循环神经网络 Recurrent neural network,最早的RNN又被称为朴素RNN,它没有LSTM或GRU中的各种复杂门结构,但已经具备对于序列信息的感知能力。

从NN与ConvNN到RNN,可以理解为 one to one 模型到 many to one 模型的迁移:

RNN结构

朴素RNN的结构如下:

输入信息xxx是经过embedding映射后的词向量,hhh是RNN输出的隐藏信息,参数AAA是RNN参数的集中表示,RNN每一步的参数AAA都是同一个参数(参数共享),上图的朴素RNN中,其信息走向可以具体描述为下图:

如果从张量计算角度看,每一步的计算为:

根据 pytorch笔记本-第五课.语言模型 中的描述,RNN每一步的计算描述为:ht=tanh(Whhht−1+Whxxt)h_{t}=tanh(W_{hh}h_{t-1}+W_{hx}x_{t})ht=tanh(Whhht1+Whxxt)现在更普遍的做法是用向量的拼接代替向量相加,目的是保留特征的更多信息,所以按照上图,RNN的每一步计算通常为:ht=tanh(A[concat(ht−1,xt)])h_{t}=tanh(A[concat(h_{t-1},x_{t})])ht=tanh(A[concat(ht1,xt)])因此,参数AAA可视为WhhW_{hh}WhhWhxW_{hx}Whx的拼接。

我们通常使用tanhtanhtanh作为激活函数,这有利于在每一次计算时,对输出进行适当的归一化,限制值的范围。

RNN虽然在每一步计算中考虑了历史信息,但实验表明,RNN容易遗忘早期历史信息,即RNN只对近期历史信息敏感,以语言模型为例,我们可以在近期信息基础上得到一个合理的词语预测结果:

sky 相对于 clouds,are 距离较近并有关联,因此根据历史信息h2h_{2}h2和输入x3x_{3}x3可以较容易地从词汇表中分类出单词 sky;

但是考虑一种情况,如果某个目标分类词语和其相关词语距离很远,由于RNN在信息传递过程中会遗忘早期历史信息,因此到目标分类的位置处,模型没有合理的输入信息,从而无法自信得到分类结果,即加大了错误分类的可能性:

如果通过实验观察该现象,可以发现梯度值有很多如下的状况:∂h100∂x0≈0,∂h101∂x0≈0,∂h102∂x6≈0\frac{\partial h_{100}}{\partial x_{0}}\approx 0,\frac{\partial h_{101}}{\partial x_{0}}\approx 0,\frac{\partial h_{102}}{\partial x_{6}}\approx 0x0h1000,x0h1010,x6h1020
即梯度消失问题,梯度消失问题正是RNN容易遗忘早期历史信息的体现。

LSTM

为了增加RNN对于早期历史信息的记忆能力,提出LSTM(Long Short-Term Memory),缓解梯度消失问题。LSTM与朴素RNN的输入输出一样,但内部结构有所区别:

LSTM主要包含4个部分:

  • 传输带 convey belt,传输带是避免梯度消失的主要改进措施,因为传输带确保信息直接在序列中流动,降低了被线性或非线性变换处理后信息失真的风险:
  • 遗忘门,用于生成向量ftf_{t}ft,每个值都在0到1之间,代表容许传输带中信息的对应位置的元素被记住的概率,0代表完全遗忘,1代表完全记住;可学习参数为WfW_{f}Wf
  • 输入门,生成的向量iti_{t}it的每个元素都在0到1之间,决定对于输入信息的接受程度,即对传输带上新增信息C~t\widetilde{C}_{t}C t的更新程度;C~t\widetilde{C}_{t}C

    t
    为经过变换的输入信息,它是传输带上的新增信息来源;
    其中,向量iti_{t}itC~t\widetilde{C}_{t}C

    t
    的计算过程如下,可学习参数为WiW_{i}WiWcW_{c}Wc


补充部分:信息的更新

传输带上信息CtC_{t}Ct的更新如下:Ct=ft⊗Ct−1+it⊗C~tC_{t}=f_{t}\otimes C_{t-1}+i_{t}\otimes\widetilde{C}_{t}Ct=ftCt1+itC

t其中,⊗\otimes代表向量的逐元素相乘,ftf_{t}ft为遗忘门的输出向量,iti_{t}itC~t\widetilde{C}_{t}C

t
来自输入门。


  • 输出门,向量oto_{t}ot决定了接收传输带信息CtC_{t}Ct到输出隐藏信息hth_{t}ht的程度,两个向量的计算过程如下(注意,LSTM的每一步输出为hth_{t}htCtC_{t}Ct),可学习参数为WoW_{o}Wo

对于一层LSTM而言,每个计算单元(由传输带,遗忘门,输入门,输出门组成)的参数都是共享的,每层LSTM学习的参数即为(Wf,Wi,Wc,Wo)(W_{f},W_{i},W_{c},W_{o})(Wf,Wi,Wc,Wo)

LSTM由于引入传输带的设计,加强了信息的传输,改善了RNN难以长期记忆的问题,从而在一定程度上缓解了梯度消失。

RNN的扩展模型

多层RNN

我们可以将RNN堆叠,构造多层RNN模型(Stacked RNN),多层的信息变换,可以加强特征提取的性能,从而获取更深层的隐藏空间下的信息表达;

多层RNN的结构如下:

上面模型的可学习参数为(A,A′,A′′)(A,A^{'},A^{''})(A,A,A)

同理,我们也可以堆叠LSTM,构成多层LSTM。

双向RNN

在最开始谈到的朴素RNN中,我们已经知道,RNN难以保留长期记忆信息,为了处理该问题,研究者提出LSTM利用传输带结构加强记忆的传输;另一种方式是双向RNN结构(Bidirectional RNN),双向RNN在长期和短期记忆信息上实现了信息的互相补充。

双向RNN结构如下:

对于双向RNN在隐藏信息的传输过程中,hhhh′h^{'}h之间是互不干扰的关系,即双向RNN本质是两个独立的RNN,只是序列的计算顺序相反;

当处理模型的输出表达时,我们则需要利用两部分信息hhhh′h^{'}h,假设对于序列沿着正向的第ttt步,模型输出为向量hth_{t}htht′h^{'}_{t}ht的拼接:concat[ht,ht′]concat[h_{t},h^{'}_{t}]concat[ht,ht]可见,双向RNN输出的信息包含了短期记忆和长期记忆,因此双向RNN具有比朴素RNN更好的表现,但可学习参数新增加了一个张量A′A^{'}A

递归网络Recursive Network

Recursive Network是比RNN更广义的神经网络,RNN是按照时序维度展开,而Recursive Network是按照图结构(空间维度)展开。

以情感分析为背景,RNN接收输入为词序列的 word embedding,经过相同的 function-f 处理后,由 function-g 计算得到情感分类结果:

对于Recursive Network,不根据时间顺序进行计算,而是将词序列根据句法结构展开为句法树(也称为Recursive Structure),句法结构的解析可以看成输入递归神经网络前的数据预处理操作,在句法树的节点上布设同一个神经网络构成递归神经网络Recursive Network:

注意,词向量和隐状态向量的维度应该相同,因为使用的总是同一个 function-f;神经网络 function-f 的堆叠方式取决于句子的Recursive Structure;另外,我们也能够看出,循环神经网络其实是递归神经网络的一个子集。

假设有一个短句子:“not very good”

根据句法将其解析为以下树结构:

应用递归神经网络得到:

对于递归神经网络的学习,像RNN一样,也是BPTT,只是此时的反向传播不是按照时间序列进行,而是按照树结构进行。

下面了解 function-f 的具体形式,以两个向量的输入方式为例:

输入aaabbb向量,输出ppp向量:p=sigmoid(W⋅Concat(a,b))p=sigmoid(W\cdot Concat(a,b))p=sigmoid(WConcat(a,b))其中,WWW为可学习参数。

第二十四课.循环神经网络RNN相关推荐

  1. 深度学习入门(六十四)循环神经网络——编码器-解码器架构

    深度学习入门(六十四)循环神经网络--编码器-解码器架构 前言 循环神经网络--编码器-解码器架构 课件 重新考察CNN 重新考察RNN 编码器-解码器架构 总结 教材 1 编码器 2 解码器 3 合 ...

  2. NeHe OpenGL第二十四课:扩展

    NeHe OpenGL第二十四课:扩展 扩展,剪裁和TGA图像文件的加载: 在这一课里,你将学会如何读取你显卡支持的OpenGL的扩展,并在你指定的剪裁区域把它显示出来.   这个教程有一些难度,但它 ...

  3. python dataframe 新列_Python第二十四课:Pandas库(四)

    Python第二十四课:Pandas库(四)点击上方"蓝字",关注我们. 不知不觉,我们已经跨越了千难万险,从零开始,一步步揭开了Python神秘的面纱.学到至今,回过头,才晓得自 ...

  4. 实践数据湖iceberg 第二十四课 iceberg元数据详细解析

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  5. 非监督特征学习与深度学习(十四)--------循环神经网络

    注:本文转载自https://github.com/exacity/simplified-deeplearning/blob/master/%E5%BE%AA%E7%8E%AF%E9%80%92%E5 ...

  6. TensorFlow精进之路(十):循环神经网络RNN

    1.概述 本来想继续学习tensorflow图像方面的应用,但是循环神经网络的某一个应用吸引到了我,所以就先学学这个循环神经网络. 2.用处 前面学习的全连接神经网络或者卷积神经网络,网络结构都是从输 ...

  7. 第三十四课.模糊神经网络

    目录 模糊理论 Fuzzy Set Fuzzy set operations Fuzzy Min Max Classifier 应用:基于模糊神经网络的水轮机调速器PID控制 模糊理论 在本篇内容中, ...

  8. 【批处理学习笔记】第二十四课:直接传递

    直接传递参数,即在使用call命令时,不使用任何参数,在子函数或子批处理里面直接对主函数(也称父批处理)里面的变量进行修改.这跟汇编语言里面的参数传递方式类似.     直接传递参数举例: ===== ...

  9. 深入浅出CChart 每日一课——快乐高四第二十四课 武当梯云纵,移花接木之Visual Basic.Net

    既然说到了C#,那么一奶同胞的VB.Net怎么能忽略呢? Visual Basic .Net和C#的内核完全一样,都是.Net,只是外在的语言形式不一样.这种情况下,调用CChart的方法也非常类似. ...

最新文章

  1. python遍历文件夹下所有文件大小_python遍历文件夹读取文件大小 | 学步园
  2. 解决weblogic页面和控制台乱码问题
  3. 那个当上非洲酋长的交大才子,如今怎么样了?
  4. jAVA 得到Map价值
  5. 查询a表有但是b表没有的数据_牛逼!一个上亿数据的报表竟然能做到秒查~
  6. 移动webhead参数
  7. typescript 怎么表示当前时间减一个月_TypeScript 入门知识点总结
  8. 安卓之上传文件,即HTTP提交表单
  9. kcf算法中cos_window是什么意思_知网/维普查重系统算法介绍(史上最详细)
  10. Docker学习总结(64)——快速理解 Docker 底层原理
  11. SQL Server执行逻辑查询时,SQL被解析的步骤
  12. java按钮禁用和启用_在浏览器中禁用(或启用)Java插件
  13. 计算机网络系统什么组成,计算机网络系统是由什么组成的
  14. vb查询mysql数据库_怎么在vb程序中查找数据库信息并显示
  15. 时钟源系统(NTP时间同步服务器)应用农产品追溯系统
  16. 12万字零碳智慧校园数字化节能监管管控平台建设方案2022
  17. 电子合同印章大小和位置调整
  18. python全国计算机,加入 Python 科目,全国计算机等级考试迎来新调整
  19. 【EXP】函数使用技巧
  20. 诈骗防范案例提醒:【韵⁢⁢达】您好, 因您用韵⁢⁢达收过12次,现复⁢制囗⁢令

热门文章

  1. TCP 为什么是三次握手,而不是两次或四次?
  2. 某程序员以阿里为原型写小说!阿里员工:每件事都是真的!网友:建议拍成电视剧!...
  3. 39岁单身程序员入住养老院,提前过上退休生活?网友:羡慕又心酸!
  4. Linux 内核代码行数达到 2700 万行量级
  5. 面试造飞机系列:面对Redis持久化连环Call,你还顶得住吗?
  6. 标量子查询产生的SQL性能瓶颈,该怎么合理优化?
  7. 从微盟36小时故障,谈谈数据安全这点事
  8. 阶段式(瀑布式)传统软件研发流程
  9. 企业/团队如何实行绩效管理,促进团队智慧高效办事?
  10. 手机调试打开控制台方法vconsole