RNN,LSTM,GRU计算方式及优缺点

本文主要参考李宏毅老师的视频介绍RNN相关知识,主要包括两个部分:

  • 分别介绍Navie RNN,LSTM,GRU的结构
  • 对比这三者的优缺点
1.RNN,LSTM,GRU结构及计算方式
1.1 Navie RNN

结构图:

在这里插入图片描述

计算公式:
h t = σ ( W h h t − 1 + W x x t ) y t = σ ( W y h t ) h^t=\sigma(W^hh^{t-1}+W^xx^t)\\y^t=\sigma(W^yh^t) ht=σ(Whht1+Wxxt)yt=σ(Wyht)
依赖每一个时刻的隐状态产生当前的输出,具体计算方式根据自己任务来定。

1.2 LSTM

结构图:

在这里插入图片描述

计算公式:
Z i = σ ( W i [ h t − 1 , x t ] ) Z f = σ ( W f [ h t − 1 , x t ] ) Z o = σ ( W o [ h t − 1 , x t ] ) Z = t a n h ( W [ h t − 1 , x t ] ) C t = Z f ⊙ C t − 1 + Z i ⊙ Z h t = Z o ⊙ t a n h C t y t = σ ( W y h t ) Z^i=\sigma(W_i[h^{t-1},x_t])\\Z^f=\sigma(W_f[h^{t-1},x_t])\\Z^o=\sigma(W_o[h^{t-1},x_t])\\Z=\mathop{tanh}(W[h^{t-1},x_t])\\C_t=Z^f\odot C^{t-1}+Z^i\odot{Z}\\h^t=Z^o\odot\mathop{tanh}C^t\\y^t=\sigma(W^yh^t) Zi=σ(Wi[ht1,xt])Zf=σ(Wf[ht1,xt])Zo=σ(Wo[ht1,xt])Z=tanh(W[ht1,xt])Ct=ZfCt1+ZiZht=ZotanhCtyt=σ(Wyht)

1.3 GRU

结构图:

