循环神经网络RNN原理
一、循环神经网络简介
循环神经网络,英文全称:Recurrent Neural Network,或简单记为RNN。需要注意的是,递归神经网络(Recursive Neural Network)的简写也是RNN,但通常RNN指循环神经网络。循环神经网络是一类用于处理序列数据的神经网络。它与其他神经网络的不同是,RNN可以更好的去处理序列的信息,即认准了前后的输入之间存在关系。在NLP中,去理解一整句话,孤立的理解组成这句话的词显然是不够的,我们需要整体的处理由这些词连接起来的整个序列。
如:(1) 我饿了,我要去食堂___。(2) 我饭卡丢了,我要去食堂___。很显然,第一句话是想表明去食堂就餐,而第二句则很有可能因为刚吃过饭,发现饭卡不见了,去食堂寻找饭卡。而在此之前,我们常用的语言模型是N-Gram,无论何种语境,可能去食堂大概率匹配的是“吃饭”而不在乎之前的信息。RNN就解决了N-Gram的缺陷,它在理论上可以往前(后)看任意多个词。
此文是我在学习RNN中所做的笔记,参考资料在文末提及。
二、循环神经网络分类
a.简单的MLP神经网络
简单的MLP三层网络模型,x、o为向量,分别表示输入层、输出层的值;U、V为矩阵,U是输入层到隐藏层的权重矩阵,V是隐藏层到输出层的权重矩阵。
b.循环神经网络
与简单的MLP神经网络不容的是,循环神经网络的隐藏层的值s不仅取决于当前的这次输入x,还取决于上一次隐藏层的值s。权重就在W就是隐藏层上一次的值作为这一次输入的输入的权重。将上图展开:
由上图可知以下公式,其中 V 是输出层权重矩阵,g 是激活函数;U 是输入x的权重矩阵,W 是上一次的值 st-1 作为这一次的输入的权重矩阵,f 是激活函数。
反复带入,即可得到:
可见,循环神经网络的输出值 ot 受之前的输出值 xt 、xt-1、xt-2 所影响。
c. 双向循环神经网络
双向循环神经网络的计算方法:
从上面三个公式可以看出: 正向计算时,隐藏层的值与 st 和 st-1 有关,而反向计算时,隐藏层的值与 s't 和 s't+1 有关;最终的输出取决于正向与反向计算的加和。
d、深度循环神经网络
此前介绍的循环神经网络只有一个输入层、一个循环层和一个输出层。与全连接神经网络以及卷积神经网络一样,可以把它推广到任意多个隐藏层的情况,得到深层循环神经网络。深度循环神经网络包含多个隐藏层(上图为了表示清楚,只列举了2层),并且也继承了双向循环神经网络的特点。由之前的公式类推,我们可以得到深度循环神经网络的计算方式:
深层神经网络有3个方案:第一种叫做 Deep Input-to-Hidden Function,它在循环层之前加入多个普通的全连接层,将输入向量进行多层映射之后再送入循环层进行处理。第二种方案是 Deep Hidden-to-Hidden Transition,它使用多个循环层,这和前馈神经网络类似,唯一不同的是计算隐含层输出的时候需要利用本隐含层上一时刻的值。第三种方案是 Deep Hidden-to-Output Function,它在循环层到输出层之间加入多个全连接层,这与第一种情况类似。上面公式展示的应为第二种情况。
由于循环层一般用 tanh 作为激活函数,层次过多之后会导致梯度消失问题。后面会提及。
三、网络的训练及BPTT
循环神经网络的输入是序列数据,每个训练样本是一个时间序列,包含多个相同维度的向量。网络的参数如何通过训练确定?这里就要使用解决循环神经网络训练问题的 Back Propagation Through Time 算法,简称BPTT。
循环神经网络的每个训练样本是一个时间序列,同一个训练样本前后时刻的输入值之间有关联,每个样本的序列长度可能不相同。训练时先对这个序列中的每个时刻的输入值进行正向传播,再通过反向传播计算出参数的梯度值并更新参数。
它包含三个步骤:(1)正向计算每个神经元的输出值;(2)反向计算每个神经元的误差项 δj ,它是误差函数 E 对神经元 j 的加权输入 netj 的偏导数;(3)计算每个权重的梯度;(4)用随机梯度下降算法更新权重。具体的算法推导我会在之后的笔记整理中总结。
四、梯度爆炸、梯度消失
循环神经网络在进行反向传播时也面临梯度消失或者梯度爆炸问题,这种问题表现在时间轴上。如果输入序列的长度很长,人们很难进行有效的参数更新。通常来说梯度爆炸更容易处理一些。因为梯度爆炸时,我们的程序会收到NaN的错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:
(1)合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以多开梯度消失的区域。
(2) 使用 ReLu 代替 sigmoid 和 tanh 作为激活函数。
(3) 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和 门控循环单元 (GRU),这是最流行的做法。
五、练手项目
可以参考github上比较出名的char_RNN的代码来提高自己的兴趣。该项目就是通过训练语料来自己写诗、歌、文。
下图是我的训练结果:
(1) 一首诗,这首通过RNN训练写出的诗还是不错的。“秋”与“春”是对应的,描绘的是诗人在秋日,欣赏的山中风景。不禁感叹,自己的青春已去,自己也已经白首,吟唱着这首诗(编不下去了…)。
(2) 通过自己找的《三体》全集,来训练出的小说片段。可以看到,只能模仿句式,不能有准确表达,所以逻辑不通的,但是形式是很像刘慈欣的写法了。
循环神经网络RNN原理的更多相关文章
- 循环神经网络(RNN, Recurrent Neural Networks)介绍(转载)
循环神经网络(RNN, Recurrent Neural Networks)介绍 这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...
- 通过keras例子理解LSTM 循环神经网络(RNN)
博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...
- 循环神经网络RNN及LSTM
一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数? htt ...
- 深度学习之循环神经网络RNN概述,双向LSTM实现字符识别
深度学习之循环神经网络RNN概述,双向LSTM实现字符识别 2. RNN概述 Recurrent Neural Network - 循环神经网络,最早出现在20世纪80年代,主要是用于时序数据的预测和 ...
- 循环神经网络RNN模型和长短时记忆系统LSTM
传统DNN或者CNN无法对时间序列上的变化进行建模,即当前的预测只跟当前的输入样本相关,无法建立在时间或者先后顺序上出现在当前样本之前或者之后的样本之间的联系.实际的很多场景中,样本出现的时间顺序非常 ...
- 从网络架构方面简析循环神经网络RNN
一.前言 1.1 诞生原因 在普通的前馈神经网络(如多层感知机MLP,卷积神经网络CNN)中,每次的输入都是独立的,即网络的输出依赖且仅依赖于当前输入,与过去一段时间内网络的输出无关.但是在现实生活中 ...
- 用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)
Google TensorFlow程序员点赞的文章! 前言 目录: - 向量表示以及它的维度 - rnn cell - rnn 向前传播 重点关注: - 如何把数据向量化的,它们的维度是怎么来的 ...
- 循环神经网络(RNN)模型与前向反向传播算法
在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...
随机推荐
- 关于新建XIB去关联控制器,报错- the view outlet was not set
凡事必勤,切勿眼高手低.这是我对于自己惰性的又一次的自我认识与批评.以前遇见而又解决的问题,当时没有记录,以为都是小CASE,直到积累了广泛的问题和技能,遇见了相同的问题,而又忘记了,又一次认识到笔记 ...
- spring4-3-AOP-基于配置文件
1.建立业务类和切面类 2.在配置文件中配置bean 引入命名空间:
- oracle 中时间类型 date 与 long 互转
我们在保存时间到数据库时,有时候会保存long型的数据,固定长度是13位,是用当前时间减去1970-01-01,再换算成毫秒得到的结果. 但是要考虑到时区问题中国的时区时+8区所以时间要加上8小时 o ...
- [C++] printf pitfall
printf pitfal l
- Oracle 用户验证日志
1.sysdba/sysoper 权限用户验证日志;2.非sysdba/sysoper 权限用户验证日志;3.关于sqlcode; 1.sysdba/sysoper 权限用户验证日志:在数据库设置了参 ...
- 常用工具类——DatetimeUtil
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...
- python report中文显示乱码
环境:python2.7 测试框架: nose (1.3.7) nose-html-reporting (0.2.3) 问题:生成测试报告失败的时候,报告会抓取代码中的print,打开后看到的中文是乱 ...
- route -A inet6 增加下一跳 提示错误 SIOCADDRT: No route to host
1.增加前路由表: 2. route -A inet6 增加下一跳 提示错误 SIOCADDRT: No route to host 3.删除已有的下一条路由表项: 4.再次尝试 route -A i ...
- linux命令の删除文件和文件夹 复制粘贴文件和文件夹
声明:此博文来自百度经验http://jingyan.baidu.com/article/642c9d34dcba80644a46f72d.html,谢谢分享! linux删除目录很简单,很多人还是习 ...
- Delphi xe5 控件TIdhttp的用法post,get解决中文乱码问题
网络接口如下图: 浏览器演示如下:http://xxx.xxx.xxx.xxx/web/login!doLogin?data={"password":"yy123&quo ...