Home / 大语言模型 / LSTM:让远处的误差仍能教会网络记忆

001|LSTM:让远处的误差仍能教会网络记忆

目录 · 下一篇

论文:Sepp Hochreiter、Jürgen Schmidhuber,Long Short-Term Memory,1997,Neural Computation。作者提供的原文 PDF。本文讨论 1997 年原始结构;后来常见的遗忘门不属于这一初版。

先接住前作的问题

本系列从Day 0 的阅读路线提出的“信息怎样跨位置传递”出发。普通循环状态已有递归信息路径,未解决的是结尾误差能否有效训练很早的写入动作;本篇先处理这个优化问题。RNNLM后来采用简单循环单元做语言建模,是应用与单元的教学对照,并非 LSTM 的直接后继版本。

五个前置概念

理解本篇需要五个概念:循环状态是跨步传递的向量;BPTT 是展开时间后的反向传播;梯度消失是远程导数尺度衰减;门是可学习的乘性开关;信用分配是判断早期事件怎样影响后期误差。能区分这五项,才不会把“长短期记忆”只记成一个名称。

一、问题设定:结尾的误差怎样教会网络保存开头信息

一句话开头给出条件,结尾才要求使用它,中间都是干扰。普通循环网络 ht=f(Wht−1+Uxt)h_t=f(Wh_{t-1}+Ux_t) 形式上可依赖全部历史,其中 xtx_t 是输入、hth_t 是状态;但误差需要穿过许多局部导数的乘积,尺度持续小于一会衰减,大于一又可能爆炸。问题不只是怎样表示记忆,而是末端误差怎样训练最初的保存动作。

问题因此包含两个层次。表示层面问“是否存在一组参数可以保存信息”;优化层面问“实际梯度是否能找到它”。仅证明循环结构有表达能力,无法解释为什么随机初始化后训练失败。把学习率调大也不改变远程与近期梯度的相对比例,反而可能让近期信号过强。

原论文主要研究监督序列学习。输入是人工构造的符号或实数序列,输出是需要利用早期信息的预测或分类;反馈是预测误差。这里没有 RL 中的策略、环境奖励和 Critic。将 LSTM 放入语言模型或强化学习是后来的应用方式,不能倒过来把这些应用设定当作原论文实验。

二、沿恒等存储路径推导输入门与输出门

先看原论文图1(PDF第7页):中央标为1.0的自连接是 CEC,两侧乘法节点分别控制写入与读出。图中没有现代遗忘门;箭头表示信息流,不能当作完整反向传播规则。

1997年原始LSTM记忆单元的恒等自连接、输入门和输出门
方法结构图摘引:Sepp Hochreiter、Jürgen Schmidhuber,1997,图1,PDF第7页;核对原文。原版权保留。

原始设计中的内部状态可以用以下教学式表达:

ct=ct−1+it⊙gt,ht=ot⊙ϕ(ct).c_t=c_{t-1}+i_t\odot g_t,\qquad h_t=o_t\odot\phi(c_t).

ctc_t 是内部记忆,iti_t 是输入门,gtg_t 是候选写入内容,oto_t 是输出门,ϕ\phi 是输出非线性,⊙\odot 表示逐元素相乘。输入门决定当前内容是否应写入;输出门决定记忆是否应影响外部计算。原始算法还有特定连接与梯度处理,上式仅突出结构思想。

若暂时只看状态到自身的直接连接,导数是 1。无新内容写入时,状态可以原样保留,这就是 constant error carousel 的关键直觉。需要特别注意,“存在导数为 1 的路径”不意味着全网络所有梯度都恒定,也不意味着门的训练永不困难。其他计算路径、损失与输入分布仍然影响实际优化。

今天教材常写的 ct=ftct−1+itgtc_t=f_t c_{t-1}+i_tg_t 加入了遗忘门。用它讲现代 LSTM 没有问题,但若讨论 1997 年的贡献,应说明版本差异。否则会把后来解决连续流重置和遗忘的问题,错误归给初版结构。

