【神经网络】图解LSTM和GRU

LSTM和GRU是为了解决循环神经网络(RNN)的短期记忆问题而提出的。RNN在处理长序列时容易遗忘早期信息,LSTM通过门控单元来学习何时保留或遗忘信息,而GRU简化了这一过程,只有重置门和更新门。两者都在语音识别、文本生成等领域有广泛应用。

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

图解LSTM和GRU

1.问题

循环神经网络(RNN,Recurrent Neural Network)受到短期记忆的影响。如果一个序列足够长,就很难将早期产生的信息带到后续的步骤中来。因此,如果试图处理一段文字来做预测,RNN可能会从一开始就遗漏了重要信息。

在这里插入图片描述
在反向传播过程中,循环神经网络会受到梯度消失问题的影响。梯度是用于更新神经网络权重的数值。梯度消失问题是指当梯度通过时间反向传播时,梯度会缩小。如果一个梯度值变得非常小,它就不会有太多的学习贡献。
在这里插入图片描述
因此,在循环神经网络中,获得小梯度更新的层会停止学习。这些通常是早期的层。因此,在较长序列中,RNN会忘记这些不学习的层,就像有一个短期记忆。

2.解决方法

LSTM(Long Short-Term Memory)和GRU(Gated Recurrent Unit)的诞生是为了解决短期记忆问题。它们利用具有内部机制的门控来调节信息的流动。
在这里插入图片描述
这些门控可以学习序列中哪些数据是重要的,再决定保留或舍弃。这样就可以将相关信息沿着长长的序列链路传递下去,以进行预测。几乎所有基于循环神经网络的先进成果都是基于这两个网络实现的。LSTM和GRU在语音识别、语音合成和文本生成有着广泛的应用。

3.实例

举一个通俗的例子。假设你正在看网上的评论,决定是否想买一件衣服。你首先阅读评论,然后确定是否有人认为它是好还是坏。

当你阅读评论时,你的大脑下意识地只记住了重要的关键词。你会对像“惊人” 和“完美”这样的词印象深刻。你对“这个”、“给了”、“所有”、“应该”等词不太在意。如果第二天有朋友问你评论说了什么,你可能不会一字不落地记住。但你可能会记得主要内容,如“一定会再次购买”,其他的词则会从记忆中消失了。

这基本上就是LSTM或GRU的作用。它可以学习只保留相关信息来进行预测,而忘记不相关的数据。在这种情况下,你记住的那些话让你判断它是好的。

4.循环神经网络

为了理解LSTM或GRU是如何实现的,我们一起回顾一下循环神经网络。首先,单词被转化为机器可读的向量。然后,RNN逐一处理向量序列。
在这里插入图片描述
在处理过程中,它将之前的隐藏状态传递给序列的下一步。隐藏状态充当了神经网络的存储器。它保存着网络以前看到的数据信息。
在这里插入图片描述
让我们看一下RNN的一个单元,看看如何计算隐藏状态。首先,输入和先前的隐藏状态被组合成一个向量。该向量现在有关于当前输入和先前输入的信息。该向量经过tanh激活,输出是新的隐藏状态,或者说是网络的记忆。
在这里插入图片描述

Tanh激活函数

tanh激活函数被用来帮助调节流经网络的数值,使其总是在-1和1之间。
在这里插入图片描述
当向量在神经网络中流动时,由于各种数学运算,它经历了许多转换。因此,想象一下一个连续被乘以的数值,比方说3。你可以看到一些数值如何快速增大并成为天文数字,导致其他数值看起来无足轻重。
在这里插入图片描述所以这就是一个RNN。它的内部操作非常少,但在适当的情况下(如短序列)工作得非常好。RNN使用的计算资源比它的进化变体,如LSTM和GRU少得多。

5.LSTM

LSTM的控制流程与循环神经网络相似。它在向前传播时处理数据并传递信息。不同之处在于LSTM单元内的操作。这些操作是用来让LSTM记住还是忘记信息。
在这里插入图片描述

