转自 http://blog.csdn.net/xingzhedai/article/details/53144126

更多参考:http://blog.csdn.net/mafeiyu80/article/details/51446558

http://blog.csdn.net/caimouse/article/details/70225998

http://kubicode.me/2017/05/15/Deep%20Learning/Understanding-about-RNN/

RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络。继Bengio提出基于神经网络的概率语言模型并获得成功之后,Mikolov于2010年提出利用RNN建模语言模型,2012年Sundermeyer提出RNN的改进版本--LSTM。近两年,RNN开始在自然语言处理、图像识别、语音识别等领域迅速得到大量应用。因项目需要,近期重点学习研究了这几类学习模型,DNN、RNN、LSTM等,后面会陆续把学习总结记录并发布出来,首先为了自己加深印象,其次如果能对他人提供些许帮助就更好了。

  循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural Language Processing, NLP)中取得了巨大成功以及广泛应用,因此搜rnn能搜到大把资料,所以本文就仅从自己理解的角度简单介绍RNNs的原理以及如何实现,后面会专门再发一篇blog结合实际源码进行分析学习:

1. RNN的基本原理及推导

2. RNN神牛简介

1. RNN的基本原理及推导

(1)什么是RNNs

  RNNs的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNNs:

有别于传统的机器学习模型中隐层单元彼此间是完全对等的,RNN中间的隐层从左向右是有时序的(阿拉伯人看是从右向左有时序,哈哈),因此隐层单元之间是要讲究先来后到的。再来一张局部特写照片:

(2)RNNs是怎么工作的

RNNs包含输入单元(Input units),输入集标记为{x0 ,x1 ,...,xt ,xt+1 ,...} ,用向量表示为X(t),而输出单元(Output units)的输出集则被标记为{y0 ,y1 ,...,yt ,yt+1 .,..} ,表示成向量形式为Y(t)。RNNs还包含隐藏单元(Hidden units),我们将其输出集标记为{ s0,s1 ,...,st ,st+1 ,...} ,表示成向量形式为S(t),这些隐藏单元完成了最为主要的工作。你会发现,在图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNNs会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“Back Projections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连。 
  上图将循环神经网络进行展开成一个全神经网络。例如,对一个包含5个单词的语句,那么展开的网络便是一个五层的神经网络,每一层代表一个单词。对于该网络的计算过程如下:
       step1: x(t)表示第t时刻(t=1,2,3... )的输入,比如,x1为当前输入句子中第二个词的Vow(vector-of-word)向量; PS:使用计算机对自然语言进行处理,便需要将自然语言处理成为机器能够识别的符号,加上在机器学习过程中,需要将其进行数值化。而词是自然语言理解与处理的基础,因此需要对词进行数值化,词向量(Word Representation,Word embeding)[1]便是一种可行又有效的方法。何为词向量,即使用一个指定长度的实数向量v来表示一个词。有一种种最简单的表示方法,就是使用One-hot vector表示单词,即根据单词的数量|V|生成一个|V| * 1的向量,当某一位为一的时候其他位都为零,然后这个向量就代表一个单词。所以,训练之前要先建立词典(工作量也不小),于是出现了 一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec(同样是神牛Mikolov在google时的成果)。
       step2:  s(t)为隐藏层的第t时刻的状态,它是网络的记忆单元。s(t)根据当前输入层的输出与上一步隐藏层的状态进行计算。s(t) =f(U*x(t) +W*s(t−1)),其中f()一般是非线性的激活函数,如tanh或ReLU或Sigmoid,在计算s(0)时,即第一个单词的隐藏层状态,需要用到s(−1),在实现中一般置为0向量即可;
       step3:o(t)是t时刻的输出,即下个单词的向量表示,o(t) =softmax(V*s(t)). 
需要注意的是:可以认为隐藏层状态s(t)是网络的记忆单元,包含了前面所有步的隐藏层状态。而输出层的输出o(t)只与当前步的s(t)有关,在实践中,为了降低网络的复杂度,往往s(t)只包含前面若干步而不是所有步的隐藏层状态;在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数U,V,W U,V,W。其反应者RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。

(3)再讲一遍RNN是怎么工作的(详细推导)(这部分摘自神牛的ppt,感觉是各版本中最容易理解的,还是一手的信息最有价值)

  • Input layer w and output layer y have the same dimensionality as the vocabulary (10K - 200K);
  • Hidden layer s is orders of magnitude smaller (50 - 1000 neurons);
  • U is the matrix of weights between input and hidden layer, V is thematrix of weights between hidden and output layer
  • Without the recurrent weightsW, this model would be a bigram neuralnetwork language model。

