JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

循环网络、LSTM 与序列

如何教一个网络一次读一个词并记住前文?来认识循环网络、几乎让它们沉没的记忆难题,以及 LSTM 和 GRU 那些巧妙的门——它们统治了序列学习近十年。

为什么序列与众不同

在上一篇指南中,你认识了卷积网络,它把图像当作一个冻结的网格,在每个位置滑动同一个滤波器。这种做法很出色,因为角落里的猫仍然是猫。但现在考虑一个句子。词是按顺序到达的,而顺序本身就是含义:"狗咬人"和"人咬狗"用的是完全相同的字,却描述了相反的事件。一个只看到冻结快照的网络无法尊重这种顺序。

序列无处不在:句子中的词、旋律中的音符、逐日的价格、视频中的帧、传感器的读数。对于标准前馈网络而言,它们有两个棘手的共同特征。第一,它们没有固定长度——一条推文和一部小说都是文本。第二,先出现的内容应当影响我们对后来内容的解读。我们需要一种架构,其连线本身就能把信息沿时间向前传递。

那个循环:一张被反复重写的便签

循环神经网络(RNN)一次一步地读取序列,并在每一步保持一份不断更新的记忆,称为隐藏状态。想象你朗读时手里拿着一张便签。你读第一个词,记下一个简短的概要;读下一个词时,你重写便签,把刚学到的内容融进去;如此直到结尾。便签从不变大——它每一步都被覆盖——但读到最后一个词时,它已携带了此前一切的压缩痕迹。

关键的细节在于:每一步应用的是*同一个*更新规则。网络只有一小组权重,它在第一个词、第二个词、第三千个词上都重复使用这同一组。这种循环复用正是"循环"的含义,也是为什么一个小小的网络就能处理任意长度的序列。新的隐藏状态由上一个隐藏状态和当前输入算出,再经一个像 tanh 这样的激活函数压缩。

h = zeros()              # the sticky note starts blank
for x in sequence:       # read one step at a time
    h = tanh(W_h @ h + W_x @ x + b)   # rewrite the note
    y = output(h)        # optional: emit something each step
# same W_h, W_x, b reused at EVERY step
五行代码看懂 RNN:一个隐藏状态 h,每一步用同一组权重重写。

训练依靠一个叫做时间反向传播的思路。你在脑中把循环"展开"成一条长链——每一步一份网络副本——然后沿着它运行普通的反向传播,把每个权重在它被使用的所有步骤上的贡献加总起来。从概念上说,这就是你已经熟悉的链式法则,只是沿时间被拉长了。

记忆难题

这就是几乎扼杀 RNN 的顽固弱点。由于记忆在每一步被挤压并重写,早期词语的影响往往会消退。更糟的是,训练时误差信号必须沿着同一条长链回传,每一步都被乘上一个数。如果这些数小于一——而 tanh 平坦的尾部很容易导致这一点——把许多这样的数相乘会让信号以指数速度趋向零。这就是你在深层网络那一级见过的梯度消失问题,如今从层间被拉长到了时间之上。

在实践中,这意味着普通 RNN 难以连接相距很远的内容。设想:"今天早上,在那场漫长而混乱的会议之前,我落在厨房桌上的钥匙……不见了。"当网络读到"不见了"时,主语"钥匙"已在许多步之前,而消退的记忆或许已不记得它是复数。长程依赖——代词与它十句话之前所指的名词——正是普通 RNN 无法把握的。

还有一个镜像的危险:如果那些逐步的数大于一,信号反而会爆炸——梯度爆炸——训练便会失稳为剧烈的震荡。常见的补救是梯度裁剪:每当梯度增长过大就限制它的大小。裁剪能驯服爆炸,却对消退方向无能为力。消失问题需要更深层的解决方案。

门控:LSTM 与 GRU

突破在于:不再每一步都覆盖整份记忆。LSTM(长短期记忆)保留一条受保护的记忆线,称为细胞状态——想象一条传送带笔直穿过整个序列,只有在被指示时才装卸货物。信息可以几乎原封不动地从第三个词一路乘到第三百个词。而正因为它能原封不动地乘行,误差信号也能沿它回流而不消退,绕开了梯度消失的陷阱。

负责"指示"的,是一组叫做的小阀门——一个个微小的、可学习的控制器,每个通过 sigmoid 输出一个介于 0(完全关闭)与 1(完全打开)之间的数。遗忘门决定抹去哪些旧记忆;输入门决定哪些新信息值得存储;输出门决定此刻揭示多少记忆。因为这些门可以选择不去触碰细胞状态,早期学到的事实便能存活下来。

GRU(门控循环单元)是一个精简的近亲,用更少的部件追求同样的目标。它只用两个门——一个更新门,在"保留我已知的"和"接纳刚到来的"之间调和;一个重置门,决定忽略多少过去——并把细胞状态和隐藏状态合并为一。在实践中,GRU 与 LSTM 表现相近;两者都不是普遍更优,所以人们常常都试一试。GRU 更轻、训练略快,这在较小数据集或较紧的硬件上有帮助。

RNN 造就了什么——以及为何 Transformer 取而代之

从 1990 年代末到 2017 年前后,门控 RNN 一直是序列学习的主力。它们驱动了第一波真正出色的机器翻译、语音识别、手写识别,以及你手机上的输入预测。它们催生的一个关键模式是编码器—解码器结构:一个 RNN 读入整段输入并压缩成一个概要,第二个 RNN 则以该概要及自己已生成的内容为条件,一次一个词元地生成输出。

那个配方有一个瓶颈:把整句话压进一个概要向量,在长输入上会卡住。解决办法是让解码器按需回看输入的任意部分——这就是注意力机制。注意力最初是作为辅助件被加装到 RNN 上的。随后在 2017 年,人们意识到可以彻底丢掉循环,只保留注意力:这便是 Transformer

Transformer 为何取胜?不是因为注意力是魔法,而是因为一个实际的工程事实:RNN 必须一次一步地读取,因此无法在序列维度上并行化,且在长输入上很慢。Transformer 一次性读取整个序列,这恰好契合现代 GPU 的并行硬件。这使得在海量得多的数据上训练成为可能——而在今日大语言模型的规模下,规模才是最要紧的。