什么是RNN网络?

RNNs背后的主要目的是要使用序列本身的顺序信息。在传统的神经网络里,我们假设输入(输出)是条件独立的。但是,在许多任务里,这是个非常非常差的假设。如果你想预测一个序列中的下一个单词是什么,你最好知道它的前一个词是什么。RNNs被叫做循环神经网络是因为它对于序列中的每个元素都做相同的操作,输出会依赖于之前的计算。用另一种说法,RNNs拥有了一个能捕获到目前为止所有计算的结果的记忆单元。从理论上讲,RNNs能使用任意长度的序列信息,但是,在实践中RNNs被限制到只能回溯几步(稍后再讨论这个问题)。下面是一个典型的RNN。

\[A recurrent neural network and the unfolding in time of the computation involved in its forward\\computation. Source: Nature\]

上面的示意图展示了一个RNN展开为整个网络时的样子。通过展开图,我们简单的认为我们写出了全完序列的网络结构。举个例子,如果我们关心的序列是由5个词组成的句子,网络将被展开为一个5层的神经网络,每层表示一个词。计算RNN时的公式如下。

  • \(x_t\) 是第\(t\) 步时间下的输入。举个例子,\(x_1\) 可以是一个one-hot 编码的向量,相当于句子的第二个词。
  • \(x_t\) 第\(t\)步的隐藏状态,\(s_t\)是基于之前的隐藏状态和当前输入计算出来的:\(s_t=f(Ux_t + Ws_{t-1})\),f通常是一个非线性函数,例如:ReLU函数。\(s_{t-1}\)是需要计算的第一个隐藏状态,通常全部初始化为0.
  • \(o_t\)是第\(t\)步的输出。例如:如果我们想预测一个句子中的下一个词是什么,\(o_t\)将会是一个关于我们词典的概率向量。\(o_t=\mathrm{softmax}(Vs_t)\)

这里还有一些需要注意的点:

  • 你可以把隐藏状态\(s_t\)当做是网络的记忆单元。\(s_t\)捕获了当前步之前所产生的信息。输出\(o_t\)只是根据第\(t\)步的记忆单元来计算。如上面简要提到的,在实践是它(记忆单元)是比较复杂的,因为\(s_t\)通常无法捕获到很多步之前的信息。
  • RNN不像每层都使用不同参数的传统神经网络,RNN所有步共享相同的参数(上面的 U,V,W)。这反映了一个事实,每一步我们都做同样的任务,只有输入不同。这大大减少了我们需要学习的参数数量。
  • 上面的示意图每个步骤均有输出,但对于一些任务来说,这个也许不是必要的。例如,当我们预测一个句子的情感的时候,我们可能只关注最后的输出,而不是每个词的情感。相似的,我们也不需要在每个步骤都有输入。RNN的主要特征是捕获了一个序列一些信息的隐藏状态。

RNNs 能做什么?

RNNs 在很多自然语言处理的任务中取得了很大成功。在此刻我要提醒你,最常使用的RNNs是LSTMs,LSTMs相比于普通的RNNs能更好的捕获到长距离依赖。但是不要担心,LSTMs大体上与我们将要在这个课上开发的RNN是一样的,LSTMs只是用一个不同的方法来计算隐藏状态。我们在之后会发文中会包含LSTMs细节。下面是一些RNN在自然语言处理上的应用的例子。

未完待续。。。

本文是翻译自wildml的一篇RNN导读文章。本人英语水平有限,仅共参考学习。

RNNs的更多相关文章

  1. 开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs

    Bengio, LeCun, Jordan, Hinton, Schmidhuber, Ng, de Freitas and OpenAI have done reddit AMA's.  These ...

  2. RNNs在股票价格预测的应用

    RNNs在股票价格预测的应用 前言 RNN和LSTMs在时态数据上表现特别好,这就是为什么他们在语音识别上是有效的.我们通过前25天的开高收低价格,去预测下一时刻的前收盘价.每个时间序列通过一个高斯分 ...

  3. PP: Shallow RNNs: a method for accurate time-series classification on tiny devices

    Problem: time series classification shallow RNNs: the first layer splits the input sequence and runs ...

  4. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  5. CNN for NLP (CS224D)

    斯坦福课程CS224d: Deep Learning for Natural Language Processing lecture13:Convolutional neural networks - ...

  6. (转)The Neural Network Zoo

    转自:http://www.asimovinstitute.org/neural-network-zoo/ THE NEURAL NETWORK ZOO POSTED ON SEPTEMBER 14, ...

  7. (转)LSTM NEURAL NETWORK FOR TIME SERIES PREDICTION

    LSTM NEURAL NETWORK FOR TIME SERIES PREDICTION Wed 21st Dec 2016   Neural Networks these days are th ...

  8. (译) Conditional Variational Autoencoders 条件式变换自编码机

    Conditional Variational Autoencoders --- 条件式变换自编码机 Goal of a Variational Autoencoder: 一个 VAE(variati ...

  9. RNN 入门教程 Part 4 – 实现 RNN-LSTM 和 GRU 模型

    转载 - Recurrent Neural Network Tutorial, Part 4 – Implementing a GRU/LSTM RNN with Python and Theano ...

随机推荐

  1. python中的列表生成式

    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...

  2. Unity获取文件夹下指定类型的文件数量

    有个文件夹里面有很多的图片,都是.png格式的,要是一个一个的拖到脚本上觉得很麻烦,就写了一个遍历添加的cars,变量是List<Sprite> 代码如下: using UnityEngi ...

  3. 【BZOJ】1045: [HAOI2008]糖果传递(中位数)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include < ...

  4. hdu 2059:龟兔赛跑(动态规划 DP)

    龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  5. 【mysql-python】安装+基本使用

    安装:从SourceForge.net上下载最新的MySQLdb,http://sourceforge.net/projects/mysql-python/ 运行exe文件 使用 From:http: ...

  6. 【mysql】windows7 安装 Mysql

    From: http://jingyan.baidu.com/article/e52e3615a1128c40c70c5174.html 安装(解压) ZIP Archive版是免安装的.只要解压就行 ...

  7. 深入.net调用webservice的总结分析

    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice .我们都知道,调用webserivice 最简单的方法就是在 "引用"  ...

  8. C语言while语句

    在C语言中,共有三大常用的程序结构: 顺序结构:代码从前往后执行,没有任何“拐弯抹角”: 选择结构:也叫分支结构,重点要掌握 if else.switch 以及条件运算符: 循环结构:重复执行同一段代 ...

  9. EL表达式页面间传参(对象参数和普通参数)

    ${param['user.name']}.${param.name}

  10. [素数个数模板] HDU 5901 Count primes

    #include<cstdio> #include<cmath> using namespace std; #define LL long long ; bool np[N]; ...