文章目录

  • 1. 什么是RNN
    • 1.1 RNN的应用
    • 1.2 为什么有了CNN,还要RNN?
    • 1.3 RNN的网络结构
    • 1.4 双向RNN
    • 1.5 BPTT算法
  • 2. 其它类型的RNN
  • 3. CNN与RNN的区别
  • 4. 为什么RNN 训练的时候Loss波动很大
  • 5. 实例代码

1. 什么是RNN

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)

1.1 RNN的应用

  • 文本生成(生成序列)
  • 机器翻译
  • 看图说话
  • 文本(情感)分析
  • 智能客服
  • 聊天机器人
  • 语音识别
  • 搜索引擎
  • 个性化推荐

1.2 为什么有了CNN,还要RNN?

  • 传统神经网络(包括CNN),输入和输出都是互相独立的。图像上的猫和狗是分隔开的,但有些任务,后续的输出和之前的内容是相关的。例如:我是中国人,我的母语是____。这是一道填空题,需要依赖于之前的输入。
  • 所以,RNN引入“记忆”的概念,也就是输出需要依赖于之前的输入序列,并把关键输入记住。循环2字来源于其每个元素都执行相同的任务。
  • 它并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来存储之前时间步的信息。

1.3 RNN的网络结构

首先先上图,然后再解释:

现在我们考虑输⼊数据存在时间相关性的情况。假设 Xt∈Rn∗dX_t\in_{}\mathbb{R}^{n*d}Xt​∈​Rn∗d 是序列中时间步t的小批量输⼊,Ht∈Rn∗hH_t\in_{}\mathbb{R}^{n*h}Ht​∈​Rn∗h 是该时间步的隐藏变量。那么根据以上结构图当前的隐藏变量的公式如下:

Ht=ϕ(XtWxh+Ht−1Whh+bh)H_t=\phi(X_tW_{xh}+H_{t-1}W_{hh}+b_h)Ht​=ϕ(Xt​Wxh​+Ht−1​Whh​+bh​)

从以上公式我们可以看出,这⾥我们保存上⼀时间步的隐藏变量 Ht−1H_{t-1}Ht−1​,并引⼊⼀个新的权重参数,该参数⽤来描述在当前时间步如何使⽤上⼀时间步的隐藏变量。具体来说,时间步 t 的隐藏变量的计算由当前时间步的输⼊和上⼀时间步的隐藏变量共同决定。 ϕ\phiϕ 函数其实就是激活函数。

我们在这⾥添加了 Ht−1WhhH_{t-1}W_{hh}Ht−1​Whh​ ⼀项。由上式中相邻时间步的隐藏变量 Ht和Ht−1H_t 和H_{t-1}Ht​和Ht−1​ 之间的关系可知,这⾥的隐藏变量能够捕捉截⾄当前时间步的序列的历史信息,就像是神经⽹络当前时间步的状态或记忆⼀样。因此,该隐藏变量也称为隐藏状态。由于隐藏状态在当前时间步的定义使⽤了上⼀时间步的隐藏状态,上式的计算是循环的。使⽤循环计算的⽹络即循环神经⽹络(recurrent neural network)。

在时间步t,输出层的输出和多层感知机中的计算类似:

Ot=HtWhq+bqO_t=H_tW_{hq}+b_qOt​=Ht​Whq​+bq​

1.4 双向RNN

之前介绍的循环神经⽹络模型都是假设当前时间步是由前⾯的较早时间步的序列决定的,因此它
们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后⾯时间步决定。例如,
当我们写下⼀个句⼦时,可能会根据句⼦后⾯的词来修改句⼦前⾯的⽤词。**双向循环神经⽹络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。**下图演⽰了⼀个含单隐藏层的双向循环神经⽹络的架构。

在双向循环神经⽹络的架构中,设该时间步正向隐藏状态为 H→t∈Rn∗h\overrightarrow{H}_t\in_{}\mathbb{R}^{n*h}Ht​∈​Rn∗h(正向隐藏单元个数为h),反向隐藏状态为 H←t∈Rn∗h\overleftarrow{H}_t\in_{}\mathbb{R}^{n*h}Ht​∈​Rn∗h(反向隐藏单元个数为h)。我们可以分别
计算正向隐藏状态和反向隐藏状态:

H→t=ϕ(XtWxh(f)+H→t−1Whh(f)+bh(f))\overrightarrow{H}_t=\phi(X_tW_{xh}^{(f)}+\overrightarrow{H}_{t-1}W_{hh}^{(f)}+b_h^{(f)})Ht​=ϕ(Xt​Wxh(f)​+Ht−1​Whh(f)​+bh(f)​)

H←t=ϕ(XtWxh(b)+H←t−1Whh(b)+bh(b))\overleftarrow{H}_t=\phi(X_tW_{xh}^{(b)}+\overleftarrow{H}_{t-1}W_{hh}^{(b)}+b_h^{(b)})Ht​=ϕ(Xt​Wxh(b)​+Ht−1​Whh(b)​+bh(b)​)

然后我们连结两个⽅向的隐藏状态 H→t和H←t\overrightarrow{H}_t和\overleftarrow{H}_tHt​和Ht​ 来得到隐藏状态 Ht∈Rn∗2hH_t\in_{}\mathbb{R}^{n*2h}Ht​∈​Rn∗2h,并将其输⼊到输出层。输出层计算输出 Ot∈Rn∗qO_t\in_{}\mathbb{R}^{n*q}Ot​∈​Rn∗q(输出个数为q):

Ot=HtWhq+bqO_t=H_tW_{hq}+b_qOt​=Ht​Whq​+bq​

双向循环神经⽹络在每个时间步的隐藏状态同时取决于该时间步之前和之后的⼦序列(包
括当前时间步的输⼊)。

1.5 BPTT算法

在之前你已经见过对于前向传播(上图蓝色箭头所指方向)怎样在神经网络中从左到右地计算这些激活项,直到输出所有地预测结果。而对于反向传播,我想你已经猜到了,反向传播地计算方向(上图红色箭头所指方向)与前向传播基本上是相反的。

我们先定义一个元素损失函数:

