目录

循环神经网络(Recurrent Neural Network,RNN)

RNN的基本概念

RNN的主要应用领域

RNN的实现

RNN的反向传播-BPTT

RNN的问题

长短期记忆(Long Short-Term Memory,LSTM)

LSTM的变体

LSTM的变体——门控循环单元GRU


循环神经网络(Recurrent Neural Network,RNN)

RNN的基本概念

循环神经网络是一类具有短期记忆能力的神经网络。

在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网状结构。和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。

循环神经网络已经被广泛应用在语音识别,语言模型以及自然语言生成等任务上。

既然已经有了卷积神经网络,为什么还要循环神经网络?

原因在于卷积神经网络的前提假设是元素之间是相互独立的,输入和输出也是独立的,比如猫和狗。但在现实世界中,很多元素都是相互连接的,比如股票随时间的变化等。因此,就有了现在的循环神铭网络,其本质在于像人一样拥有记忆的能力。因此,它的输出就依赖于当前的输入和记忆。

人类并不是每时每刻都从一片空白的大脑开始他们的思考。在阅读一篇文章的时候,都是基于自己已经拥有的对先前所见词的理解来推理当前词的真实含义。我们不会将所有的东西全部丢弃,然后用空白的大脑进行思考。我们的思想具有持久性。

传统的神经网络做不到这一点,看起来也像是一种巨大的弊端。利于,假设你希望电影中每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的时间推断后续的事件。

RNN解决了这个问题,RNN是包含循环的网络,允许信息的持久化。

RNN的主要应用领域

RNN的主要应用领域很多,可以说只要考虑时间先后顺序的问题都可以使用RNN来解决:例如自然语言处理(视频处理,文本生成,语言模型,图像处理)、机器翻译、机器写小说、语言识别、图像描述生成、文本相似度计算、音乐推荐、商品推荐、视频推荐等新的应用领域。

RNN的实现

RNN的层级结构较之于CNN来说比较简单,它主要由输入层,Hidden Layer,输出层组成。并且在Hidden Layer有一个箭头表示数据的循环更新,这个就是实现时间记忆功能的方法。

这些循环使得RNN看起来非常神秘。然而,这其实并不会比一个正常的神经网络难于立即,RNN可以被看做同一个神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

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

  • x是一个向量,它表示输入层的值;
  • s是一个向量,它表示隐藏层的值;
  • U是输入层到隐藏层的权重矩阵;
  • o是一个向量,他表示输出层的值;
  • V是隐藏层到输出层的权重矩阵;
  • 权重矩阵W是隐藏上一次的值作为这一次的输入的权重。因为循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。

RNN的反向传播-BPTT

随时间反向传播(Backpropagation Through Time, BPTT)算法的主要思想是通过类似前馈神经网络的BP算法来进行计算梯度。

BPTT算法将循环神经网络看做一个展开的多层前馈网络,其中“每一层”对应网络中的“每个时刻”。

这样,循环神经网络就可以按照前馈网络中的反响传播算法进行计算参数梯度。在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是所有“展开层”的参数梯度之和。

BPTT算法很对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的步骤:

1、前向计算每个神经元的输出值;

2、方向计算每个神经元的误差值;

3、计算每个权重的梯度;

4、最后再用梯度下降算法更新权重 。

RNN的问题

常见问题:梯度爆炸、梯度消失

梯度爆炸的解决方法:1)权重衰减:通过给参数增加范数的正则化来限制参数的取值范围;2)梯度截断:当梯度的模大于一定阈值时,就将它截断成为一个较小的数。

梯度消失的解决办法:1)合理的初始化权重值:初始化权重值,使每个神经元尽可能不要取极大或极小值,以多开梯度消失的区域;2)使用Relu代替sigmoid和tanh作为激活函数;3)使用其他结构RNNs,比如长短时记忆网络(LSTM)和Gated Recurrent Unit(GRU),这是当下最流行的做法。


长短期记忆(Long Short-Term Memory,LSTM)

LSTM是一种改进的RNN。LSTM的产生背景主要是为了解决RNN长序列训练过程中梯度消失梯度爆炸问题。简单来说就是比普通RNN在更长的序列中有更好的表现。

有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测“the clouds are in the sky”最后的词,我们并不需要任何其他上下文——因为下一个词很显然就应该是sky。