在这里插入图片描述
计算公式:
r = σ ( W r [ h t − 1 , x t ] ) z = σ ( W r [ h t − 1 , x t ] ) h t − 1 ′ = r ⊙ h t − 1 h ′ = t a n h ( W h t − 1 ′ ) h t = ( 1 − z ) ⊙ h t − 1 + z ⊙ h ′ r=\sigma(W^r[h^{t-1},x^t])\\z=\sigma(W^r[h^{t-1},x^t])\\h^{t-1'}=r\odot h^{t-1}\\h'=\mathop{tanh}(Wh^{t-1'})\\h^t=(1-z)\odot h^{t-1}+z\odot h' r=σ(Wr[ht1,xt])z=σ(Wr[ht1,xt])ht1=rht1h=tanh(Wht1)ht=(1z)ht1+zh

2.RNN,LSTM,GRU的优缺点
2.1 为什么LSTM能解决RNN不能长期依赖的问题

(1)RNN的梯度消失问题导致不能“长期依赖”

RNN中的梯度消失不是指损失对参数的总梯度消失了,而是RNN中对较远时间步的梯度消失了。RNN中反向传播使用的是back propagation through time(BPTT)方法,损失loss对参数W的梯度等于loss在各时间步对w求导之和。用公式表示就是:
∂ E ∂ W h = ∑ i = 1 t ∂ E ∂ y t ∂ y t ∂ h t ∂ h t ∂ h i ∂ h i ∂ W h (1) \frac{\partial E}{\partial W^h}=\sum_{i=1}^t\frac{\partial E}{\partial y^t}\frac{\partial y_t}{\partial h_t}\frac{\partial h_t}{\partial h^i}\frac{\partial h_i}{\partial W^h}\tag1 WhE=i=1tytEhtythihtWhhi(1)
上式中 ∂ h t ∂ h i \frac{\partial h_t}{\partial h^i} hiht计算较复杂,根据复合函数求导方式连续求导。
∂ h t ∂ h i = ∏ k = i + 1 t ∂ h k ∂ h k − 1 (2) \frac{\partial h_t}{\partial h^i}=\prod_{k=i+1}^t\frac{\partial h_k}{\partial h^{k-1}}\tag2 hiht=k=i+1thk1hk(2)
∂ h k ∂ h k − 1 \frac{\partial h_k}{\partial h^{k-1}} hk1hk是当前隐状态对上一隐状态求偏导。
∂ h k ∂ h k − 1 = σ ′ W h \frac{\partial h_k}{\partial h^{k-1}}=\sigma'W^h hk1hk=σWh
假设某一时间步j距离t时间步相差了(t-j)时刻。则
∂ h t ∂ h i = ∏ t − j σ ′ W h \frac{\partial h_t}{\partial h^i}=\prod^{t-j}\sigma'W^h hiht=tjσWh
如果t-j很大,也就是j距离t时间步很远,当 s i g m a ′ W h > 1 sigma'W^h>1 sigmaWh>1时,会产生梯度爆炸问题, s i g m a ′ W h < 1 sigma'W^h<1 sigmaWh<1时,会产生梯度消失问题。而当t-j很小时,也就是j时t的短期依赖,则不存在梯度消失/梯度爆炸的问题。一般会使用梯度裁剪解决梯度爆炸问题。所以主要分析梯度消失问题。

loss对时间步j的梯度值反映了时间步j对最终输出 y t y_t yt的影响程度。就是j对最终输出 y t y_t yt的影响程度越大,则loss对时间步j的梯度值也就越大。loss对时间步j的梯度值趋于0,就说明了j对最终输出 y t y_t yt没影响。

综上:距离时间步t较远的j的梯度会消失,j对最终输出 y t y_t yt没影响。也就是说RNN中不能长期依赖。

(2)LSTM如何解决梯度消失

LSTM设计的初衷就是让当前记忆单元对上一记忆单元的偏导为常数。如在1997年最初版本的LSTM,记忆细胞更新公式为:
C t = C t − 1 + Z i ⊙ x t ∂ C t ∂ C t − 1 = 1 C^t=C^{t-1}+Z^i\odot x^t\\\frac{\partial C_t}{\partial C^{t-1}}=1 Ct=Ct1+ZixtCt1Ct=1
后来为了避免记忆细胞无线增长,引入了“遗忘门”。更新公式为:
C t = Z f ⊙ C t − 1 + Z i ⊙ x t C^t=Z^f\odot C^{t-1}+Z^i\odot x^t\\ Ct=ZfCt1+Zixt
此时连续偏导的值为:
∂ C t ∂ C t − 1 = Z f \frac{\partial C_t}{\partial C^{t-1}}=Z^f Ct1Ct=Zf
虽然 Z f Z^f Zf是一个[0,1]区间的数值,不在满足当前记忆单元对上一记忆单元的偏导为常数。但通常会给遗忘门设置一个很大的偏置项,使得遗忘门在多数情况下是关闭的,只有在少数情况下开启。回顾下遗忘门的公式,这里我们加上了偏置b。
Z f = σ ( W f [ h t − 1 , x t ] + b f ) Z^f=\sigma(W_f[h^{t-1},x_t]+b^f) Zf=σ(Wf[ht1,xt]+bf)
趋向于1时,遗忘门关闭,趋向于0,时,遗忘门打开。通过设置大的偏置项,使得大多数遗忘门的值趋于1。也就缓解了由于小数连乘导致的梯度消失问题。

2.2 相较于LSTM,GRU的优势

GRU的参数量少,减少过拟合的风险

LSTM的参数量是Navie RNN的4倍(看公式),参数量过多就会存在过拟合的风险,GRU只使用两个门控开关,达到了和LSTM接近的结果。其参数量是Navie RNN的三倍

### RNNLSTM GRU 的工作原理与流程对比 #### 1. 循环神经网络 (RNN) 循环神经网络通过引入隐藏状态来捕捉序列中的时间依赖关系。对于每一个输入 \( x_t \),RNN 计算当前时刻的隐藏状态 \( h_t \) 并输出 \( o_t \)[^3]。 \[ h_t = f(W_{hh}h_{t-1} + W_{xh}x_t) \] 其中,\( f() \) 是激活函数(通常是 tanh),而 \( W_{hh} \) \( W_{xh} \) 分别表示从前一时刻隐藏层到当前隐藏层以及从输入层到当前隐藏层之间的权重矩阵。然而,随着序列长度增加,标准 RNN 面临梯度消失或爆炸的问题,这使得其难以有效处理长时间跨度的数据关联[^5]。 #### 2. 长短期记忆网络 (LSTM) 为了克服传统 RNN 存在的问题,Hochreiter & Schmidhuber 提出了 LSTM 结构。它增加了三个门控机制——遗忘门、输入门输出门,允许模型有选择性地记住或忘记某些信息: - **遗忘门**:决定哪些信息应被丢弃; - **输入门**:控制新候选值更新细胞状态的程度; - **输出门**:确定最终输出的内容。 这种设计让 LSTM 更好地保持长期依赖关系,并缓解了梯度问题的影响[^4]。 具体计算如下所示: ```python forget_gate = sigmoid(X * W_f + prev_H * U_f + b_f) input_gate = sigmoid(X * W_i + prev_H * U_i + b_i) cell_candidate = tanh(X * W_c + prev_H * U_c + b_c) C_t = forget_gate * C_prev + input_gate * cell_candidate output_gate = sigmoid(X * W_o + prev_H * U_o + b_o) H_t = output_gate * tanh(C_t) ``` 这里 `X` 表示当前输入向量,`prev_H`, `C_prev` 则分别代表前一刻的状态细胞状态。 #### 3. 门控循环单元 (GRU) 相较于 LSTMGRU 将遗忘门与输入门合二为一形成更新门,并简化了内部结构。这样既减少了参数数量又提高了训练效率。GRU 主要由两个部分组成:重置门用于调节旧状态的重要性,更新后的状态则决定了如何组合新的输入与之前的状态[^2]。 公式表达如下: ```python reset_gate = sigmoid(X * W_r + H_prev * U_r + b_r) update_gate = sigmoid(X * W_z + H_prev * U_z + b_z) candidate_state = tanh(X * W_h + reset_gate * (H_prev * U_h) + b_h) H_t = update_gate * candidate_state + (1 - update_gate) * H_prev ``` 综上所述,虽然三种架构都旨在解决不同类型的序列建模挑战,但各自采用了不同的策略技术手段来实现这一目标。LSTM 以其复杂的多门控体系著称,能够更好地应对极长距离的记忆需求;相比之下,GRU 凭借精简的设计实现了更快的速度更低的空间复杂度,在许多应用场景下表现出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值