深入理解RNN与LSTM

本文深入探讨了循环神经网络(RNN)的基础,包括前向传播、反向传播和梯度问题,以及RNN如何处理序列数据。特别地,文章详细介绍了长短期记忆网络(LSTM)的前向传播机制,阐述了LSTM如何解决RNN的梯度弥散问题,以增强长期记忆能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环神经网络(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都相同,对于每个时间步其都是采用同一个神经元进行前向传播。

FCN与RNN对比

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+Vht1+b)

如上式,对于某一层, W 、 V 、 b W、V、b WVb均为模型需要学习的参数,通过上图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[i1]+V[i1]ht1[i]+b[i])

为了简化研究,下文统一对单层RNN进行讨论。

值得注意的是,单层RNN前向传播可做如下变换:

W x t + V h t = [ W V ] × [ x t h t − 1 ] Wx_t+Vh_t=\left[\begin{array}{cc}W&V\end{array}\right]\times\left[\begin{array}{c}x_t\\h_t-1\end{array}\right] Wxt+Vht=[WV]×[xtht1]

为此,我们不妨将参数进行统一表示: 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[ht1;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 Vb为参数, g ( ⋅ ) g(\cdot) g()为激活函数,如softmax。

RNN单元

针对单层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[ht1;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 Wb的梯度,可进行如下推导:

Δ W

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值