核心概念

LSTM的核心概念是单元状态,以及它的各种门。单元状态就像一条运输公路,将相对的信息一直传递到序列链中。你可以把它看作是网络的“存储器”。从理论上讲,单元状态可以在整个序列的处理过程中携带相关信息。因此,即使是较早的时间步骤的信息也可以进入以后的时间步骤,减少短期记忆的影响。在单元状态的旅程中,信息通过门被添加或删除到单元状态中。这些门是不同的神经网络,决定哪些信息可以在单元状态中留下。在训练过程中,门可以学习哪些信息是需要保留或遗忘的。

Sigmoid函数

门控包含sigmoid激活函数。Sigmoid激活类似于tanh激活。这对更新或遗忘数据很有帮助,因为任何数字乘以0都是0,导致数值消失或被遗忘。任何数字乘以1都是相同的值,因此该值保持不变或被保留。网络可以了解哪些数据不重要,因此可以被遗忘,或者哪些数据是重要的,可以保留。
在这里插入图片描述
所以我们有三个不同的门来调节LSTM单元中的信息流。一个遗忘门,一个输入门,一个输出门。

遗忘门

首先,我们有一个遗忘门。这个门决定哪些信息应该被丢弃或保留。来自前一个隐藏状态的信息和来自当前输入的信息被传递到sigmoid函数中。数值在0和1之间。越接近0意味着遗忘,越接近1意味着保留。
在这里插入图片描述

输入门

为了更新单元的状态,我们有一个输入门。首先,我们将之前的隐藏状态和当前的输入传给一个sigmoid函数。这决定了哪些值将被更新,将这些值转换为0和1之间。0表示不重要,1表示重要。还要将隐藏状态和当前输入传入tanh函数,以转化为-1和1之间的值,帮助调节网络。然后将tanh输出与sigmoid输出相乘。sigmoid输出将决定哪些信息是重要的,可以从tanh输出中保留。
在这里插入图片描述

单元状态

现在我们有足够的信息来计算单元的状态。首先,单元状态和遗忘向量点乘。如果被乘以接近0的值,就有可能在单元状态中丢掉数值。然后我们从输入门的输出做一个点加法,将细胞状态更新为神经网络认为相关的新值。这样我们就得到了新的单元格状态。
在这里插入图片描述

输出门

最后我们有一个输出门。输出门决定下一个隐藏状态应该是什么。隐藏状态包含了以前输入的信息。隐藏状态也用于预测。首先,我们将之前的隐藏状态和当前的输入传给一个sigmoid函数。然后我们把新修改的单元格状态传给tanh函数。我们将tanh输出与sigmoid输出相乘,以决定隐藏状态应该携带什么信息。输出就是隐藏状态。新的单元格状态和新的隐藏状态被带到下一个时间步骤中。
在这里插入图片描述
总结:遗忘门决定从以前的步骤中保留什么相关信息。输入门决定从当前步骤中添加什么相关信息。输出门决定了下一个隐藏状态应该是什么。

伪代码实现

这里有一个使用python伪代码的例子。

  1. 首先,之前的隐藏状态和当前的输入被串联起来。我们称它为联合。
  2. 合并后的数据被送入遗忘层。这个层会删除不相关的数据。
  3. 使用联合创建一个候选层。候选层持有可能的值以添加到单元格状态中。
  4. 组合也被送入输入层。该层决定候选人中的哪些数据应该被添加到新的单元格状态中。
  5. 在计算完遗忘层、候选层和输入层后,使用这些向量和之前的细胞状态来计算细胞状态。
  6. 然后计算出输出。
  7. 将输出和新的单元格状态相乘,就得到了新的隐藏状态。

在这里插入图片描述
LSTM网络的控制流程是一些张量操作和一个for循环。你可以使用隐藏状态进行预测。结合所有的这些机制,一个LSTM可以在序列处理过程中选择哪些信息是相关的,以记住或忘记。