在这样的场景中,相关的信息和预测的词的位置之间的间隔是非常小的,RNN可以学会使用先前的信息。

但是同样会有一些更复杂的场景。假设我们试着去预测“I grow uo in China.. I speak Chinese"最后的词。当前信息建议下一个词可能是上一个语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的China的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在事件中是LSTM的默认行为,而非需要付出很大代价才能获得的能力。所以RNN都具有一种重复神经元模块的链式的形式。在标准的RNN中,重复的模块只有一个非常简单的结构,例如一个tanh层。

LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

LSTM的关键就是细胞状态(cell state),水平线在图上方贯穿运行。细胞状态类似于传送带,直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择通过的方法。他们包含一个sigmoid神经网络层和一个按位的乘法操作。

Sigmoid层输出0到1之间的数值,描述每个部分有多少量可以通过。0代表“不允许任何量通过”,1表示“允许任意量通过”。

LSTM网络主要改进在以下两个方面:

1、新的内部状态:LSTM网络引入一个新的内部状态(cell state)ct专门进行线性的循环信息传递,同时(非线性)输出信息给移仓层的外部状态ht;

2、门控机制:LSTM网络引入门控机制(Gating Mechanism)来控制信息传递的路径。

长短时记忆网络的思路比较简单。原始RNN的隐藏只有一个状态,即h,他对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?

新增的状态c,称为单元状态(cell state)。我们把上左图按照时间维度展开得到右图:

在t时刻,LSTM的输入有三个:当前时刻网络的输入值x(t)、上一时刻LSTM的输出值h(t-1)、以及上移时刻的单元状态c(t-1);LSTM的输出有两个:当前时刻LSTM输出值h(t)和当前时刻的状态单元c(t)。注意都是向量

LSTM的关键,就是怎眼控制长期状态c。在这里,LSTM的思路是使用三个控制开关:

1、第一个开关:负责控制继续保存长期状态c;

2、第二个开关:负责控制把即时状态输入到长期状态c;

3、第三个开关:负责控制是否把长期状态c作为当前的LSTM的输出。

分别对应以下三个门:

1、遗忘门f_{t}:控制上一个时刻的内部状态c_{t-1}需要遗忘多少信息;

1、输入门i_{t}:控制当前时刻的候选状态c'_{t}有多少信息需要保存;

1、输出门o_{t}:控制当前时刻的内部状态ct有多少讯息需要输出给外部状态h_{t};

在LSTM中第一步是决定会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取,输出一个在0到1之间的数值给每个字细胞状态中的数字。1表示“完全保留”,0表示“完全舍弃”。在语言模型的例子中基于已经看到的预测下一个词的问题中,细胞状态可能包含主语的性别,因此正确的代词可以被选择出来,当我们看到新的主语,我们希望忘记旧的主语。

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid层称“输入门层”决定什么值将要更新。然后,一个tanh层创建一个新的候选值向量会被加入到状态中。下一步就是两个信息来产生对状态的更新。在语言模型的例子中,希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。

现在是更新旧细胞状态的时间了,更新为。前面的步骤已经决定了将会做什么,现在就需要实际去完成。把旧的状态与相乘,丢弃掉我们确定需要丢弃的信息,接着加上,这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新信息的地方。

最终,需要确定输出什么值。这个输出将会基于细胞状态,但是也是一个过滤后的版本。首先,运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。接着,把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在语言模型的例子中,以为他就看到了一个代词,可能需要输出与一个动词相关的信息。例如,可能输出是否代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行词形变化。


LSTM的变体

其中一个流行的LSTM变体,就是由Gers & Schmidhuber提出的,增加了“peephole connection”。是说,让门层也会接受细胞状态的输入。

上图增加了peephole到每个门上,但是许多论文会加入部分的peephole而非所有都增加。

另一个变体是通过使用coupled忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是以通做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些已经忘记旧的信息的那些状态。

LSTM的变体——门控循环单元GRU

门控循环单元(Gated Recurrent Ubit, GRU)网络是一种比LSTM网络更加简单的循环神经网络。

GRU对LSTM做了两个大改动:

1、将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate)。

2、将党员状态与输出合并为一个状态。

表示重置门,表示更新门。

