循环神经网络(RNN)与长短期记忆网络(LSTM)

循环神经网络(RNN)

  如果我们的数据是一个时间序列,且序列长短不一,在每一个时间点存在数据,如下 &lt; … , x t − 2 , x t − 1 , x t , x t + 1 , x t + 2 , ⋯ &gt; &lt;\dots , x_{t-2}, x_{t-1}, x_{t}, x_{t+1},x_{t+2}, \dots&gt; <,xt2,xt1,xt,xt+1,xt+2,>可以说不同时刻的数据相互之间十分可能存在某种联系。

  对于这种数据,如果考虑使用DNN或者CNN,首先,DNN与CNN的batch维度是不起作用的,因为batch中的数据在前向传播是独立进行,反向传播仅仅把误差相加,DNN与CNN显然无法很好的学习batch中的数据在时间上的相关规律。另一方面,如果我们明确知道这种数据的时间连续性在前100个时间点内,我们可以增加DNN的输入神经元或CNN的输入通道数到100,把前100个时间点的数据当做特征字段 x x x输入,来得到该时间点的目标输出 y y y。但是实际应用中,序列长短不一(可能还不够100),也有可能与超过100个时间点之前的数据相关系,这样我们的CNN和DNN就不好解决了,因此引入了RNN。

RNN网络结构

  RNN的一个cell往往占据一个隐层,只有一个隐层的RNN其网络结构如下图左,按时间轴展开后就得到了右边的图像。

其中的 h h h所代表的模块即是RNN的cell,它有一个箭头(权重是 W W W)指向自己,这就是"循环"二字的由来。一般看RNN要看其展开后的图像, x x x是网络的输入, h h h( h i d d e n hidden hidden的缩写)是隐藏层状态, o o o是网络的输出, y y y是期望输出, L L L就是 y y y o o o的损失,右上角的 t t t即是在 t t t时刻的数据,我们看 t t t时刻的隐藏层状态 h ( t ) h^{(t)} h(t),它是由 t t t时刻的输入 x ( t ) x^{(t)} x(t) t − 1 t-1 t1时刻的隐藏层状态 h ( t − 1 ) h^{(t-1)} h(t1)共同决定,可见RNN存在同一隐层内部的传播,这在CNN和DNN这种前馈神经网络结构中是不存在的,正是由于这种隐层内的传播,让RNN能够综合学习之前时刻的数据,来输出当前时刻的数据。

  上图中的权重 U , V , W U,V,W UVW,对于展开后的RNN,是参数共享的,不同时刻的 x 、 h 、 o x、h、o xho在计算时,共享相同的权重值。

  在不同的时刻,RNN有不同的输入 x ( t ) x^{(t)} x(t),同样就也有对应的输出 y ( t ) y^{(t)} y(t),但有时我们可能在输入完一个序列 x ( 1 ) … x ( n ) x^{(1)}\dots x^{(n)} x(1)x(n)后,只要最后的输出 y ( n ) y^{(n)} y(n),或者只要部分时刻的输出,或者有其它更复杂的情况,根据输入输出,我们可以对RNN进行分类。

  当然RNN一般都不会只有一个隐层,我们可以通过叠加RNN cell来增加RNN的深度,构成深度RNN结构,一般RNN的深度越深,学习能力越强,但是学习速率会下降。下面给出一个有5个隐层的RNN结构。

红色部分表示RNN的输入部分,绿色部分表示RNN的输出部分。不难看出来,RNN的输入包含两个部分,除了数据输入 x x x外,我们还要初始化隐藏层状态的输入 h h h,同理,RNN的输出也包含两个部分。

RNN的神经元个数

  我们在比较不同的神经网络对某一具体问题的效果时,需要把隐层的神经元个数设置成一样的。我一直认为RNN是没有神经元这个概念的,只有RNN cell这个概念,但是一个前辈明确指出RNN是有神经元的概念。针对RNN的神经元个数,网上有不同的说法,blog认为RNN的神经元个数近似可以看成,待更新参数(权值和偏置)的个数,还有人认为RNN某一隐层的神经元个数就是把RNN展开后,RNN结构在时间上的迭代次数,即输入的时间序列的长度。这两种定义都不是很到位,这样定义神经元,无法很好地对接DNN中的神经元。

  在说RNN的神经元之前,先说明一下RNN的输入 x x x的size。

  RNN的输入 x x x的size可以表示成 ( b a t c h   s i z e , s e q u e n c e   l e n g t h , i n p u t   s i z e ) (batch~size, sequence~length, input~size) (batch size,sequence length,input size),如果我们的batch size是10,对于batch中的一条记录,其包含的时间步总长sequence length是20,即我们的时间序列长是20,batch中的一条记录在某一时刻的特征总数是30,那么我们输入的size是 ( 10 , 20 , 30 ) (10, 20, 30) (10,20,30),同样的,每一个隐藏层的隐藏状态 h h h可以定义成 ( b a t c h   s i z e , s e q u e n c e   l e n g t h , h i d d e n   s i z e ) (batch~size, sequence~length, hidden~size) (batch size,sequence length,hidden size)

  我们把只有一个隐层的RNN,其 t − 1 t-1 t1时刻到 t t t时刻展开的更加彻底,见下图:

m就是 x x x的size中的 i n p u t   s i z e input~size input size,n就是 h h h的size中的 h i d d e n   s i z e hidden~size hidden size,这样我们就可以按照看DNN结构的方式,来看RNN的 t t t时刻的结构,可见隐层的神经元个数就是 h i d d e n   s i z e hidden~size hidden size

RNN前向传播

  在 t t t时刻,RNN根据该时刻的输入 x t x_{t} xt,和上一时刻保留的信息 h t − 1 h_{t-1} ht1,按照下面的公式计算该时刻的输出 o t o_{t} ot h t = f ( U x t + W h t − 1 + b ) o t = f ( V h t + c ) h_{t} = f(Ux_{t}+Wh_{t-1}+b) \\ o_{t} = f(Vh_{t}+c) \\ ht=f(Uxt+Wht1+b)ot=f(Vht+c)

其中 f ( ⋅ ) f(·) f()是激活函数,最终的损失函数是对需要考虑的所有时刻的损失的叠加 L = ∑ t = 1 T l t = ∑ t = 1 T l ( o t , y t ) L= \sum\limits_{t=1}^{T}l_{t}=\sum\limits_{t=1}^{T}l(o_{t}, y_{t}) L=t=1Tlt=t=1Tl(ot,yt)

其中, y

  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值