热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

转自http:blog.csdn.netxingzhedaiarticledetails53144126更多参考:http:blog.csdn.netmaf

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


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • 都会|可能会_###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了###haohaohao###图神经网络之神器——PyTorchGeometric上手&实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 论文阅读:《Bag of Tricks for LongTailed Visual Recognition with Deep Convolutional Neural Networks》
    基于深度卷积神经网络的长尾视觉识别技巧包摘要近年来,挑战性长尾分布上的视觉识别技术取得了很大的进展,主要基于各种复杂的范式(如元学习)。除了这些复杂 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
夕阳隐日
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有