深入理解RNN与LSTM
Posted Zip Zou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解RNN与LSTM相关的知识,希望对你有一定的参考价值。
文章目录
循环神经网络(Recurrent Neural Network)基础
在深度学习领域,神经网络已经被用于处理各类数据,如CNN在图像领域的应用,全连接神经网络在分类问题的应用等。随着神经网络在各个领域的渗透,传统以统计机器学习为主的NLP问题,也逐渐开始采用深度学习的方法来解决。如由Google Brain提出的Word2Vec模型,便将传统BoW等统计方法的词向量方法,带入到了以深度学习为基础的Distribution Representation的方法中来,真正地将NLP问题带入了深度学习的练兵场。当然,RNN的模型并非局限于NLP领域,而是为了解决一系列序列化数据的建模问题,如视频、语音等,而文本也只是序列化数据的一种典型案例。
RNN的特征在于,对于每个RNN神经元,其参数始终共享,即对于文本序列,任何一个输入都经过相同的处理,得到一个输出。在传统的全连接神经网络的结构中,神经元之间互不影响,并没有直接联系,神经元与神经元之间相互独立。而在RNN结构中,隐藏层的神经元开始通过一个隐藏状态所相连,通常会被表示为 h t h_t ht。在理解RNN与全连接神经网络时,需要对两者的结构加以区分,通常,FCN会采用水平方式进行可视化理解,即每一层的神经元垂直排列,而不同层之间以水平方式排布。但在RNN的模型图中,隐藏层的不同神经元之间通常水平排列,而隐藏层的不同层之间以垂直方式排列,如图所示,在FCN网络中,各层水平布局,隐藏层各神经元相互独立,在RNN中,各层以垂直布局,而水平方向上布局着各神经元。注意:RNN结构图只是为了使得结构直观易理解,而在水平方向上其实每个A都相同,对于每个时间步其都是采用同一个神经元进行前向传播。
RNN的前向传播
在RNN中,序列数据按照其时间顺序,依次输入到网络中,而时间顺序则表示时间步的概念。在RNN中,隐藏状态极为重要,隐藏状态是连接各隐藏层各神经元的中介值。如上图,在第一层中,在时间步 t t t,RNN隐藏层神经元得到隐藏状态 h t ( 1 ) h_t^(1) ht(1),在时间步 t + 1 t+1 t+1,则接受来自上一个时间步的隐藏层输出 h t ( 1 ) h_t^(1) ht(1),得到新的隐藏状态 h t + 1 ( 1 ) h_t+1^(1) ht+1(1)。而从垂直方向上看,各层之间,也通过隐藏状态所连接,对于 L 1 L_1 L1到 L 2 L_2 L2, L 2 L_2 L2在水平的时间轴上,各神经元通过隐藏状态 h t ( 2 ) h_t^(2) ht(2)连接,而层间还将接受前一层的 h t ( 1 ) h_t^(1) ht(1)的值来作为 x t x_t xt的值,从而获得到该层新的隐藏状态。因此,RNN是一个在水平方向和垂直方向上,均可扩展的结构(水平方向上只是人为添加的易于理解的状态,在工程实践中不存在水平方向的设置)。
根据RNN的定义,可以简单地给出RNN的前向传播过程:
h t = g ( W x t + V h t − 1 + b ) h_t=g\\left(Wx_t+Vh_t-1+b\\right) ht=g(Wxt+Vht−1+b)
如上式,对于某一层, W 、 V 、 b W、V、b W、V、b均为模型需要学习的参数,通过上图RNN结构图的对应,则应为 L 1 L_1 L1层水平方向所有神经元的参数,**同一层的RNN单元参数相同,即参数共享。**若考虑多层RNN,则可将上式改为:
h t [ i ] = g ( W [ i ] h t [ i − 1 ] + V [ i − 1 ] h t − 1 [ i ] + b [ i ] ) h_t^[i]=g\\left(W^[i]h_t^[i-1]+V^[i-1]h_t-1^[i]+b^[i]\\right) ht[i]=g(W[i]ht[i−1]+V[i−1]ht−1[i]+b[i])
为了简化研究,下文统一对单层RNN进行讨论。
值得注意的是,单层RNN前向传播可做如下变换:
W x t + V h t = [ W V ] × [ x t h t − 1 ] Wx_t+Vh_t=\\left[\\beginarrayccW&V\\endarray\\right]\\times\\left[\\beginarraycx_t\\\\h_t-1\\endarray\\right] Wxt+Vht=[WV]×[xtht−1]
为此,我们不妨将参数进行统一表示: W = [ W ; V ] W=\\left[W;V\\right] W=[W;V],其中 [ ⋅ ; ⋅ ] [\\cdot;\\cdot] [⋅;⋅]表示拼接操作,则前向传播变为 h t = g ( W [ h t − 1 ; x t ] ⊤ + b ) h_t=g\\left(W[h_t-1;x_t]^\\top+b\\right) ht=g(W[ht−1;xt]⊤+b)。
再获得隐藏状态后,若需要获得每一个时间步的输出,则需要进一步进行线性变换:
o t = V h t + b o , y t = g ( o t ) o_t=Vh_t+b_o, \\;\\;y_t=g(o_t) ot=Vht+bo,yt=g(ot),其中 V 、 b V、b V、b为参数, g ( ⋅ ) g(\\cdot) g(⋅)为激活函数,如softmax。
针对单层RNN,可采用上述结构进行描述。
RNN的反向传播
为简化分析,选用RNN的最后时间步的隐藏状态(无输出层)直接作为输出层,即 o u t p u t = h t = g ( W [ h t − 1 ; x t ] ⊤ + b ) output=h_t=g\\left(W\\left[h_t-1;x_t\\right]^\\top+b\\right) output=ht=g(W[ht−1;xt]⊤+b),若为分类问题,则 g ( ⋅ ) g(\\cdot) g(⋅)通常为Softmax。定义问题的损失函数为 J ( θ ) = L o s s ( o u t p u t , y ∣ θ ) J(\\theta)=Loss\\left(output,y|\\theta\\right) J(θ)=Loss(output,y∣θ),则在进行反向传播时,需要计算 W 、 b W、b W、b的梯度,可进行如下推导:
Δ W = ∂ J ( θ ) ∂ W = ∂ ∂ W L o s s ( o u t p u t , y ) = L o s s ( o u t p u t , y ) ′ ∂ g ( W [ h t − 1 ; x ] ⊤ + b ) ∂ W = L o s s ( o u t p u t , y ) ′ g ( ⋅ ) ′ [ h t − 1 ; x t ] \\Delta W=\\frac\\partial J(\\theta)\\partial W=\\frac\\partial\\partial W Loss(output,y)=Loss(output,y)'\\frac\\partial g\\left(W\\left[h_t-1;x\\right]^\\top+b\\right)\\partial W=Loss(output,y)'g(\\cdot)'[h_t-1;x_t] ΔW=以上是关于深入理解RNN与LSTM的主要内容,如果未能解决你的问题,请参考以下文章