当前位置: 首页 > news >正文

【人工智能基础四】循环神经网络(RNN)与长短时记忆网络(LSTM)

文章目录

  • 一. RNN
    • 1. 循环神经网络结构
    • 2. 循环神经网络计算
      • 2.1. 机器翻译
      • 2.2. 循环体
  • 二. 长短时记忆网路(LSTM)
    • 1. 产生背景
    • 2. LSTM的设计思想与LSTM的链式结构
      • 2.1. LSTM的设计思想
      • 2.2. LSTM链式结构图与遗忘门
    • 3. 长短时记忆网络结构

一. RNN

RNN出现的原因与基本逻辑

  1. 卷积神经网络模型,层与层之间是全连接或部分连接的,但每层之间的节点没有连接。
  2. 考虑这样一个问题,如果要预测一个句子的下一个单词是什么,一般需要用到当前单词及前面的单词,因为句子中前后单词并不是独立的。例如,当前单词是“很”,前一个单词是“天空”,那么下一个单词很大概率是“蓝”。这样的应用CNN并不擅长。 由此出现了可以用来处理和预测序列数据的循环神经网络(RNN)。
  3. 人类在阅读时会根据之前已经加过工过的信息来理解现在看到的文字,与此类似,RNN对信息的处理方式也是如此,会记忆之前的信息,并利用之前的信息影响后面节点的输出。
    体现在网络结构上,RNN隐藏层之间的节点是有连接的,隐藏层的输入不仅包括输入层的输出, 还包括上一时刻隐藏层的输出。

 

RNN的发展

随着更加有效的循环神经网络结构(LSTM、GRU)等被不断提出,以RNN为基础的网络挖掘数据中的时序信息和语义信息的深度表达能力被充分利用,并广泛应用于情感分析、机器翻译、语言模型和语音识别等领域。

本文介绍的循环神经网络指的是简单RNN。

 

1. 循环神经网络结构

循环神经网络结构

下图展示了一个典型的循环神经网络结构图,主体结构A的输入除了来自输入层 x t x_t xt ,还有一个循环的边提供上一时刻的隐藏状态 h t − 1 h_{t-1} ht1。在每一时刻,循环神经网络的模块A在读取了 x t x_t xt h t − 1 h_{t-1} ht1之后,会生成新的隐藏状态 h t h_{t} ht ,并产生本时刻的输出 O t O_{t} Ot

 

序列的保存逻辑

由于序列长度可以无限长,维度有限的 h t h_{t} ht状态不可能将序列的全部信息都保存下来,因此循环神经网络只保存与后面任务 O t , O t + 1 . . . O_{t},O_{t+1}... Ot,Ot+1...相关的最重要信息。卷积神经网络在不同的空间位置共享参数,循环神经网络是在不同的时间位置共享参数,从而能够使用有限的参数处理任意长度的序列。

 

按时间展开后的结构

将循环神经网络按时间展开后如下图,RNN在每一个适合会有一个输入 x t x_t xt,然后根据前一时刻的隐藏状态 h t − 1 h_{t-1} ht1,计算新的隐藏状态 h t h_t ht,并输出 O t O_t Ot,其中 h t − 1 h_{t-1} ht1浓缩了之前序列 x 0 , x 1 , x t − 1 x_0,x_1,x_{t-1} x0,x1,xt1的信息。

 
在这里插入图片描述

循环网络的展开在模型训练中有重要意义,假设序列长度为N,将RNN展开后可以视为一个有N个中间层的前馈神经网络模,可以利用反向传播算法进行训练。

 

2. 循环神经网络计算

从RNN的结构特征可以很容易看出它最擅长解决与时间序列相关的问题。对于一个序列数据,可以将这个序列上不同时刻的数据依次传入RNN的输入层,而输出可以是对序列中下一个时刻的预测,也可以是对当前时刻信息的处理结果,例如语音识别结果

RNN中的状态是通过一个向量来表示的,这个向量的维度也称为RNN隐藏层的大小,假设其为n。

  • 对于时间序列数据来说(例如不同时刻商品的销量),每一时刻的输入样例可以是当前时刻的数值(例如销量值);
  • 对于语言模型来说,输入样例可以是当前单词对应的单词向量(Word Embedding)。

 

