GRU及双向RNN介绍

本文介绍了GRU(门控循环单元)及其简化LSTM的方式,以及如何通过重置门和更新门处理时间序列中的短期和长期依赖。此外,还讨论了双向循环神经网络,它能提供更丰富的上下文信息,通过前向和后向RNN捕捉序列的未来和过去信息。

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

GRU
假设我们已经熟知循环神经网络(RNN)及长短时间记忆网络(LSTM)。相比于简单的RNN,LSTM增加了记忆单元(memory cell)、输入门(input gate)、遗忘门(forget gate)及输出门(output gate),这些门及记忆单元组合起来大大提升了RNN处理远距离依赖问题的能力。
RNN:

Image Name

H t = ϕ ( X t W x h + H t − 1 W h h + b h ) H_{t} = ϕ(X_{t}W_{xh} + H_{t-1}W_{hh} + b_{h}) Ht=ϕ(XtWxh+Ht1Whh+bh)

长短期记忆long short-term memory

遗忘门:控制上一时间步的记忆细胞
输入门:控制当前时间步的输入
输出门:控制从记忆细胞到隐藏状态
记忆细胞:⼀种特殊的隐藏状态的信息的流动

Image Name

I t = σ ( X t W x i + H t − 1 W h i + b i ) F t = σ ( X t W x f + H t − 1 W h f + b f ) O t = σ ( X t W x o + H t − 1 W h o + b o ) C ~ t = t a n h ( X t W x c + H t − 1 W h c + b c ) C t = F t ⊙ C t − 1 + I t ⊙ C ~ t H t = O t ⊙ t a n h ( C t ) I_t = σ(X_tW_{xi} + H_{t−1}W_{hi} + b_i) \\ F_t = σ(X_tW_{xf} + H_{t−1}W_{hf} + b_f)\\ O_t = σ(X_tW_{xo} + H_{t−1}W_{ho} + b_o)\\ \widetilde{C}_t = tanh(X_tW_{xc} + H_{t−1}W_{hc} + b_c)\\ C_t = F_t ⊙C_{t−1} + I_t ⊙\widetilde{C}_t\\ H_t = O_t⊙tanh(C_t) It=σ(X

### 不同神经网络模型的概念及应用场景 #### 循环神经网络 (RNN) 循环神经网络是一种用于处理序列数据的神经网络结构。它通过在网络中引入循环连接来捕捉输入数据中的时间依赖关系。然而,标准 RNN 存在梯度消失和梯度爆炸的问题,在长时间序列上表现不佳[^1]。 ```python import torch.nn as nn rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=2) input = torch.randn(5, 3, 10) # 序列长度为5,批量大小为3,特征维度为10 h0 = torch.zeros(2, 3, 20) # 初始隐藏状态 output, hn = rnn(input, h0) ``` #### 长短时记忆网络 (LSTM) 为了克服传统 RNN 的缺陷,Hochreiter 和 Schmidhuber 提出了 LSTM 结构。LSTM 使用特殊的门机制(遗忘门、输入门和输出门)以及细胞状态来控制信息流,从而有效缓解了长期依赖问题[^2]。 ```python lstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2) input = torch.randn(5, 3, 10) h0 = torch.zeros(2, 3, 20) c0 = torch.zeros(2, 3, 20) # 初始细胞状态 output, (hn, cn) = lstm(input, (h0, c0)) ``` #### 门控循环单元 (GRU) GRU 是一种简化版的 LSTM,去掉了单独的细胞状态并融合了遗忘门和输入门的功能。这种设计减少了计算复杂度,同时保留了捕获长期依赖的能力[^3]。 ```python gru = nn.GRU(input_size=10, hidden_size=20, num_layers=2) input = torch.randn(5, 3, 10) h0 = torch.zeros(2, 3, 20) output, hn = gru(input, h0) ``` #### 双向 RNN 双向 RNN 同时考虑过去和未来的上下文信息。具体来说,它由两个独立的 RNN 组成——一个按正常顺序处理序列,另一个则逆序处理。最终的结果通常是这两个方向上的隐层表示拼接而成。 ```python birnn = nn.RNN(input_size=10, hidden_size=20, num_layers=2, bidirectional=True) input = torch.randn(5, 3, 10) h0 = torch.zeros(4, 3, 20) # 因为是双向,所以层数乘以2 output, hn = birnn(input, h0) ``` #### Transformer Transformer 完全摒弃了传统的循环结构,转而采用自注意力机制来自适应地加权不同位置的信息。这种方法不仅提高了并行化程度,还显著增强了模型对于全局上下文的理解能力。 ```python transformer_model = nn.Transformer(nhead=8, num_encoder_layers=6, num_decoder_layers=6) src = torch.rand((10, 32, 512)) # 源序列形状:(S,N,E),其中 S 是源序列长度,N 是批次大小,E 是嵌入维数 tgt = torch.rand((20, 32, 512)) # 目标序列形状:(T,N,E),其中 T 是目标序列长度 out = transformer_model(src, tgt) ``` ### 总结比较 | 特性 | RNN | GRU | LSTM | 双向 RNN | Transformer | |--------------|-------------|---------------|-----------------|----------------|------------| | 参数数量 | 较少 | 中等 | 更多 | 增加倍增效果 | 显著更多 | | 计算效率 | 高 | 较高 | 较低 | 减半速度提升 | 并行优势大 | | 上下文理解 | 局限于单向 | 改善但仍有限 | 大幅增强 | 考虑前后关联 | 全局最优 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值