从一个标量递推看见梯度路径

把普通 RNN 暂时简化为 ht=tanh⁡(aht−1+bxt)h_t=\tanh(ah_{t-1}+bx_t),其中 a,ba,b 是固定标量权重,xtx_t 是输入,s<Ts<T 分别标记早期与末端时间;固定中间输入后,末端状态对早期状态的导数为 ∂hT/∂hs=∏t=s+1Ta(1−ht2)\partial h_T/\partial h_s=\prod_{t=s+1}^{T}a(1-h_t^2)。困难在乘积,而不是最后一次求导。LSTM 把这条反复经过非线性的路径改成加法累积:展开得到 cT=cs+∑t=s+1Titgtc_T=c_s+\sum_{t=s+1}^{T}i_tg_t。沿 CEC 自连接传播时,早期状态不必在每一步重新通过饱和非线性;写入仍要穿过输入门,读出仍要穿过输出门。因此“保住已写入内容的梯度”和“学会何时写入”是不同的优化子问题。原文 §3.2—§4(PDF第5—7页) 正是先分析普通恒等记忆的读写冲突,再引入两个门。

可手算的教学实验。 若一条普通循环路径每步导数为 0.90.9,100 步后只剩 0.9100≈2.66×10−50.9^{100}\approx2.66\times10^{-5}。相反,令 c0=0c_0=0,第一步 i1=1,g1=0.6i_1=1,g_1=0.6,此后输入门为零,则 c100=0.6c_{100}=0.6。若门未完全关闭,每步泄入 0.0010.001,则 c100=0.699c_{100}=0.699:恒等路径保护梯度,并不自动保护内容免受错误写入。这个反例也解释为什么只加一条跳连不足以替代门。

构造一条序列:第一步给出一个数字,后面 99 步都是无关噪声,第 101 步要求输出第一步数字。理想门控在第一步写入,中间关闭输入,在最后打开输出。这个例子不是论文结果,而是用来区分“存储”“不被覆盖”和“按时取出”三个动作。

将读门与存储状态分开做一次干预

在前面的保留实验上,只把末步输出门从1改成0:内部记忆仍为0.6,外部读出却为0。由此可设计两个独立检查:直接观察状态确认是否保存,再改变读门确认是否能取出。仅凭最终输出为零无法区分“忘了”与“没读出来”;这也解释原图为什么需要把存储线和读出乘法节点分开画。

教法联系:Christopher Olah的Understanding LSTM Networks。算例为本文自构。

三、按原版连接和梯度规则实现记忆单元

输入:监督序列 x[1:T]、目标 y、可训练门与候选变换
初始化内部状态 c、外部输出 h
对每个时间步 t:
    根据当前输入及允许的循环连接计算输入门 i
    计算候选内容 g
    c ← c + i * g                 # 原始恒等自连接的教学表示
    计算输出门 o
    h ← o * activation(c)
根据任务读出预测,并与监督目标计算损失
按原始算法规定的梯度路径与截断规则更新参数
输出:能够选择写入、保持和读出的序列模型

四、从人工长时延任务读出学习难度

三者不能混成“LSTM 直接优化记忆长度”。记忆长度是任务条件或行为表现,不是公式中单独最大化的量。

作者在人工长时延任务上展示了学习优势,其中涉及超过 1000 步的时延。

实现明确后,检查任务是否真的依赖早期输入,并分开读时延、干扰和训练工作量。

项目 原论文范围及阅读要点
任务 第 5 节的人工长时延任务,含实值、噪声和符号模式
数据 按任务规则生成;不是大型自然语言预训练语料
对照 BPTT、RTRL 等循环学习方法,以及论文讨论的其他方法
指标 学习是否成功、训练工作量及可跨越的时延,按任务分别阅读
预算 各实验单独给定;不能用一个现代 GPU 小时数概括
重复与不确定性 关注第 5 节各任务的成功运行统计;不把单次成功视为平均可靠性

