循环神经网络

原创 2017年07月28日 19:38:56

RNN是什么

循环神经网络即recurrent neural network,它的提出主要是为了处理序列数据,序列数据是什么?就是前面的输入和后面的输入是有关联的,比如一句话,前后的词都是有关系的,“我肚子饿了,准备去xx”,根据前面的输入判断“xx”很大可能就是“吃饭”。这个就是序列数据。

循环神经网络有很多变种,比如LSTM、GRU等,这里搞清楚基础的循环神经网络的思想,对于理解其他变种就比较容易了。

与传统神经网络区别

下图是我们经典的全连接网络,从输入层到两个隐含层再到输出层,四层之间都是全连接的,而且层内之间的节点不相连。这种网络模型对于序列数据的预测就基本无能为力,比如某句话的下一个单词是什么就很难处理。

循环神经网络则擅长处理序列数据,它会对前面的信息进行记忆并且参与当前输出的计算,理论上循环神经网络能处理任意长度的序列数据。

RNN模型

RNN模型最抽象的画法就是下面这种了,但它不太好理解,因为它将时间维度挤压了。其中x是输入,U是输出层到隐含层的权重,s是隐含层值,W则是上个时刻隐含层作为这个时刻输入的权重,V是隐含层到输出层的权重,o是输出。

为方便理解,将上图展开,现在可以清楚看到输入x、隐层值s和输出o都有了下标t,这个t表示时刻,t-1是上一时刻,t+1则是下一时刻。不同时刻输入对应不同的输出,而且上一时刻的隐含层会影响当前时刻的输出。

那么反应到神经元是怎样的呢?如下图,这下就更清晰了,输入的3个神经元连接4个隐含层神经元,然后保留隐含层状态用于下一刻参与计算。

RNN的正向传播

还是使用这张图进行说明,设输出层的输入为nett,则很容易可以得到输出,

nett=Vst

ot=σ(nett)

其中σ是激活函数,再设隐含层的输入为ht

ht=Uxt+Wst1

st=σ(ht)

可以继续往前一个时刻推,有

st=σ(Uxt+Wσ(Uxt1+Wst2))

而t-2时刻又可以用t-3时刻来表示,从这就可以看出循环神经网络具有记忆,可以往前看任意个输入。

RNN的训练

假设损失函数为

E

在t时刻,根据误差逆传播,有

Etnett=Etototnett=E(ot)σ(nett)

首先,我们来看看对V的求导,每个时刻t的误差至于当前时刻的误差相关,则

EtV=EtnettnettV=Etnettst

其次,对W求导,对于一个训练样本,所有时刻的误差加起来才是这个样本的误差,某时刻t对W求偏导为,

EtW=EtnettnettststW

其中st=σ(Uxt+Wσ(Uxt1+Wst2))一直依赖上个时刻,某个样本的总误差是需要所有时刻加起来,不断对某个时刻进行求偏导,误差一直反向传播到t为0时刻,则

EW=tEtW=tk=0Etnettnettst(tj=k+1stsk)skW

其中stsk根据链式法则是会一直乘到k
时刻,k可以是0、1、2…,那么上式可以表示成,

EW=tk=0EtnettnettststskskW

最后,对U求导,

EU=EhthtU=Ehtxt

通过上面实现梯度下降训练。

梯度消失或梯度爆炸

对于tanh和sigmoid激活函数的RNN,我们说它不能很好的处理较长的序列,这个是为什么呢?简单说就是因为RNN很容易会存在梯度消失或梯度爆炸问题,发生这种情况时RNN就捕捉不了很早之前的序列的影响。

为什么会这样?接着往下看,tanh和sigmoid的梯度大致如下图所示,两端的梯度值都基本接近0了,而从上面的求导公式可以看到

EW=tEtW=tk=0Etnettnettst(tj=k+1stsk)skW

其中有个连乘操作,而向量函数对向量求导结果为一个Jacobian矩阵,元素为每个点的导数,离当前时刻越远则会乘越多激活函数的导数,指数型,本来就接近0的梯度再经过指数就更加小,基本忽略不计了,于是便接收不到远距离的影响,这就是RNN处理不了较长序列的原因。

而当矩阵中的值太大时,经过指数放大,则会产生梯度爆炸。

梯度爆炸会导致程序NaN,可以设置一个梯度阈值来处理。

梯度消失则可以用ReLU来替代tanh和sigmoid激活函数,或者用LSTM或GRU结构。

RNN简单应用例子

比如可以做字符级别的预测,如下图,假如这里只有四种字符,样本为”hello”单词,则输入h预测下个字符为e,e接着则输出l,l则输出l,最后输入l则输出o。

========广告时间========

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

循环神经网络(RNN)练习:比特币市场的分析与预测

小作业。循环神经网络(RNN)练习:比特币市场的分析与预测。内容分为两部分,一是用一段时间的价格预测未来一天的价格,二是用第t天的收益率,预测第t天的未来一周波动率。...

深度学习(06)_循环神经网络RNN和LSTM_01

循环神经网络RNN和LSTM_01 个人博客地址:http://lawlite.me/2017/06/14/RNN-%E5%BE%AA%E7%8E%AF%E7%A5%9E%E7%BB%8F%E7%BD...

详解循环神经网络(Recurrent Neural Network)

今天的学习资料是这篇文章,写的非常详细,有理论有代码,本文是补充一些小细节,可以二者结合看效果更好: https://zybuluo.com/hanbingtao/note/541458在文末有关于...

循环神经网络

  • 2017年02月22日 09:05
  • 3.15MB
  • 下载

Python实现循环神经网络RNN

  • 2017年05月05日 21:35
  • 6KB
  • 下载

双向长短时记忆循环神经网络详解(Bi-directional LSTM RNN)

1. Recurrent Neural Network (RNN)尽管从多层感知器(MLP)到循环神经网络(RNN)的扩展看起来微不足道,但是这对于序列的学习具有深远的意义。循环神经网络(RNN)的使...

循环神经网络:设计及应用

  • 2015年06月29日 18:03
  • 5.3MB
  • 下载

人工智能--循环神经网络

  • 2017年08月09日 13:12
  • 1.99MB
  • 下载

循环神经网络——双向LSTM&GRU

* 简单梳理调整了代码结构,方便使用 * 将所有gate的计算并在一个大矩阵乘法下完成提高GPU的利用率 * 除了LSTM(Long-Short Term Memory)以外的cell,还提供了GRU...

循环神经网络教程-第二部分 用python numpy theano实现RNN

这是Github的代码地址在这一部分我们将会用Python从头实现一个完整的RNN,并使用Theano(一个在GPU上执行操作的库)优化我们的实现。 Github上提供了完整的代码。我将跳过一些对于理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:循环神经网络
举报原因:
原因补充:

(最多只允许输入30个字)