循环神经网络 (RNN)
RNN是什么
循环神经网络即recurrent neural network,它的提出主要是为了处理序列数据,序列数据是什么?就是前面的输入和后面的输入是有关联的,比如一句话,前后的词都是有关系的,“我肚子饿了,准备去xx”,根据前面的输入判断“xx”很大可能就是“吃饭”。这个就是序列数据。
循环神经网络有很多变种,比如LSTM、GRU等,这里搞清楚基础的循环神经网络的思想,对于理解其他变种就比较容易了。
与传统神经网络区别
下图是我们经典的全连接网络,从输入层到两个隐含层再到输出层,四层之间都是全连接的,而且层内之间的节点不相连。这种网络模型对于序列数据的预测就基本无能为力,比如某句话的下一个单词是什么就很难处理。
循环神经网络则擅长处理序列数据,它会对前面的信息进行记忆并且参与当前输出的计算,理论上循环神经网络能处理任意长度的序列数据。
RNN模型
RNN模型最抽象的画法就是下面这种了,但它不太好理解,因为它将时间维度挤压了。其中x是输入,U是输出层到隐含层的权重,s是隐含层值,W则是上个时刻隐含层作为这个时刻输入的权重,V是隐含层到输出层的权重,o是输出。
为方便理解,将上图展开,现在可以清楚看到输入x、隐层值s和输出o都有了下标t,这个t表示时刻,t-1是上一时刻,t+1则是下一时刻。不同时刻输入对应不同的输出,而且上一时刻的隐含层会影响当前时刻的输出。
那么反应到神经元是怎样的呢?如下图,这下就更清晰了,输入的3个神经元连接4个隐含层神经元,然后保留隐含层状态用于下一刻参与计算。
RNN的正向传播
还是使用这张图进行说明,设输出层的输入为nett,则很容易可以得到输出,
nett=Vst
ot=σ(nett)
其中σ是激活函数,再设隐含层的输入为ht
ht=Uxt+Wst−1
st=σ(ht)
可以继续往前一个时刻推,有
st=σ(Uxt+Wσ(Uxt−1+Wst−2))
而t-2时刻又可以用t-3时刻来表示,从这就可以看出循环神经网络具有记忆,可以往前看任意个输入。
RNN的训练
假设损失函数为
E
在t时刻,根据误差逆传播,有
∂Et∂nett=∂Et∂ot∂ot∂nett=E′(ot)σ′(nett)
首先,我们来看看对V的求导,每个时刻t的误差至于当前时刻的误差相关,则
∂Et∂V=∂Et∂nett∂nett∂V=∂Et∂nettst
其次,对W求导,对于一个训练样本,所有时刻的误差加起来才是这个样本的误差,某时刻t对W求偏导为,
∂Et∂W=∂Et∂nett∂nett∂st∂st∂W
其中st=σ(Uxt+Wσ(Uxt−1+Wst−2))一直依赖上个时刻,某个样本的总误差是需要所有时刻加起来,不断对某个时刻进行求偏导,误差一直反向传播到t为0时刻,则
∂E∂W=∑t∂Et∂W=∑tk=0∂Et∂nett∂nett∂st(∏tj=k+1∂st∂sk)∂sk∂W
其中∂st∂sk根据链式法则是会一直乘到k
时刻,k可以是0、1、2…,那么上式可以表示成,
∂E∂W=∑tk=0∂Et∂nett∂nett∂st∂st∂sk∂sk∂W
最后,对U求导,
∂E∂U=∂E∂ht∂ht∂U=∂E∂htxt
通过上面实现梯度下降训练。
梯度消失或梯度爆炸
对于tanh和sigmoid激活函数的RNN,我们说它不能很好的处理较长的序列,这个是为什么呢?简单说就是因为RNN很容易会存在梯度消失或梯度爆炸问题,发生这种情况时RNN就捕捉不了很早之前的序列的影响。
为什么会这样?接着往下看,tanh和sigmoid的梯度大致如下图所示,两端的梯度值都基本接近0了,而从上面的求导公式可以看到
∂E∂W=∑t∂Et∂W=∑tk=0∂Et∂nett∂nett∂st(∏tj=k+1∂st∂sk)∂sk∂W
其中有个连乘操作,而向量函数对向量求导结果为一个Jacobian矩阵,元素为每个点的导数,离当前时刻越远则会乘越多激活函数的导数,指数型,本来就接近0的梯度再经过指数就更加小,基本忽略不计了,于是便接收不到远距离的影响,这就是RNN处理不了较长序列的原因。
而当矩阵中的值太大时,经过指数放大,则会产生梯度爆炸。
梯度爆炸会导致程序NaN,可以设置一个梯度阈值来处理。
梯度消失则可以用ReLU来替代tanh和sigmoid激活函数,或者用LSTM或GRU结构。
RNN简单应用例子
比如可以做字符级别的预测,如下图,假如这里只有四种字符,样本为”hello”单词,则输入h预测下个字符为e,e接着则输出l,l则输出l,最后输入l则输出o。
原文地址: http://blog.csdn.net/wangyangzhizhou/article/details/76278375
循环神经网络 (RNN)相关推荐
- 深度学习 -- TensorFlow(9)循环神经网络RNN
目录 一.循环神经网络RNN介绍 二.Elman network && Jordan network 三.RNN的多种架构 1.一对一 2.多对一 3.多对多 4. 一对多 5.Seq ...
- 循环神经网络(RNN、LSTM、GRU)
循环神经网络(RNN.LSTM.GRU) 目录 循环神经网络(RNN.LSTM.GRU) 概述: 计算: LSTM(长短记忆模型): GRU:
- 「NLP」 深度学习NLP开篇-循环神经网络(RNN)
https://www.toutiao.com/a6714260714988503564/ 从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环 ...
- 深度学习~循环神经网络RNN, LSTM
目录 1. 循环神经网络RNN 1.1 RNN出现背景 1.2 RNN概念 2. LSTM 2.1 LSTM出现背景 2.2 LSTM结构 参考 1. 循环神经网络RNN 1.1 RNN出现背景 pr ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
循环神经网络(RNN, Recurrent Neural Networks)介绍 循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural ...
- DL之RNN:循环神经网络RNN的简介、应用、经典案例之详细攻略
DL之RNN:循环神经网络RNN的简介.应用.经典案例之详细攻略 目录 循环神经网络RNN的简介 1.RNN的分类 1.RNN的常见算法分类 2.RNN的三种分类
- 【NLP】 深度学习NLP开篇-循环神经网络(RNN)
从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环神经网络(RNN).首先,会介绍RNN提出的由来:然后,详细介绍RNN的模型结构,前向传播和 ...
- Pytorch实现基本循环神经网络RNN (3)
1.47.Pytorch实现基本循环神经网络RNN (3) Recurrent Neural networks(Rumelhart, 1986)主要用来处理序列型数据,具有对以往数据的记忆功能.下图所 ...
- [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例
从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇讲解了TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的 ...
- 循环神经网络(RNN)相关知识
文章目录 RNN概述 前向传播公式 通过时间反向传播(BPTT) RNN确定序列长度方式 其他RNN结构 基于RNN的应用 1,序列数据的分析 2,序列数据的转换 3,序列数据的生成 RNN的不足 1 ...
最新文章
- boost::gil::channel_view用法的测试程序
- php并行运算,php多进程并行执行脚本的代码
- Python之爬虫-段子网
- python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
- Hibernate SQL方言
- java接收json字符串_JAVA后台接收前台传过来的json字符串并解析获得key 和value
- 反思 大班 快乐的机器人_幼儿园大班教案《蚂蚁宝宝钻洞》含反思
- WEB前端开发规范文档
- 诛仙2·末日与曙光》解禁公测
- python解释器的下载与安装
- 不服!女性为何成为科技领域的“隐形人”?讲讲崛起中的“她”力量
- 操作系统和编程语言简单描述
- Word文档丢失找回之没有保存Word文档就关闭了怎么解决
- LyricsX for Mac(桌面歌词显示器)
- 【JavaEE】网络编程基础之Socket套接字
- 2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?
- CMOS器件与TTL器件CMOS电平与TTL电平
- 高中数学40分怎么办_高中数学补课能听懂考试40分
- python入门 数据类型(七种数据类型,序列,元素)
- 密码开锁:浙大版C语言程序设计