L(t)(y′(t),y(t))=−y(t)logy′(t)−(1−y′(t))log(1−y′(t))L^{(t)}(y^{'(t)},y^{(t)})=-y^{(t)}logy^{'(t)}-(1-y^{'(t)})log(1-y^{'(t)})L(t)(y′(t),y(t))=−y(t)logy′(t)−(1−y′(t))log(1−y′(t))

整个序列的损失函数:

L(y′,y)=∑t=1TxL(t)(y′(t),y(t))L(y^{'},y)=\sum_{t=1}^{T_x}L^{(t)}(y^{'(t)},y^{(t)})L(y′,y)=t=1∑Tx​​L(t)(y′(t),y(t))$

在这个计算图中,通过y′(1)y^{'(1)}y′(1)可以计算对应的损失函数,于是计算出第一个时间步的损失函数,然后计算出第二个时间步的损失函数,然后是第三个时间步,一直到最后一个时间步,最后为了计算出总体损失函数,我们要把它们都加起来,通过等式计算出最后的?,也就是把每个单独时间步的损失函数都加起来。然后你就可以通过导数相关的参数,用梯度下降法来更新参数。

在这个反向传播的过程中,最重要的信息传递或者说最重要的递归运算就是这个从右到左的运算,这也就是为什么这个算法有一个很别致的名字,叫做**“通过(穿越)时间反向传播(backpropagation through time)”。**取这个名字的原因是对于前向传播,你需要从左到右进行计算,在这个过程中,时刻?不断增加。而对于反向传播,你需要从右到左进行计算,就像时间倒流。“通过时间反向传播”,就像穿越时光,这种说法听起来就像是你需要一台时光机来实现这个算法一样。

2. 其它类型的RNN

  • **One to one:**这个可能没有那么重要,这就是一个小型的标准的神经网络,输入?然后得到输出?。

  • **One to many:**音乐生成,你的目标是使用一个神经网络输出一些音符。对应于一段音乐,输入?

    可以是一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符,并且如果你什么都不想输入,?可以是空的输入,可设为 0 向量。

  • **Many to one:**句子分类问题,输入文档,输出文档的类型。

  • **Many to many():**命名实体识别。

  • **Many to many():**机器翻译。

3. CNN与RNN的区别

类别 特点描述
相同点 1、传统神经网络的扩展。
2、前向计算产生结果,反向计算模型更新。
3、每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。
不同点 1、CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算
2、RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出

4. 为什么RNN 训练的时候Loss波动很大

由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,learning rate没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏,为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。

5. 实例代码

TensorFlow实现RNN

【机器学习通俗易懂系列文章】


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

欢迎大家加入讨论!共同完善此项目!群号:【541954936】

通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)相关推荐

  1. TensorFlow练手项目二:基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器 2019.01.02更新: 代码比较老了,当时的开发环境为Python 2.7 + TensorFlow 1.4,现在可能无法直接运行了.如果有兴趣,可以移步我 ...

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

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

  3. Tensorflow与keras学习 (3)——循环神经网络RNN

    循环神经网络RNN 3.1 RNN与LSTM介绍: 循环神经网络中的神经单元类似于模拟数字电路技术中的门电路,具有很多控制门来控制输入输出. RNN结构: LSTM结构: 相比与传统的神经网络,RNN ...

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

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

  5. 通过keras例子理解LSTM 循环神经网络(RNN)

    博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...

  6. [深度学习-原理篇]什么是循环神经网络RNN与LSTM

    1. 什么是 RNN 循环神经网络(Recurrent Neural Network,RNN)是一种以序列数据为输入来进行建模的深度学习模型,它是 NLP 中最常用的模型. 2. RNN 的结构 RN ...

  7. 第六章_循环神经网络(RNN)

    文章目录 第六章 循环神经网络(RNN) CNN和RNN的对比 http://www.elecfans.com/d/775895.html 6.1 为什么需要RNN? 6.1 RNN种类? RNN t ...

  8. 使用循环神经网络(RNN)实现影评情感分类

    最近由于做论文的补充实验,需要在rnn上做一下算法验证.找了一下这个博客写的挺好的,但是也有一些bug,暂时先记录一下. 使用循环神经网络(RNN)实现影评情感分类 作为对循环神经网络的实践,我用循环 ...

  9. python输出一首诗_基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器,具体内容如下 之前在手机百度上看到有个"为你写诗"功能,能够随机生成古诗,当时感觉很酷炫= = 在学习了深度学习后,了解了一下原理,打算自己 ...

最新文章

  1. MySQL知识梳理与命令操作
  2. freeCodeCamp:Find the Longest Word in a String
  3. python 开放_Python
  4. 常使用的webserver地址
  5. 在HTML中怎么去掉超链接的下划线?
  6. 第五节 CImage和CBmp(二)
  7. gogs可以自动化部署吗_效率提升利器:你还害怕自动化部署吗?
  8. hibernate简单入门教程(四)---------关联映射
  9. [51nod1116]K进制下的大数
  10. java 获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式(性程安全模式与不安全)
  11. 物流货代公司管理系统
  12. Kafka配置4--Windows下配置Kafka的SSL证书
  13. php html转ubb,php实现转换ubb代码的方法
  14. C语言strcmp函数用法
  15. Access根据出生日期计算年龄_从身份证号码计算年龄
  16. matlab中普通电感,matlab电感在哪
  17. 在下拉列表框上添加--请选择--
  18. drupal用户注册邮件smtp及社会化登录模块安装
  19. JScript 方法
  20. 各个排序算法的时间复杂度、稳定性、快排的原理以及图解

热门文章

  1. 入坑 c计划 day 1
  2. 【数据库技术】2PL(两阶段锁)下的死锁与饥饿处理手段
  3. 为什么人到了中年会喜欢上养花?养花能给人带来什么?
  4. 局部路径规划器teb_local_planner详解3:跟随全局planner
  5. 怎么才能把windows里的文件复制到虚拟机的linux中去
  6. iFixit高清完整拆解:iPhone 7 Plus
  7. Linux虚拟机配置网络代理配置yum源
  8. 【技术贴】全盘文件夹快捷方式 杀毒后快捷方式消失,但文件夹打不开。重装系统后还是快捷方式的解决办法。...
  9. Python操作Excel的Xlwings教程(八)——Excel使用VBA调用Python
  10. 数据结构中的算法,算法的定义与特征