Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!
本文翻译自 RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS 。
Recurrent Neural Networks(RNNS) ,循环神经网络,是一个流行的模型,已经在许多NLP任务上显示出巨大的潜力。尽管它最近很流行,但是我发现能够解释RNN如何工作,以及如何实现RNN的资料很少。这个系列将会涵盖如下几个主题,
- RNN概述
- 利用Python,Theano实现RNN
- 理解RNN的BPTT算法和梯度消失
- 利用Python,Theano实现GRU或LSTM
我们将会实现一个 基于语言模型的循环神经网络 。语言模型有两个应用。第一,基于句子在真实世界中出现的可能性,语言模型可以让我们对任意的句子进行打分。这个就给予我们一种度量语法和语义正确性的方式。语言模型通常应用在机器翻译系统中。第二,语言模型允许我们生成新的文本(我认为这是一个更酷的应用)。在莎士比亚的作品上训练一个语言模型,允许我们生成莎士比亚风格的文本。Andrej Karpathy所写的 blog 显示了基于RNN的字符级的语言模型的能力。
我假设你已经在一定程度上熟悉基本的神经网络。如果你对基本的神经网络还不熟悉,你可以先看这篇blog IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION , 它将会让你理解非循环网络背后的思想和具体实现。
1 什么是循环神经网络?
循环神经网络背后的思想就是使用序列信息。在传统的神经网络中,我们认为所有的输入(和输出)彼此之间是互相独立的。但是对于很多任务而言,这个观点并不合适。如果你想预测句子中的下一个词,你最好需要知道它之前的词。循环神经网络之所以称之为循环,就是因为它们对于序列中每个元素都执行相同的任务,输出依赖于之前的计算。另一种思考循环神经网络的方法是,它们有一个记忆,记忆可以捕获迄今为止已经计算过的信息。理论上,循环神经网络可以利用任意长度序列的信息,但是,在实际中,它们仅能利用有限长步(具体原因会在后续解释)。下面就是一个典型的循环神经网络。
上图展示了一个循环神经网络展开为全网络。通过展开,我们简单的认为我们写出了全部的序列。例如,如果我们关心的序列是一个有5个词的句子,那么这个网络就会展开为5层的神经网络,一层对应一个词。循环神经网络中管理计算的公式如下所示,
- \(x_{t}\) 是时刻t的输入。例如, \(x_{1}\) 可以是一个one-hot向量,对应句子中第二个词;
- \(s_{t}\) 是时刻t的隐层状态。它是网络的记忆。\(s_{t}\) 基于前一时刻的隐层状态和当前时刻的输入进行计算, \(s_{t} = f(U x_{t} + W s_{t-1})\) 。函数f通常是非线性的,如tanh或者ReLU。\(s_{-1}\) 被要求为计算第一个隐藏状态,通常被初始化为全0;
- \(o_{t}\) 是时刻t的输出。例如,如果我们想预测句子a的下一个词,它将会是一个词汇表中的概率向量,\(o_{t} = softmax(Vs_{t})\) ;
这里有一些注意事项,如下:
- 你可以将隐层状态\(s_{t}\) 认为是网络的记忆。\(s_{t}\) 可以捕获之前所有时刻发生的信息。输出 \(o_{t}\) 的计算仅仅依赖于时刻t的记忆。上面已经简略提到,实际中这个过程有些复杂,因为 \(s_{t}\) 通常不能获取之前过长时刻的信息;
- 不像传统的深度神经网络,在不同的层使用不同的参数,循环神经网络在所有步骤中共享参数(U、V、W)。这个反映一个事实,我们在每一步上执行相同的任务,仅仅是输入不同。这个机制极大减少了我们需要学习的参数的数量;
- 上图在每一步都有输出,但是根据任务的不同,这个并不是必须的。例如,当预测一个句子的情感时,我们可能仅仅关注最后的输出,而不是每个词的情感。相似地,我们在每一步中可能也不需要输入。循环神经网络最大的特点就是隐层状态,它可以捕获一个序列的一些信息;
2 循环神经网络可以做什么?
循环神经网络在很多NLP任务中显示出巨大的成功。在这里,我需要提醒一下,大部分循环神经网络是 LSTM ,它比普通的循环神经网络可以更好的捕获长期依赖。不用担心,LSTM本质上依然是循环神经网络,它仅仅是在计算隐层状态时采用一种不同的方式,我们将会在后续的文章中详细介绍它。下面是一些循环神经网络应用到NLP的例子。
2.1 语言模型和文本生成
给定一个词序列,我们想要预测每个词在给定前面的词的条件概率。语言模型允许我们度量一个句子的可能性,这是机器翻译的重要输入(高概率的句子通常是正确的)。预测下一个词的副产品就是我们可以得到一个生成模型,这允许我们通过在输出概率中采样来生成下一个文本。依赖于我们的训练数据,我们可以生成 各种类型的文本 。在语言模型中,我们的输入通常是一个词序列(例如,编码为one-hot向量),输出就是待预测的词序列。当训练网络时,我们设置 \(o_{t} = x_{t+1}\) ,因为,我们想要时刻t的输出为正确的下一个词。
下面是一些关于语言模型和文本生成的文献,
Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
2.2 机器翻译
机器翻译类似于语言模型,输入是一个源语言的词序列(例如,德语)。我们想输出一个目标语言的词序列(例如,英语)。关键的区别就是我们的输出只能在我们已经看见整个输入之后开始,因为,我们翻译句子的第一个词可能需要从整个输入句子获取信息。
下面是一些关于机器翻译的文献,
A Recursive Recurrent Neural Network for Statistical Machine Translation
Sequence to Sequence Learning with Neural Networks
Joint Language and Translation Modeling with Recurrent Neural Networks
2.3 语音识别
给定一个声学信号的输入序列,我们可以预测语音段序列以及它们的概率。
下面是一些关于语音识别的文献,
Towards End-to-End Speech Recognition with Recurrent Neural Networks
2.4 生成图像描述
结合卷积神经网络,循环神经网络也作为模型的一部分,用于对无标注图像 生成描述。让人惊讶的是它是如何工作的。组合模型甚至可以将生成的文字与图像上的特征进行对齐。
针对生成图像描述的深度图像-语义对齐,来源:http://cs.stanford.edu/people/karpathy/deepimagesent/
3 循环神经网络的训练
循环神经网络的训练类似于传统神经网络的训练。我们也使用反向传播算法,但是有所变化。因为循环神经网络在所有时刻的参数是共享的,但是每个输出的梯度不仅依赖当前时刻的计算,还依赖之前时刻的计算。例如,为了计算时刻 t = 4 的梯度,我们还需要反向传播3步,然后将梯度相加。这个被称为Backpropagation Through Time(BPTT)。如果你不能完全理解这个,不要担心,我们会在后面的文章详细地介绍它。现在,我们仅仅需要了解到利用BPTT算法训练出来的普通循环神经网络很难学习长期依赖(例如,距离很远的两步之间的依赖),原因就在于梯度消失/发散问题。目前已经有一些机制来解决这些问题,特定类型的循环神经网络(如LSTM)专门用于规避这些问题。
4 循环神经网络的扩展
近年来,研究者已经提出了更加复杂的循环神经网络,用以解决普通循环神经网络的缺陷。我们将会在后续的文章中详细介绍,但是,我想在这部分大致介绍一些,以便你们可以熟悉这些模型。
4.1 双向循环神经网络
Bidirectional RNNs(双向循环神经网络)基于这样一种思想,时刻t的输出不仅依赖序列中之前的元素,也依赖于后续的元素。例如,要预测序列中缺失的词,你会看一下左边和右边的上下文。双向循环神经网络非常简单。它们仅仅是两个循环神经网络堆在一起。输出是基于两个循环神经网络的隐层状态进行计算的。
双向循环神经网络的结构如下所示。
4.2 深度(双向)循环神经网络
Deep (Bidirectional) RNNs(深度(双向)循环神经网络)非常类似于双向循环神经网络,区别在于,每一时刻,网络有多层。实际上,这个可以让网络具备更强的学习能力(当然,也需要更多的训练数据)。
深度循环神经网络的结构如下所示。
4.3 LSTM
最近,LSTM网络非常流行,我们之前已经简单提到。LSTM在架构上与循环神经网络并没有本质的不同,但是它们计算隐层状态的函数会有所不同。LSTM中的记忆称为cell,你可以将它视为以之前的状态 \(h_{t-1}\) 和当前的输入 \(x_{t}\) 作为输入的一个黑盒。在内部,cell决定记忆中哪些保留(哪些删除)。然后,之前的状态,当前的记忆和输入进行组合。这类单元在捕获长期依赖上被证明是非常有效的。刚开始,LSTM会令人感到困惑,但是,如果你感兴趣,你可以看这篇博客 Understanding LSTM Networks 。
5 结论
到目前为止,我希望你已经对什么是循环神经网络以及它们能够做什么有一个基本的了解。在下一篇文章中,我们将会使用Python和Theano实现循环神经网络语言模型的第一个版本。
6 Reference
RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS
The Unreasonable Effectiveness of Recurrent Neural Networks
Recurrent Neural Network系列1--RNN(循环神经网络)概述的更多相关文章
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...
- Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM
yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...
- Recurrent Neural Networks(RNN) 循环神经网络初探
1. 针对机器学习/深度神经网络“记忆能力”的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pattern)是信息的一 ...
- 循环神经网络(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循环神经网络 ...
- Recurrent Neural Network(循环神经网络)
Reference: Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...
- Recurrent Neural Network(递归神经网络)
递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neural network ...
- Recurrent neural network (RNN) - Pytorch版
import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms # ...
随机推荐
- ABP框架 - Swagger UI 集成
文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(76)-微信公众平台开发-网页授权
前言 网页授权是:应用或者网站请求你用你的微信帐号登录,同意之后第三方应用可以获取你的个人信息 网上说了一大堆参数,实际很难理解和猜透,我们以实际的代码来演示比较通俗易懂 配置 实现之前我们必须配置用 ...
- android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...
- 用django创建一个项目
首先你得安装好python和django,然后配置好环境变量,安装python就不说了,从配置环境变量开始 1.配置环境变量 在我的电脑处点击右键,或者打开 控制面板\系统和安全\系统 -> 左 ...
- 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题
2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...
- 去IOE的一点反对意见以及其他
某天在机场听见两老板在聊天,说到他们目前销售的报表老跟不上的问题,说要请一个人,专门合并和分析一些发过来的excel表格,我真想冲上去说,老板,你需要的是一个信息处理的系统,你需要咨询么.回来一直耿耿 ...
- Dynamics CRM 之ADFS 使用 WID 的独立联合服务器
ADFS 的使用 WID 的独立联合服务器适用于自己的测试环境,常用的就是在虚机中使用. 拓扑图如下: wID:联合身份验证服务配置为使用 Windows 内部数据库
- mysql百万级分页优化
普通分页 数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start , 这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后 ...
- 录像时调用MediaRecorder的start()时发生start failed: -19错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Jquery对网页高度、宽度的操作
Jquery获取网页的宽度.高度 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: doc ...