6.GRU

我们已经知道了LSTM的工作原理,让我们简单地看看GRU。GRU是较新的一代循环神经网络,与LSTM非常相似。GRU摆脱了单元状态,使用隐藏状态来传递信息。它也只有两个门,一个复位门和更新门。
在这里插入图片描述

更新门

更新门的作用类似于LSTM的遗忘门和输入门。它决定丢弃哪些信息,增加哪些新信息。

重置门

重置门用于决定遗忘多少过去的信息。

7.总结

GRU的张量运算较少。因此,它比LSTM的训练速度快一些。但是,没有一个标准来确定哪一个更好。研究人员和工程师通常会同时尝试这两种方法,以确定哪种方法更适合实际情况。

<think>嗯,用户这次的问题是关于RNN、GRULSTM在面试中的常见区别问题。从对话历史看,用户之前关注过注意力机制,现在转向循环神经网络的变体比较,可能是为技术面试做准备。 用户提供的引用资料很全面,主要来自四篇技术文章:[^1][^2][^3][^4]。这些资料详细对比了三种网络的结构差异,特别强调了门控机制的设计原理。其中[^2][^3]提到GRULSTM参数更少,训练更快;[^4]则解释了LSTM解决长期依赖问题的原理。 考虑到面试场景,需要突出三个关键对比维度:结构差异(门控数量)、性能表现(训练速度/长序列处理)适用场景。特别要注意: - RNN的梯度消失问题是LSTM/GRU出现的动机 - LSTM的三个门(输入/遗忘/输出)与GRU两个门(更新/重置)的对应关系 - 实际选择模型时的权衡因素(数据量、序列长度等) 用户可能隐含的需求是希望获得可直接用于面试应答的结构化答案。因此回复要包含: 1. 核心区别表格(门控/参数/复杂度) 2. 典型面试追问方向(如梯度消失对策) 3. 场景化选择建议(何时用GRU/LSTM) 需要避免过度深入数学推导,而是用示意图(如门控信号流向)比喻(如门控=信息水闸)帮助理解。最后补充的"面试技巧"模块应该能直接提升用户应试能力。</think>以下是RNN、GRULSTM的核心区别及常见面试问题解析,结合技术要点面试场景设计: --- ### 一、**核心区别对比表** | **特性** | **RNN** | **LSTM** | **GRU** | |------------------|--------------------------|-----------------------------------|----------------------------------| | **门控机制** | 无 | 3个门:输入门/遗忘门/输出门 | 2个门:更新门/重置门 | | **参数量** | 最少 ($d \times d$) | 最多 ($4d \times d$) | 中等 ($3d \times d$) | | **梯度处理** | 易梯度消失/爆炸[^3] | 细胞状态缓解梯度消失[^4] | 更新门控制梯度传播[^2] | | **计算效率** | 较高 | 较低 | **最高**(比LSTM快40%)[^2] | | **长期依赖处理** | ≤10步[^3] | **强**(1000+步)[^4] | 中等(100~500步)[^2] | > **门控作用详解**: > - **LSTM遗忘门**:$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$ 控制历史记忆保留量[^4] > - **GRU更新门**:$z_t = \sigma(W_z \cdot [h_{t-1}, x_t])$ 平衡新旧状态比例[^2] > - **重置门**:$r_t = \sigma(W_r \cdot [h_{t-1}, x_t])$ 控制历史信息写入候选状态[^3] --- ### 二、**结构差异图解** ```mermaid graph LR subgraph RNN A[输入x_t] --> B[tanh(W·x_t + U·h_{t-1})] B --> C[输出h_t] end subgraph LSTM D[输入x_t] --> E[遗忘门f_t] D --> F[输入门i_t] D --> G[输出门o_t] E --> H[细胞状态C_t] F --> H G --> I[隐藏状态h_t] end subgraph GRU J[输入x_t] --> K[更新门z_t] J --> L[重置门r_t] K & L --> M[候选状态~h_t] M --> N[隐藏状态h_t] end ``` --- ### 三、**高频面试问题** #### 1. **为什么LSTM/GRU能解决RNN的梯度消失?** - **关键机制**:门控单元形成**常数误差传送带**(LSTM细胞状态 $C_t$ / GRU直接连接)[^4] - **数学原理**: $$ \frac{\partial C_t}{\partial C_{t-1}} = f_t \odot \sigma'(\cdot) \approx 1 \quad (\text{当} f_t \approx 1) $$ 梯度在细胞状态中可无损传播[^3] #### 2. **LSTMGRU如何选择?** - **选LSTM**:超长序列(DNA/日志分析)、需要精细控制信息流[^2] - **选GRU**:中等长度文本/语音、资源受限场景(移动端)[^3] - **实验结论**: - 小数据集:GRU表现更优(参数少不易过拟合) - 大数据集:LSTM潜力更大(门控更灵活)[^2] #### 3. **门控单元的参数计算(面试手撕题)** - **LSTM参数量**:$4 \times d \times (d + x)$ ($d$:隐藏层大小, $x$:输入维度) *示例*:输入维度128,隐藏层256 → $4 \times 256 \times (256+128) = 393,216$ - **GRU参数量**:$3 \times d \times (d + x)$ *同示例*:$3 \times 256 \times (256+128) = 294,912$ --- ### 四、**实战代码对比** ```python # LSTM 单元核心计算 (PyTorch风格) def lstm_cell(x, h, C, W_i, W_f, W_o, W_c): i = torch.sigmoid(x @ W_i[0] + h @ W_i[1]) # 输入门 f = torch.sigmoid(x @ W_f[0] + h @ W_f[1]) # 遗忘门 o = torch.sigmoid(x @ W_o[0] + h @ W_o[1]) # 输出门 c_tilde = torch.tanh(x @ W_c[0] + h @ W_c[1]) C_new = f * C + i * c_tilde # 细胞状态更新 h_new = o * torch.tanh(C_new) return h_new, C_new # GRU 单元核心计算 def gru_cell(x, h, W_z, W_r, W_h): z = torch.sigmoid(x @ W_z[0] + h @ W_z[1]) # 更新门 r = torch.sigmoid(x @ W_r[0] + h @ W_r[1]) # 重置门 h_tilde = torch.tanh(x @ W_h[0] + (r * h) @ W_h[1]) h_new = (1 - z) * h + z * h_tilde # 状态融合 return h_new ``` --- ### 五、**面试技巧** 1. **必考问题**: - "画图说明LSTM的细胞状态如何传播" → 强调$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$[^4] - "GRU如何简化LSTM?" → 合并输入门与遗忘门为更新门,取消输出门[^3] 2. **陷阱问题**: - "LSTM能否完全避免梯度消失?" → 不能!长链中门控函数饱仍会导致梯度衰减[^3] 3. **加分回答**: - "工业界趋势:Transformer取代RNN族,但LSTM在传感器数据等时序任务仍不可替代" --- **总结**: - **RNN**:基础序列模型,适合短文本生成[^1] - **LSTM**:长序列建模首选,计算代价高[^4] - **GRU**:资源敏感场景的平衡选择[^2] > ⚠️ **面试雷区**:勿说"GRULSTM的改进" → 实际是**不同设计哲学**(GRU:参数效率, LSTM:表达能力) --- **相关问题** 1. 如何用LSTM处理变长序列?Packed Sequence的原理是什么? 2. 双向LSTM(BiLSTM)如何增强序列建模?在NER任务中的具体作用? 3. 为什么Transformer出现后LSTM使用减少?两者在位置编码上有何本质区别? 4. 能否用一维卷积(Conv1D)替代RNN处理时序数据?比较其优缺点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值