2.1. 机器翻译

RNN中每一个时刻的输入为需要翻译的句子中的单词。如下图,如果需要翻译的句子为ABCD,那么RNN第一段每一个时刻的输入就分别是A、 B、C 和 D,然后用“_”作为待翻译句子的结束符。

在第一段中,循环神经网络没有输出。从结束符“_”开始,循环神经网络进入翻译阶段。该阶段中每一个时刻的输入是上一个时刻的输出,如虚线所示,而最终得到的输出就是句子ABCD翻译的结果。从图中可以看到句子ABCD对应的翻译结果就是XYZ,当网络输出“_”时表示翻译结束。
在这里插入图片描述

 

2.2. 循环体

RNN可以看做同一个神经网络结构(输入层-隐藏层-输出层)在时间序列上被复制多次的结果,这个被复制多次的结构称为循环体,如何设计循环体的网络结构是循环神经网络效果的关键,如简单RNN、LSTM和GRU等不同的神经网络关于循环体结构是不一致的

如下图展示了简单RNN的循环体结构,这个循环体只使用了类似全连接层的网络结构,图中tanh作为激活函数的全连接层,下面通过下图所示的网络结构来标识RNN前向传播的完整流程

在这里插入图片描述

 

上图所示的循环体包括两个全连接层,第一个包含在tanh内,第二个连接层用于当前时刻的输出。假设当前输入向量的维度是x,隐藏状态的维度为n,输入大小为n+x,也就是将前一段时刻的状态和当前时刻的输入拼接成了一个大的向量作为循环体中神经网络的输入。该部分的直接输出为隐藏状态,因此第一个全连接层的参数个数为( n + x ) * n + n。循环体除了提供给下一时刻的状态,还有当前时刻的输出,当前时刻的输出是下一个时刻的输入,维度为x。因此第二个全连接层的参数为 n * x + x

下图展示了RNN前向传播的具体分析:

在这里插入图片描述

下图展示了RNN前向传播的具体计算过程
在这里插入图片描述

 

二. 长短时记忆网路(LSTM)

1. 产生背景

RNN的问题

  1. 循环神经网络处理序列较短的数据效果较好,但是当序列较长时,RNN可能会丧失学习到长近距离信息的能力,比如用RNN构建模型预测下一个词,当预测the clouds are in the sky最后的词,这个时候其 实并不需要任何其他的上下文,因为下一个词很显然就应该是sky。但如果预测I grew up in China…I speak fluent Chinese最后的词。当前的信息建议下一个词可能是一种语言的名字, 但是如果我们需要弄清楚是什么语言,我们就需要离当前位置很远的 Chinese的上下文信息。
  2. 理论上,RNN可以处理这样的问题,但在实践中,即使仔细挑选参数,RNN也不能有效处理这种长期依赖问题。随着间隔不断增大,RNN会彻底丧失学习到连接远信息的能力。除此之外,RNN还容易出现梯度消失和梯度爆炸问题。

 

长短时记忆网络的提出

由此,Hochreiter 和Schmidhuber提出了长短时记忆网络(Long Short-Term Memory, LSTM),本质上,LSTM是一种时间循环神经网络。LSTM可以解决RNN中普遍存在的长期依赖问题,能有效传递和表达长时间序列中的信息并且不会导致长时间前的有效信息被忽略。并且也能解决RNN的梯度消失以及梯度爆炸的问题。

 

2. LSTM的设计思想与LSTM的链式结构

2.1. LSTM的设计思想

LSTM的设计借鉴了人类对自然语言处理的直觉性经验,一是在时间序列中,不是多有信息都等同有效,大多数情况存在“关键词”或“关键帧”,二是我们在阅读时会自动概括已阅读部分的内容并且用之前的内容帮助理解后文。基于这两点,LSTM提出了“长短期记忆”的概念,只有一部分信息需要长期记忆,而且还需要动态地处理神经网络的记忆,因为有的信息一开始价值很高,后面价值逐渐衰减,因此需要让神经网络学会遗忘特定的信息。

 

