初学RNN
FNN
定义
FNN(Feedforward Neural Network),即前馈神经网络,它是网络信息单向传递的一种神经网络,数据由输入层开始输入,依次流入隐藏层各层神经元,最终由输出层输出。其当前的输出只由当前的输入决定,任何层的输出都不会影响同级层。

以上图所示的神经网络为例,它在训练过程中通过前向计算和反向传播,不断通过调整权重系数Wi和Wo来实现学习目的。通常情况下,前馈神经网络会在空间上进行延伸,通过增加隐藏层层数与隐藏层神经元个数追求更好的学习效果。
缺点
前馈神经网络假定元素之间是相互独立的,对于序列数据,只能单独地处理序列中的每个元素,前一个输入与后一个输入在处理过程中也是完全独立的,无法捕获序列之间的依赖关系。
RNN
定义
RNN(Recurrent Neural Network),即循环神经网络,它是一种主要用来处理序列数据的神经网络,它关注了隐藏层每个神经元在时间维度上的变化,其中循环说成递推可能会更直观一些,本质就是同一个网络接收当前时刻的输入和上一时刻隐藏层神经元的输出,沿着时序反复迭代以实现对序列数据的学习。
结构
直观结构

在上图中, RNN 的每个时刻,输入层的x1和x2都在Wi的作用下传入隐藏层,上一时刻的隐藏层输出也通过Wh传入当前的隐藏层,因此它相当于可以间接访问之前的所有输入,这就是为什么说RNN可以保存记忆。
内部结构

上图展示了RNN在三个相邻时刻的计算逻辑。 在任意时刻t,隐藏层状态的计算可以被视为:
- 拼接t时刻的输入Xt和t−1时刻的隐藏层状态Ht−1,得到新的张量[Xt,Ht-1];
- 将新的张量送入带有激活函数φ的全连接层,激活函数常用tanh或者relu, 全连接层的输出是t时刻的隐藏层状态Ht。
在t时刻,隐藏层状态Ht的计算公式为:

在t时刻,输出层的输出计算公式为:

参数说明:
- Xt是t时刻的输入,它是一个向量;
- Wi是输入层到隐藏层的权重矩阵;
- Ht-1是t-1时刻的隐藏层状态,在初始时刻,会给隐藏层设置初始状态H0;
- Wh是隐藏层上一时刻的值作用于当前时刻的权重矩阵;
- Wo是隐藏层到输出层的权重矩阵;
- bh是和bo是偏置系数。
注意:
- 在不同时刻,RNN总是使用这些模型参数,其参数开销不会随着时间的增加而增加。
- 隐藏层状态中XtWi+Ht-1Wh的计算,相当于Xt和Ht-1的拼接与Wi和Wh的拼接进行矩阵乘法。
- RNN和前馈神经网络一样,也是通过反向传播来更新权重,以达到学习的效果。
应用
1-N类型,输入一张图片,输出一段话或者一段音乐,利用它可以实现看图说话。

N-1类型,输入一段话,输出对其情感类别的判断,利用它可以实现文本分类。

N-N类型,输入和输出是等长的序列,可以用来生成等长的诗歌。

N-M类型,输入和输出是不等长的序列,也被叫做Encoder-Decoder模型或Seq2Seq模型,可以应用在机器翻译、文本摘要、阅读理解等多个领域上。


变体
BRNN(Bidirectional RNN)

RNN的一个主要问题是只能从以往的输入进行学习,也就是只能理解上下文中的上文,为了拥有更好的学习效果,因此提出了双向RNN,也就是BRNN。 BRNN会在原有RNN的基础上再加一个隐藏层,该隐藏层的状态是从后向前传播的,从序列的终点开始读取,称为后向层;而原有的从序列起点开始读取的隐藏层称为前向层。 BRNN的隐藏层状态的计算可以被视为:
- 根据输入序列计算前向层隐藏层状态H1;
- 将输入序列反转,计算后向层隐藏层状态H2;
- 将H1和H2拼接起来,得到最终隐藏层状态H,H=[H1,H2]。
注意,只有能拿到整个输入序列时才能使用BRNN 。
DRNN(Deep RNN)

