简单的循环神经网络(RNN)虽然其设计思路简洁,但在学习长序列模式时面临困难。其主要问题常在于时间上的反向传播过程。梯度可能呈指数级缩小(梯度消失),这使得网络难以学习远距离元素间的关联;或呈指数级增大(梯度爆炸),导致训练不稳定。这一局限性显著影响了它们在需要长时记忆任务上的表现。为应对这些难题,更复杂的循环架构被发展出来,其中最著名的是长短期记忆(LSTM)网络和门控循环单元(GRU)。这些架构引入了被称为“门”的机制,用于调节循环单元内信息的流通,使它们能够在长时间内选择性地记忆或遗忘信息。长短期记忆 (LSTM)LSTM通过引入一个专门的细胞状态与隐藏状态并行,来处理梯度问题。可将细胞状态($c_t$)想象成一条信息高速公路,它允许信息在序列中相对不变地流动,除非被明确修改。细胞状态的修改由三个主要的门来控制:遗忘门: 它决定从细胞状态中丢弃哪些信息。它查看前一隐藏状态($h_{t-1}$)和当前输入($x_t$),并对前一细胞状态($c_{t-1}$)中的每条信息输出一个0到1之间的数值。1表示“完全保留”,而0表示“完全丢弃”。输入门: 它决定将哪些新信息存储到细胞状态中。此门有两个部分:首先,一个 sigmoid 层($ \sigma $)决定更新哪些值(即“输入门”本身);其次,一个 tanh 层创建一个新的候选值向量($\tilde{c}_t$),这些值可以被添加到状态中。输出门: 它决定将什么作为隐藏状态($h_t$)输出。它首先运行一个 sigmoid 层来决定细胞状态的哪些部分应该被输出。然后,它将(已更新的)细胞状态通过 tanh 函数(将值推到-1和1之间)并将其乘以 sigmoid 门的输出,以便只输出选定的部分。这些门使用如 sigmoid($ \sigma $)之类的激活函数(将值压缩到0和1之间)来控制信息流通。通过学习这些门的参数,LSTM能够学习复杂的依赖关系并在多个时间步中保留重要信息,从而缓解了梯度消失问题。digraph LSTM_Conceptual { rankdir=LR; node [shape=box, style=rounded, fontname="helvetica", fontsize=10, margin=0.2]; edge [fontsize=10, fontname="helvetica"]; subgraph cluster_lstm { label = "LSTM单元"; bgcolor="#e9ecef"; // 灰色 style=filled; xt [label="输入 (x_t)", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; // 蓝色 ht_1 [label="前一隐藏 (h_{t-1})", shape=ellipse, style=filled, fillcolor="#ffec99"]; // 黄色 ct_1 [label="前一细胞 (c_{t-1})", shape=ellipse, style=filled, fillcolor="#d8f5a2"]; // 青柠色 forget_gate [label="遗忘门 (σ)", style=filled, fillcolor="#ffc9c9"]; // 红色 input_gate [label="输入门 (σ, tanh)", style=filled, fillcolor="#96f2d7"]; // 青色 output_gate [label="输出门 (σ, tanh)", style=filled, fillcolor="#bac8ff"]; // 靛青色 cell_update [label="细胞状态更新", shape=circle, style=filled, fillcolor="#ced4da", label="+"]; // 灰色 ht_update [label="隐藏状态更新", shape=circle, style=filled, fillcolor="#ced4da", label="×"]; // 灰色 ct [label="新细胞 (c_t)", shape=ellipse, style=filled, fillcolor="#d8f5a2"]; // 青柠色 ht [label="新隐藏 (h_t)", shape=ellipse, style=filled, fillcolor="#ffec99"]; // 黄色 {xt ht_1} -> forget_gate [label=" 决定\n 遗忘"]; {xt ht_1} -> input_gate [label=" 决定\n 更新"]; ct_1 -> forget_gate [style=dotted]; forget_gate -> cell_update [label=" 遗忘"]; input_gate -> cell_update [label=" 添加"]; ct_1 -> cell_update [style=dotted]; cell_update -> ct; {xt ht_1} -> output_gate [label=" 决定\n 输出"]; ct -> output_gate [style=dotted]; output_gate -> ht_update; ht_1 -> ht_update [style=invis]; // 用于布局 ct -> ht_update [label=" 调节"]; ht_update -> ht; } }LSTM单元内的信息流,突显遗忘门、输入门和输出门在管理细胞状态和隐藏状态方面的作用。门控循环单元 (GRU)门控循环单元(GRU)是一种较新的循环架构,其引入是为了简化LSTM。它将遗忘门和输入门合并为一个更新门,并将细胞状态和隐藏状态合并。它还引入了一个重置门。重置门: 它决定在提出新的候选隐藏状态时,前一隐藏状态($h_{t-1}$)应被遗忘多少。如果重置门的输出接近0,则前一隐藏状态将被很大程度上忽略。更新门: 类似于LSTM的遗忘门和输入门的组合。它决定保留前一隐藏状态($h_{t-1}$)的多少,以及将(使用重置门的影响计算出的)新候选隐藏状态的多少纳入最终隐藏状态($h_t$)。GRU比LSTM有更少的参数(因为它们缺少单独的输出门和细胞状态),有时在计算上更高效。从实践来看,它们在许多任务上的表现常与LSTM相近,虽然没有绝对的优胜者;最佳选择通常取决于具体的数据集和问题。digraph GRU_Conceptual { rankdir=LR; node [shape=box, style=rounded, fontname="helvetica", fontsize=10, margin=0.2]; edge [fontsize=10, fontname="helvetica"]; subgraph cluster_gru { label = "GRU单元"; bgcolor="#e9ecef"; // 灰色 style=filled; xt [label="输入 (x_t)", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; // 蓝色 ht_1 [label="前一隐藏 (h_{t-1})", shape=ellipse, style=filled, fillcolor="#ffec99"]; // 黄色 reset_gate [label="重置门 (σ)", style=filled, fillcolor="#ffd8a8"]; // 橙色 update_gate [label="更新门 (σ)", style=filled, fillcolor="#b2f2bb"]; // 绿色 candidate_h [label="候选 ~h_t (tanh)", style=filled, fillcolor="#d0bfff"]; // 紫罗兰色 combine [label="组合", shape=plaintext, fontsize=10]; ht [label="新隐藏 (h_t)", shape=ellipse, style=filled, fillcolor="#ffec99"]; // 黄色 {xt ht_1} -> reset_gate [label=" 决定\n 重置"]; {xt ht_1} -> update_gate [label=" 决定\n 更新"]; reset_gate -> candidate_h [label=" 影响"]; ht_1 -> candidate_h [style=dotted]; xt -> candidate_h [style=dotted]; update_gate -> combine [label=" 更新混合"]; ht_1 -> combine [label=" 保留旧值"]; candidate_h -> combine [label=" 添加新值"]; combine -> ht; } }GRU单元内的信息流,显示重置门和更新门如何控制组合到新隐藏状态中的信息。LSTM和GRU都通过引入门控机制,相对于简单的RNN取得了显著进步。这些门使网络能够学习在长序列中哪些信息应保留或丢弃,使它们成为自然语言处理、时间序列分析等领域中建模序列数据的有力工具。虽然我们不会在本入门课程中完整实现它们,但理解它们的作用对于判断何时标准前馈网络或简单循环网络可能不足是重要的。