循环神经网络(RNN)原理通俗解释

  • 1.RNN怎么来的?
  • 2.RNN的网络结构及原理
  • 3.RNN的改进1:双向RNN
  • 4.RNN的改进2:深层双向RNN
    • 4.1 Pyramidal RNN
  • 5.RNN的训练-BPTT
  • 6.RNN与CNN的结合应用:看图说话
  • 7.RNN项目练手

1.RNN怎么来的?

循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使用,学习出来的东西没有逻辑,所以要想真正让它更有用,路还很远。

这是一般的神经网络应该有的结构: 

既然我们已经有了人工神经网络和卷积神经网络,为什么还要循环神经网络? 
原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。 
但现实世界中,很多元素都是相互连接的,比如股票随时间的变化,一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去__________.这里填空,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,但机会要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

2.RNN的网络结构及原理

它的网络结构如下: 

其中每个圆圈可以看作是一个单元,而且每个单元做的事情也是一样的,因此可以折叠呈左半图的样子。用一句话解释RNN,就是一个单元结构重复使用。

RNN是一个序列到序列的模型,假设xt−1,xt,xt+1xt−1,xt,xt+1是一个输入:“我是中国“,那么ot−1,otot−1,ot就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是ot+1ot+1应该是”人”的概率比较大。

因此,我们可以做这样的定义:

Xt:表示t时刻的输入,ot:表示t时刻的输出,St:表示t时刻的记忆Xt:表示t时刻的输入,ot:表示t时刻的输出,St:表示t时刻的记忆

。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:

St=f(U∗Xt+W∗St−1)St=f(U∗Xt+W∗St−1)

大家可能会很好奇,为什么还要加一个f()f()函数,其实这个函数是神经网络中的激活函数,但为什么要加上它呢? 
举个例子,假如你在大学学了非常好的解题方法,那你初中那时候的解题方法还要用吗?显然是不用了的。RNN的想法也一样,既然我能记忆了,那我当然是只记重要的信息啦,其他不重要的,就肯定会忘记,是吧。但是在神经网络中什么最适合过滤信息呀?肯定是激活函数嘛,因此在这里就套用一个激活函数,来做一个非线性映射,来过滤信息,这个激活函数可能为tanh,也可为其他。

假设你大四快毕业了,要参加考研,请问你参加考研是不是先记住你学过的内容然后去考研,还是直接带几本书去参加考研呢?很显然嘛,那RNN的想法就是预测的时候带着当前时刻的记忆StSt去预测。假如你要预测“我是中国“的下一个词出现的概率,这里已经很显然了,运用softmax来预测每个词出现的概率再合适不过了,但预测不能直接带用一个矩阵来预测呀,所有预测的时候还要带一个权重矩阵V,用公式表示为:

ot=softmax(VSt)ot=softmax(VSt)

其中otot就表示时刻t的输出。

RNN中的结构细节: 
1.可以把StSt当作饮状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息。 
2.otot是由当前时间以及之前所有的记忆得到的。就是你考研之后做的考试卷子,是用你的记忆得到的。 
3.很可惜的是,StSt并不能捕捉之前所有时间点的信息。就像你考研不能记住所有的英语单词一样。 
4.和卷积神经网络一样,这里的网络中每个cell都共享了一组参数(U,V,W),这样就能极大的降低计算量了。 
5.otot在很多情况下都是不存在的,因为很多任务,比如文本情感分析,都是只关注最后的结果的。就像考研之后选择学校,学校不会管你到底怎么努力,怎么心酸的准备考研,而只关注你最后考了多少分。

3.RNN的改进1:双向RNN

在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解: 

从前往后:S1t→=f(U1→∗Xt+W1→∗St−1+b1→)从前往后:St1→=f(U1→∗Xt+W1→∗St−1+b1→)
从后往前:S2t→=f(U2∗Xt→+W2→∗St−1+b2→)从后往前:St2→=f(U2∗Xt→+W2→∗St−1+b2→)
输出:ot=softmax(V∗[S1t→;S2t→])输出:ot=softmax(V∗[St1→;St2→])

这里的[S1t→;S2t→][St1→;St2→]做的是一个拼接,如果他们都是1000X1维的,拼接在一起就是1000X2维的了。

双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。

4.RNN的改进2:深层双向RNN

深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。

深层双向RNN就是基于这么一个想法,他的输入有两方面,第一就是前一时刻的隐藏层传过来的信息h→(i)t−1h→t−1(i),和当前时刻上一隐藏层传过来的信息h(i−1)t=[h→(i−1)t;h←(i−1)t]ht(i−1)=[h→t(i−1);h←t(i−1)],包括前向和后向的。 

我们用公式来表示是这样的: 
 
然后再利用最后一层来进行分类,分类公式如下: 

4.1 Pyramidal RNN

其他类似的网络还有Pyramidal RNN: 

我们现在有一个很长的输入序列,可以看到这是一个双向的RNN,上图是谷歌的W.Chan做的一个测试,它原先要做的是语音识别,他要用序列到序列的模型做语音识别,序列到序列就是说,输入一个序列然后就输出一个序列。

由图我们发现,上一层的两个输出,作为当前层的输入,如果是非常长的序列的话,这样做的话,每一层的序列都比上一层要短,但当前层的输入f(x)f(x)也会随之增多,貌似看一起相互抵消,运算量并没有什么改进。

