RNN、LSTM和GRU的简单介绍

1、RNN(Recurrent Neural Network,循环神经网络)

1.1为什么会有RNN的出现?
  因为以往的神经网络都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是现实生活中很多情况是,这一个的输入需要参照前面一个的输入的.
  比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。(用联系的眼光去看待各个神经元,而不是孤立而片面地去看待每个神经元)

1.2RNN的结构?
在这里插入图片描述

这个网络在t时刻接收到输入xt之后,隐藏层的值是 st,输出值是Ot。关键一点是, st的值不仅仅取决于xt,还取决于 s(t-1) 。我们可以用下面的公式来表示循环神经网络的计算方法:

用公式表示如下(为了方便理解,没有加入偏置b):
在这里插入图片描述

2、LSTM(Long Short Term Memory networks

### RNNLSTM GRU 的区别及其适用场景 #### 1. 特点对比 - **RNN (Recurrent Neural Network)** 循环神经网络是一种用于处理序列数据的模型,其核心特点是能够在不同时间步 $ t $ 上共享权重并保持隐藏状态。然而,标准的 RNN 存在一个主要缺陷——难以捕捉长时间依赖关系,这主要是由于梯度消失或爆炸问题引起的[^2]。 - **LSTM (Long Short-Term Memory)** 长短期记忆网络通过引入特殊的门控机制解决了 RNN 中存在的梯度消失问题。具体来说,它维护了一个细胞状态(Cell State, $ C_t $)以及隐藏状态(Hidden State, $ H_t $)。这些额外的状态允许 LSTM 更好地保存历史信息,并决定哪些部分应该被遗忘或者更新][^[^34]。 - **GRU (Gated Recurrent Unit)** 门控循环单元可以看作是对 LSTM 的简化版本,在保留了大部分性能的同时减少了计算复杂度。相比于 LSTM 的三个门(输入门、忘记门输出门),GRU 将输入门与忘记门合并成了单一的更新门,并且不再区分内部的记忆单元外部的隐藏表示[^4]。 #### 2. 参数说明 在上述提到的各种架构中,“$ W_{hv} $" 是指连接当前时刻输入向量 v 到下一时刻隐含层 h 的权值矩阵之一;类似的还有其他类型的权重比如那些负责调节各门行为的参数等等[^1]。 #### 3. 应用场景分析 每种模型都有自己的优势所在: - 对于较短的时间跨度内的模式识别任务,简单RNN 可能已经足够满足需求; - 当面对更复杂的序列建模挑战时,则可能需要采用更加先进的变体如 LSTM 或者 GRU 来应对可能出现的数据间较长距离的相关性; - 如果资源有限但又希望获得接近最佳的结果的话,那么可以选择效率更高的 GRU 而不是完整的 LSTM 结构因为两者表现往往相差不大但在实现上后者更为轻便快捷一些. ```python import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.rnn(x) out = self.fc(out[:, -1, :]) return out class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim): super(LSTMModel, self).__init__() self.hidden_dim = hidden_dim self.layer_dim = layer_dim self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): _, (hn, _) = self.lstm(x) out = self.fc(hn[-1]) return out class GRUModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(GRUModel, self).__init__() self.gru = nn.GRU(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): gru_out, _ = self.gru(x) out = self.fc(gru_out[:,-1,:]) return out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值