传统DNN或者CNN无法对时间序列上的变化进行建模,即当前的预测只跟当前的输入样本相关,无法建立在时间或者先后顺序上出现在当前样本之前或者之后的样本之间的联系。实际的很多场景中,样本出现的时间顺序非常重要,例如自然语言处理、语音识别、手写体识别等应用。

循环神经网络RNN包含循环的网络,可以记录信息的持久化信息,特别适合应用在跟时间序列相关的场合

RNN之父Jürgen Schmidhuber

Jürgen Schmidhuber 是瑞士人工智能实验室 IDSIA 的科学事务主管,同时任教于卢加诺大学和瑞士南部应用科学与艺术学院。他于1987年和1991年在慕尼黑工业大学先后获得计算机科学的学士和博士学位。自1987年以来,一直引领着自我改进式(self-improving)通用问题求解程序(problem-solver)的研究。从1991年开始,他成为深度学习神经网络领域的开拓者。

他在 IDSIA 和慕尼黑工业大学的研究团队开发了一种递归神经网络,并率先在正式的国际性比赛中获胜。这些技术革新了手写体识别、语音识别、机器翻译和图片注释技术,现在被谷歌、微软、IBM、百度和其他很多公司应用。

RNN循环神经网络的基本循环结构如下图:

RNN的输入是一组向量,或者说是任意长度的一个序列,具体到文本应用中就是一段话。RNN假定序列之中每个元素出现的位置不是孤立的,它一定是跟在它之前的出现的元素有关。

上图表示神经网络的模块A的输出除了作为下一个模块的输入外,还会和下一个时刻模块A的输入一起,作为A的输入传递给模块A,注意A的输出是在下一时刻传输给A,而不是在同一时刻循环输出再输入给A(这样就成了死循环了)。为了方便解读,一般把循环结构展开:

这样每一个模块A的输入就包含了两部分:

1.  上一个模块A的输出

2.  时间序列在此样本之前的所有样本在模块A之前的所有模块上的输出。

RNN通过这样一个一个循环结构,构建了一个与序列和先后次序有关的模型,该模型的预测不仅与当前输入有关,还与在此输入之前的所有输入状态有关,这也是与自然状态下人的思维判别方式最像的。

RNN还在隐含层节点之间增加了互连:

理论上RNN可以支持任意长度的序列,但是如果序列太长会导致优化时出现梯度消失的问题,即神经元很难接收到离当前元素很远位置上的元素对当前元素的影响,常规只能接收到之前的若干个单位,所以一般会设置最大长度,超长会对其截断。

LSTM(long short-term memory)长短时记忆网络

LSTM解决了RNN不支持长期依赖的问题,使其大幅度提升记忆时长。

LSTM是一种特殊类型的RNN,可以学习长期依赖信息,由Hochreiter & Schmidhuber 在1997年提出。标准RNN中循环模块如下:

而在LSTM中,这一结构变为:

LSTM的成功的关键在于图中上方的贯穿线,类似于传送带,将前边序列的信息成功传递给很远后边的神经元,而保持不衰减。LSTM设计了“门”的结构来决定当前的状态如何添加到贯穿线上。

LSTM 的门决定了信息通过的方式,包含一个sigmoid 神经网络层和一个乘法操作,Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”。

LSTM 拥有三个门,来保护和控制细胞状态。

第一个Sigmoid门决定了需要从当前状态中舍弃哪些信息,这个门称为“忘记门”,例如根据当前的状态出现了一个新的主语,那么之前的句子中的主语就应该被丢弃掉。

第二个Sigmoid+T函数组成的门决定了哪些信息需要被添加到状态中,这里分为两部分,一个是Sigmoid层决定了将要更新哪些值,这一部分跟第一层完全一样,而T层会创建一个新的信息用来添加到状态中。如替换掉之前句子的主语的状态。

前边两个门的工作主要是用来更新贯穿线的状态的,第三个门的作用是根据贯穿线上的信息以及当前的输入信息计算模块的输出,更新的依然是哪些信息需要丢弃,哪些信息需要被添加。

循环神经网络RNN模型和长短时记忆系统LSTM的更多相关文章

  1. 循环神经网络(RNN)模型与前向反向传播算法

    在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...

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

    循环神经网络(RNN, Recurrent Neural Networks)介绍    这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...

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

    原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...

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

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

  5. 从网络架构方面简析循环神经网络RNN

    一.前言 1.1 诞生原因 在普通的前馈神经网络(如多层感知机MLP,卷积神经网络CNN)中,每次的输入都是独立的,即网络的输出依赖且仅依赖于当前输入,与过去一段时间内网络的输出无关.但是在现实生活中 ...

  6. 循环神经网络(RNN)的改进——长短期记忆LSTM

     一:vanilla RNN 使用机器学习技术处理输入为基于时间的序列或者可以转化为基于时间的序列的问题时,我们可以对每个时间步采用递归公式,如下,We can process a sequence ...

  7. 循环神经网络RNN及LSTM

    一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数?  htt ...

  8. 深度学习之循环神经网络RNN概述,双向LSTM实现字符识别

    深度学习之循环神经网络RNN概述,双向LSTM实现字符识别 2. RNN概述 Recurrent Neural Network - 循环神经网络,最早出现在20世纪80年代,主要是用于时序数据的预测和 ...

  9. 吴恩达deepLearning.ai循环神经网络RNN学习笔记_看图就懂了!!!(理论篇)

    前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RNN模型怎么解决这个问题 - RNN模型适用的数据特征 - RNN几种类型 RNN模型结构 - RNN block - ...

随机推荐

  1. git---控制面板提交

    比如我修改了一个项目的代码.需要提交代码. 1.打开项目所在目录,右键>Git Bash Here 2.打开交互模式.git会列出所有untracked的文件,然后你可以用各种形式加入.git ...

  2. 笔记-CSS空背景图片会导致页面被加载两次

    如果页面样式的背景图片路径设置为'' 或 '#', 会导致页面被重复加载两次 (Chrome.56.0.2924.87 测试) 因为:空图片路径属性值,默认加载当前页面的URL作为图片路径 Safar ...

  3. Java消息队列ActiveMQ (一)--JMS基本概念

    摘要:The Java Message Service (JMS) API is a messaging standard that allows application components bas ...

  4. C++中char类型的十六进制字符串转换成字节流

    如a[5]="1234"转换成a[5]={0x12,0x34} 代码如下: void HexStrToByte(const char* source, unsigned char* ...

  5. Dispose 与 close 方法 的区别

    Dispose : 释放 托管 与 非托管资源. Finalize : 释放 非托管资源. Close: 关闭资源后,可以再次使用资源.

  6. Spark机器学习1·编程入门(scala/java/python)

    Spark安装目录 /Users/erichan/Garden/spark-1.4.0-bin-hadoop2.6 基本测试 ./bin/run-example org.apache.spark.ex ...

  7. SQL注入导图

    本图来自信安之路学生渗透小组@辽宁-web-TwoDog, 博主觉得这张图画的很好,所以贴在这里提供参考!

  8. CSS + Jquery

    关于 position 1.父视图通过设置relative   子视图设置absolute ,这样可以相当于父视图来设置. 2.relative 不脱离文本流 位置还保留着 3.absolute 脱离 ...

  9. Multiply Strings,字符串相乘

    问题描述:给定两个字符串,返回他们的乘积. public class MultiplyStrings { public String multiply(String num1, String num2 ...

  10. merge two sorted lists, 合并两个有序序列

    /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Lis ...