证据一,第 3 节误差传播分析。作者展示普通循环路径上误差信号如何包含反复相乘的因子。它解释了优化困难的来源,但不是“所有普通 RNN 在所有任务上都会失败”的定理。

证据二,第 4 节架构与附录 A.1。门控和特殊内部连接给出了可执行的解决机制,而不仅是关于记忆的比喻。复现时要保留原版连接与梯度规则,若直接调用现代框架默认 LSTM,得到的是相关但不同的算法。

证据三,第 5 节实验与第 6 节讨论。人工任务提供关于长时延学习的受控证据,作者同时讨论适用特点。实验能够说明在这些构造中学习更容易,不能证明真实文本中的语义记忆、检索精度或语言生成质量。

读原表3。 左两列分别控制时延与干扰符号数,最右列是达到成功标准所需的训练序列数。上半部随时延增加同时扩大可用干扰符号集合;下半部固定长时延、增加同一种干扰重复出现的机会,学习代价明显不同。这是特定人工任务的训练统计,不能把最后一列当作自然语言任务的通用记忆容量。

长时延及不同干扰符号数量下,LSTM达到成功标准所需的训练序列数
实验结果表摘引:Sepp Hochreiter、Jürgen Schmidhuber,1997,表3,PDF第15页;核对原文。原版权保留。

这里最有价值的公平性问题,是任务是否真的要求长程记忆。如果中间输入本身泄露了答案,或者局部统计可以预测结果,模型并不需要保存早期条件。反过来,只有不可预测干扰而没有可学习标记,也可能让任务本身没有足够信息。一个好实验需要同时控制时延和信息位置。

五、梯度能保留,内容为什么仍会被覆盖

再把任务改成同时记住 100 个独立数字。即便每个数字都需要长期保持,固定维度状态的容量和读出方式也会成为瓶颈。由此可以理解为什么梯度传播改善不等于无限记忆。模型仍需要学习哪些信息值得保留,并解决多个事实相互干扰的问题。

真正的新意在于对长期信用分配作出结构性处理:不是单纯增加层数,而是让存储通路与输入输出变换部分分工。代价包括更多参数、顺序计算以及结构实现复杂性。本文的分析是,后来的注意力并非使这个问题消失,而是通过直接访问过去表示改变了信息路径和资源取舍。

六、把本篇机制再推进一步

1. 若输入门每步漏入少量噪声,恒等路径还解决了什么?

参考答案:它仍保留内部直接路径的导数,却不保证存储内容不变。正文中每步漏入0.001会改变最终数值,说明内容保护还依赖门控;可固定序列和初始化,分别改变门的泄漏与时延,区分梯度保持和错误写入。这个消融是教学建议,不是原文新增结果。

七、把存储模块接到序列任务,再改变读取接口

恒等记忆仍要学习何时写入。到RNN语言模型继续看另一种循环状态怎样压缩词历史,并检查实际反传长度;两者是记忆机制的教学对照,不能把RNNLM写成原版LSTM的直接实现。

自测与参考答案

1. 为什么把普通 RNN 的学习率提高十倍,不能根本解决长时延梯度消失?

学习率同时放大近期和远程更新,而时间链上的相对衰减仍存在。若远程梯度比近期小很多,统一放大无法恢复合适比例,近期梯度还可能先造成不稳定。结构性改变针对的是传播路径,学习率针对的是整体更新尺度。

2. 既然内部自连接导数为 1,是否说明 LSTM 不会梯度爆炸或遗忘?

不是。这只描述特定直接路径,其他路径仍可放大误差;输入门持续写入会改变状态,多个内容也会干扰。原始结构与现代遗忘门版本还需要分开讨论。可靠记忆是结构、训练和任务共同产生的行为。

3. 怎样设计实验,证明模型确实使用了早期信息?

固定后半段噪声,仅改变第一步内容,检查输出是否随之改变;再删除或打乱第一步标记,观察表现是否下降。训练和测试使用不同延迟与噪声序列,并报告多次初始化。这样才能排除靠中间泄露信息或记忆训练样本完成任务的解释。