简单的循环神经网络(RNN)在理念上简洁,但难以捕捉长序列中的依赖关系。梯度消失问题常会阻碍梯度在许多时间步中有效传播,使得网络难以学习远距离元素间的关系。长短期记忆(LSTM)网络在第五章中进行了详细描述,通过引入专用记忆单元和多个门控机制(遗忘门、输入门和输出门)来精细控制信息流,从而提供了一个有效的解决方案。LSTM已被证实非常有效,但其内部结构相对复杂且参数数量较多。在LSTM开发的同时,出现了另一种门控循环单元:门控循环单元,简称GRU。GRU由Cho等人于2014年提出,旨在处理长距离依赖关系方面达到类似的能力,但采用更精简的架构。GRU背后的主要思想是简化门控机制,同时保持其缓解梯度问题的有效性。简化门控结构与LSTM相比,GRU引入了两项主要简化:单元状态与隐藏状态合并: GRU不像LSTM那样维护独立的单元状态($c_t$)。它们只有一个隐藏状态($h_t$)。这个隐藏状态兼具双重作用:携带过往信息,并作为当前时间步的输出。更少的门: GRU只使用两个门,而不是LSTM中使用的三个(或四个,取决于看待方式)。它们是重置门和更新门。我们简单看一下这两个门的作用:重置门($r_t$): 这个门决定了在计算新的候选隐藏状态时,来自上一个隐藏状态($h_{t-1}$)的多少信息应该被忽略或“重置”。如果重置门在某些维度上的值接近0,它有效地使单元在这些维度上表现得像是在处理一个新序列的开始,从而使其能够遗忘不相关的过往信息。更新门($z_t$): 这个门的作用类似于LSTM中的遗忘门和输入门,但以组合方式。它决定了来自上一个隐藏状态($h_{t-1}$)的多少信息应该保留并直接传递到当前隐藏状态($h_t$)。反之,它也决定了应该整合多少新计算出的候选隐藏状态。下图对LSTM和GRU单元的内部结构进行了高层次的比较。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", margin=0.2]; edge [fontname="sans-serif", fontsize=10]; subgraph cluster_lstm { label = "LSTM 单元"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#a5d8ff"]; lstm_input [label="输入 (x_t)"]; lstm_h_prev [label="上一个隐藏状态 (h_{t-1})"]; lstm_c_prev [label="上一个单元状态 (c_{t-1})"]; lstm_gates [label="门\n(遗忘, 输入, 输出)", shape=ellipse, fillcolor="#ffc9c9"]; lstm_cell_update [label="单元状态\n更新", shape=ellipse, fillcolor="#b2f2bb"]; lstm_h_next [label="隐藏状态 (h_t)"]; lstm_c_next [label="单元状态 (c_t)"]; {lstm_input, lstm_h_prev} -> lstm_gates; {lstm_gates, lstm_c_prev} -> lstm_cell_update -> lstm_c_next; {lstm_gates, lstm_c_next} -> lstm_h_next; // 用于间距的隐形边 edge [style=invis]; lstm_input -> lstm_h_prev -> lstm_c_prev; lstm_h_next -> lstm_c_next; } subgraph cluster_gru { label = "GRU 单元"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#a5d8ff"]; gru_input [label="输入 (x_t)"]; gru_h_prev [label="上一个隐藏状态 (h_{t-1})"]; gru_gates [label="门\n(重置, 更新)", shape=ellipse, fillcolor="#ffec99"]; gru_candidate [label="候选\n状态计算", shape=ellipse, fillcolor="#b2f2bb"]; gru_combine [label="合并/更新", shape=ellipse, fillcolor="#ffd8a8"]; gru_h_next [label="隐藏状态 (h_t)"]; {gru_input, gru_h_prev} -> gru_gates; {gru_gates, gru_input, gru_h_prev} -> gru_candidate; {gru_gates, gru_candidate, gru_h_prev} -> gru_combine -> gru_h_next; // 用于间距的隐形边 edge [style=invis]; gru_input -> gru_h_prev; gru_candidate -> gru_combine; } }高层次地比较了LSTM和GRU单元的内部组成部分和信息流。注意GRU中没有独立的单元状态,且门更少。简化的潜在优势这种降低的复杂度提供了几个潜在优势:更少的参数: 只有两个门且没有独立的单元状态,GRU通常比相同数量隐藏单元的LSTM具有更少的训练参数。这可以使GRU的训练计算成本更低,并潜在地更不容易过拟合,尤其是在数据量不是非常大的数据集上。更快的训练: 更少的参数通常意味着每个训练步骤的计算速度更快。然而,LSTM和GRU之间的性能差异通常取决于任务。两种架构在所有序列建模问题中都不是普遍优越的。尽管GRU提供了简洁性,但LSTM凭借其独特的单元状态和独立的门,可能对信息流提供更精细的控制,这对某些复杂任务可能有利。在接下来的部分,我们将详细检查GRU架构,包括控制其门和状态更新的具体公式。然后,我们将直接比较其机制和性能特点与LSTM的异同,以帮助您决定何时选择哪种更适合您的应用。