1、重置门决定是否将之前的状态忘记。(作用相当于合并了LSTM中的遗忘门和输入门);

2、将先前隐藏状态和遗忘门输出的向量进行点乘,相当于趋于0的时候,前一个时刻的状态信息会被忘掉,隐藏状态会被重置为当前输入的信息;

3、得到了新的隐藏状态,但是还不能直接输出,而是通过更新门来控制最后的输出:

AI学习笔记(十九)循环神经网络相关推荐

  1. 【theano-windows】学习笔记十九——循环神经网络

    前言 前面已经介绍了RBM和CNN了,就剩最后一个RNN了,抽了一天时间简单看了一下原理,但是没细推RNN的参数更新算法BPTT,全名是Backpropagation Through Time. [注 ...

  2. AI学习笔记(九)从零开始训练神经网络、深度学习开源框架

    AI学习笔记之从零开始训练神经网络.深度学习开源框架 从零开始训练神经网络 构建网络的基本框架 启动训练网络并测试数据 深度学习开源框架 深度学习框架 组件--张量 组件--基于张量的各种操作 组件- ...

  3. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  4. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  5. 【theano-windows】学习笔记十二——卷积神经网络

    前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 ...

  6. TensorFlow学习笔记之六(循环神经网络RNN)

    文章目录 1. 循环神经网络简介 1. 循环神经网络简介 循环神经网络源自于1982年由 Saratha Sathasivam提出的霍普菲尔德网络. 循环神经网络的主要用途是处理和预测序列数据,循环神 ...

  7. CS231n笔记十:循环神经网络

    一.循环神经网络 Recurrent nerual network 特点:输入/输出是长度可变的序列.在CV中,最常见的RNN的应用领域就是视频处理(如many to one的RNN,可以输入一段视频 ...

  8. javascript学习笔记(十九) 节点的操作

    包括节点的创建.添加.移除.替换.复制 本节要用到的html例子 1 <ul id="myList"> 2 <li>项目一</li> 3 < ...

  9. 乐优商城学习笔记十九-商品详情(二)

    2.页面静态化 2.1.简介 2.1.1.问题分析 现在,我们的页面是通过Thymeleaf模板引擎渲染后返回到客户端.在后台需要大量的数据查询,而后渲染得到HTML页面.会对数据库造成压力,并且请求 ...

  10. 深度学习笔记七:循环神经网络RNN(基本理论)

    参考: RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS A Critical Review of Recurrent ...

最新文章

  1. 【自考】信息系统开发与管理(二)——章节详读
  2. saltstack实战-6
  3. Redis: under the hood---转载
  4. Android 基础(二十四) EditText
  5. 实现弹出悬浮页面_30秒快速实现Excel每页标题行的打印!
  6. 多网卡无法上外网的解决
  7. 【千字分析】剑指 Offer 05. 替换空格
  8. mysql int 11 java_mysql中int(11)列的大小(以字节为单位)是多少?
  9. editor.md 实现拖拽剪切复制粘贴上传图片,文件插件
  10. 数据库-结构化查询语言SQL概述
  11. To B 赛道上,“飞奔的大象”阿里会赢吗?
  12. 51单片机波特率计算c语言,51单片机波特率怎么算?51单片机波特率计算公式
  13. jsp调用getParameterValues获取表单信息
  14. 屏幕录像专家V7.5 + 注册机
  15. 【OpenStack】OpenStack系列17之OpenStack私有云设计一
  16. 中国计算机学会推荐国际学术会议和期刊目录 2015
  17. GateWayWorker 部署
  18. opencv中的人脸检测案例
  19. 淘宝订单转化率低的原因,怎样提高店铺订单转化率,提高店铺订单转化率的小技巧
  20. python之模块导入及模块导入路径

热门文章

  1. mongorepository查询条件_Java操作MongoDB采用MongoRepository仓库进行条件查询 | 学步园...
  2. OpenGL秒安装及显示
  3. CSDN 博客 美化 个性化
  4. validate参数校验和数据回显
  5. mysql主从之slave-skip-errors和sql_slave_skip_counter
  6. RIP路由协议基本配置
  7. java里程碑之泛型--泛型基本语法
  8. IIS 7.0 SSL 部署指南
  9. 不使用控件的分页实现分页(更灵活)
  10. 华为机试HJ95:人民币转换