LSTM和GRU区别与联系

LSTM和GRU都是特殊的RNN架构,都是为了解决梯度消失问题而生。GRU可以认为是简化版本的LSTM。

二者的核心概念:

当前记忆 = 过去记忆 + 记忆增量

1、LSTM网络

LSTM具有三个门结构,输入门,输出门和遗忘门。
记忆增量当前输入过去输出的加权和。
遗忘门控制过去记忆的量,输入门控制记忆增量的量。
输出门控制当前记忆当前输出的影响。
遗忘门:
f = σ ( U 1 x t + W 1 h t − 1 ) f=\sigma(U_1x_t+W_1h_{t-1}) f=σ(U1xt+W1ht1)
输入门:
i = σ ( U 2 x t + W 2 h t − 1 ) i=\sigma(U_2x_t+W_2h_{t-1}) i=σ(U2xt+W2ht1)

当前记忆:
c t = f ⊙ c t − 1 + i ⊙ t a n h ( U 3 x t + W 3 h t − 1 ) c_{t}=f\odot c_{t-1}+i\odot tanh(U_3x_t+W_3h_{t-1}) ct=fct1+itanh(U3xt+W3ht1)
输出门:
o = σ ( U 3 x t + W 3 h t − 1 ) o=\sigma(U_3x_t+W_3h_{t-1}) o=σ(U3xt+W3ht1)
当前输出:
h t = o ⊙ t a n h ( c t ) h_t=o\odot tanh(c_{t}) ht=otanh(ct)

2、GRU网络

GRU具体两个门结构:重置门 和更新门。
记忆增量(或者说候选状态)由当前输入信息和过去记忆(或者说过去状态)累加形成,而重置门控制着过去记忆在当前记忆增量中的重要性。
更新门控制过去记忆当前记忆增量的比例。
重置门:
r t = σ ( U 1 x t + W 1 h t − 1 ) r_t=\sigma(U_1x_t+W_1h_{t-1}) rt=σ(U1xt+W1ht1)
更新门:
z t = σ ( U 2 x t + W 2 h t − 1 ) z_t=\sigma(U_2x_t+W_2h_{t-1}) zt=σ(U2xt+W2ht1)
记忆增量:
h ~ = t a n h ( U 3 x t + W 3 ( h t − 1 ⊙ r t ) ) \tilde{h}=tanh(U_3x_t+W_3(h_{t-1}\odot r_t)) h~=tanh(U3xt+W3(ht1rt))
当前记忆:
h t = ( 1 − z t ) ⊙ h t − 1 + z t ⊙ h ~ h_t=(1-z_t)\odot h_{t-1}+z_t\odot\tilde{h} ht=(1zt)ht1+zth~

可以看出GRU和LSTM非常类似,实际上性能也类似。只是GRU参数比LSTM少,训练速度更快。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)是两种常用的循环神经网络(RNN)模型,用于解决序列数据建模中的长期依赖问题。它们在模型结构和计方式上有一些区别LSTM模型结构: LSTM模型由输入门、遗忘门和输出门组成。输入门控制新输入的信息是否进入细胞状态,遗忘门控制细胞状态中的信息是否被遗忘,输出门控制细胞状态中的信息是否输出到下一层。LSTM通过这些门的控制,可以有效地处理长期依赖关系。 GRU模型结构: GRU模型也由更新门和重置门组成。更新门决定了新的输入信息和前一时刻的隐藏状态之间的权重,重置门决定了前一时刻的隐藏状态对当前时刻的影响程度。GRU通过这两个门的控制,可以在一定程度上解决长期依赖问题。 LSTMGRU的比较: 1. LSTMGRU在很多情况下表现相似,但是GRU的计更简单,更易于实现。 2. LSTM具有更复杂的门控机制,可以更好地处理长期依赖关系,但是计量较大。 3. GRU通过更新门和重置门的控制,可以在一定程度上解决长期依赖问题,计量较小。 代码实现: 以下是GRU模型的代码实现示例: ```python import torch import torch.nn as nn # 定义GRU模型 class GRUModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(GRUModel, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) out, _ = self.gru(x, h0) out = self.fc(out[:, -1, :]) return out # 创建GRU模型实例 input_size = 10 hidden_size = 20 num_layers = 2 output_size = 1 model = GRUModel(input_size, hidden_size, num_layers, output_size) print(model) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值