Gated Recurrent Unit/zh

    From Marovi AI
    This page is a translated version of the page Gated Recurrent Unit and the translation is 100% complete.
    Other languages:
    Article
    Topic area Deep Learning
    Prerequisites Recurrent Neural Networks, Long Short-Term Memory, Backpropagation


    概述

    门控循环单元(GRU)是一种循环神经网络单元,它使用门控机制来控制信息在各时间步之间的流动。该结构由 Cho 等人于 2014 年作为统计机器翻译编码器-解码器模型的一部分提出,旨在作为长短期记忆 (LSTM)单元更为简洁的替代方案,同时保留对长程依赖的建模能力并缓解梯度消失问题[1]

    LSTM相比,GRU 将细胞状态和隐藏状态合并为单个向量,并用两个门——更新门和重置门——替换原有的输入门、遗忘门和输出门。其结果是一种参数更少、训练更快、在大量序列建模任务上具有竞争性准确率的单元。虽然Transformer 架构的兴起在许多大规模自然语言任务中取代了循环单元,但 GRU 仍在低延迟推理、设备端语音模型、时间序列预测以及作为混合架构组件等场景中被广泛使用。

    背景与动机

    原始的循环网络通过对前一隐藏状态和当前输入的线性组合施加一个非线性变换来更新隐藏状态。当使用时间反向传播进行训练时,损失关于早期时间步的梯度涉及对相同 Jacobi 矩阵的反复相乘,这会导致梯度在长序列中消失或爆炸。因此,普通循环网络难以学习跨越几十步以上的依赖关系。

    LSTM由 Hochreiter 和 Schmidhuber 于 1997 年提出,通过引入一个独立的细胞状态(具有加性更新)以及若干学习何时写入、保留或读取信息的门来解决上述问题。LSTM 在十多年间一直是主流的循环架构,但其三门设计带来了相当可观的参数与计算开销。GRU 的提出源于这样一个问题:能否用更简单的门控方案,在更少参数、更易优化和更低内存占用的前提下达到相当的性能?这种特性在编码器-解码器场景中尤为有吸引力,因为每个训练样本都需要执行大量的循环步骤。

    架构

    GRU 单元在每个时间步处理一个输入向量并输出一个隐藏状态。在时间步 $ t $,它接收当前输入 $ x_t \in \mathbb{R}^{d_x} $ 和上一隐藏状态 $ h_{t-1} \in \mathbb{R}^{d_h} $,并通过两个门和一个候选激活值产生更新后的隐藏状态 $ h_t \in \mathbb{R}^{d_h} $

    • 重置门 $ r_t $ 控制有多少前一隐藏状态被混合进候选状态。当重置门接近零时,候选状态会忽略过去的上下文,表现得仿佛序列刚刚开始。
    • 更新门 $ z_t $ 控制前一隐藏状态与新候选状态之间的凸组合。当更新门接近一时,单元基本上将其前一状态向前复制,从而为梯度提供近似恒等的传播路径。
    • 候选隐藏状态 $ \tilde{h}_t $ 是一个由 tanh 激活的提议值,它在 $ r_t $ 的调控下,将当前输入中的新信息与对过去(可能被削弱)的视图共同编码。

    LSTM不同,GRU 不存在独立的细胞状态,也没有输出门;隐藏状态本身既是暴露给后续层的输出,也是循环反馈给该单元的内容。

    数学表述

    $ \sigma $ 表示按元素的逻辑S 形函数$ \odot $ 表示按元素乘积GRU 的标准更新方程为:

    $ {\displaystyle z_t = \sigma\bigl(W_z x_t + U_z h_{t-1} + b_z\bigr)} $

    $ {\displaystyle r_t = \sigma\bigl(W_r x_t + U_r h_{t-1} + b_r\bigr)} $

    $ {\displaystyle \tilde{h}_t = \tanh\bigl(W_h x_t + U_h (r_t \odot h_{t-1}) + b_h\bigr)} $

    $ {\displaystyle h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t} $

    这里 $ W_\bullet \in \mathbb{R}^{d_h \times d_x} $ 用于映射输入,$ U_\bullet \in \mathbb{R}^{d_h \times d_h} $ 用于映射前一隐藏状态,$ b_\bullet \in \mathbb{R}^{d_h} $ 为偏置。单个 GRU 单元的参数总数为 $ 3 \cdot d_h \cdot (d_x + d_h + 1) $,大约是相同隐藏宽度的 LSTM 的四分之三——后者使用四个门而非三个。一些实现采用约定 $ h_t = z_t \odot h_{t-1} + (1 - z_t) \odot \tilde{h}_t $;这两种表述仅在门的命名上有所不同,本质上等价。

    最终方程中的凸组合是 GRU 能够跨多个时间步传递信息的关键所在。每当 $ z_t $ 较小时,$ h_t \approx h_{t-1} $,因此梯度 $ \partial h_t / \partial h_{t-1} $ 接近单位矩阵,梯度信号得以无几何衰减地传播。

    训练与推理

    GRU 通常采用端到端的方式,使用Adam或其变体配合梯度裁剪进行时间反向传播训练,以控制门控机制下少数仍会出现的梯度爆炸。常用的正则化选项包括对单元输入与输出施加Dropout(在某些变体中通过变分 Dropout作用于循环连接),以及对输入-隐藏和隐藏-隐藏权重矩阵施加权重衰减

    在推理阶段,GRU 一次消费一个 token 并就地更新其隐藏状态,使每 token 的计算和内存开销与序列长度无关。现代框架会将三个门的计算融合为单次矩阵乘法,每个时间步对应一个形状为 $ 3 d_h \times (d_x + d_h) $ 的堆叠权重矩阵,并提供 cuDNN 或 Metal 的内核,在训练时进一步沿时间维度融合计算。在部署中,GRU 较小的参数量以及不存在显式细胞状态的特点,使其在流式应用以及内存带宽是瓶颈的嵌入式硬件上颇具吸引力。

    变体

    若干变体对基本公式进行了修改:

    • 极简门控单元(MGU)去掉了重置门,仅使用一个类似遗忘门的单门,从而进一步减少参数量,在字符级语言建模和音乐建模基准测试中仍保持竞争力。[2]
    • 输入-遗忘耦合变体在重置门和更新门之间共享权重,以少量的表达能力换取额外的参数节省。
    • 双向 GRU 运行两个相互独立的 GRU 层,一个沿前向序列、另一个沿反向序列,并将其隐藏状态拼接。在推理时可获取完整序列的标注与分类任务中,这是标准做法。
    • 堆叠或深层 GRU 在垂直方向上堆叠多个 GRU 层,下层的输出序列作为上层的输入序列。层间的残差连接有助于训练深层循环堆栈。
    • 卷积 GRU 用卷积替代稠密权重矩阵,得到适用于视频、气象雷达等时空数据的循环单元。

    与 LSTM 的比较

    在实际应用中,GRULSTM 通常可以互换。Chung 等人在复调音乐和语音信号建模上的实证比较未发现明确的赢家,选择取决于任务和计算预算。[3] Greff 等人也得出类似结论:没有任何重大的架构变体能够持续地胜过标准 LSTM,而 GRU 则是一种更廉价且具有竞争力的替代方案。[4]

    实际差异可以从公式中直接预见。在相同隐藏宽度下,GRU 的每步计算和内存约低 25%,因为它只有三个门而非四个,且没有独立的细胞状态。LSTM 的独立细胞状态和输出门提供了更细粒度的机制,可以保护长期记忆不被覆盖,并选择性地将其暴露给下游层,这在具有极长依赖关系的任务中可能很重要。GRU 的耦合更新——其中 $ z_t $ 同时控制保留多少过去信息以及写入多少候选信息——对许多任务来说是一种有用的归纳偏置,但它无法表示 LSTM 能够刻画的某些模式。

    应用

    在基于注意力的模型被广泛采用之前,GRU 是许多序列到序列任务的默认构件:用于机器翻译的编码器-解码器模型、用于语音识别的声学模型和语言模型、用于命名实体识别的序列标注,以及基于会话级点击序列的推荐系统。它们至今仍常见于:

    • 设备端及流式语音识别和关键词检测——这些场景对模型体积和每 token 延迟非常敏感。
    • 工业表格类时间序列预测,其中循环结构所带来的归纳偏置及其较少的参数量与有限的训练数据相匹配。
    • 需要随时间整合观测的强化学习策略,特别是在部分可观测环境中。
    • 同时结合卷积、循环与注意力组件的混合架构。

    局限性

    使 GRU 高效的那些特性同时也限制了其表达能力。严格的顺序更新规则意味着训练无法在时间维度上并行化,这正是 Transformer 在自然语言建模前沿大幅取代 GRU 的核心原因。即使加性更新路径可以缓解最坏情形,长序列在实践中仍会出现梯度衰减;标准 GRU 的有效上下文长度通常以数百步而非数千步为单位衡量。耦合的更新门也使得难以分别调整遗忘和写入的动态,这有时相对于 LSTM 是一个真实的劣势。最后,与所有循环模型一样,GRU 对初始化以及循环权重的尺度具有敏感性,深层堆栈需要仔细选择初始化方式(通常是正交或按单位矩阵缩放)才能稳定训练。

    参考文献