与前馈神经网络不同,RNN因为考虑了时间维度,隐藏层达到三层就算多的了。
优缺点
优点
- RNN可以处理序列信息,且内部结构简单,对计算资源的要求低。
缺点
RNN是一个时序模型,每个时刻的计算都依赖于前一时刻的结果,计算速度慢;
RNN由于梯度消失,难以支持长序列,不能捕获序列中长期的依赖关系;
RNN网络在时间维度上是串联的,离当前时间越远的隐藏层输出,对当前隐藏层的输出影响越小,它无法根据不同词本身的重要性对当前的输出产生影响;
RNN对所有输入是同等对待的,提取了所有的信息,没有区分有用信息、无用信息和辅助信息。但是如果某个网络可以根据不同输入的重要性,选择性地丢弃和记忆,就可以使得有效信息即使距离当前时间较远,也能有较大影响,实现长期记忆,这就引出了LSTM。
主要参考
- 《动手学深度学习》第8章第4节;
- 网络上相关资料。
初学RNN的更多相关文章
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 完全图解RNN、RNN变体、Seq2Seq、Attention机制
完全图解RNN.RNN变体.Seq2Seq.Attention机制 本文主要是利用图片的形式,详细地介绍了经典的RNN.RNN几个重要变体,以及Seq2Seq模型.Attention机制.希望这篇文章 ...
- TensorFlow初学
TensorFlow初学 基本概念 1.激活函数和成本函数 激活函数(activation function):一般是非线性函数,就是每个神经元通过这个函数将原有的来自其他神经的输入做一个非线性变化, ...
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 初学Vue2.0--基础篇
概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...
- RNN求解过程推导与实现
RNN求解过程推导与实现 RNN LSTM BPTT matlab code opencv code BPTT,Back Propagation Through Time. 首先来看看怎么处理RNN. ...
- 在RNN中使用Dropout
dropout在前向神经网络中效果很好,但是不能直接用于RNN,因为RNN中的循环会放大噪声,扰乱它自己的学习.那么如何让它适用于RNN,就是只将它应用于一些特定的RNN连接上. LSTM的长期记 ...
- 初学Python
初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...
随机推荐
- K8S之YAML配置文件
通过 YAML 配置文件 部署 Deployment 使用命令(类似 docker-compose) // 部署 kubectl create -f xxx.yml // 删除 kubectl del ...
- Linux 上安装 PostgreSQL
打开 PostgreSQL 官网 https://www.postgresql.org/,点击菜单栏上的 Download ,可以看到这里包含了很多平台的安装包,包括 Linux.Windows.Ma ...
- CentOS7内置Realtek网卡驱动r8169降级r8168
前几天装了几台服务器测试,在使用的过程中发现,每次重启系统,登录界面会弹出网卡提示 "r8169 0000:02:00 eth0 Invalid ocp reg 17758!" ...
- (Bug修复)C#爬虫,让你不再觉得神秘
Bug修复 https://github.com/ZhangQueque/quewaner.Crawler/issues/1 修复加载Https网址中午乱码,导致Node解析失败的问题 1.使用第三方 ...
- HDU4991 Ordered Subsequence (树状数组优化DP)
dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数. 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i. 求解目标:sum(dp[k ...
- SSM项目环境快速搭建
SSM项目的环境搭建 环境搭建的目标 工程创建 创建父工程 创建空 maven工程 xxx-parent 作为父工程 修改父工程中的 pom.xml <!--?xml version=" ...
- Java开发学习(三十七)----SpringBoot多环境配置及配置文件分类
一.多环境配置 在工作中,对于开发环境.测试环境.生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配 ...
- C语言之走迷宫深度和广度优先(利用堆栈和队列)
完成以下迷宫 利用二维数组储存每一个数组里的值,若是不能走则为1,若是可行就是0,走过了就设为2. 一般是再复制一个数组,用来记录. 堆栈的思想就是将一个点的上下左右都遍历一遍,若可行进栈,跳出遍历, ...
- NLP之基于TextCNN的文本情感分类
TextCNN @ 目录 TextCNN 1.理论 1.1 基础概念 最大汇聚(池化)层: 1.2 textCNN模型结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 基础概念 在 ...
- 类的编写模板之简单Java类
简单Java类是初学java时的一个重要的类模型,一般由属性和getter.setter方法组成,该类不涉及复杂的逻辑运算,仅仅是作为数据的储存,同时该类一般都有明确的实物类型.如:定义一个雇员的类, ...