《转》循环神经网络(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
《转》循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论的更多相关文章
- 循环神经网络(RNN, Recurrent Neural Networks)介绍(转载)
循环神经网络(RNN, Recurrent Neural Networks)介绍 这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...
- 循环神经网络(RNN, Recurrent Neural Networks)——无非引入了环,解决时间序列问题
摘自:http://blog.csdn.net/heyongluoyao8/article/details/48636251 不同于传统的FNNs(Feed-forward Neural Networ ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- 循环神经网络(Recurrent Neural Network,RNN)
为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...
- 4.5 RNN循环神经网络(recurrent neural network)
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 RNN循环神经网络 ...
- 转:RNN(Recurrent Neural Networks)
RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...
- RNN(Recurrent Neural Networks)公式推导和实现
RNN(Recurrent Neural Networks)公式推导和实现 http://x-algo.cn/index.php/2016/04/25/rnn-recurrent-neural-net ...
随机推荐
- pygame-KidsCanCode系列jumpy-part16-enemy敌人
接上回继续,这次我们要给游戏加点难度,增加几个随机出现的敌人,玩家碰到敌人后Game Over. 最终效果如下,头上顶个"电风扇"的家伙,就是敌人. 一.先定义敌人类 # 敌人类 ...
- Vue.JS React 精彩文章汇总
JavaScript深入系列 [干货] JavaScript数组所有API全解密 [干货] 移动端:页面->手淘互动动效的探索 - IT大咖说 - 大咖干货,不再错过 [扫盲] Jonath ...
- 前端工程化系列[04]-Grunt构建工具的使用进阶
在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt ...
- (2):Mysql 查看、创建、更改 数据库和表
一.一探究竟 我想看看有多少个数据库,有多少个表,以及表里有啥东西.那么你可以这样: 图形界面: 命令: 查看多少个数据库:注意 后面带s #查看 SHOW DATABASES; #查看表 USE b ...
- 使用docker搭建gitlab版本控制系统
1. GitLab 简介 GitLab 是一款基于 git 的开源代码仓库系统 GitLab 与著名的 GitHub 最大的区别就是: 允许我们搭建自己的 git 代码私有仓库,非常方便 2 ...
- pip install whl
$ pip install --download /tmp/offline_packages -r requirements.txt $ pip install --no-index --find-l ...
- 【推荐】Hutool 的通用工具类库
摘自3.1.1版本作者发布原话,当时看到有点说不上的情绪,为作者的坚持.热爱点个赞. 已经想不起来是怎样结识 Hutool 的,但 Hutool 伴随几个项目的推进,获得了同事一致好评. 没经过实践和 ...
- git远程删除分支后,本地git branch -a 依然能看到的解决办法
http://blog.csdn.net/qq_16885135/article/details/52777871 使用 git branch -a 命令可以查http://blog.csdn.net ...
- 【转】浅谈常用的几种web攻击方式
浅谈常用的几种web攻击方式 一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是 ...
- 两台linux服务器各有两个不同的用户 其中一个服务器可以无密码登录服务器
服务器A:普通用户USERA 服务器B:普通用户USERB 把USERA的公钥写入服务器B用户USERB的authorized_keys中 USERA能普能用户登录然后服务器A,然后再登录服务器B: ...