上图里左上角的输入信号,在下面推导中用x(t)来表示,以免弄混。

隐层的输出为s(t), s(t) = f (U*w(t) + W*s(t-1))                                                         (1)

输出层的输出为y(t), y(t) = g (V*s(t))                                                                       (2)

其中,f(z) and g(z) are sigmoid and softmax activation,

训练的过程采用随机梯度下降(SGD),U、V、W每输入一个词就更新一次,更新采用反向传播算法,误差(这里称为交叉熵)的公式为式(4):

where d(t) is a target vector that represents the word w(t + 1)(encoded as 1-of-V vector)

系数矩阵V的更新:

输出层梯度误差向隐层的传播为:

where the error vector is obtained using function dh() that isapplied element-wise:

注:这里的x不是输入信号

系数矩阵U的更新,注意,这里的w(t)应为输入信号x(t):

RNN还可以继续展开成上面的递归结构,相应地,隐层的误差传播函数也可以写成递归形式如下:

权系数W的更新写成递归形式:

2.  RNN神牛简介(另附他在 SIGIR 2016 大会中神经信息检索研讨会(Neu-IR Workshop)上的演讲解说)

学习RNN,不得不先提一下Tomas Mikolov,他是RNN建模语言模型的提出者(不是RNN的创造者),这位老兄应该是先在google做自然语言处理的研究, 作为Google Brain 团队的一员,参与了 word2vec 项目的开发,2014年又去了facebook人工智能实验室担任研究科学家,他的 Facebook 个人页面上写到他的长期研究目标是「开发能够使用自然语言进行学习和与人类交流的智能机器」,有兴趣的同学可以在fb上加他为好友一起聊聊:-)

他在 SIGIR 2016 大会中神经信息检索研讨会(Neu-IR Workshop)上的演讲解说http://chuansong.me/n/464503442191

《转》循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论的更多相关文章

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

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

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

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

  3. 循环神经网络(RNN, Recurrent Neural Networks)——无非引入了环,解决时间序列问题

    摘自:http://blog.csdn.net/heyongluoyao8/article/details/48636251 不同于传统的FNNs(Feed-forward Neural Networ ...

  4. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  5. 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)

    由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...

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

    为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...

  7. 4.5 RNN循环神经网络(recurrent neural network)

     自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  RNN循环神经网络 ...

  8. 转:RNN(Recurrent Neural Networks)

    RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...

  9. RNN(Recurrent Neural Networks)公式推导和实现

    RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...

随机推荐

  1. python之property属性

    Property的概念:property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值. import math class Circle: def __init__(self,radi ...

  2. Java全栈程序员之09:IDEA+GitHub

    GitHub是源码托管站点,其依赖于Git这个源码管理工具来进行代码的托管.所以将我们的代码托管到GitHub之前,我们需要安装Git. 1.Git安装 可以通过输入git命令来确定是否在本机已经安装 ...

  3. cd4与cd8比值的意义

    正常情况下CD4/CD8比值介于1.5—2.5之间,如CD4是每微升血750个,CD8是每微升血460个,这样两者的比值就是1.63. 虽然95%的正常人CD4/CD8的比值都在1以上,但是也有一些正 ...

  4. HashTable代码解析

    HashTable继承关系如下: HashTable是一个线程安全的[键-值对]存储结构.其存储结构和HashMap相同,参考这里. 1. HashTable定义了一个类型为Entry<K,V& ...

  5. ionic1页面切换动画卡顿优化

    https://github.com/shprink/ionic-native-transitions https://www.npmjs.com/package/ionic-native-trans ...

  6. 分析轮子(一)-ArrayList.java

    前言:之前也看过一些JDK源码,不过没有留下痕迹,经久年月就淡忘了,现在的时机也差不多了,想再看一次,并且记录下来自己的感想,于是从自己使用最多最熟悉的地方开始!并且看的过程中,我希望自己思考一下如下 ...

  7. notepad++ 复制代码--高亮 - 带颜色

    思路来源:http://blog.csdn.net/super828/article/details/72826024 选择代码,然后右键选择菜单命令

  8. Git Flow 分支管理简述

    概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...

  9. 让我头疼一下午的Excel合并单元格

    Excel导出常见问题 excel导出其实不算什么难事 在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了. 但是,凡事都有例外,截止今天,excel导出 ...

  10. ProtoBuf3 C++使用篇

    protobuf 是用于结构化数据串行化的灵活.高效.自动化的解决方案.又如 XML,不过它更小.更快.也更简单.你只需要按照你想要的数据存储格式编写一个.proto,然后使用生成器生成的代码来读写这 ...