《转》循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论

转自 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

时间: 2024-08-02 10:55:02

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

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

本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks)(第二部分) 14.4 深度RNN 堆叠多层cell是很常见的,如图14-12所示,这就是一个深度RNN. 图14-12 深度RNN(左),随时间展开(右) 在TensorFlow中实现深度RNN,需要创建多个cell并将它们堆叠到一个MultiRNNCell中.下面的代码创建了三个完全相同的cel

转:RNN(Recurrent Neural Networks)

RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-networks-derivation-and-implementation/ 2016-04-25 分类:Deep Learning / NLP / RNN 阅读(6997) 评论(7) 本文主要参考wildml的博客所写,所有的代码都是python实现.没有使用任何深度学习的工具,公式推导虽然枯燥,但

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

RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-networks-derivation-and-implementation/ 2016-04-25 分类:Deep Learning / NLP / RNN 阅读(6997) 评论(7) 本文主要参考wildml的博客所写,所有的代码都是python实现.没有使用任何深度学习的工具,公式推导虽然枯燥,但

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

一.RNN简介 1.)什么是RNN? RNN是一种特殊的神经网络结构,考虑前一时刻的输入,且赋予了网络对前面的内容的一种'记忆'功能. 2.)RNN可以解决什么问题? 时间先后顺序的问题都可以使用RNN来解决,比如:音乐,翻译,造句,语音识别,视频图像预测,语言处理等等,后来经过变种甚至可以达到CNN的作用 具体例子1 Car which.............,() ..........使用RNN可以预测括号里面的内容应该为 is/was. 2 学习莎士比亚写的诗词,然后进行模仿 3 你想为

递归神经网络(Recurrent Neural Networks,RNN)

在深度学习领域,传统的多层感知机(MLP)具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录.甚至到了今天,MLP在解决分类任务上始终都比其他方法要略胜一筹. 尽管如此,大多数专家还是会达成共识:MLP可以实现的功能仍然相当有限.究其原因,人类的大脑有着惊人的计算功能,而“分类”任务仅仅是其中很小的一个组成部分.我们不仅能够识别个体案例,更能分析输入信息之间的整体逻辑序列.这些信息序列富含有大量的内容,信息彼此间有着复杂的时间关联性,并且信息长度各种

Recurrent Neural Network 学习笔记【二】RNN-LSTM

理论上讲,只要足够大的RNN结构就能去生成任意复杂的序列结构. 但是在实际上,标准的RNN并不能有效的长期保存信息(这是由于类似HMM的结构,每次每个节点的信息如果始终经过同样的变换,那么会要么指数爆炸要么指数衰减,很快信息就会丢失).也是由于它这个“健忘”的特点,这种RNN生成的序列很容易缺乏稳定性.这样的话,如果只能依赖上几步的结果去预测下一步,而又使用预测的新结果去预测再下一步,那么一旦出现了错误,系统就会很容沿着错误的方向走下去,而很少有机会能从之前的信息中把错误改正过来. 从这个角度讲

吴恩达《深度学习》-课后测验-第五门课 序列模型(Sequence Models)-Week 1: Recurrent Neural Networks(第一周测验:循环神经网络)

Week 1 Quiz: Recurrent Neural Networks(第一周测验:循环神经网络) \1. Suppose your training examples are sentences (sequences of words). Which of the following refers to the jth word in the ith training example?( 假设你的训练样本是句子(单词序列),下 面哪个选项指的是第??个训练样本中的第??个词?) [ ]

Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano

转载 - Recurrent Neural Networks Tutorial, Part 2 – Implementing a RNN with Python, Numpy and Theano This the second part of the Recurrent Neural Network Tutorial. The first part is here. Code to follow along is on Github. In this part we will implemen

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

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域. 1. RNN概述 在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的.但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不