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 # ...
随机推荐
- MVC5 网站开发之九 网站设置
网站配置一般用来保存网站的一些设置,写在配置文件中比写在数据库中要合适一下,因为配置文件本身带有缓存,随网站启动读入缓存中,速度更快,而保存在数据库中要单独为一条记录创建一个表,结构不够清晰,而且读写 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- R abalone data set
#鲍鱼数据集aburl <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data' ab ...
- ActiveRecord模式整理
DAO Data Access Object,数据访问对象 DAO是一个软件设计的指导原则,在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象 ...
- JVM类加载
JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...
- Android的Kotlin秘方(II):RecyclerView 和 DiffUtil
作者:Antonio Leiva 时间:Sep 12, 2016 原文链接:http://antonioleiva.com/recyclerview-diffutil-kotlin/ 如你所知,在[支 ...
- asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...
- 【Update】C# 批量插入数据 SqlBulkCopy
SqlBulkCopy的原理就是通过在客户端把数据都缓存在table中,然后利用SqlBulkCopy一次性把table中的数据插入到数据库中. SqlConnection sqlConn = new ...
- [Hadoop in Action] 第6章 编程实践
Hadoop程序开发的独门绝技 在本地,伪分布和全分布模式下调试程序 程序输出的完整性检查和回归测试 日志和监控 性能调优 1.开发MapReduce程序 [本地模式] 本地模式 ...
- SpringMVC初步
SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...