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)相关推荐

  1. 深度学习 -- TensorFlow(9)循环神经网络RNN

    目录 一.循环神经网络RNN介绍 二.Elman network && Jordan network 三.RNN的多种架构 1.一对一 2.多对一 3.多对多 4. 一对多 5.Seq ...

  2. 循环神经网络(RNN、LSTM、GRU)

    循环神经网络(RNN.LSTM.GRU) 目录 循环神经网络(RNN.LSTM.GRU) 概述: 计算: LSTM(长短记忆模型): GRU:

  3. 「NLP」 深度学习NLP开篇-循环神经网络(RNN)

    https://www.toutiao.com/a6714260714988503564/ 从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环 ...

  4. 深度学习~循环神经网络RNN, LSTM

    目录 1. 循环神经网络RNN 1.1 RNN出现背景 1.2 RNN概念 2. LSTM 2.1 LSTM出现背景 2.2 LSTM结构 参考 1. 循环神经网络RNN 1.1 RNN出现背景 pr ...

  5. 循环神经网络(RNN, Recurrent Neural Networks)介绍

    循环神经网络(RNN, Recurrent Neural Networks)介绍   循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural ...

  6. DL之RNN:循环神经网络RNN的简介、应用、经典案例之详细攻略

    DL之RNN:循环神经网络RNN的简介.应用.经典案例之详细攻略 目录 循环神经网络RNN的简介 1.RNN的分类 1.RNN的常见算法分类 2.RNN的三种分类

  7. 【NLP】 深度学习NLP开篇-循环神经网络(RNN)

    从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环神经网络(RNN).首先,会介绍RNN提出的由来:然后,详细介绍RNN的模型结构,前向传播和 ...

  8. Pytorch实现基本循环神经网络RNN (3)

    1.47.Pytorch实现基本循环神经网络RNN (3) Recurrent Neural networks(Rumelhart, 1986)主要用来处理序列型数据,具有对以往数据的记忆功能.下图所 ...

  9. [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇讲解了TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的 ...

  10. 循环神经网络(RNN)相关知识

    文章目录 RNN概述 前向传播公式 通过时间反向传播(BPTT) RNN确定序列长度方式 其他RNN结构 基于RNN的应用 1,序列数据的分析 2,序列数据的转换 3,序列数据的生成 RNN的不足 1 ...

最新文章

  1. boost::gil::channel_view用法的测试程序
  2. php并行运算,php多进程并行执行脚本的代码
  3. Python之爬虫-段子网
  4. python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
  5. Hibernate SQL方言
  6. java接收json字符串_JAVA后台接收前台传过来的json字符串并解析获得key 和value
  7. 反思 大班 快乐的机器人_幼儿园大班教案《蚂蚁宝宝钻洞》含反思
  8. WEB前端开发规范文档
  9. 诛仙2·末日与曙光》解禁公测
  10. python解释器的下载与安装
  11. 不服!女性为何成为科技领域的“隐形人”?讲讲崛起中的“她”力量
  12. 操作系统和编程语言简单描述
  13. Word文档丢失找回之没有保存Word文档就关闭了怎么解决
  14. LyricsX for Mac(桌面歌词显示器)
  15. 【JavaEE】网络编程基础之Socket套接字
  16. 2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?
  17. CMOS器件与TTL器件CMOS电平与TTL电平
  18. 高中数学40分怎么办_高中数学补课能听懂考试40分
  19. python入门 数据类型(七种数据类型,序列,元素)
  20. 密码开锁:浙大版C语言程序设计

热门文章

  1. HDOJ 2176 取石子游戏
  2. 吴恩达 coursera AI 第三课总结+作业答案
  3. 从理论角度理解L1、L2正则化
  4. GPU 共享内存bank冲突(shared memory bank conflicts)
  5. 基于socket网络编程技术实现TCP和UDP的流程详解及实例
  6. 修改$_env php,Laravel如何友好的修改.env配置文件详解
  7. 2020中级财管(押题班)
  8. 《秋暮登北楼》王武陵
  9. 云炬随笔20171227
  10. c4d流体插件_【C4D】流体插件详细讲解