但我们知道,对于一层来说,它是从前往后转的,比如要预测一个股市的变化,以天为单位,假如要预测明天的股市变化,你就要用今天,以及今天之前的所有数据,我们暂时无法只用昨天的数据,不用今天的数据,预测明天的数据,也即是说,预测必须具有连续性。 
但每一层的ff运算是可以并行的,从这个角度来看,运算量还是可以接受的,特别是在原始输入序列较短的时候还是有优势的。

5.RNN的训练-BPTT

如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆:

st=tanh(Uxt+Wst−1)st=tanh(Uxt+Wst−1)

然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率:

y^t=softmax(Vst)y^t=softmax(Vst)

为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:

t时刻的损失:Et(yt,y^t)=−ytlogy^tt时刻的损失:Et(yt,y^t)=−ytlogy^t

其中ytytt时刻的标准答案,是一个只有一个是1,其他都是0的向量;y^ty^t是我们预测出来的结果,与ytyt的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来:

E(yt,y^t)=∑tEt(yt,y^t)=−∑tytlogy^tE(yt,y^t)=∑tEt(yt,y^t)=−∑tytlogy^t

如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别:CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。

因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下:

假设我们对E3E3的W求偏导:它的损失首先来源于预测的输出y^3y^3,预测的输出又是来源于当前时刻的记忆s3s3,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆:s3=tanh(Ux3+Ws2)s3=tanh(Ux3+Ws2) 
因此,根据链式法则可以有:

∂E3∂W=∂E3∂y^3∂y^3∂s3∂s3∂W∂E3∂W=∂E3∂y^3∂y^3∂s3∂s3∂W

但是,你会发现,s2=tanh(Ux2+Ws1)s2=tanh(Ux2+Ws1),也就是s2s2里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的: 
 
我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。

6.RNN与CNN的结合应用:看图说话

在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子:假设我们有CNN的模型训练了一个网络结构,比如是这个

最后我们不是要分类嘛,那在分类前,是不是已经拿到了图像的特征呀,那我们能不能把图像的特征拿出来,放到RNN的输入里,让他学习呢?

之前的RNN是这样的:

St=tanh(U∗Xt+W∗St−1)St=tanh(U∗Xt+W∗St−1)

我们把图像的特征加在里面,可以得到:

St=tanh(U∗Xt+W∗St−1+V∗X)St=tanh(U∗Xt+W∗St−1+V∗X)

其中的X就是图像的特征。如果用的是上面的CNN网络,X应该是一个4096X1的向量。

注:这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。

7.RNN项目练手

RNN可以写歌词,写诗等,这有个项目可以玩玩,还不错。 
Tensorflow实现RNN

原文:https://blog.csdn.net/qq_39422642/article/details/78676567

循环神经网络(RNN)原理通俗解释相关推荐

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

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

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

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

  3. CS224N笔记(四) Lecture 7:循环神经网络RNN的进阶——LSTM与GRU

    本文将介绍两种比RNN更好地应对梯度消失问题的模型结构--LSTM和GRU,文章以CS224N的课件和材料为基础,重点分析他们的结构特点和梯度计算,在梯度消失的解决策略上进行了深入探究,并进一步分析它 ...

  4. 循环神经网络(RNN)知识入门

    循环神经网络(RNN)知识入门 原创:方云 一. RNN的发展历史 1986年,Elman等人提出了用于处理序列数据的循环神经网络(Recurrent Neural Networks).如同卷积神经网 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Zoom惊人财报、传苹果打造搜索引擎与谷歌竞争、Netflix部分剧集免费以吸引新用户等| Decode the Week...
  2. 使用JDK 13查看TLS配置
  3. Discuz 升级X3问题汇总整理
  4. 算法题学到的一些小语言细节
  5. github编程语言排名_这是每种主要编程语言的Hello World应用示例-全部在一个GitHub存储库中
  6. 怎么设置ep4ce6e22b8n引脚_技术货:教你怎么检查电路原理图
  7. QT保留小数点后位数
  8. 什么是Maven神器?
  9. ubuntu16.04装机7: 挂载机械硬盘
  10. 大数据开发笔记(十):Hbase列存储数据库总结
  11. Redis学习-1 NoSQL
  12. 39份AICon全球人工智能与机器学习技术大会 · 北京站2021(PPT汇总)
  13. 计算机网络拓扑星型优点和缺点,星型结构拓扑有哪些优缺点 星型结构拓扑优缺点介绍【图文】...
  14. 嘉兴 机器人仓库 菜鸟_菜鸟在嘉兴推出全新智能仓,宣布将在双11启用超级机器人仓群...
  15. 微信小程序wx:for 循环中item的keng
  16. kvm介绍、kvm存储池、kvm快照和克隆、kvm虚拟机基本管理和网络管理
  17. java set集合基础使用及其特点
  18. js 点击事件穿透 html,Js点击事件.html
  19. 室内电子地图-自定义室内地图-室内地图在线工具
  20. 公司使用Qt到底要不要付费?

热门文章

  1. amazon mws api 获取所有产品_Amazon’s Choice是什么?Amazon's Choice标签全解读
  2. 分层和分段用什么符号_如何划分段落层次,如何给段落分层
  3. java dom 解析xml 例子,Java DOM解析XML的幾個例子
  4. android 窗口缩放,Android界面整体缩放
  5. eclipse做java_在Eclipse中使用Java 12
  6. jsp+ajax+servlet+sqlserver实现分页查询_SXT DAY063 分页
  7. mysql四个对勾_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...
  8. GitHub高赞,针对小白的算法训练仓库
  9. 用 IDEA 看源码的正确姿势!你掌握了吗?
  10. 每日一皮:叫你们别上泰坦尼克,嗓子都喊哑了!没一个听我的,最后还把我......