2.2. LSTM链式结构图与遗忘门

同循环神经网络一 样,LSTM也具有RNN重复模块链的形式,如下图。

在这里插入图片描述

假设输入的句子为I am from China.I am fluent in______。为了正确预测出下一 个单词Chinese,LSTM会更加关注上一句中的China并且利用神经元 (cell)对其进行记忆。在处理序列时神经元会对获取的信息进行存储,这些信息会用于预测下一个单词。

LSTM网络节点中会单独设计一 个“遗忘门”,当遇到句号时,遗忘门会意识到句子中的上下文发生了改变,并忽略当前神经元中存储的状态信息。换句话说,遗忘门的作用是让循环神经网络“遗忘”之前没有用到的信息。

 

3. 长短时记忆网络结构

实际上,LSTM链式结构中每一个计算节点是一种拥有3个“门”结构 的特殊网络结构,如下图。LSTM靠一些“门”的结构让信息有选择性地影响循环神经网络中每个时刻的状态。

门的结构

  • “门”结构就是一个使用Sigmod神经网络和一个按位做乘法的运算,这两个操作合在一起就是一个“门”结构。
  • 使用Sigmod作为激活函数的全连接神经网络层会输出一个0~1之间的数值,描述当前输入有多少信息量可以通过这个结构。当门打开时,如果Sigmoid神经网络层输出为1,则全部信息都可以通过。当门关上时,如果Sigmoid神经网络层输出为 0,则任何信息都无法通过。

在这里插入图片描述
遗忘门和输入门可以使神经网络更有效的保存需长期记忆的信息,遗忘门的作用是让网络忘记之前没有用的信息,更具当前输入 x i x_i xi和上一时刻的输出 h t − 1 h_{t-1} ht1决定那一部分信息被遗忘,哪一部分信息被记忆。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • fabricjs 实现图像的二值化功能
  • 计算机网络基础 - 计算机网络和因特网(2)
  • ARM/Linux嵌入式面经(二十):地平线嵌入式开发
  • SQL进阶技巧:数据预处理如何对数据进行分桶【分箱】?
  • SD8223LC 首鼎SHOUDING单键电容式触摸IC SOT23-6
  • 面试经典算法150题系列-h指数
  • Jenkins参数化构建
  • C# 使用 NLog 输出日志到文件夹
  • springboot新农村综合展示平台-计算机毕业设计源码41793
  • 震惊!一男子深夜燥热难耐,竟然偷偷起身打开电脑并开始 学习c++入门基础(下)
  • 一个很变态却非常实用的发论文的新方向,【Transformer+目标检测】
  • 为什么有的地方笔记本经常连不上wifi,而手机可以?
  • Linux学习第56天:RGB转HDMI
  • Radiant Photo 1.4.1 AI智能完美照片修图插件支持PS ai beta
  • 珠海市举办“数智赋能产业转型与创新培训专场”活动
  • 345-反转字符串中的元音字母
  • 5、React组件事件详解
  • Apache Spark Streaming 使用实例
  • Apache的80端口被占用以及访问时报错403
  • gf框架之分页模块(五) - 自定义分页
  • HTTP中GET与POST的区别 99%的错误认识
  • spark本地环境的搭建到运行第一个spark程序
  • Vue.js源码(2):初探List Rendering
  • 从PHP迁移至Golang - 基础篇
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 深度解析利用ES6进行Promise封装总结
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 我感觉这是史上最牛的防sql注入方法类
  • 用jQuery怎么做到前后端分离
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • AI算硅基生命吗,为什么?
  • 阿里云服务器如何修改远程端口?
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • (~_~)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (LLM) 很笨
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)菜鸟学数据库(三)——存储过程
  • (转)项目管理杂谈-我所期望的新人
  • .NET BackgroundWorker
  • .NET Core 成都线下面基会拉开序幕
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET企业级应用架构设计系列之结尾篇
  • .NET运行机制
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /etc/motd and /etc/issue