Skip to content

长短时记忆网络(Long Short-Term Memory)深度教程

从"误差传送带"到化学序列建模:公式推导、纯 Python 实现,与五个化学/材料实验

一份面向「人工智能 × 化学」方向研究生的 LSTM 教程。 从"为什么朴素循环网络记不住第 0 步"讲起,给出 梯度消失定理、常数误差传送带(CEC)、门控的乘性本质、LSTM 六方程、 完整 BPTT、梯度通路分解、记忆半衰期的完整数学推导, 用手写的纯 Python 实现(不使用 NumPy)把每一步公式落到代码, 最后在五个化学/材料任务上跑实验——包括两个"我们输了"的真实实验。

封面:一条链上的记忆

先说清楚这份教程的定位:它是《循环神经网络(RNN)深度教程》的姊妹篇。 RNN 那本的重点是 BPTT 与反向传播本身;这一本只谈一件事: 记忆。为什么梯度会消失、LSTM 用什么机制绕开它、 这个机制在什么条件下会失效,以及化学里的序列数据什么时候真的需要它。 如果你还没读过 RNN 教程,也不影响——第 2 章会把需要的结论重新推一遍。


目录

  1. 写在前面
  2. 背景:记忆为什么这么难
  3. 数学准备:连乘、Jacobian 与"传送带"
  4. LSTM 的前向传播:完整推导
  5. 每一个门到底在干什么
  6. BPTT:LSTM 的完整反向传播推导
  7. 记忆容量与记忆长度
  8. 纯 Python 实现:公式 ↔ 代码对照
  9. 化学与材料中的应用:五个实验
  10. 优缺点、常见坑与实践清单
  11. 参考文献

附录 A 公式 ↔ 代码对照总表 · 附录 B 复现指南 · 附录 C 术语中英对照


0. 写在前面

0.1 这份教程讲什么,不讲什么

市面上探讨 LSTM 的资料往往汗牛充栋,但大部分论述浅尝辄止,仅仅用"三个门、一条传送带"这样浮于表面的概念比喻草草带过。本教程的追求是将这套经典架构从微观机理到宏观行为彻底讲透。

在这里,我们将直面长程记忆的动力学本质:从数学定理出发,严格证明梯度为何会在时间演化中遭遇指数级衰减,并精准划定其适用边界(第 2.2 节);进而引入"常数误差传送带"(CEC)的数学形式,阐明无损信息流通的构造原理(第 2.4 节);随后深入门控机制的微观本质,揭示其作为乘性交互(Sigma-Pi 单元)的代数与物理意义(第 2.5 节)。在动力学演化层面,教程不仅会逐项剖析前向传播六大控制方程的构建机理(第 3 章),更会展开从末端损失函数一路逆流回溯至各权重矩阵的完整 BPTT 反向传播推导,全程不跳过任何链式法则细节(第 5 章)。在此基础上,我们给出一个至关重要的"梯度通路分解定理",将反向传播的梯度严谨解构为常数项、遗忘门递归项与隐状态递归项之和;由此彻底解密遗忘门偏置 bfb_f 为何是掌控整个动力学系统记忆生命的"总阀门"(第 4.1、6.3 节),并在真实与构造实验中严谨划定 LSTM 依然会遭遇遗忘失效的客观边界(第 6.5、8.5 节)。

为了保持叙事焦点的高度凝练与理论纵深,本教程将策略性地省去与核心记忆机理弱相关的工业级工程分支。关于现代主流 Transformer 架构的系统对比,我们仅在第 9.3 节提炼其在归纳偏置与并行机制上的本质分野;而诸如底层硬件加速、混合精度计算、分布式训练集群部署,以及 JIT 融合算子等纯工程实现技巧,则不在此处展开。

0.2 这份教程给谁看

本教程专为跋涉在"人工智能 × 化学与材料科学"交叉前沿的研究者打造。如果你是刚步入该领域的研究生,具备高等数学中的微积分与线性代数功底,熟悉 Python 编程却未曾亲手推导并实现过神经网络的底层运算;抑或你正面对着聚合反应序列、分子 SMILES 表达式或原位动态光谱数据,急需在繁杂的算法库中理性判断"手头的材料化学数据到底该不该引入 LSTM",那么这份教程正是为你量身沉淀的思维指南。在全篇推导中,每当 diag()\mathrm{diag}(\cdot) 对角矩阵、\odot Hadamard 逐元素积或 Jacobian 矩阵等数学符号首次登场时,正文都会即时给出明确的物理与代数阐释,确保阅读体验顺畅自然。

0.3 文件清单

文件说明
长短时记忆网络教程.md主文件(你正在读的这份)
code/全部可运行代码(算法部分零第三方依赖
code/lstm.py核心库:CEC / RNN / LSTM / GRU / 双向 / 语言模型 + 完整 BPTT
code/chemdata.py化学数据集(共聚物、端基、SMILES、化学式)
code/tests_lstm.py42 项测试,含 160+ 项逐参数梯度检查
code/demo_*.py五个实验
code/make_figures.py唯一用到 matplotlib 的脚本
figures/18 张数据图(PNG + SVG)+ results_*.json(原始数字)
images/12 张手绘风格插图(风格 #097,图像模型生成,示意性质)
images/prompts/生成插图时使用的完整提示词(每张图一个文件)

0.4 关于"不使用 NumPy"

在实现层面,教程严格恪守"纯 Python 实现(零依赖且不使用 NumPy)"的硬性约束。在核心代码库 lstm.py、化学数据集处理模块 chemdata.py 以及绝大多数实验脚本中,找不到任何一行 import numpy(仅在 demo_deepchem_esol.py 中为兼容 DeepChem 官方库的输入输出接口而局部调用,绝未用于算法底层内核)。

在纯 Python 的世界里,所有的矩阵运算都回归到最本质的二维浮点列表 list[list[float]]

python
def matmul(A, B):
    n, m, p = len(A), len(B), len(B[0])
    C = [[0.0] * p for _ in range(n)]
    for i in range(n):
        for k in range(m):
            a = A[i][k]
            for j in range(p):
                C[i][j] += a * B[k][j]
    return C

如此执着的实现策略必然伴随着算力上的代价:正如第 7.10 节坦诚指出的,由于缺乏底层的 BLAS 向量化加速,其计算耗时比高度优化的 NumPy 慢 100 至 1000 倍。然而,其带来的学术价值是无可替代的——这里不存在任何封装框架的"黑箱魔法",教程中推导的每一条微分方程都能在代码中精确对应到某一行循环语句,且每一个解析梯度都可以通过中心差分数值方法得到逐项严格验证(第 7.8 节)。

0.5 关于数据:哪些是真的,哪些是构造的

在步入具体算法推演前,有必要对全书涉及的数据基底建立清醒的认知。本教程设计的五个实验中,所用数据的真实性分为三个截然不同的层级,而实验结论的外推边界也严格受制于数据本身的物理属性:

实验数据真实性
端基识别(第 6、8.1 节)人工生成构造任务。用来把梯度问题放大到看得见
共聚物 → Tg(第 8.2 节)Fox 方程 + 构造的序列项组成部分是真物理,序列项是人为设定
SMILES 语言模型(第 8.4 节)1128 条真实分子 SMILES真数据(Delaney/ESOL)
ESOL 溶解度(第 8.3 节)1128 条实测 logS真数据 + 真标签
材料带隙(第 8.5 节)4604 条实验带隙真数据 + 真标签

在科学探索中,构造数据绝非妥协或缺陷:恰恰相反,唯有在物理机理完全透明、噪声被严格隔绝的构造任务中,我们才有底气断言"模型若表现不佳,其病根必定出在架构与记忆机制本身"。而在真实世界的复杂数据面前,模型遭遇滑铁卢的真实案例(如第 8.3 与 8.5 节所示),同样会被全盘呈现并深入反思,以此淬炼出真正严谨的科研判断力。

0.6 记号约定

符号含义
TT时间步数(序列长度)
dd输入维度
HH隐状态维度
xtRdx_t\in\mathbb{R}^dtt 步输入
htRHh_t\in\mathbb{R}^Htt 步隐状态(也是输出)
ctRHc_t\in\mathbb{R}^Htt记忆单元(LSTM 独有的那条通路)
ft,it,otRHf_t,i_t,o_t\in\mathbb{R}^H遗忘门 / 输入门 / 输出门
gtRHg_t\in\mathbb{R}^H候选状态(candidate)
zt=[xt;ht1]z_t=[x_t;h_{t-1}]拼接向量,维度 d+Hd+H
Wf,W_f,\dots形状 (H,d+H)(H,\,d+H) 的权重矩阵
σ\sigmalogistic 函数 σ(z)=1/(1+ez)\sigma(z)=1/(1+e^{-z})
\odot逐元素积(Hadamard 积)
diag(v)\mathrm{diag}(v)vv 为对角线的对角矩阵
L/θ\partial L/\partial \theta损失对参数的梯度
δ\delta 前缀本教程里统一表示"某个中间量的梯度",如 δct=L/ct\delta c_t=\partial L/\partial c_t

时间下标统一写在右下:ctc_t 是"第 tt算完之后"的值, ct1c_{t-1} 是上一步的值。初始化取 h0=0,  c0=0h_0=\mathbf 0,\;c_0=\mathbf 0


1. 背景:记忆为什么这么难

1.1 化学里一半的数据是序列

在涉足复杂的算法推导前,不妨先回归化学与材料科学的研究日常。在物质世界的表征与演化中,有一半以上的数据本质上就是序列,且其物理、化学意义严格依存于元素的排列次序:

数据类型例子顺序携带什么信息
SMILESCC(=O)Oc1ccccc1C(=O)O(阿司匹林)原子连接关系。重排字符 = 另一个分子(或非法字符串)
聚合物单体序列AABABBBA…嵌段 / 无规 / 交替决定 Tg、结晶度、自组装
反应步骤起始物 → 中间体 → 产物机理;每步条件依赖前一步
光谱 / 色谱一维 NMR、IR、GC 曲线峰位与峰形的顺序
分子动力学轨迹逐帧坐标时间演化;扩散系数、寿命
实验时间序列原位 XRD、在线 pH动力学与相变路径

然而,在计算建模的实践中,极易产生一种"只要排成一排就是序列"的认知错觉。下面这些数据形式虽然表面上被写成一串字符或数组,但其内部次序却不承载任何本征物理意义:

数据为什么顺序不是信息
化学式 Fe2O3O3Fe2 是同一个物质,书写顺序纯属约定
元素组成向量本来就没有顺序
分子指纹 (ECFP)是一个集合的哈希

化学里的序列:SMILES、聚合物链、反应步骤

理解这两组对比,构成了全书方法论的基石。LSTM 本质上蕴含着一种极强的归纳偏置(inductive bias)——它在先验上假定输入的时序或空间先后严格决定了因果关联。若将原本具备排列不变性的数据强行塞入序列模型,算法不仅会在无谓的时序推演中耗费算力,更会无可避免地在训练集里拟合出根本不存在的"次序伪影"(第 8.5 节将用真实材料带隙实验给出深刻印证)。

1.2 1991:梯度消失被发现

如果我们将循环神经网络沿着时间维度逐级展开(unroll),便会清晰地洞察到它的微观真相:它实质上是一个层层共享参数矩阵的超深前馈网络。序列有多长,这一网络的物理深度就有多大。

早在 1991 年,Sepp Hochreiter 在慕尼黑工业大学完成的毕业论文《Untersuchungen zu dynamischen neuronalen Netzen》中,便极其敏锐地指出了这种架构的命门所在:这种"深"绝非普通的多层感知机,因为每一个时间步都在机械地施加同一个转移矩阵 WW;当沿着时间轴逆向求导时,误差信号必须被这个因子反复连乘。从矩阵动力学的角度来看,只要该算子的谱半径偏离了极其苛刻的临界值 1,在历经 TT 个时间步的级联演化后,其模长便会无可挽回地趋向于 00(信号彻底湮灭)或者 \infty(数值剧烈爆炸)。

随后在 1994 年,Bengio、Simard 与 Frasconi 进一步给出了普适的动力学分析,正式向学术界敲响警钟:梯度消失绝非通过调小学习率或增加迭代步数就能调和的工程小疾,而是根植于循环架构内部的本征缺陷。

这一结论,正是整份教程最核心的理论动因:若反向传播的梯度无法完好无损地逆流回传至第 0 步,那么"第 0 步发生了什么"便在数学上永远无法对当前的输出决策产生任何反馈。 而在化学与材料合成的世界里,恰恰充斥着这类"牵一发而动全身"的长程因果——高分子链起始端引发剂的结构基团(端基)、多步多相反应最初始的活化与引发步骤,抑或是分子动力学轨迹最前端的瞬态成核构象,都在底层逻辑上要求网络必须能够稳固守住"源头"的记忆。

1.3 三种"修梯度"的思路

面对这一系统性的动力学退化,学术界在历史上曾探索过三条截然不同的拯救路线,理解它们的分野对当下的科研选型大有裨益:

思路代表工作做法结局
改激活函数用 ReLU 替代 tanh让导数不饱和对前馈网络有效,对循环网络只把"消失"换成"爆炸"
改初始化正交初始化(Saxe 2014)让循环矩阵的特征值都在 1 附近有效,是今天训练朴素 RNN 的标准手段
改结构LSTM(1997)给记忆单独修一条加法通路,并用门控制读写有效,本教程的主角

在后文第 6 章的实证对比中,我们将亲手把这三条路径置于同一标尺下检验。你会看到,借助正交初始化技术,朴素 RNN 确实能够勉强守住 60 步的时序关联;然而,LSTM 的真正革命性价值并不在于机械地将记忆跨度拉长多少步,而在于它通过门控将"记多久"从一个听天由命的初始化随机属性,转变成了一个可由数据反向驱动训练的连续动力学参数。这两种机制在认知维度上存在着云泥之别。

1.4 从 CEC 到 LSTM:1997 年那篇论文做了什么

在 1997 年发表于 Neural Computation 的奠基之作《Long Short-Term Memory》中,Hochreiter 与 Schmidhuber 对朴素循环单元的病灶给出了极为深刻的动力学诊断:系统内部其实时刻交织着两个根本性的错误反馈冲突,即输入权重冲突(input weight conflict)与输出权重冲突(output weight conflict)。

具体而言,同一个输入变换权重矩阵 WxhW_{xh} 承担着自相矛盾的双重角色:当序列中出现决定性的关键基团时,它应当全力将其刻写入内部状态;而在大量无关的溶剂分子或背景噪声穿行时,它又必须坚决予以滤除。然而,由于参数在时间维度上是完全绑定的,反向传播的误差信号必然会在不同时刻发生剧烈抵消,致使网络进退失据。与此同时,输出端也面临着类似的困境:内部状态为了维护全局历史必须包罗万象,而下游任务在当前微观瞬态却往往只需要提取局部特征。单一的线性记忆通路绝不可能同时胜任这两种跨越时间尺度的张力。

为了从根本上化解这对矛盾,作者开出的药方是为记忆单元加装两道乘性控制门:输入门负责裁决"当前输入要不要写入",输出门负责把控"内部记忆要不要泄露给外部",而记忆自身则脱离复杂的非线性嵌套,转由一条纯粹的加法通路向前推进。

这一结构彻底打通了一条让误差信号从输出端无损回传至起点的绿色通道,规避了连乘造成的剧烈衰减。但不可忽视的是,此时的架构仍留有一个致命的物理隐患:内部记忆单元陷入了只增不减的单调累加状态,由于缺乏主动清空通道,系统终究会走向状态饱和的死胡同。

1.5 遗忘门:2000 年才补上的关键一块

在 1997 年最初诞生的原始 LSTM 结构中,并未设计遗忘门这一构件:

ct=ct1+itgt(1.1)c_t = c_{t-1} + i_t\odot g_t \tag{1.1}

在物理图像上,这相当于一个只有进料口、没有排污排废阀门的反应釜。当处理的高分子链段风格发生突变(例如从一段致密的刚性链段突然过渡到柔性链段),或者分子序列的局部化学环境发生剧变时,早期无休止累积的陈旧状态会形成极其沉重的"历史包袱",持续压制新生信号,导致模型根本无法动态换挡。

直至 1999 至 2000 年间,Gers、Schmidhuber 与 Cummins 才正式引入了现代意义上的遗忘门:

ct=ftct1+itgt(1.2)c_t = f_t\odot c_{t-1} + i_t\odot g_t \tag{1.2}

与此同时,他们提出了一个至关重要的工程实践法则:在网络初始化时,务必将遗忘门的偏置项 bfb_f 设定在 1.05.01.0\sim5.0 的正数区间(这意味着在演化初始时刻,门控开度基准处于 f0.730.99f\approx0.73\sim0.99 的高位,系统天然偏向于"守住记忆")。这一设计的数学推导将在第 4.1 节彻底拆解,而其实测威力将在第 6.4 节展现得淋漓尽致——仅仅改变这一个微小的常数偏置,就能让一个长达 60 步的高分子端基识别任务,戏剧性地从"全程随机瞎猜"彻底转变为"100% 满分收敛"。

1.6 之后的二十年

为了帮助你在后续查阅计算化学与材料信息学文献时建立清晰的坐标系,我们将这套架构二十余年来的演进脉络梳理如下:

年份工作贡献
1991Hochreiter指出梯度消失是架构问题
1997Hochreiter & SchmidhuberLSTM:CEC + 输入门 + 输出门
1999Gers, Schmidhuber, Cummins遗忘门
2000Gers & Schmidhuberpeephole 连接、遗忘门偏置初始化
2005Graves & Schmidhuber双向 LSTM、CTC(语音/手写识别)
2013Graves深度 LSTM + 语音识别突破
2014Cho et al. / Sutskever et al.GRU;seq2seq(机器翻译)
2014Zaremba et al.dropout 正则化 LSTM
2015He et al.残差连接(让 LSTM 堆得更深)
2016Gal & Ghahramanivariational dropout(循环网络专用)
2017Vaswani et al.Transformer;此后序列建模的主流转移
2019Sanchez-Lengeling & Aspuru-Guzik化学生成模型综述,LSTM 作为基线
2020+——化学序列任务上,LSTM 仍常见于小数据、时序与在线预测场景

1.7 为什么化学家今天还应该学 LSTM

诚然,在自然语言处理与超大规模预训练模型中,Transformer 凭借其卓越的并行能力已成为绝对的主流,但在材料与化学科学的真实研发腹地,LSTM 依然保有四个难以替代的立足根基:

其一在于微小而昂贵的数据体量。与互联网领域动辄数亿条语料不同,实验室中高精度合成、纯化与表征出的高质量材料数据往往只有几百至数千组,此时参数量庞大、缺乏强归纳偏置的自注意力模型极易发生过拟合,而参数精简的 LSTM 展现出了显著占优的样本利用效率。

其二在于对真实物理时序的天然契合。在原位红外、原位拉曼光谱监测、色谱流出曲线以及化学反应微观动力学演化中,"顺序"是不可逆转的单向物理时间,循环网络步步递推的因果结构与这一客观物理历程在拓扑上高度同构。

其三在于低开销的流式在线推演。LSTM 在前向推理中每推进一步仅需 O(1)O(1) 的时间复杂度与恒定的内存占用,完全不需要像自注意力那样每次都回溯并计算全历史的二次方注意力矩阵,这使得它极为适用于化工生产线中的嵌入式边缘计算与在线工艺分析(PAT)。

其四在于其作为科学基线的严谨锚定价值。在化学信息学与材料机理研究中,任何宣称具备优越性的新型序列算法,都理应先与调优良好的 LSTM 进行公平对决,否则研究人员便无法从数学与物理上辨明,性能的提升究竟源自真正的方法学创新,还是仅仅享受了调参的红利。


2. 数学准备:连乘、Jacobian 与"传送带"

这一章只做一件事:把"记忆"这件事变成一个可以计算的数学对象。

2.1 序列模型的梯度是一条路径的连乘

设损失 LL 只依赖最后一步的输出 hTh_T(分类/回归头接在末尾)。 朴素循环单元:

ht=tanh(Wxhxt+Whhht1+bh)(2.1)h_t=\tanh(W_{xh}x_t+W_{hh}h_{t-1}+b_h) \tag{2.1}

我们要的是 L/h0\partial L/\partial h_0——它决定了"第 0 步的输入 能不能改变今天的输出"。

hth_t 的每一步应用链式法则:

Lh0=LhTt=1Ththt1(2.2)\frac{\partial L}{\partial h_0} =\frac{\partial L}{\partial h_T}\prod_{t=1}^{T}\frac{\partial h_t}{\partial h_{t-1}} \tag{2.2}

这里的 ht/ht1\partial h_t/\partial h_{t-1} 是一个 H×HH\times HJacobian 矩阵

推导 (2.3) 的每一步

约定所有向量均为列向量。令激活前的线性组合为

at=Wxhxt+Whhht1+bh,ht=tanh(at).a_t=W_{xh}x_t+W_{hh}h_{t-1}+b_h,\qquad h_t=\tanh(a_t).

首先求输出对激活前变量的偏导 ht/at\partial h_t/\partial a_t。由于双曲正切函数 tanh\tanh 采用逐分量独立作用的方式,输出的第 ii 个分量严格只取决于输入的第 ii 个分量,其导数为 tanh(at[i])=1ht[i]2\tanh'(a_t[i])=1-h_t[i]^2,而非对角元全部恒等于 0。因此,该微分算子构成了一个纯粹的对角矩阵 Λt:=diag ⁣(1htht)\Lambda_t:=\mathrm{diag}\!\big(\mathbf 1-h_t\odot h_t\big)

进而推求中间量对前一步隐状态的偏导 at/ht1\partial a_t/\partial h_{t-1}。展开分量表达式可知 at[i]=kWhh[i,k]ht1[k]+consta_t[i]=\sum_k W_{hh}[i,k]h_{t-1}[k]+\text{const},故对任意分量有 at[i]/ht1[k]=Whh[i,k]\partial a_t[i]/\partial h_{t-1}[k]=W_{hh}[i,k],这意味着该步的 Jacobian 矩阵完全等同于转移矩阵 WhhW_{hh} 本身。

最后,依据矩阵形式的链式法则 htht1=htatatht1\dfrac{\partial h_t}{\partial h_{t-1}}=\dfrac{\partial h_t}{\partial a_t}\dfrac{\partial a_t}{\partial h_{t-1}},将两项相乘即刻锁定了单步回传的 Jacobian 核心算子:

Jt:=htht1=ΛtWhh.(2.3)J_t:=\frac{\partial h_t}{\partial h_{t-1}}=\Lambda_t W_{hh}. \tag{2.3}

有了单步 Jacobian 矩阵,还需要将其代回至反向传播的梯度流中。记列向量 δt:=L/htRH\delta_t:=\partial L/\partial h_t\in\mathbb R^H 为损失关于隐状态的梯度。根据向量值函数的微积分链式法则,反向传递的本质是伴随矩阵 JJ^\top 作用在当前梯度向量上:

δt1=(htht1) ⁣δt=WhhΛtδt=Whh(δt(1htht))(2.3’)\delta_{t-1} =\left(\frac{\partial h_t}{\partial h_{t-1}}\right)^{\!\top}\delta_t =W_{hh}^{\top}\Lambda_t\,\delta_t =W_{hh}^{\top}\big(\delta_t\odot(\mathbf 1-h_t\odot h_t)\big) \tag{2.3'}

这个转置是初学者在手写自动微分时最容易失足的陷阱。 在纯 Python 代码的物理映射中,它直接体现为 dh_next = vecmat(dh ⊙ (1 - h*h), W_hh),亦即"先对饱和导数项做逐元素点乘,再利用 WW^\top 逆向映射回流"。在第 7.8 节的逐参数数值梯度检查中,差分校验能够极为敏锐地捕捉到哪怕一处转置方向写反的微观错误(事实上,教程作者在最初打磨底座代码时便曾在此处踩中过暗坑)。

据此,总梯度传递关系式 (2.2) 便可以严谨地写作显式 Jacobian 算子的连续乘积形式;又由于矩阵转置并不改变诱导二范数(即 A2=A2\|A^\top\|_2=\|A\|_2),下文我们将统一定义

δ0=(t=1TJt) ⁣δT,Jtγ(2.4)\delta_0=\Big(\prod_{t=1}^{T}J_t\Big)^{\!\top}\delta_T, \qquad \|J_t\|\le\gamma \tag{2.4}

以此为基准展开对范数衰减机制的动力学讨论,其数学结论与下式 (2.5) 具有完全等价的严密性。

2.2 梯度消失/爆炸定理

定理 2.1(指数衰减) 设对所有时间步 tt,矩阵乘积的诱导范数均受限于一实常数上界 ΛtWhhγ\|\Lambda_t W_{hh}\|\le\gamma,则反向传播回溯至第 0 步的梯度范数必然满足

Lh0    γTLhT(2.5)\left\|\frac{\partial L}{\partial h_0}\right\| \;\le\;\gamma^{T}\left\|\frac{\partial L}{\partial h_T}\right\| \tag{2.5}

证明 直接应用矩阵范数的次可乘性不等式 ABAB\|AB\|\le\|A\|\|B\| 展开:

t=1TΛtWhht=1TΛtWhhγT.\left\|\prod_{t=1}^{T}\Lambda_tW_{hh}\right\| \le\prod_{t=1}^{T}\|\Lambda_tW_{hh}\|\le\gamma^{T}.

不等式两边同乘末端梯度范数 L/hT\|\partial L/\partial h_T\| 即完成证明。\blacksquare

推论 2.2(两极坍缩的动力学困境)

从定理 2.1 可以直接审视出常规递归网络在处理长序列时面临的残酷两难境地。当复合矩阵的上界常数 γ<1\gamma < 1 时,随着时间跨度 TT 的线性延展,逆流回传的梯度信号将遭遇指数级湮灭。举例而言,当 γ=0.9\gamma=0.9 这一看似接近于 1 的温和条件下,历经 T=60T=60 步的反应链传递后,残留梯度已跌至初始幅度的千分之二(约 1.8×1031.8\times10^{-3});若传质阻尼进一步加剧至 γ=0.5\gamma=0.5,回传 60 步后的量级将剧烈坍缩至 8.7×10198.7\times10^{-19}——在标准 IEEE 754 双精度浮点数体系中,该数值已被底层硬件作为下溢异常彻底归零,意味着第 0 步的微观状态对后续输出的演化彻底失去了反馈修正的能力。

反之,倘若参数配置不当使得系统跨越了能量耗散的边界导致 γ>1\gamma > 1,梯度又会如同不受控的链式裂变反应一般发生指数级爆炸,仅仅几十步的微小积累便会触发浮点数溢出,造成网络权重的剧烈振荡与崩塌。在纯粹的数学理论中,唯一能保证长程信号既不消散也不爆炸的"安全走廊"要求 γ1\gamma\approx 1,然而在连续参数空间中,这仅仅是一个测度为零的奇异超曲面。

更为本质的是,γ\gamma 的取值主要受制于循环变换矩阵 WhhW_{hh} 的本征谱半径,而 WhhW_{hh} 并非静态常量,它在整个反向传播训练历程中必须随误差驱动持续更新。在无约束的优化轨道上,矩阵的特征值几乎必然被推离临界点 1。于是,训练越深入、处理的聚合物链或反应历程越长,系统的动力学退化便越发不可逆转。这正是 Hochreiter 强调该现象是"架构级绝症而非参数微调问题"的深刻内涵。

梯度沿时间回传的衰减

2.3 三个可测量的诊断指标

为了让抽象的矩阵动力学在科研实践中能够被精准度量,我们在手写的底层算法库中(通过 lstm.pytrace_dhtrace_dcgradient_flow 函数)显式固化了三个可计算的物理诊断指标。

首要的判据是逐层衰减因子 ρt=L/ht1/L/ht\rho_t=\|\partial L/\partial h_{t-1}\| \,/\, \|\partial L/\partial h_{t}\|,它敏锐地反映了误差波包在时间轴上逆行时每一步的局域增益或阻尼倍率;教程进一步提炼了由终至始的宏观梯度比值 ρ=L/c0/L/cT\rho=\|\partial L/\partial c_0\|/\|\partial L/\partial c_{T}\|,以此作为裁定整条链长程传导是否畅通的终极全局指标。紧随其后的是记忆半衰期 τ1/2\tau_{1/2},此概念直接脱胎于化学动力学与放射性衰变模型,代表着梯度信号强度衰减至其初始值一半时所必须跨越的离散时间步数,对于理想的指数衰减曲线 ρt\rho^t,该特征量可严密表达为 τ1/2=ln0.5/lnρ\tau_{1/2}=\ln 0.5/\ln\rho。而在静态层面,循环转移矩阵的谱半径 ρ(Whh)=maxiλi\rho(W_{hh})=\max_i|\lambda_i| 则构成了初始化配置的安全警戒线,使研究者在模型尚未启动训练之前,便能根据其最大特征模长对梯度的稳定性建立底线预判。

2.4 常数误差传送带(CEC)

洞悉了连乘衰减的微观根源后,我们不禁追问:若能在结构设计上直接将单步传递 Jacobian (2.3) 强制锚定为单位矩阵 II,体系将展现出何种动力学景象?

沿着这一设想,我们构建一个最为纯粹的极简"核心记忆单元":

ct=ct1+tanh(Wcxt+bc),ht=ct(2.6)c_t=c_{t-1}+\tanh(W_cx_t+b_c),\qquad h_t=c_t \tag{2.6}

对其求取记忆更新过程关于前一时刻状态的偏导,由于采用纯加法直通设计,微积分算子直接简化为单位阵:

ctct1=I(2.7)\frac{\partial c_t}{\partial c_{t-1}}=I \tag{2.7}

将这一导数代入定理 2.1 的范数衰减界限,此时有效阻尼因子恒等于极限值 γ=1\gamma=1,意味着梯度在时间维度的逆向流动中完全免于任何几何衰减

Lc0=LcT(经由其它路径的项)另外存在,但不是主导(2.8)\frac{\partial L}{\partial c_0}=\frac{\partial L}{\partial c_T} \underbrace{\text{(经由其它路径的项)}}_{\text{另外存在,但不是主导}} \tag{2.8}

Hochreiter 将这一极具突破性的物理构想命名为常数误差传送带(Constant Error Carousel, CEC)。"Carousel"(回转输送带/旋转木马)的意象在此极为贴切:无论序列向前延伸了多少个反应微元,只要误差信号被放置于这条管道之上,它便能如同一股不受介质摩擦阻碍的理想流体,原封不动地被完整送回最初始的状态源头。

常数误差传送带

然而,这种纯粹的无损结构在面对复杂的物质序列时,也必须面对自身难以克服的物理困境。在式 (2.6) 的简单加和机制中,体系缺乏任何耗散或清空通道,随着演化步数 tt 的持续推移,状态量 ctc_t 将无节制地线性发散,造成内部数值尺度的剧烈漂移;更严重的是,模型彻底丧失了在不同反应阶段之间"动态换挡"的能力——早期写入的陈旧状态将形成永久性凝固的历史包袱,牢牢压制当下的微观响应。正因如此,纯粹的 CEC 虽是一座闪烁着深刻机理的理论灯塔,却无法直接作为实战模型投入使用。在后文第 6.4 节的对比实验中,实测测得 CEC 在 20 步后的梯度比值精确保持为令人惊叹的 1.0000000000001.000000000000,而朴素 RNN 在完全同等的条件下却早早萎缩至 1.3×1031.3\times10^{-3}。这组鲜明的数据,直观揭示了"加法传送带"与"矩阵连乘链"之间的本质鸿沟。

2.5 门控的数学本质:乘性交互

要实现从"永恒传送"到"按需擦除与注入"的飞跃,系统必须引入动态调控的门(gate)。在代数结构上,门控的本质并非寻常的加权求和,而是非线性网络理论中经典的乘性交互(multiplicative interaction),在神经计算文献中亦被称为 Sigma-Pi 单元

y=iwijSixj(2.9)y=\sum_i w_i\prod_{j\in S_i}x_j \tag{2.9}

常规的神经元仅能在输入空间实施加和操作 iwixi\sum_i w_ix_i,而 Sigma-Pi 单元则通过引入不同变量之间的乘积项,在数学上赋予了网络一种高级特权——"由一个控制信号的存在与否,直接裁决另一个状态变量是否被允许生效"。

若将这一乘性逻辑落脚于记忆单元的逐元素更新中,便自然孕育出了现代门控机制的通用形式:

ct=ft(0,1)ct1+it(0,1)gt(2.10)c_t=\underbrace{f_t}_{\text{门}\in(0,1)}\odot c_{t-1} +\underbrace{i_t}_{\text{门}\in(0,1)}\odot g_t \tag{2.10}

通过调节这组连续开闭的阀门,系统能够以流体动力学般的平滑方式实现三种截然不同的微观操作:

操作门值效果
擦除ft0f_t\to0丢掉 ct1c_{t-1}
保持ft1, it0f_t\to1,\ i_t\to0ct=ct1c_t=c_{t-1},传送带
写入ft1, it1f_t\to1,\ i_t\to1叠加新信息 gtg_t

此时,系统的反向传播偏导演变为 ct/ct1=diag(ft)\partial c_t/\partial c_{t-1}=\mathrm{diag}(f_t)。尽管它不再是绝对守恒的单位阵,但其内在性质已发生质变:它绝非那个受制于随机矩阵特征值飘移、稍有不慎便坠入深渊的被动算子,而是一组由真实物理输入驱动、具备高度化学可解释性的连续门控开度。当任务需要死守链起始端的引发剂信号时,优化动力学将自发驱动反向梯度把 ftf_t 推向饱和全开的 1;而当检测到链段发生质的转变时,网络同样能平滑地将 ftf_t 调小归零以完成记忆重置。

这正是 LSTM 留给序列建模最伟大的启示:它成功地将"长程梯度能否跨越时序"这一原本听天由命的初始化运气难题,彻底驯化为了一个在优化空间中可被连续学习与调控的确定性参数。

2.6 LSTM 的三条设计公理

将上述物理图景与数学推导收敛归纳,我们可以凝练出支撑整套 LSTM 架构的三条底层设计公理,后文中推导出的所有控制方程,皆是这三条公理在空间几何上的忠实映射:

第一条公理是记忆演化必须恪守加法通路。系统关于历史内部状态的导数 ct/ct1=diag(ft)\partial c_t/\partial c_{t-1}=\mathrm{diag}(f_t) 绝不能包裹任何复杂的非线性激活函数,更严禁引入稠密矩阵的反复连乘,唯有如此方能确保逆向误差回流不被系统刚性耗散。

第二条公理是状态读写必须由乘性闸门严格受控。系统必须分别配置独立的写入门 iti_t 与输出门 oto_t,借由瞬时输入对门控开度的调节,从拓扑结构上将输入权重冲突与输出权重冲突彻底拆解解耦。

第三条公理是门控开度必须具备逐元素独立性与有界平滑性。通过运用逻辑斯蒂 Sigmoid 函数将各分量严格限定于 (0,1)(0,1) 的区间内,从而在数学上提供从完全擦除、完全保持到完全写入的连续流体动力学插值能力。


3. LSTM 的前向传播:完整推导

3.1 从 CEC 到"读写保护"

第 1.4 节剖析的两个动力学冲突,是理解 LSTM 结构必然性的关键钥匙。

设想我们仅保留常数误差传送带的纯加法骨架 ct=ct1+g~tc_t=c_{t-1}+\tilde g_t。此时,候选信息生成式 g~t=tanh(Wcxt+bc)\tilde g_t=\tanh(W_cx_t+b_c) 中的输入变换矩阵 WcW_c 必须被迫在时间轴上分饰两角:当遇到表征关键反应活性位点的单体时,它应当全力将该信号铭刻进记忆;而当遇到惰性基团或溶剂背景时,它又应当坚决闭门拒客。然而,由于参数在时间展开中是全局共享的,同一个矩阵无法自相矛盾地做出动态取舍,最终导致反向传播时要求增大权重的信号与要求减小权重的信号发生剧烈相消。与此同时,直接将内部累积量 ctc_t 倾倒至输出端又会引发输出权重冲突——内部记忆池必须维持高维的全景历史信息,而当前时间步的下游预测却往往只需提取局部瞬态特征。

为了精巧地瓦解这一双重困境,设计者引入了两道随输入动态响应的乘性闸门:

g~t    itgt(写入门保护输入),ct    ottanh(ct)(输出门保护输出)\tilde g_t\;\longrightarrow\;i_t\odot g_t \quad(\text{写入门保护输入}), \qquad c_t\;\longrightarrow\;o_t\odot\tanh(c_t)\quad(\text{输出门保护输出})

这一构造的精妙之处在于:门控的开度是瞬时输入的非线性函数,因此"当前要不要写入"与"当下要不要读取"能够在每个反应微元中瞬态自适应调节,而共享参数矩阵 WW 则专注于"写入什么模式"。输入与输出的控制权与内容权由此被彻底剥离解耦。

3.2 标准 LSTM 的六个方程

把上述受控设计与 2000 年补全的遗忘门结合起来,便构成了历经工程与科学检验的标准 LSTM 动力学核心。记多维拼接向量 zt=[xt;ht1]Rd+Hz_t=[x_t;h_{t-1}]\in\mathbb R^{d+H}(分号代表将当前输入与上一时刻隐状态首尾拼合):

ft=σ ⁣(Wfzt+bf)遗忘门it=σ ⁣(Wizt+bi)输入门gt=tanh ⁣(Wgzt+bg)候选状态ct=ftct1+itgt记忆更新ot=σ ⁣(Wozt+bo)输出门ht=ottanh ⁣(ct)隐状态/输出(3.1)\boxed{ \begin{aligned} f_t&=\sigma\!\big(W_f z_t+b_f\big) &&\text{遗忘门}\\ i_t&=\sigma\!\big(W_i z_t+b_i\big) &&\text{输入门}\\ g_t&=\tanh\!\big(W_g z_t+b_g\big) &&\text{候选状态}\\ c_t&=f_t\odot c_{t-1}+i_t\odot g_t &&\text{记忆更新}\\ o_t&=\sigma\!\big(W_o z_t+b_o\big) &&\text{输出门}\\ h_t&=o_t\odot\tanh\!\big(c_t\big) &&\text{隐状态/输出} \end{aligned}} \tag{3.1}

初值设为静态基准 h0=0, c0=0h_0=\mathbf 0,\ c_0=\mathbf 0;时间步沿序列逐步推移 t=1,,Tt=1,\dots,T

LSTM 的六条通路

若开启后文第 4.4 节所讨论的窥视孔连接(peephole),则前三个门控方程将额外汲取当前或既往记忆单元的线索:

ft=σ ⁣(Wfzt+bf+pfct1窥视孔)it=σ ⁣(Wizt+bi+pict1)ot=σ ⁣(Wozt+bo+poct)(3.2)\begin{aligned} f_t&=\sigma\!\big(W_fz_t+b_f+\underbrace{p_f\odot c_{t-1}}_{\text{窥视孔}}\big)\\ i_t&=\sigma\!\big(W_i z_t+b_i+p_i\odot c_{t-1}\big)\\ o_t&=\sigma\!\big(W_o z_t+b_o+p_o\odot c_{t}\big) \end{aligned} \tag{3.2}

3.3 为什么 cc 用加法、hhtanh\tanh

在深入代码实现之前,有必要深究一个关乎动力学生死的核心问题:为何记忆状态 ctc_t 的演化必须采用纯线性加法,而隐状态输出 hth_t 却必须被强力挤压进 tanh\tanh 非线性区间?

在记忆通路内部,纯加法结构的本质诉求是为逆流回传的梯度提供免于耗散的物理管道。由式 (3.1) 第四式可知,其关于前一状态的一阶偏导为

ctct1=diag(ft)(3.3)\frac{\partial c_t}{\partial c_{t-1}}=\mathrm{diag}(f_t) \tag{3.3}

倘若设计者在此处画蛇添足地套上一层非线性变换(例如写作 ct=tanh(Wcct1+)c_t=\tanh(W_cc_{t-1}+\dots)),那么雅可比导数项便会不可避免地重新引入权重矩阵 WcW_c^\top,整个系统瞬间跌回第 2.1 节所揭示的随机矩阵连续乘积泥潭,长期记忆的希望再次破灭。

与之形成鲜明对照的是,对外输出的隐状态 hth_t 引入 tanh\tanh 则是为了从物理上建立数值的安全边界。作为纯累加器的记忆单元 ctc_t 具有无界增长的数学自由度(在实际训练中,优秀的记忆维度累积至 ±10\pm10 乃至 ±100\pm100 乃是正常的高能量状态而非算法错误),但若直接将如此巨大的动态范围暴露给后续网络层,必将引发下游神经元的数值饱和。双曲正切函数适时地充当了能量阻尼器,将内部激荡的蓄水池平稳映射至 (1,1)(-1, 1) 的标准可控视窗。当然,这种设计也暗含妥协:当 ct|c_t| 剧烈膨胀时,导数项 tanh(ct)0\tanh'(c_t)\to 0 同样会压制输出端的反向梯度,这一局限性将在第 6.5 节展开剖析。

最后,输出门 oto_t 作用于 hth_t 而非直接截断 ctc_t,还在逻辑拓扑上构筑了一道天然的隔断防火墙。当 ot0o_t\to 0 时,下游网络无法窥探内部累积的任何线索,使得模型能够在极长的时间跨度内"暗中潜伏"、静默守候,唯有在关键判定节点来临之际方才启封读出,这正是彻底化解输出权重冲突的核心利器。

3.4 门的取值范围与饱和行为

控制门控开度的核心是非线性的逻辑斯蒂函数,它将任意实数平滑压缩至物理上有意义的连续概率区间:

σ(z)=11+ez(0,1),σ(z)=σ(z)(1σ(z))(3.4)\sigma(z)=\frac{1}{1+e^{-z}}\in(0,1),\qquad \sigma'(z)=\sigma(z)\big(1-\sigma(z)\big) \tag{3.4}

式 (3.4) 导数关系的展开过程极具美感:

ddz11+ez=ez(1+ez)2=11+ezσ(z)ez1+ez1σ(z).\frac{d}{dz}\frac{1}{1+e^{-z}} =\frac{e^{-z}}{(1+e^{-z})^2} =\underbrace{\frac{1}{1+e^{-z}}}_{\sigma(z)} \cdot\underbrace{\frac{e^{-z}}{1+e^{-z}}}_{1-\sigma(z)} .

值得特别警惕的是其导数的边缘归零特性:一旦激活前输入模长超过阈值 z>6|z|>6,导数值便急剧萎缩至 σ(z)<2.5×103\sigma'(z)<2.5\times10^{-3},此时物理阀门在数值意义上已被牢牢"焊死"。这种动力学饱和会引发两大致命后果:其一是饱和闸门对应的参数矩阵几乎无法接收到任何反向梯度更新,使该通路的学习进程彻底陷入停滞冰封;其二,它反向凸显了遗忘门初始偏置设定的极端敏感性——若网络在初始随机分布中不慎坠入饱和死区,系统在整个训练生命周期内都将难以挣脱这一状态束缚(详见第 4.1 与 6.4 节)。

相应地,候选记忆状态则采用双曲正切函数进行激发:

gt=tanh(ut)(1,1),tanh(u)=1tanh2(u)(3.5)g_t=\tanh(u_t)\in(-1,1),\qquad \tanh'(u)=1-\tanh^2(u) \tag{3.5}

候选状态值域具备正负双向对称性,这一特性在物理上不可或缺:化学体系中的性质调控既需要强化累加,更需要逆向抵消与做减法,单纯依赖非负的输入门是无法实现记忆修正与中和的。

3.5 参数形状表与参数量

为了精准把握模型的容量与拓扑规模,我们将单层标准 LSTM 的参数矩阵及尺寸汇总如下:

参数形状数量
Wf,Wi,Wg,WoW_f,W_i,W_g,W_o(H,d+H)(H,\,d+H)4H(d+H)4H(d+H)
bf,bi,bg,bob_f,b_i,b_g,b_o(H,)(H,)4H4H
(可选)peephole pf,pi,pop_f,p_i,p_o(H,)(H,)3H3H

由此可以精确导出标准 LSTM 单元的总参数量计算公式:

NLSTM=4H(d+H+1)  (+3H 若开 peephole)(3.6)N_{\text{LSTM}}=4H(d+H+1)\;(+\,3H\text{ 若开 peephole}) \tag{3.6}

若将其与参数量为 NRNN=H(d+H+1)N_{\text{RNN}}=H(d+H+1) 的朴素循环单元相对照,会发现 LSTM 的参数量恰好是朴素 RNN 的 4 倍,这清晰地反映了系统为维系四条门控通道所独立配置的权重代价。在后文第 8.3 节的 ESOL 水溶性实验中,我们手写的轻量级 LSTM 参数总量仅在 10410^4 级别,比 DeepChem 官方提供的一维卷积网络整整低了一个数量级,而正是借助这一严谨的容量公式,我们得以在极受限的数据上实现更优的参数效率。而在构建深层多层网络时,只需将上一层的输出隐序列 h(1)h^{(\ell-1)} 作为当前层的输入 x()x^{(\ell)} 即可自然递推。

3.6 一个能手算的例子

为了将抽象的代数符号还原为具象的数值跃迁,我们将维度压缩至极简的一维极限空间 d=H=1d=H=1。假定经过初期演化,某个记忆单元已经具备了明确的功能分化:

遗忘门设定在偏向保持的开度 ft=σ(2.0)=0.881f_t=\sigma(2.0)=0.881;输入门设定在偏向抑制的微开状态 it=σ(1.0)=0.269i_t=\sigma(-1.0)=0.269;输出门开度为 ot=σ(0.5)=0.622o_t=\sigma(0.5)=0.622。此时外部输入驱动信号 g~t=tanh(ut)\tilde g_t=\tanh(u_t) 经历三个离散步长,激发强度依次为 u1=1.0, u2=2.0, u3=0.0u_1=1.0,\ u_2=-2.0,\ u_3=0.0。在初始零基准 c0=0c_0=0 下,动力学状态的演化明细如下:

ttutu_tgt=tanhutg_t=\tanh u_tct=0.881ct1+0.269gtc_t=0.881c_{t-1}+0.269g_ttanhct\tanh c_tht=0.622tanhcth_t=0.622\tanh c_t
11.00.76160+0.2048=0.20480+0.2048=0.20480.20200.1256
2−2.0−0.96400.18040.2593=0.07890.1804-0.2593=-0.0789−0.0787−0.0490
30.00.00000.881×(0.0789)=0.06950.881\times(-0.0789)=-0.0695−0.0694−0.0432

审视这一连串数字,两个关键的物理现象跃然纸上:在第 3 步时,外部输入已完全归零(u3=0u_3=0g3=0g_3=0),然而隐状态输出依然显著非零(h3=0.0432h_3=-0.0432)——这无可辩驳地证明了过往历史信息成功跨越了时间间隔,被稳定搬运到了未来;更进一步观察第 2 步,记忆状态 ctc_t 从上一时刻的正值 +0.2048+0.2048 迅猛翻转为负值 0.0789-0.0789,证明这套机制不仅能被动堆积信息,更能以代数减法主动修正和改写记忆,这正是现代门控机制远胜于无脑累加型 CEC 的精义所在。

3.7 初始化:构建健康的初始动力学相空间

网络的初始参数并非孤立的随机数字,它们共同定义了系统演化起点处的相空间流形。在构建 LSTM 时,稳妥的初始化策略必须同时筑牢三道防线:

首先,针对循环转移矩阵必须严格采用正交矩阵初始化(通过调用底层的 orthogonal_matrix 函数实现)。根据线性代数理论,正交矩阵的所有奇异值均恒等于 1,具有绝对保距性质,即诱导二范数满足 W2=1\|W\|_2=1。这一性质确保了系统从 t=0t=0 步启动反向传播时,既不会盲目放大梯度也不会无端耗散能量。值得强调的是,在 LSTM 中权重矩阵横跨了输入特征 xtx_t 与历史状态 ht1h_{t-1} 两部分,因此正交约束仅施加于作用在循环隐状态的对角子块之上,输入变换部分依然沿用 Xavier 均匀分布。

其次,必须坚决落实遗忘门偏置项的正向偏移准则,将 bfb_f 显式初始化为 1.0 至 3.0 的正数。正如后文所严谨推导的,这一细微设定构成了防止系统在冷启动阶段发生长程记忆早夭的关键基石。

最后,其余各输入门、输出门以及候选状态的偏置向量默认置为 0;在某些极长序列的任务中,甚至可以考虑将输入门偏置 bib_i 预设为负数,通过在初始化阶段人为建立"倾向于抑制写入"的惰性先验,往往能够有效避免前期噪声在记忆池中泛滥成灾。

3.8 常见变体

二十年来围绕门控机制派生出了诸多微调拓扑,我们将其核心脉络收录于下:

变体改动什么时候有用
peephole (2000)门额外看到 cc需要精确计时的任务(第 4.4 节)
CIFG (2007)ft=1itf_t=1-i_t,省 1/4 参数数据很少时
GRU (2014)c,hc,h 合并成 hh参数更少、训练更快(第 4.5 节对照)
双向 (2005)正反各读一遍再拼接整条序列同时可见(分子 SMILES 就是这种)
深层 + 残差 (2015)层间加 h(l1)h^{(l-1)}层数 >2 时
variational dropout (2016)同一序列共用 mask循环层正则化的正确做法
layer norm LSTM在门之前做归一化长序列、大批量训练

4. 每一个门到底在干什么

4.1 遗忘门:为什么 bf=1b_f=1 是"天大的小事"

从偏导数结构来看,遗忘门对主记忆通路的控制占据着绝对的统治地位。由式 (3.3) 连乘展开可知:

cTc0=t=1Tdiag(ft)(4.1)\frac{\partial c_T}{\partial c_0}=\prod_{t=1}^{T}\mathrm{diag}(f_t) \tag{4.1}

在网络刚刚完成初始化的冷启动时刻,线性项 WfztW_fz_t 的方差尚处于极小尺度,门控的平均开度几乎完全由常数偏置所锚定:

fˉσ(bf)(4.2)\bar f\approx\sigma(b_f) \tag{4.2}

将其代入回传梯度的模长估算式中,便可得到一个极具穿透力的解析估计:

Lc0σ(bf)TLcT(4.3)\left\|\frac{\partial L}{\partial c_0}\right\| \approx\sigma(b_f)^{T}\left\|\frac{\partial L}{\partial c_T}\right\| \tag{4.3}

以一段中等长度的高分子链(T=60T=60)为例,不同的偏置设定会引发截然不同的微观命运:

bfb_ffˉ=σ(bf)\bar f=\sigma(b_f)fˉ60\bar f^{60}半衰期 τ1/2=ln0.5/lnfˉ\tau_{1/2}=\ln0.5/\ln\bar f
0.00.5008.7×10198.7\times10^{-19}1.0 步
1.00.7316.6×1096.6\times10^{-9}2.2 步
2.00.8815.0×1045.0\times10^{-4}5.5 步
3.00.9535.5×1025.5\times10^{-2}14.4 步
4.00.9823.4×1013.4\times10^{-1}38.1 步
5.00.9936.7×1016.7\times10^{-1}102.5 步

遗忘门偏置:一个常数决定记多久

这个动力学演化推导道出了一个极具颠覆性的科技事实:一个看似微不足道的标量常数,竟能决定整个系统能否孕育出跨越尺度的长程记忆。

设想将遗忘门偏置随手设为对称中心 bf=0b_f=0,则初始门控开度均值恰好落在半开半闭的 fˉ=0.5\bar f=0.5。在物理图景中,这意味着训练尚未起步,第 0 步写入的引发剂微观信号在向后传导 60 步高分子链长后,其反向梯度将被衰减 101810^{18} 倍之巨——在双精度浮点数中已被硬件彻底判为绝对零度。其致命后果在于:负责在起始端刻写特征的权重矩阵自始至终收不到任何有意义的修正反馈,导致网络在诞生之初便被剥夺了学会"记录源头"的生理可能;然而从宏观训练曲线来看,表观损失仍在平稳下降,因为模型正在短程局域特征上"虚假繁荣"地学习。而一旦将初始偏置温和上调至 bf=3.0b_f=3.0,初始开度跃升至 fˉ0.95\bar f\approx0.95,60 步回传的累积衰减仅剩 18 倍左右,最初始的微观记忆通路瞬间被激活复苏。

这一深层机制昭示了长程序列建模中的反常识规律:网络究竟能否在浩瀚时序中守住记忆,很大程度上并非取决于后天优化器如何漫长迭代,而是在最初参数初始化的那一瞬间便已尘埃落定。

4.2 输入门与候选状态

写入记忆单元的新增增量严格表达为 itgti_t\odot g_t 的逐元素乘积。在这套协同体系中,两个变量各司其职:候选状态 gt=tanh()g_t=\tanh(\cdot) 负责决定"写入什么内容",其带有正负极性的激活值刻画了当前输入对系统各自由度的微观倾向(在高分子建模中,宛如特定单体单元所固有的刚性、极性或空间位阻效应);而输入门 it=σ()i_t=\sigma(\cdot) 则充当精密计量的控制阀,专职裁决"以多大强度写入"(类似于反应釜进料口在此刻所允许通过的瞬时物料流速)。

在材料科学研究人员中,极易滋生一种直觉误区,认为"输入门开得越大,网络记忆能力必然越强"。然而在真实演化中,倘若输入门持续处于 it1i_t\approx 1 的极限开度,内部状态 ctc_t 将迅速陷入失控的线性膨胀,导致外侧的 tanh(ct)\tanh(c_t) 发生不可逆的输出饱和,下游网络反而再也无法从中解析出任何有价值的差异化信号。后文第 6.5 节的消融实验便记录了这一现象:当遗忘门偏置设置得过于亢进(如 bf=5.0b_f=5.0)导致系统过度粘稠、无法代谢时,模型的最终泛化准确率反而发生逆向滑坡。由此可见,记忆体系的健康运作,不仅在于懂得留存,更在于懂得克制。

4.3 输出门

输出映射方程 ht=ottanh(ct)h_t=o_t\odot\tanh(c_t) 表面平直,却在微积分层面暗含了一条极易被算法开发者忽略的梯度捷径

htct=ot(1tanh2(ct))经 tanh+(otct) ⁣tanh(ct)仅当有 peephole(4.4)\frac{\partial h_t}{\partial c_t} =\underbrace{o_t\odot\big(\mathbf 1-\tanh^2(c_t)\big)}_{\text{经 }\tanh} +\underbrace{\left(\frac{\partial o_t}{\partial c_t}\right)^{\!\top}\odot\tanh(c_t)}_{\text{仅当有 peephole}} \tag{4.4}

在未挂载 peephole 连接的基准架构中,门控 oto_t 与记忆 ctc_t 在拓扑上相互正交,第二项自动消失,此时偏导完全坍缩为第一项。

这项导数是上游误差信号渗透进核心加法传送带的唯一物理入口。 若当前瞬态的输出门开度紧闭(ot0o_t\to 0),这一注入通道便在瞬间被彻底切断,使得内部记忆单元完全免受该步瞬态损失的直接冲击,仅仅依靠未来的时间步提供回溯动力。

4.4 Peephole:让门"看一眼记忆"

经典 LSTM 的门控决策仅依赖外部输入 xtx_t 与隐状态 ht1h_{t-1},而在 Gers 提出的 peephole 结构中,门控方程被赋予了直接洞察内部累积量 cc 的特权:

ft=σ(Wfzt+bf+pfct1)f_t=\sigma(W_fz_t+b_f+p_f\odot c_{t-1})

引入这一连接的动机源于对精密计时的苛刻需求。设想系统面临一个需要精确统计聚合度或反应步数的任务,模型必须随时掌握"当前链段已经延伸了多少个单体"这一核心累加指标,方能精准裁决在第几步打开输出阀门。由于计数器的真实基底完好存放在 cc 之中,让门控直接"窥视"记忆状态便成为了最为直接的解法。

然而,窥视孔的引入在算法上并非免费:它不仅额外增加了 3H3H 个一阶向量参数,更使得反向传播的导数链条从纯对角的 diag(ft)\mathrm{diag}(f_t) 泛化出了额外的依赖项。在绝大多数有机分子或材料物性预测中,由于并不存在严格离散的步数计数瓶颈,peephole 所带来的边际性能收益通常十分微弱,在严密的梯度检查中,它为各门带来的数值变化仅局限在微小的微扰量级。

4.5 门的三态:写、擦、读

将三道控制门并置于同一热力学视角下,一个记忆微元在离散时间步内本质上仅在周而复始地执行三项确定性操作:

操作由谁决定表达式化学类比
擦除ftf_tftct1f_t\odot c_{t-1}忘记上一段链的极性
写入it,gti_t,g_titgti_t\odot g_t写入新单体的极性
读出oto_tottanh(ct)o_t\odot\tanh(c_t)只在需要判断时读出累积量

三道门:写、擦、读

这三项微观动作在代数上的彻底解耦,构成了 LSTM 区别于门控循环单元(GRU)的最本质分水岭。在 GRU 的设计哲学中,擦除门与写入门被强行绑定在了一对互补的归一化门控 (1zt)(1-z_t)ztz_t 之间,这意味着"想要多吸收一点新生信息",系统就必须在物理上"等比例地抹杀一段既有历史"。后文第 9.3 节的实测消融将直观展现,这种互斥约束在面对极端长程的化学依赖时所暴露出的局限性。

4.6 门的失效模式:监控系统健康状态的三大预警信号

在实际开展化学与材料建模实验前,研究人员应当在监控面板中时刻警惕三种典型的动力学病态。

其一是门控饱和。当输入特征量纲过大或学习率失控时,门控激活前的线性加和往往长时间深陷在 z>6|z|>6 的两翼平台区,此时阀门开度被死死锁在 0 或 1,其局域梯度被浮点精度截断归零,导致该门的全部权重矩阵陷入无法优化的脑死亡状态。

其二是门控塌缩。在这一病态下,门控虽然未曾饱和,但在时间轴上的每一个微元中均输出几乎一模一样的中间数值(例如对所有步长 tt 恒有 it0.5i_t\approx 0.5)。此时,LSTM 复杂的非线性乘性交互能力彻底瓦解,退化为一个参数冗余且性能低下的准线性递归方程;本教程内置的 gate_statistics() 诊断工具,正是专为在线捕捉这一塌缩危机而打造。

其三是记忆溢出。当遗忘门偏置预设过高且缺乏有效的输入归一化约束时,累加池 ctc_t 的模长将在持续进料中无节制发散,直接诱发外围 tanh(ct)\tanh(c_t) 发生硬饱和,造成模型输出在宏观上蜕变为毫无响应的恒定常量。唯有对这三大隐患建立充分的警觉,才能在后续的材料数据训练中游刃有余。


5. BPTT:LSTM 的完整反向传播推导

这一章是全篇理论推演的最硬核部分。我们的使命是从末端输出损失关于隐状态的偏导 L/hT\partial L/\partial h_T 出发,沿着时间维度逆流而上,不跳过任何一个求导步骤地一路严密推演至输入端权重矩阵 L/Wf\partial L/\partial W_f。这不仅是一次纯粹的数学远征,更是洞悉梯度在循环网络内部如何穿梭、分流与汇聚的唯一正道。

5.1 计算图与记号

为了在复杂的复合求导中保持微积分脉络的绝对清晰,我们先将前向传播解构为"激活前线性变换(pre-activation)"与"非线性激活(activation)"两层阶梯,此时复杂的求导体系便精炼为四个最基础的标量导数关系:

中间量定义它的导数
uf,tu_{f,t}Wfzt+bfW_fz_t+b_fσ(u)=σ(u)(1σ(u))\sigma'(u)=\sigma(u)(1-\sigma(u))
ftf_tσ(uf,t)\sigma(u_{f,t})ft(1ft)f_t(1-f_t)
iti_tσ(ui,t)\sigma(u_{i,t})it(1it)i_t(1-i_t)
gtg_ttanh(ug,t)\tanh(u_{g,t})1gt21-g_t^2
oto_tσ(uo,t)\sigma(u_{o,t})ot(1ot)o_t(1-o_t)
ctc_tftct1+itgtf_t\odot c_{t-1}+i_t\odot g_t见下式推导
τt\tau_ttanh(ct)\tanh(c_t)1τt21-\tau_t^2
hth_totτto_t\odot\tau_t见下式推导

在记号约定上,以下中间变量梯度皆统一处理为长度为 HH 的列向量:

δht:=Lht,δct:=Lct,δzt:=Lzt\delta h_t:=\frac{\partial L}{\partial h_t},\qquad \delta c_t:=\frac{\partial L}{\partial c_t},\qquad \delta z_t:=\frac{\partial L}{\partial z_t}

这里存在一个关乎算法成败的关键约定δht\delta h_t 在反向传播的物理实现中,代表着"第 tt 步输出节点所承受的全部上游梯度之和"。它既包含了该时刻下游预测头直接施加的外侧损失反冲(例如在每个时间步都输出预测标签的分子语言模型),也融合了来自后续第 t+1t+1 步时序逆流回传的隐状态梯度。在后文的代码实现中,这一汇聚逻辑直接映射为 dh = dh_seq[t] + dh_next

BPTT:梯度沿时间回流

5.2 输出端:ht=ottanh(ct)h_t=o_t\odot\tanh(c_t) 的求导

求导从最贴近输出端的微元逐分量切入。对隐状态向量的任意第 jj 个分量,其前向关系为:

ht[j]=ot[j]τt[j],τt[j]=tanh(ct[j]).h_t[j]=o_t[j]\cdot\tau_t[j],\qquad \tau_t[j]=\tanh(c_t[j]) .

首先应用乘积法则求取对输出门变量 ot[j]o_t[j] 的偏导:

ht[j]ot[j]=τt[j]    Lot[j]=δht[j]τt[j]    δot=δhttanh(ct)(5.1)\frac{\partial h_t[j]}{\partial o_t[j]}=\tau_t[j] \;\Longrightarrow\; \frac{\partial L}{\partial o_t[j]} =\delta h_t[j]\,\tau_t[j] \;\Longrightarrow\; \boxed{\delta o_t=\delta h_t\odot\tanh(c_t)} \tag{5.1}

同理,对双曲正切激活中间量 τt[j]\tau_t[j] 实施链式法则:

ht[j]τt[j]=ot[j]    Lτt[j]=δht[j]ot[j].\frac{\partial h_t[j]}{\partial \tau_t[j]}=o_t[j] \;\Longrightarrow\; \frac{\partial L}{\partial \tau_t[j]}=\delta h_t[j]\,o_t[j] .

进一步结合标量导数 τt[j]=tanh(ct[j])\tau_t[j]=\tanh(c_t[j])tanh=1tanh2\tanh'=1-\tanh^2,便可导出损失函数经由瞬时输出路径传递给当前记忆状态 ct[j]c_t[j] 的梯度增量:

Lct[j]+=δht[j]ot[j](1τt[j]2)\frac{\partial L}{\partial c_t[j]} \mathrel{+}=\delta h_t[j]\,o_t[j]\,\big(1-\tau_t[j]^2\big)

之所以在此处严谨地采用累加赋值运算符 +=\mathrel{+}=,是因为记忆单元 ctc_t 除了承受当期输出端的外侧反冲外,稍后还将从未来的第 t+1t+1 时间步接收纵向传递的历史梯度。写成向量化形式即为:

δct=δhtot(1tanh2(ct))+(来自 t+1 步的部分)(5.2)\boxed{\delta c_t=\delta h_t\odot o_t\odot\big(\mathbf 1-\tanh^2(c_t)\big) +\big(\text{来自 }t+1\text{ 步的部分}\big)} \tag{5.2}

5.3 记忆更新:ct=ftct1+itgtc_t=f_t\odot c_{t-1}+i_t\odot g_t

本小节构成了整篇 BPTT 推导的最核心纽带。将记忆更新方程展开为标量分量形式:ct[j]=ft[j]ct1[j]+it[j]gt[j]c_t[j]=f_t[j]c_{t-1}[j]+i_t[j]g_t[j]。由于不同维度之间严格互不干扰,我们可以针对每个分量 jj 独立求偏导:

ct[j]ft[j]=ct1[j],ct[j]it[j]=gt[j],ct[j]gt[j]=it[j],ct[j]ct1[j]=ft[j]\frac{\partial c_t[j]}{\partial f_t[j]}=c_{t-1}[j],\quad \frac{\partial c_t[j]}{\partial i_t[j]}=g_t[j],\quad \frac{\partial c_t[j]}{\partial g_t[j]}=i_t[j],\quad \frac{\partial c_t[j]}{\partial c_{t-1}[j]}=f_t[j]

当总梯度 δct\delta c_t 已经由前序计算完全确定之后,各个控制支路的梯度便水到渠成:

δft=δctct1δit=δctgtδgt=δctitδct1=δctft(5.3)\boxed{ \begin{aligned} \delta f_t&=\delta c_t\odot c_{t-1}\\ \delta i_t&=\delta c_t\odot g_t\\ \delta g_t&=\delta c_t\odot i_t\\ \delta c_{t-1}&=\delta c_t\odot f_t \end{aligned}} \tag{5.3}

式 (5.3) 中的最后一式具有不可估量的理论地位:仔细观察可知,它仅仅包含一个纯粹的逐元素点乘 δctft\delta c_t\odot f_t,而未卷入任何稠密权重矩阵的相乘。这正是"常数误差传送带"在反向传播动力学中的具象化呈现——将其与式 (2.3') 中朴素 RNN 所依赖的 WhhΛtW_{hh}^{\top}\Lambda_t 相对照,一边是对角门控向量的温和缩放,另一边则是随机全连接矩阵的无情连乘,二者在数学性质上的高下立判。

若进一步考虑开启窥视孔(peephole)的拓扑变体,由于此时门控 ft,itf_t,i_t 显式依赖于上一时刻状态 ct1c_{t-1},而输出门 oto_t 显式依赖于当期状态 ctc_t,式 (5.1)、(5.2) 与 (5.3) 需要相应追加补偿项:

δct+=δotot(1ot)po(5.4)\delta c_t \mathrel{+}= \delta o_t\odot o_t\odot(\mathbf 1-o_t)\odot p_o \tag{5.4}

δct1+=δftft(1ft)pf+δitit(1it)pi(5.5)\delta c_{t-1}\mathrel{+}= \delta f_t\odot f_t\odot(\mathbf 1-f_t)\odot p_f +\delta i_t\odot i_t\odot(\mathbf 1-i_t)\odot p_i \tag{5.5}

推导式 (5.4) 的关键在于洞悉复合依赖链:根据 ht=ot(ct)tanh(ct)h_t=o_t(c_t)\odot\tanh(c_t)ot=σ(uo+poct)o_t=\sigma(u_o+p_o\odot c_t),对 ct[j]c_t[j] 求导时多出了一条经由输出门分支的分流路径:ht[j]/ot[j]ot[j]/ct[j]=τt[j]ot[j](1ot[j])po[j]\partial h_t[j]/\partial o_t[j]\cdot\partial o_t[j]/\partial c_t[j]=\tau_t[j]\cdot o_t[j](1-o_t[j])\cdot p_o[j],将该项乘以上游梯度 δht[j]\delta h_t[j] 并整理为向量形式即得式 (5.4)。式 (5.5) 的推导机理完全对称,只是其影响作用于更前一步的基底 ct1c_{t-1}。特别需要提醒的是,代码实现中式 (5.4) 应当直接复用已经算好的中间梯度 do(即 δot\delta o_t),切不可重复套入 δht\delta h_t,避免发生重叠求导的低级失误。

5.4 门的 pre-activation 与参数梯度

四个门控分支本质上都是对线性组合 u=Wz+bu=Wz+b 施加逐元素的平滑非线性映射,因此其反向传播形式呈现出规整的对称性:

δuf,t=δftft(1ft),δui,t=δitit(1it),\boxed{ \delta u_{f,t}=\delta f_t\odot f_t\odot(\mathbf 1-f_t),\quad \delta u_{i,t}=\delta i_t\odot i_t\odot(\mathbf 1-i_t),}

δug,t=δgt(1gtgt),δuo,t=δotot(1ot)(5.6)\boxed{ \delta u_{g,t}=\delta g_t\odot(\mathbf 1-g_t\odot g_t),\quad \delta u_{o,t}=\delta o_t\odot o_t\odot(\mathbf 1-o_t)} \tag{5.6}

在获得各门的激活前梯度后,我们终于来到了权重矩阵更新的核心关口。以遗忘门权重 WfRH×(d+H)W_f\in\mathbb R^{H\times(d+H)} 为例,展开其标量代数关系 uf,t[j]=kWf[j,k]zt[k]+bf[j]u_{f,t}[j]=\sum_k W_f[j,k]z_t[k]+b_f[j],可直接求取各个矩阵元素的导数贡献:

uf,t[j]Wf[j,k]=zt[k],uf,t[j]bf[j]=1.\frac{\partial u_{f,t}[j]}{\partial W_f[j,k]}=z_t[k],\qquad \frac{\partial u_{f,t}[j]}{\partial b_f[j]}=1 .

此时,必须将序列上所有时间步 tt 的历史贡献悉数求和——因为同一个参数矩阵 WfW_f 在时序展开的前向网络中被重复调用了 TT 次:

LWf=t=1Tδuf,tzt,Lbf=t=1Tδuf,t(5.7)\boxed{ \frac{\partial L}{\partial W_f}=\sum_{t=1}^{T}\delta u_{f,t}\,z_t^{\top}, \qquad \frac{\partial L}{\partial b_f}=\sum_{t=1}^{T}\delta u_{f,t}} \tag{5.7}

为什么公式中必须存在时序求和符号 t\sum_t 这是初涉循环网络的开发者最容易产生困惑的地方。在深度学习的底层法则中,WfW_f 是一个跨越整个时序生命周期高度复用的时序共享参数(parameter tying)。多元微积分的链式法则严格规定:当一个参数在多个计算图节点中同时发生分流作用时,其总梯度必然等于各分支偏导数的代数相加。在代码逻辑中,这具体体现为:在反向逆序遍历 for t in reversed(...) 的大循环内,权重梯度累加器 self.gW_f[j][k] += ... 必须持续不断地执行 += 操作,而 zero_grad() 仅被允许在每一个训练 batch 启动前调用一次。若由于手滑将累加符号误写为赋值覆盖符 =,将酿成深度学习中最隐秘的幽灵 bug——此时前向推理与预测完全正确,甚至训练损失也能出现缓慢下降,但模型实际更新的却是一个残缺畸形的错误梯度。此外需要强调,式 (5.7) 中的单步项本质上是向量与行向量的外积(outer product)δuz\delta u\,z^\top,其维度严格吻合为 (H,1)×(1,d+H)=(H,d+H)(H,1)\times(1,d+H)=(H,d+H),在代码中直接对应于 outer(dpf, z) 函数。

其余三个门控分支(i,g,oi, g, o)在代数形态上完全对称,只需将角标做相应替换即可闭合。

5.5 回到输入:zt=[xt;ht1]z_t=[x_t;h_{t-1}] 的梯度

为了使多层网络或时序反向流得以继续向下游传递,我们还必须计算总输入向量 zt=[xt;ht1]z_t=[x_t;h_{t-1}] 的反向梯度。由于四个门控方程的激活前线性项皆由 ztz_t 分流驱动,对其第 kk 个分量应用全微分法则:

Lzt[k]=j(δuf,t[j]Wf[j,k]+δui,t[j]Wi[j,k]+δug,t[j]Wg[j,k]+δuo,t[j]Wo[j,k])\frac{\partial L}{\partial z_t[k]} =\sum_j\big(\delta u_{f,t}[j]W_f[j,k]+\delta u_{i,t}[j]W_i[j,k] +\delta u_{g,t}[j]W_g[j,k]+\delta u_{o,t}[j]W_o[j,k]\big)

写成紧凑的矩阵向量形式,清晰地反映出转置伴随矩阵向输入端的映射回流:

δzt=Wfδuf,t+Wiδui,t+Wgδug,t+Woδuo,t(5.8)\boxed{ \delta z_t = W_f^{\top}\delta u_{f,t}+W_i^{\top}\delta u_{i,t} +W_g^{\top}\delta u_{g,t}+W_o^{\top}\delta u_{o,t}} \tag{5.8}

在底层代码中,该步骤由四次连续的 vecmat(dpf, self.W_f) 向量矩阵转置乘法求和优雅实现。

最后,依据前向拼接时的空间布局,将合成梯度 δzt\delta z_t 顺理成章地切分为两截:前 dd 维直接构成了当前时间步特征输入的反向梯度,而后 HH 维则被作为递推增量注入回前一步的隐状态:

Lxt=δzt[1:d],δht1+=δzt[d+1:d+H](5.9)\boxed{ \frac{\partial L}{\partial x_t}=\delta z_t[1{:}d], \qquad \delta h_{t-1}\mathrel{+}=\delta z_t[d{+}1{:}d{+}H]} \tag{5.9}

在此处,再次凸显出累加符 +=\mathrel{+}= 的严谨性:历史隐状态 ht1h_{t-1} 在回传中不仅要承接本步门控流的反馈,还要随时准备吸纳来自外部更深网络层或特定任务预测头的附加梯度。

5.6 完整算法

将 5.2 至 5.5 节推导的所有微观微分方程式串联一体,便汇聚成了经典 LSTM 沿时间反向传播(BPTT)的完整算法流程:

text
输入:dh_seq[t](每个时间步输出收到的上游梯度),T
初始化:dh_next = 0,dc_next = 0
for t = T down to 1:
    dh = dh_seq[t] + dh_next                      # 合并两条来源
    do     = dh ⊙ tanh(c_t)                       # (5.1)
    dc     = dc_next + dh ⊙ o_t ⊙ (1 - tanh²(c_t)) # (5.2)
    df     = dc ⊙ c_{t-1}                          # (5.3)
    di     = dc ⊙ g_t
    dg     = dc ⊙ i_t
    dc_next= dc ⊙ f_t                              # (5.3) 最后一行 ← 传送带
    du_f   = df ⊙ f_t ⊙ (1-f_t)                    # (5.6)
    du_i   = di ⊙ i_t ⊙ (1-i_t)
    du_g   = dg ⊙ (1 - g_t ⊙ g_t)
    du_o   = do ⊙ o_t ⊙ (1-o_t)
    # 参数梯度:累加,不是覆盖                       (5.7)
    gW_f += outer(du_f, z_t);  gb_f += du_f
    gW_i += outer(du_i, z_t);  gb_i += du_i
    gW_g += outer(du_g, z_t);  gb_g += du_g
    gW_o += outer(du_o, z_t);  gb_o += du_o
    dz     = W_fᵀdu_f + W_iᵀdu_i + W_gᵀdu_g + W_oᵀdu_o   # (5.8)
    dx[t]  = dz[1:d]                               # (5.9)
    dh_next= dz[d+1:d+H]

在核心代码库 code/lstm.pyLSTMLayer.backward 方法中,上述伪代码以零依赖纯 Python 语法得到了逐行呈现,读者可在附录 A 中查阅公式与代码的完整对照表。

5.7 梯度通路分解定理

掌握了严密的反向计算图后,我们终于有足够的数学底气正面回答本教程最核心的科学命题:LSTM 究竟是在哪一条微观通路上挽救了濒临消亡的梯度?这种拯救机制能够维持多久的有效生命周期?

定理 5.1(记忆主通路梯度的门控连乘定理) 记标量微元 sk:=δhkok(1tanh2(ck))s_k:=\delta h_k\odot o_k\odot(\mathbf 1-\tanh^2(c_k)) 为第 kk 步输出经由输出门和双曲正切主动注入记忆核心池的"源项",则反向传播回溯至序列起点(第 0 步)时,记忆单元所汇聚的总梯度严格满足:

δc0=k=1T(j=1kfj)sk(5.10)\boxed{\delta c_0=\sum_{k=1}^{T}\Big(\bigodot_{j=1}^{k}f_j\Big)\odot s_k} \tag{5.10}

证明 将式 (5.3) 中的递推基石 δct1=δctft\delta c_{t-1}=\delta c_t\odot f_t 结合式 (5.2) 进行迭代展开:

δct=st+ft+1δct+1(t<T),δcT=sT.\delta c_t=s_t+f_{t+1}\odot\delta c_{t+1}\qquad(t<T),\qquad \delta c_T=s_T .

运用第一数学归纳法:假设对于任意时刻 tt,系统反向状态均可归纳为后续全部注入源的衰减叠加,即 δct=k=t+1T(j=t+1kfj)sk+st\delta c_t=\sum_{k=t+1}^{T}(\odot_{j=t+1}^{k}f_j)\odot s_k +\,s_t。将其代入回退递推式中:

δct1=st1+ftδct=st1+k=tT(j=tkfj)sk,\delta c_{t-1}=s_{t-1}+f_t\odot\delta c_t =s_{t-1}+\sum_{k=t}^{T}\Big(\bigodot_{j=t}^{k}f_j\Big)\odot s_k ,

归纳假设得以严密保持。最终在序列起点令 t=1t=1,即可精确导出全局封闭解式 (5.10)。\blacksquare

该定理在数学上彻底揭开了三个困扰序列建模已久的底层真相:

首先,阻尼衰减因子里彻底摒弃了任意权重矩阵的连乘积。在记忆主通路中,每一步的衰减权重仅仅是由各时间步遗忘门开度所构成的乘积 fj\prod f_j。由于门控取值 fj(0,1)f_j\in(0,1) 是由数据反向驱动自适应学习出的物理标量,当化学或物理任务确实要求系统守住长程端基特征时,反向误差信号会强力推动系统将各时间步的门控推向饱和开启的 fj1f_j\to 1,使得几何级数衰减在动力学层面上自发消失。这正是 LSTM 赖以逆天改命的底层法门。

其次,长程梯度呈现为累加求和形式而非孤注一掷的连乘积。展开式表明,第 0 步记忆单元所接收到的总误差 δc0\delta c_0,实质上是未来 TT 个时间步向源头注入的历史贡献之加权和。即使远端的历史项因门控开度不足而有所耗散,临近时间步的梯度依然能够以饱满的幅度直达核心,这保证了梯度信号绝不会发生全局性的猝死,极大增强了动力学优化的稳健性。

最后,它严谨划定了记忆存留的物理边界。倘若遗忘门在局域序列上维持着近似常数的均值 fˉ=σ(bf)\bar f=\sigma(b_f),那么第 kk 步所贡献的信号依然会按照 fˉk\bar f^{k} 的指数包络衰减,其特征半衰期同样严格遵从 τ1/2=ln0.5/lnfˉ\tau_{1/2}=\ln0.5/\ln\bar f 的规律,这与第 4.1 节的先验估计完全闭环契合。

定理 5.2(隐状态 hh 通路的本征衰减性——切莫迷信绝对传送带) 若我们将目光转向隐状态的反向回流分支,由式 (5.9) 可知 δht1\delta h_{t-1} 包含了 δzt\delta z_t 的后 HH 个分量,将其按式 (5.8) 展开:

δht1Wfδuf,t+Wiδui,t+Wgδug,t+Woδuo,t\delta h_{t-1}\supset W_f^{\top}\delta u_{f,t} +W_i^{\top}\delta u_{i,t}+W_g^{\top}\delta u_{g,t}+W_o^{\top}\delta u_{o,t}

在此支路中,中间梯度 δu,t\delta u_{\cdot,t} 依赖于 δct\delta c_t,而 δct\delta c_t 又向上回溯绑定于 δht\delta h_t。若将此路径沿时序持续展开,衰减因子中不可避免地重新出现了权重矩阵的连续卷积

t(对角门项)(W)(对角饱和项)(5.11)\prod_t\Big(\text{对角门项}\Big)\Big(W_{\cdot}^{\top}\Big)\Big(\text{对角饱和项}\Big) \tag{5.11}

这一深刻推论敲响了一记警钟:LSTM 从物理机制上倾力庇护的仅仅是记忆单元通路 cc,而非向外暴露的隐状态通路 hh 假若某个化学任务强行要求"第 0 步的微观基团必须直接干预末位第 TT 步的瞬态隐状态输出",那么这一扰动信号在终点必须先从 cTc_T 穿过输出门 oTo_T 与双曲正切 tanh\tanh 的屏障走出来——而这条向外破茧的通道并没有传送带的无损护航。

这也完美解释了后文第 6.4 节实验中观察到的反常识现象:即使 LSTM 已经成功打通了将梯度送回第 0 步的通道(其 cc 通路比值极度接近 1),但要让网络真正学会把这份历史记忆高效读取并转化为外部决策,依然需要优化器耗费相当的迭代时间去磨合输出门与激活函数的非线性转换。

5.8 遗忘门打开时到底发生了什么

从纯理论推导来看,将遗忘门设为常开(ft1f_t\equiv 1)似乎最有利于保存长程记忆,但在真实的化学序列建模中,这种偏执的设定却会诱发系统性的崩溃。

其首要困境在于内部状态的无界发散:若门控完全不设防,ct=c0+kikgkc_t=c_0+\sum_k i_k\odot g_k 将伴随序列推进持续线性累加,迅速将外围的双曲正切挤压至平坦区,导致输出端梯度的二次湮灭——相当于把时间维度的梯度消失转移到了状态维度的饱和湮灭之中。其次在于化学现实的多样性代谢需求,在聚合物嵌段更替或反应条件改变时,旧有的累加量若不能被及时代谢清空,模型便无法建立适应新反应阶段的微观状态。再者,过大的门控开度还会导致局部导数趋近于零,使得门控自身的参数陷入停滞(后文第 6.4 节扫描偏置时,过度亢进的 bf=5b_f=5 其准确率反而明显逊色于温和的 bf=3b_f=3)。

因此,科学的工程辩证观应当是:正向偏移偏置 bfb_f 的根本意图,仅仅是在网络诞生的蛮荒时刻开辟一条阻力最小的初始梯度运河,而门控在后续演化中的真实开合轨迹,必须彻底交由化学数据本身的物理内涵去自洽雕琢。

5.9 数值验证:梯度检查抓到过的两个真 bug

再优雅精巧的推演也抵挡不住手写代码时的一个符号疏漏。在深度学习的底层算法工程中,唯一具有终极裁判权的质检利器,当属基于有限差分(finite difference)的数值梯度检验

基础的三点中心差分通过两翼对称微扰提供二阶精度的逼近基准:

LθL(θ+ε)L(θε)2ε    +    O(ε2)(5.12)\frac{\partial L}{\partial\theta}\approx \frac{L(\theta+\varepsilon)-L(\theta-\varepsilon)}{2\varepsilon} \;\;+\;\;O(\varepsilon^2) \tag{5.12}

而高精度的五点差分公式则能通过更高阶的 Taylor 展开抹平局域曲率,实现四阶精度的逼近:

LθL(θ+2ε)+8L(θ+ε)8L(θε)+L(θ2ε)12ε    +    O(ε4)(5.13)\frac{\partial L}{\partial\theta}\approx \frac{-L(\theta+2\varepsilon)+8L(\theta+\varepsilon) -8L(\theta-\varepsilon)+L(\theta-2\varepsilon)}{12\varepsilon} \;\;+\;\;O(\varepsilon^4) \tag{5.13}

在实际进行梯度检查时,存在着两条违背直觉却至关重要的工程经验法则:

首先,微扰步长 ε\varepsilon 绝非越小越好。数值分析表明,有限差分的总截断误差由截断项与机器舍入噪声共同决定:Error=O(ε2)+O(ϵmach/ε)\text{Error}=O(\varepsilon^2)+O(\epsilon_{\text{mach}}/\varepsilon)。当步长取得过小(例如在双精度下取 ε=106\varepsilon=10^{-6}),分母上的微扰会极大放大分子上浮点相消所残存的机器噪声,实测其相对误差反而恶化至 1.9×1071.9\times10^{-7};而在最佳平衡点 ε104\varepsilon\approx10^{-4} 处,实测误差能够达到极其精密的 9.0×1099.0\times10^{-9}

其次,判定准则必须采用相对误差与绝对误差的联合双判据。某些神经元参数的真实解析梯度在物理上可能已经衰减至 10810^{-8} 量级,此时微小的浮点舍入涨落就会轻易使相对误差假性放大至 10610^{-6} 以上,若盲目依赖单一指标势必造成误判。本教程在算法质检中严格实施双重护栏:只要满足"相对误差 <106< 10^{-6} 绝对误差 <109< 10^{-9}"即判定通过。

在开发本套纯原生算法库的过程中,正是依靠这套毫不妥协的差分检验,两桩在常规 loss 监控中极难现形的真实 bug 被当场人赃并获:

案例一:时序平均系数 1/T1/T 的隐蔽遗漏 在字符级语言模型的损失函数定义中,总标量 loss 是对全序列 TT 个离散步长所求得交叉熵的算术平均值;然而在最初编写反向传播时,代码却将每一个时间步输出端接收到的梯度 L/ht\partial L/\partial h_t 进行了简单加和,未除以序列长度 TT。这一遗漏导致解析梯度恰好是真实数值梯度的整整 4.00 倍(此时 T=4T=4)。此类"等比例放大一个恒定常数"的缺陷在宏观训练曲线上极难察觉,因为优化器 Adam 会自然将其视同为学习率被放大了 4 倍而默默吸收,使开发者误以为模型运行完好,实则超参数评估体系早已全盘失真。修复此 bug 的方案是:对预测层输出梯度 dlogits 与逆流回传的 dh 必须双双严格乘以归一化因子 1/T1/T

案例二:输出变换层 Dense 对象的内部缓存污染 在语言模型的前向展开中,由于每个时间步必须共用同一个全连接输出层,该层内部习惯性地缓存了"最近一次"前向传递的输入张量。若开发者在编写代码时,先以循环方式完整执行完 TT 个步长的前向推理,随后再倒序调用 TT 次该层对象的 backward,那么这 TT 次反向权重梯度的累加计算,将荒谬地全部基于序列最后一个步长所遗留的输入缓存去计算外积,导致早期时间步的梯度被彻底篡改。修复该缺陷的法则是在每次反向回溯前,命令该输出层利用该步专属的隐状态重新前向一次以刷新环境。该 bug 一经触发,相对误差立即飙升至 0.6 之巨,在严格的差分质检下无所遁形。


6. 记忆容量与记忆长度

当研究人员提出"LSTM 究竟能记住多长的序列?"这一疑问时,同行之间往往会爆发激烈的争论。这种争论的根源在于:提问者常常将三种在物理与数学层次上截然不同的"记忆"混为一谈。

6.1 三种"记忆"

记忆的定义度量本教程怎么测
梯度记忆:梯度能传回多远L/c0\partial L/\partial c_0L/cT\partial L/\partial c_T 之比第 6.3 节(不训练,纯解析)
影响力记忆:输出对远端输入有多敏感y^/xt|\partial \hat y/\partial x_t| 的形状第 6.4 节(训练后)
任务记忆:真的能答对多远的问题端基识别的准确率第 6.4 节

这三种记忆之间存在着严格的单向因果链条

任务记忆    影响力记忆    梯度记忆\text{任务记忆}\;\Longleftarrow\;\text{影响力记忆}\;\Longleftarrow\;\text{梯度记忆}

显然,这一逻辑链条在逆向并不成立:反向传播能将梯度完整传回第 0 步,仅仅为网络提供了学习的生理可能,绝不保证网络在训练后真的愿意调用这部分远端特征;而即使模型在局部对远端特征展现出了数值敏感性,也不等于它真正掌握了解决宏观化学任务的正确映射规律。本教程之所以花费大量算力将这三个维度同步测量并排对比,正是为了帮助研究者拨开这一认知迷雾。

6.2 半衰期的解析估计

由定理 5.1 可知,若遗忘门在局域步长内维持着近似常数的均值 fˉ\bar f,则第 kk 步所贡献的信号分量将按 fˉk\bar f^{k} 发生指数衰减。类比于化学反应动力学,我们定义梯度信号衰减至其初始强度一半时所经历的特征步数为记忆半衰期

fˉτ=12    τ1/2=ln0.5lnfˉ(6.1)\bar f^{\tau}=\tfrac12 \;\Longrightarrow\; \tau_{1/2}=\frac{\ln 0.5}{\ln \bar f} \tag{6.1}

将初始时刻的偏置近似关系 fˉσ(bf)\bar f\approx\sigma(b_f) 代入,即可导出一套极其简练且可直接用于指导实验的解析预估法则:

τ1/2(bf)ln0.5lnσ(bf)(6.2)\boxed{\tau_{1/2}(b_f)\approx\frac{\ln 0.5}{\ln\sigma(b_f)}} \tag{6.2}

后文第 6.4 节的实测半衰期数据将充分证实,该解析公式在量级预判上具有惊人的实用可靠性。

6.3 实验一:把梯度衰减量出来(不训练)

为了把不同架构最本征的传质能力置于完全无偏的标尺下,我们设计了一项纯粹的动力学校验实验(代码参见 demo_memory.py_decay_profile 函数):随机初始化一个 LSTM 或 RNN 模型,向其输入一段长度为 T=64T=64 的随机序列;在演化的最后一步人为注入一个标准单位梯度,令其沿着计算图一路逆向回传,并逐帧忠实记录每一步的梯度范数演化。

这项实验的精妙之处在于它完全不卷入任何参数训练过程。这意味着测得的所有动态差异都纯粹源自网络拓扑结构与初始化本征属性的差异,彻底排除了优化器类型、学习率调度策略或数据集特定偏差等外在干扰。

fig_m01_gradient_decay 完整描绘了各模型的衰减演化轨迹,而图 fig_m02_decay_ratio 则以直观的条形图展现了回溯 64 步后残存梯度的宏观对比:

梯度沿时间回传的衰减

回传 64 步后的梯度比值

模型回传 64 步后的比值半衰期(步)通路
CEC(传送带)1.0001.000>63>63cc
RNN(xavier)2.76×10142.76\times10^{-14}3hh
RNN(orthogonal)2.28×10112.28\times10^{-11}3hh
GRU6.96×10166.96\times10^{-16}1hh
LSTM(bf=0b_f=0)3.18×10133.18\times10^{-13}2cc
LSTM(bf=1b_f=1)2.09×1042.09\times10^{-4}4cc
LSTM(bf=3b_f=3)2.23\mathbf{2.23}>63>63cc

审视这组沉甸甸的实测数据,有四项极具冲击力的科学现象值得驻足深思:

第一,CEC 回传 64 步后的比值在计算机浮点精度下精确收敛为 1.000000000000,第 2.4 节所建立的常数误差传送带无损假说在微观硬件层面获得了逐位验证。

第二,LSTM(bf=3b_f=3) 的回传比值不仅没有衰减,反而超越基准达到了惊人的 2.23。这绝非数值爆炸或浮点溢出:当遗忘门偏置设为 3 时,其初始开度高达 f0.95f\approx0.95,此时记忆主通路几乎处于完全导通状态,根据定理 5.1 的求和架构,反向传播不仅完整保全了来自终点的信号,更沿途将各个时间微元注入的梯度贡献一路累加包裹,最终在源头汇聚成一股更为强大的反馈洪流。

第三,实测比值显著超越了教科书式的直觉估算。若单纯套用单项连乘公式 σ(1)64\sigma(1)^{64} 进行粗糙手算,预估值仅为 2.0×1092.0\times10^{-9},而实测数值却达到了 2.09×1042.09\times10^{-4},两者整整相差了 5 个数量级。产生这一巨大差距的原因正是定理 5.1 所揭示的加和累积本质——反向总梯度是由 TT 个向源头汇流的分支叠加而成,绝非孤立单链的几何连乘,这深刻提醒研究者:单项连乘估算仅仅构成了极其保守的理论下界。

第四,门控循环单元(GRU)在测试中展现出了最为剧烈的衰减滑坡,其 64 步后的比值惨跌至 6.96×10166.96\times10^{-16},特征半衰期仅有 1 步。这一现象尖锐地刺破了"只要有门控就能记住一切"的幻觉,深刻印证了其缺乏独立加法通道在长程反向传播中的本征缺陷。

6.4 实验二:端基识别——链有多长才记不住

为了把抽象的梯度数学映射到真实的高分子化学语境中,我们设计了一个极具启发性的高分子合成化学任务:假定使用同一种单体,分别经由四种截然不同的聚合引发体系(烷基锂阴离子聚合、ATRP 溴化物引发、RAFT 三硫代酯引发、茂金属配位聚合)合成聚合物链。所得的高分子链在链身骨架上完全同质,唯独在链起始端的引发基团(端基)上携带化学结构差异。算法的任务仅仅是通读整条链的序列特征,在链末端对最初使用的引发剂类别做出四分类判别。

在这一设定中,决定性的端基特征被严格固定在序列的第 0 位,而预测输出头则挂载在最末端的池化层,两者之间横跨了长达 T1T-1 步的时序荒原。这构成了检验模型纯粹长程记忆极限的绝佳试金石。

需要严谨说明的是,这是一个标准的构造性科学任务。在真实的实验室分析中,化学家通常依赖飞行时间质谱(MALDI-TOF)、端基滴定分析或高分辨率 NMR 端基积分来判定结构。在此之所以采用合成构造序列,是因为它剥离了一切复杂的偶发化学干扰,纯粹考查序列记忆能力,使得"模型若发生预测溃败,必是其记忆机制本身发生了退化"。

我们将六种具有代表性的循环模型置于不同链长(20 与 60)的统一训练赛场下:

模型说明
RNN(xavier)朴素循环层,Xavier 初始化(教科书默认)
RNN(orthogonal)朴素循环层,正交初始化(第 1.3 节的第二条路)
GRU门控,但没有独立的记忆通路
LSTM(bf=0b_f=0)遗忘门偏置 0(很多框架的默认值!)
LSTM(bf=1b_f=1)遗忘门偏置 1(Gers & Schmidhuber 的建议)
LSTM(bf=3b_f=3)更强的"偏向记住"
模型链长 20链长 60
RNN(xavier)0.683±0.2250.683\pm0.2251.000±0.000\mathbf{1.000\pm0.000}
RNN(orthogonal)1.000±0.0001.000\pm0.0000.950±0.0710.950\pm0.071
GRU1.000±0.0001.000\pm0.0000.300±0.0610.300\pm0.061
LSTM(bf=0b_f=0)0.517±0.3440.517\pm0.3440.300±0.0610.300\pm0.061
LSTM(bf=1b_f=1)0.942±0.0820.942\pm0.0820.533±0.3360.533\pm0.336
LSTM(bf=3b_f=3)1.000±0.0001.000\pm0.0000.950±0.0710.950\pm0.071

(基于 3 个独立随机种子、15 轮训练统计;四分类任务随机瞎猜基准为 0.250。)

端基识别:链长 vs 准确率

这张看似违背直觉的数据表,值得每一位机器学习从业者反复研读:

在较短的链长(20 步)上,几乎所有具备合理初始化的模型都能轻松收敛,表明该任务在短程尺度上并不构成阻碍。然而,一旦高分子链延伸至 60 步,系统内部立刻发生了惨烈的分化:GRU 与默认零偏置的 LSTM(bf=0b_f=0) 全面崩溃至随机猜测边缘(准确率约 0.300);与此同时,经过正交初始化的 RNN 与开启大偏置的 LSTM(bf=3b_f=3) 则稳稳坚守在 0.95 以上的高位。

最令人错愕的反常识现象是:采用 Xavier 初始化的朴素 RNN 在链长 60 上竟跑出了 1.000 的满分,而推荐偏置配置下的 LSTM(bf=1b_f=1) 却仅录得 0.533±0.3360.533\pm0.336 的波动均值——同一套算法换一个随机数种子,准确率便会在 0.25 到 1.00 之间发生剧烈跳变。

这背后的动力学真相究竟是什么?答案深植于该实验的物理设定之中:此处的聚合物链身是由完全相同的单一单体重复构成的均聚物。对朴素 RNN 而言,其隐状态演化式 ht=tanh(Wxxconst+Whht1)h_t=\tanh(W_xx_{\text{const}}+W_hh_{t-1}) 在输入恒定的条件下蜕变为一个经典的不动点迭代动力系统。只要转移矩阵 WhW_h 在训练中没有快速发生收缩衰减,由最初第 0 步端基所激发的初始相空间点位,便会顺理成章地平移投射为一个专属的不动点吸引子。换言之,朴素 RNN 在此并非真正攻克了长程反向传播的梯度消失,而是巧妙地利用任务输入的均一性,以动力学吸引子的方式"绕过"了梯度消失。

这一反思凝聚为本教程最核心的学术论断:

"模型挂着 LSTM 的名字"绝非实现长期记忆的充分条件。在这个 60 步的合成任务中,缺乏正确偏置引导的 LSTM 和 GRU 甚至被朴素 RNN 远远甩在身后。决定系统生死存亡的根本命脉,在于底层的记忆加法运河是否被真正物理开启——对 LSTM 而言,这由常数偏置 bfb_f 绝对主宰;对 RNN 而言,则由矩阵的初始谱结构严格定义。

更进一步,我们将链长推进至极其苛刻的 120 步极限跨度(采用 2 个独立种子、20 轮训练):

模型链长 120
RNN(orthogonal)0.713±0.2900.713\pm0.290
LSTM(bf=1b_f=1)0.163±0.0600.163\pm0.060
LSTM(bf=3b_f=3)0.550±0.4500.550\pm0.450

这组极限数据揭示了三个深层现实:首先,在 120 步的极端尺度下,所有模型均无可避免地显现出性能退化,种子间的方差大幅飙升至 ±0.45\pm0.45,这标志着当前极简的网络容量正在逼近物理承载上限;其次,bfb_f 的决定性阶梯依然固若金汤——仅仅改变偏置这一个常数,bf=3b_f=3(0.550)的泛化能力便数倍碾压 bf=1b_f=1(0.163);最后,朴素 RNN 在均一链上凭借不动点机制依然维持了 0.713 的表观高位,但这并非代表其拥有更健康的梯度流动(第 6.3 节测得其梯度残留仅为 101410^{-14}),而是证明了简单结构在简单任务上常常能够投机取巧。那么,当链身出现真实化学噪声的强烈干扰时,谁才是真正的王者?后文第 6.5 节将揭晓谜底。

为了彻底描摹偏置项对记忆寿命的连续调控行为,我们实施了细致的遗忘门偏置系统扫描(对应图 fig_m04_forget_biasfig_m05_half_life):

bfb_f初始 fˉ=σ(bf)\bar f=\sigma(b_f)回传比值半衰期验证准确率
0.00.5683.69×10113.69\times10^{-11}20.375
0.50.6735.30×1085.30\times10^{-8}30.375
1.00.7646.62×1056.62\times10^{-5}40.375
2.00.8938.25×1028.25\times10^{-2}81.000\mathbf{1.000}
3.00.9571.461.46100.850
5.00.9944.184.18191.000\mathbf{1.000}

遗忘门偏置扫描

记忆半衰期随  的变化

这是一张足以让所有算法研究者警醒的相变图谱:当 bf1.0b_f\le1.0 时,反向梯度回传比值长期受困于 10410^{-4} 之下,任务验证准确率被死死压制在 0.375 的低位;而一旦偏置跨越阈值 bf2.0b_f\ge2.0,回传比值跃升至 10210^{-2} 以上,系统如同经历了一级相变一般,准确率瞬间跃升至 1.000 的满分境地。值得指出的是,由于诸多主流框架在处理隐层偏置时往往默认取 0,许多学者在遇到长序列任务时抱怨"换了 LSTM 依然无济于事",其实并非架构失灵,而是整套记忆运河在初始化时便被默认闭锁。

在训练收敛之后,我们进一步提取并绘制了模型的远端影响力曲线(图 fig_m06_influence),通过度量预测分布在微观扰动下的全变差距离 Δ\Delta,定量剖析末端输出究竟在关注整条链上的哪一个区段:

模型验证准确率Δ\Delta(只换端基)Δ\Delta(只换链身中位)
RNN(orthogonal)·均匀链0.8500.6650.000
LSTM(bf=1b_f=1)·均匀链0.3750.0000.000
LSTM(bf=3b_f=3)·均匀链0.8500.6640.000
RNN(orthogonal)·干扰链1.0000.9970.001
LSTM(bf=3b_f=3)·干扰链1.0000.9960.000

远端影响力:只改一个位置

表格中 Δ\Delta 代表"在保持其它全部结构完全静止的条件下,仅仅翻转单一标记时预测输出分布所产生的全变差扰动"。并排审视这两列指标,模型的认知模式昭然若揭:对于真正学会长程识别的模型,其预测决策展现出极强的特异性——只换端基时预测分布发生翻天覆地的剧变(Δ=0.661.00\Delta=0.66\sim1.00),而肆意改动链身中位单体时系统却波澜不惊(Δ=0.000\Delta=0.000),证明模型已精准锁定了第 0 步的决定性因果;反观失败的 LSTM(bf=1b_f=1),两个位置的响应皆死死定格在 0.000,表明它根本无法萃取源头信息,输出仅仅是一个平庸的常数先验。

在此必须分享一段在实际科研中极为宝贵的方法论沉思:在早期的实验诊断中,作者曾一度试图采用局域微分算子 h/xt\|\partial h/\partial x_t\| 来评估影响力,结果在均一链上测得了低至 103010^{-30} 的荒谬数值。深入排查后方才顿悟:模型已将状态推入了双曲正切的深度饱和平坦区,此时宏观函数值对输入存在着强烈的因果依赖,而局部的解析导数却呈现为假死般的绝对零;随后尝试的全局掩码置换法又因打破了链身的均一性先验而引入了虚假放大。最终确立的"单一位置置换-全变差距离分析法"完美规避了激活饱和的测量陷阱,提供了坚实可靠的物理度量。这深刻表明:在材料 AI 的机理诊断中,选择正确的物理测度往往比更换算法架构更为根本。

6.5 实验三:更难的任务上,LSTM 也会输

为了彻底检验各架构在真实复杂环境下的抗干扰韧性,我们进一步构筑了升级版任务:将均一的高分子链身彻底替换为四种不同单体随机乱序共聚的强干扰链段。在物理本质上,这并未增减任何有效信息量(决定引发剂类别的端基依然静静躺在第 0 位),但模型必须被迫在长达 59 步的动态杂音包裹中,始终守住最初那份微弱而珍贵的信号不被覆盖冲刷。

模型种子 0种子 1均值
RNN(orthogonal)1.0000.5250.762
GRU0.3250.2500.287
LSTM(bf=1b_f=1)0.2501.0000.625
LSTM(bf=3b_f=3)1.0001.0001.000±0.000\mathbf{1.000\pm0.000}

带干扰的长链任务

这组实验构成了 LSTM 证明自身存在价值的真正主场。在均一链上依赖不动点投机取巧的朴素 RNN,一旦遭遇链身随机单体的持续冲击,其脆弱的相空间平衡瞬间瓦解,各步新输入的杂音将过往状态层层掩埋,导致跨种子均值剧烈回落至 0.762;而唯有具备完全独立加法记忆通路、且被正向偏置 bf=3b_f=3 彻底激活导通的 LSTM,在所有随机试验中展现出了不可动摇的 1.000 满分战力。

与此同时,这一对比也为科研人员划定了一条不可逾越的戒律:门控绝非万能的灵丹妙药,偏置 bfb_f 才是其苏醒的根本钥匙;在相同的网络拓扑下,仅仅因为偏置配置不当,LSTM 就会在同一个带有干扰的任务中展现出平庸与卓越的天壤之别。

6.6 记忆容量的上限

除了反向传播中的梯度传导障碍,序列建模还面临着另一座难以逾越的理论物理天花板:有限维度的状态向量 cRHc\in\mathbb R^H 绝不可能在信息论意义上容纳无限的时序历史。

从信息论与离散动力系统的角度审视,假定连续状态空间中的每个浮点分量受限于信噪比与数值精度仅能解析出 bb 个有效比特,那么整个内部隐空间的离散状态容量上限便是 2bH2^{bH},系统所能无损区分的异构历史轨迹至多不超过 2bH2^{bH} 条。尽管这一理论上界相对宽松,但它在微观上解释了一个极为普遍的实验现象:在处理相同长度的高分子或反应序列时,若盲目压缩隐状态维度 HH,系统最先丧失的必然是跨越极限距离的长程判别能力。因此在实践中,当发现模型即便拥有通畅的梯度比值(ρ103\rho\gg10^{-3})却依然在任务末端频频失准时,研究者应当清醒地认识到:这已非梯度流动的阻尼障碍,而是系统信息容量发生了硬性溢出。

6.7 让长程依赖训得动的六件事

在明晰了上述理论机理与实证规律后,面对极难训练的长程化学与材料序列,研究人员可由浅入深构建起一套成体系的动力学驾驭方案。

首要且成本最低的决定性举措,是在初始化时坚决抬升遗忘门偏置项(建议设定在 bf=1.03.0b_f=1.0\sim3.0 的区间内),这一操作几乎不带来任何算力开销,却能瞬间为反向传播开辟一条畅通的低阻抗运河。紧随其后的是在权重层面实施严格的正交初始化,从几何变换的底层确保循环转移矩阵具备保距特性。在训练策略上,切忌直接在数百步的长链上硬碰硬,而应积极采纳课程学习(curriculum learning)的递进范式,先在截短的短链上建立微观化学表征,随后再沿时间轴平滑延展,实测表明该策略在分子语言模型中具有卓越的稳态收敛效果。在数值稳定性方面,引入阈值为 g5\|\mathbf g\|\le 5 的全局范数梯度裁剪虽无法根治梯度消失,却构成了防范长时序梯度突发爆炸的不可逾越的护城河;与此同时,对输入特征实施严格的标准化预处理至关重要,一旦输入特征量纲失控,门控将在初期便被推入饱和死区。最后,在极深层或超长序列场景下,于门控激活前挂载层归一化(Layer Normalization),能够强力约束各时间步前向激活的统计分布,从而将门控开度始终维系在灵敏的工作区间之内。



7. 纯 Python 实现:公式 ↔ 代码对照

7.1 代码结构

text
code/
├── lstm.py                 核心库(约 2100 行,零依赖)
│   ├── 张量原语            zeros / matmul / matvec / vecmat / outer /
│   │                       hadamard / concat / split_concat
│   ├── 数值稳定的激活      sigmoid(分两支防溢出)/ tanh / softmax
│   ├── 初始化              xavier_matrix / orthogonal_matrix(Gram-Schmidt)
│   ├── class CECCell       常数误差传送带(教学原型)
│   ├── class SimpleRNNLayer 朴素循环层(对照组)
│   ├── class LSTMLayer     标准 LSTM + 完整 BPTT + 门统计 + 梯度轨迹
│   ├── class GRULayer      GRU(对照组)
│   ├── class BidirectionalLSTM / 三种池化
│   ├── class SeqRegressor / SeqClassifier / RNNLM(端到端模型)
│   ├── class MLP           只看组成的对照组
│   ├── Adam / SGD / clip_grads_ / grad_check_with_grads
│   ├── gradient_flow / influence_profile / occlusion_profile /
│   │   swap_delta / gate_profile(四种诊断量)
│   └── ridge_fit / ridge_predict(闭式解基线)
├── chemdata.py             化学数据集(约 460 行,零依赖)
│   ├── 共聚物 Tg            Fox 方程 + 过量异种二单元组序列项
│   ├── 端基/引发剂任务      长程依赖的构造任务
│   ├── SMILES 语料与词表    1128 条真实分子(打包在 data/)
│   └── 化学式解析           LiFePO4 → token 序列
├── tests_lstm.py           42 项测试(含 160+ 项逐参数梯度检查)
├── demo_memory.py          实验一~三:记忆、梯度、门
├── demo_polymer.py         实验四:共聚物序列 → Tg
├── demo_deepchem_esol.py   实验五:DeepChem / ESOL
├── demo_smiles_lm.py       实验六:SMILES 语言模型与分子生成
├── demo_deepchem_bandgap.py 实验七:材料带隙(负面结论)
├── make_figures.py         画全部数据图(唯一用到 matplotlib 的脚本)
└── run_all.sh              一键复现

7.2 矩阵就是 list[list[float]]

唯一需要说明的是 vecmat,因为它在反向传播里出现了 5 次:

python
def vecmat(v, M):
    """向量乘矩阵 y = v·M,等价于 (Mᵀ)·v —— 反向传播里到处是它。"""
    n, m = len(M), len(M[0])
    y = [0.0] * m
    for i in range(n):
        vi = v[i]
        for j in range(m):
            y[j] += vi * M[i][j]
    return y

它做的就是 (5.8) 里的 WδuW^\top\delta u。第 2.1 节强调过转置问题—— 把它封成一个函数,整份代码里就不会再抄错。

7.3 数值稳定的 sigmoid

python
def sigmoid(z):
    if z >= 0.0:
        return 1.0 / (1.0 + math.exp(-z))
    e = math.exp(z)
    return e / (1.0 + e)

朴素写法 1/(1+exp(-z))z<745z<-745 时会抛 OverflowError。 分两支在数学上恒等,数值上都不会溢出。 序列任务里 zz 很容易到 100-100(门被彻底关上),所以这不是学术讨论。

7.4 前向:20 行

python
for t, x_t in enumerate(x):
    z = concat(x_t, h)                                  # z_t = [x_t ; h_{t-1}]
    f = [sigmoid(v + b) for v, b in zip(matvec(self.W_f, z), self.b_f)]
    i = [sigmoid(v + b) for v, b in zip(matvec(self.W_i, z), self.b_i)]
    g = [tanh(v + b)    for v, b in zip(matvec(self.W_g, z), self.b_g)]
    c_new = [ff*cc + ii*gg for ff, cc, ii, gg in zip(f, c, i, g)]
    o = [sigmoid(v + b) for v, b in zip(matvec(self.W_o, z), self.b_o)]
    tanh_c = [tanh(v) for v in c_new]
    h_new = [oo*tc for oo, tc in zip(o, tanh_c)]
    if mask is not None and mask[t] == 0:               # ← 补齐位
        self._cache.append(("mask", None))
    else:
        self._cache.append(("step", (z, f, i, g, o, c_new, tanh_c, list(c))))
        h, c = h_new, c_new
    hs.append(list(h))

每一行对应 (3.1) 的一个方程,顺序也完全一样。 self._cache 把每一步需要的中间量存下来——反向传播要用它们, 这也是循环网络显存占用 O(T)O(T) 的原因。

7.5 反向:逐行对照

python
dh = vadd(dh_seq[t], dh_next)                     # 合并两条来源
do = hadamard(dh, tanh_c)                         # (5.1)
dtanh_c = hadamard(dh, o)
dc = vadd(dc_next, [dtanh_c[j] * dtanh_from_output(tanh_c[j])
                    for j in range(H)])           # (5.2)
df = hadamard(dc, c_prev)                         # (5.3)
di = hadamard(dc, g)
dg = hadamard(dc, i)
dc_prev = hadamard(dc, f)                         # (5.3) 传送带
dpf = [df[j] * dsigmoid_from_output(f[j]) for j in range(H)]   # (5.6)
dpi = [di[j] * dsigmoid_from_output(i[j]) for j in range(H)]
dpg = [dg[j] * dtanh_from_output(g[j]) for j in range(H)]
dpo = [do[j] * dsigmoid_from_output(o[j]) for j in range(H)]
# ... 参数梯度用 += 累加((5.7) 的 Σ_t),然后:
dz = vecmat(dpf, self.W_f)                        # (5.8)
dz = vadd(dz, vecmat(dpi, self.W_i))
dz = vadd(dz, vecmat(dpg, self.W_g))
dz = vadd(dz, vecmat(dpo, self.W_o))
dx[t], dh_next = split_concat(dz, self.input_dim)  # (5.9)
dc_next = dc_prev

7.6 mask:补齐位必须"前后一致"

在化学小分子 SMILES 或多分散性共聚物的数据处理中,样本序列长度往往参差不齐,必须通过补齐(padding)将其整齐化。处理这类虚构占位符时,整个计算图必须在前向推理与反向传播两端严格恪守"恒等映射"的一致性约束。在前向传播中,当遇到补齐标记时,系统应当直接将前一刻状态原封不动地继承下来(即 htht1h_t\gets h_{t-1}ctct1c_t\gets c_{t-1}),坚决跳过任何门控计算;而在反向传播中,上游梯度必须被无损透传回前一步(即令 δht1+=δht\delta h_{t-1}\mathrel{+}=\delta h_tδc\delta c 直接前传),严禁为补齐位计算任何参数梯度。

在底层代码中,这一逻辑被精巧地固化为 if mask[t] == 0: ...; continue。在手写算法中,最典型的隐性灾难莫过于"前向记得处理 mask,反向却抛诸脑后"——此时前向输出看似天衣无缝,反向传播却荒谬地将补齐占位符当成真实的化学基团去反求梯度。为此,tests_lstm.py 专门设立了 mask 不变性 测试项:带有补齐的推演结果必须与剔除补齐后的纯净运算在浮点精度上实现逐位完全一致(实测残差严格低于 101210^{-12})。

7.7 优化器与梯度裁剪

python
def clip_grads_(grads, max_norm):
    total = grad_global_norm(grads)          # 所有参数梯度拼成一个大向量
    if total <= max_norm or total == 0.0:
        return 1.0
    scale = max_norm / total
    scale_inplace(grads, scale)
    return scale

在优化器工程中,务必严格遵循全局范数裁剪,切忌实施逐参数独立截断。逐参数裁剪会粗暴改变梯度向量在相空间中的指引方向,造成优化轨迹的严重失真;而全局范数裁剪仅在梯度总模长越界时实施等比例整体缩放,完好保留了最速下降的方向信息。

而在亲手编写 Adam 优化器时,作者曾踩中过一个令人啼笑皆非的经典陷阱:

python
self.m = zero_clone(params)      # 正确:一阶动量矩必须严格从零向量启动
self.v = zero_clone(params)
# self.m = deep_clone(params)    # 错误:若误将权重初值直接克隆为动量,
#                                # 负权重会导致 sqrt(v) 对负数开方,瞬间触发 math domain error

7.8 为什么必须做梯度检查

在工程实践中,前向推导畅通、表观 loss 稳步下降、甚至最终测试指标看似合理,都绝不能作为证明反向传播算法正确的充分依据。前文第 5.9 节披露的 Bug 1(时序系数 1/T1/T 遗漏)便是一个绝佳的反面教材:它使梯度整体虚胖了 4 倍,而自适应优化器 Adam 会默默将其等同于全局学习率放大了 4 倍予以吞吐吸收,模型依然能够平稳训练,但开发者将永远无法知晓自己的超参数究竟建立在怎样虚妄的物理基底之上

教程给出的差分质检标准范式如下:

python
res = grad_check_with_grads(loss_and_grad, loss_only, model.params(),
                            model.grads(), n_checks=12, eps=1e-4, seed=4)

其中 loss_and_grad() 函数必须恪守"先彻底清零、再顺次执行前向与反向"的纯净法则,而 loss_only() 仅执行前向推理。特别需要警惕的是,后者绝不能借用前向加反向的过程敷衍代替——那会将微扰期间的伪梯度悄然累加进参数状态中,从而不可逆地污染后续所有分量的数值检查。

7.9 测试结果

在最终的算法回归库中,42 组单元测试全数满分通过,无一折戟。其中多达 17 个关键测试组深度整合了逐参数数值差分校验,累计完成了 164 项极其苛刻的微观梯度比对(每一项检查均需额外执行 2 次独立的前向扰动):

检查范围相对误差区间
单层(LSTM ±peephole / GRU / CEC / SimpleRNN / Dense / Embedding)2.5×10118.4×10102.5\times10^{-11}\sim8.4\times10^{-10}
端到端(三种池化 / 分类 / 两层堆叠 / 双向 / GRU / peephole / 带 mask / 语言模型)7.2×1093.5×1067.2\times10^{-9}\sim3.5\times10^{-6},最大绝对误差 1.1×10101.1\times10^{-10}

除了微积分层面的差分检验,一系列直击物理结构合理性的结构性硬核测试同样全线告捷:

测试结果
mask 不变性:补齐后预测逐位相同差异 <1012<10^{-12}
CEC 的梯度恒等性(20 步)L/c0÷L/c19=1.000000000000\partial L/\partial c_0 \div \partial L/\partial c_{19}=1.000000000000
对照:朴素 RNN 同样条件下1.29×1031.29\times10^{-3}
遗忘门偏置的单调性bf=0:1.9×107<bf=1:1.6×102<bf=3:1.07b_f{=}0:1.9\times10^{-7}<b_f{=}1:1.6\times10^{-2}<b_f{=}3:1.07
手算例(门全开时退化为累加传送带)与解析解差异 0.00.0
全局梯度裁剪g=1.22×1021.000|g|=1.22\times10^{2}\to1.000
Adam 拟合 4 个点(60 轮)最终 RMSE 0.0279

审视遗忘门偏置单调性那一行所记录的严谨阶梯数值:它从代码层面为第 4.1 节的数学推导提供了无可挑剔的独立物理实证,与第 6.4 节的长程实验构成了完美的理论闭环。

7.10 纯 Python 的代价

平心而论,这种对纯原生语法的执着使得代码的运行速度比高度优化的 NumPy 慢 300 至 800 倍。在单核 CPU 上,一个仅包含 H=16H=16T=40T=40、240 条样本的小规模 epoch 便需耗时约 2.7 秒,若迁移至 NumPy 仅需毫秒量级,在 GPU 加速的现代 PyTorch 环境中更是不可同日而语。

因此,本套代码的根本定位并非工业级生产引擎,而是一座纯粹的教学与科研显微镜。它的不可替代之处在于:它允许研究者在毫无封装遮蔽的透明环境中,用高精度的有限差分逐项苛刻检验每一条数学公式的纯真;它为小而精的科学探索(如样本量在 100 至 1000、序列跨度百步以内的机理验证)提供了毫无黑箱的实验沙盒;更重要的是,它将深层动力学状态的探针深植于骨髓之中——诸如门控分布统计、各层梯度轨迹等高级诊断指标,在主流框架中往往需要大费周章地编写底层 hook 才能获取,而在纯 Python 循环中,它们仅仅是自然存放在列表中的透明变量。在工业实战中,我们理应果断拥抱 PyTorch 的 nn.LSTM,但请将本章的推导与代码,作为你在调试黑箱时最坚实的物理底图。


8. 化学与材料中的应用:五个实验

在化学与材料信息学的真实研究语境中,一个算法架构的优劣,从来无法脱离其物理背景而由合成数据集上的抽象指标单独裁决。为了让读者切身体会到长短时记忆网络在物质科学中究竟何时大显身手、何时力不从心,本章所设计的五个实验均恪守着严苛的科学对照范式。

首先,所有任务均紧密依托于清晰的物理化学机理,拒绝脱离领域常识的空洞套用;其次,序列模型绝不孤立呈现,而是始终与“对时序一无所知”的经典组成基线(如单体摩尔分数 MLP、物化描述符随机森林等)同台竞技,确立热力学平均意义下的性能底线;再者,我们为每一个序列任务均设置了至关重要的“阴性对照组”——将输入序列的顺序人为随机打乱并重新训练。如果打乱了语序后模型精度毫无衰减,那此前的所谓胜出便不过是对局部虚假统计量的过拟合;唯有当打乱引发显著的性能崩塌,我们才能确信网络真正解析了主链拓扑中的物理空间信息。最后,本章不仅详实记录模型胜出的高光时刻,更坦诚记录其被简单基线击溃的负面案例。在实验环境的控制上,所有序列模型的骨干结构、优化器、学习率与批量大小均完全对齐,唯一的变量唯有循环单元的架构与超参数本身。值得格外提醒的是,所有连续回归实验均强制执行了标签标准化,彻底规避了因物理量纲悬殊导致的收敛假象。

8.1 实验一:记忆长度(第 6.3~6.5 节回顾)

作为跨越时空记忆的奠基性验证,我们在第 6 章已经完整见证了模型在合成聚合物端基长程分类任务上的深度较量。站在全局视野回望,这一基准实验从三个纵深维度彻底确立了长程依赖的物理本质。

在最底层的反向传播梯度动力学层面,历经 64 步漫长的时序回传后,常数误差传送带(CEC)展现出无懈可击的守恒特性,严格保持着 1.0001.000 的无损传导。与之形成惨烈对照的是,朴素 RNN(1014\sim10^{-14})、标准 GRU(7×10167\times10^{-16})乃至未施加偏置的默认 LSTM(bf=0b_f=0 对应 3×10133\times10^{-13})均深陷指数级梯度湮灭的泥潭之中;唯有当遗忘门偏置开启至 bf=1b_f=1(传导比跃升至 2×1042\times10^{-4})与 bf=3b_f=3(高达 2.23)时,细胞状态的记忆通路才被真正从物理上全面激活。

将这一底层动力学投射到宏观任务表现上,在序列跨度达 60 个单体的四分类挑战中,面对均匀合成的理想聚合物链,正交初始化的 RNN 与充足偏置的 LSTM(bf=3b_f=3) 均以 0.950 的高准确率领跑,而缺乏长时保护机制的 GRU 与默认 LSTM(bf=0b_f=0) 则迅速退化至 0.300 的随机猜测边缘。而一旦引入模拟真实合成杂质的高熵干扰单体,整个测试格局瞬间分化:唯有拥有深厚记忆偏置的 LSTM(bf=3b_f=3) 坚如磐石地达成了 1.000±0.0001.000\pm0.000 的全胜收敛,而朴素 RNN(0.762)与 GRU(0.287)均遭遇不可逆的性能溃退。

在更为细微的敏感度诊断层面,成功驯化的 LSTM 展现出了如同受体识别般的高度专一性:当仅仅替换链端决定产物类型的端基 token 时,模型输出发生剧烈翻转(预测扰动 Δ=0.661.00\Delta=0.66\sim1.00);而若在链身中位肆意篡改单体类型,预测扰动却严格为零(Δ=0.000\Delta=0.000)。这一诊断铁证般地证明,网络并未贪恋残存的局域短时记忆,而是真正学会在漫长的链增长历史中,将注意力跨越数十个时间步精准聚焦于最初的活性引发中心。

8.2 实验二:共聚物序列 → 玻璃化转变温度 Tg

在高分子物理中,玻璃化转变温度(TgT_g)是表征链段运动受阻程度的核心物理量。之所以选择 TgT_g 作为序列建模的试金石,是因为它并非仅由宏观化学组成决定,而是对主链上的微观单体序列排布展现出高度的拓扑敏感性。即使在单体投料比完全相同的前提下,两嵌段共聚物(如 AAABBB)与完全无规共聚物(如 ABABAB)的 TgT_g 也会产生可观的偏离。在微观力学与统计热力学层面,这种宏观性质的差异本质上直接源于链上二单元组(diad)局部配位概率分布的深刻分歧。

共聚物:组成相同、序列不同

在生成合成数据集(chemdata.py)时,我们构建了一套兼具经典热力学规律与微观序构扰动的双层物理模型。首先,宏观组成贡献完全严格遵循经典高分子物理中的 Fox 方程

1Tg=iwiTg,i(8.1)\frac{1}{T_g}=\sum_i\frac{w_i}{T_{g,i}} \tag{8.1}

式中 wiw_i 代表单体组分 ii 的摩尔分数,而 Tg,iT_{g,i} 则取自高分子权威物性手册中 20 种常见均聚物的典型量级。然而,仅靠 Fox 方程无法捕捉局部邻域效应,因此我们在基底之上叠加上了一项由人为精细构造的过量异种二单元组分数所激发的微观序构势能:

ΔTg=C[fAB(1ipi2)],C=100 K(8.2)\Delta T_g=C\Big[f_{AB}-\big(1-\textstyle\sum_i p_i^2\big)\Big],\qquad C=100\ \mathrm{K} \tag{8.2}

式中的物理内涵十分直观:括号内第一项 fABf_{AB} 为链上实际测得的异种相邻单体对的统计频率,而第二项则是在完全相同组成下由伯努利无规统计给出的无规排列理论期望值 1pi21-\sum p_i^2。二者之差构成了衡量聚合物主链微观序构偏离完全无规分布的无量纲标尺。对于无规链,其过量项期望严格归零;对于两相微区分离的嵌段链,由于同种单体紧密抱团、相界面异种配位极其稀少,该修正项呈现出显著的负值;而对于单体交替交织的交替共聚物,密集的异质界面则激发出正向的升温效应。图 fig_p04_sequence_effect 清晰刻画了式 (8.2) 所对应的序构能量地形。

为了探寻网络是否真正触碰到了这种拓扑排列机制,我们设立了四组对照架构:

模型看到的信息
组成 MLP6 维单体摩尔分数(不知道顺序
GRU单体索引序列
LSTM单体索引序列
LSTM(序列打乱)同样的一袋单体,顺序被打乱

本实验涵盖了 480 条合成共聚物链(由 240 条无规链与 240 条嵌段链混合后切分),固定链长为 32,包含 6 种典型单体基团,并由 3 个独立随机种子重复训练。值得强调的是,整个标签集自身的样本标准差(即若一个模型毫无学习能力、永远盲目猜测训练集均值时所产生的基准 RMSE)高达 45.15 K。这一先验背景是我们评估所有预测器有效性的绝对参照系。

模型验证集 RMSE / KR2R^2嵌段链外推 RMSE / K
常数预测(参考)45.150.000——
组成 MLP(不看顺序15.93±1.2815.93\pm1.280.89620.86
GRU12.82±0.5412.82\pm0.540.93315.50
LSTM12.97±0.5812.97\pm0.580.93115.81
LSTM(序列打乱18.37±0.9218.37\pm0.920.86222.56

共聚物 Tg:四个模型

细细品味这张凝聚着高分子物理与算法博弈的成绩单,有三个深具启发的结论跃然纸上。

首先,具备序列解析能力的时序模型确实显著击败了纯组成基线。GRU 与 LSTM 分别取得了 12.82±0.5412.82\pm0.54 K 与 12.97±0.5812.97\pm0.58 K 的优秀表现,相较于只看单体摩尔分数的组成 MLP(15.93±1.2815.93\pm1.28 K)实现了近 19% 的相对误差削减,决定系数 R2R^2 更是从 0.896 跨越到了 0.93 以上。这扎实地证明,循环神经网络绝非仅仅是一台统计单体浓度的积分器,而是敏锐捕获到了相邻单体排布所引发的微观界面序构。

其次,一旦人为将单体顺序粉碎打乱,模型的泛化表现反而比完全不看顺序的组成基线更为糟糕(打乱后的 LSTM 均方根误差恶化至 18.37 K,决定系数重挫至 0.862,甚至远落后于简单 MLP 的 15.93 K)。这背后的认知机理尤为深刻:当物理上真实存在的序构被彻底打散为随机杂乱的伪序列时,若强行驱使一个序列模型去逼近一个本应服从置换不变性的热力学状态,模型就会不可避免地将打乱过程中引入的局部偶然排列当作“伪特征”深深镌刻在权重之中,从而产生严重的过拟合与方差爆炸。这道“序列打乱的阴性对照”,其科学论证力远比单纯宣布“我们战胜了基线”更为深邃有力。

最后,在当前 32 步的中等链长尺度下,GRU 与 LSTM 展现出了势均力敌的战力(12.82 K 对比 12.97 K,二者的微弱差异已被随机种子间的波动完全吞没)。这是因为 32 步的时序跨度尚未触及反向传播的极限衰减红线,此时 GRU 更加简练紧凑的门控参数带来的快速收敛优势,恰如其分地抵消了其缺乏独立细胞记忆通路的理论劣势,这与第 6 章在极限长链下的表现形成了生动的对照与呼应。

预测-真值散点

嵌段外推

序列效应本身

在更严苛的分布外泛化测试中,我们考察了模型对训练集未曾经历过的全新嵌段共聚物微相结构的外推预测能力。正如数据所示,未被打乱的 GRU 与 LSTM 依然展现出极佳的稳定性(外推 RMSE 稳定在 15.50~15.81 K 区间),而打乱版则大幅溃退至 22.56 K。

在深入审视此类高分子序列建模实验时,读者应当建立起明晰的阅读图谱。我们设立的组成 MLP 是一道绝不可或缺的物理基线标尺,因为它对空间排布与连接拓扑一无所知,其达到的误差界限代表了仅凭经典热力学平均浓度所能触碰到的预测天花板;任何声称捕获了微观立体序构的序列网络,其性能必须显著优于该基线才具备立论的科学价值。而将序列随机打乱的消融实验则是甄别算法真伪的关键试金石,由于打乱后的单体集合与真链完全同构,唯有当其性能发生断崖式退化时,才能坚实断言模型确实建立起了对时序与空间关联的物理理解;若打乱后精度依然毫发无损,那早前的胜利便纯属巧合与假象。图 fig_p02_polymer_scatter 中紧密贴合对角线的真值预测散点、图 fig_p03_polymer_extrap 中针对全新嵌段链的外推泛化,以及图 fig_p04_sequence_effect 中揭示的微观序构项,共同构成了这一高分子物理图景的闭环验证。

8.3 实验三:DeepChem / ESOL——SMILES → 水溶性

在药物化学与计算毒理学中,小分子水溶性(以十进制对数 logS 衡量的饱和溶解度)是决定化合物成药性的先决条件。本实验选用经典 Delaney / ESOL 数据集(共包含 1128 个结构经过实测的有机小分子),为了彻底杜绝化学同源分子在训练集与测试集间的“信息泄漏”,本实验严格放弃了虚高指标的随机切分,全面采用基于分子拓扑核心的 scaffold split(Murcko 骨架切分)。这种切分强制将训练集中未曾出现的母核框架孤立在测试集中,是对模型在全新化学空间下泛化能力的终极拷问。

SMILES → 溶解度:把一串珠子倒进烧杯

在这一基准测试中,业界标准的 DeepChem 计算框架扮演着三重不可或缺的基座角色。首先,它通过 dc.molnet.load_delaney 提供了标准化的实验水溶性标签,并施加了严谨的母核切分体系;其次,其内置的 dc.feat.SmilesToSeq 模块担当起通向序列世界的特征桥梁,将抽象的 SMILES 字符串规范化为定长的整数 token 序列并产出完整的字符词典,本教程所写的轻量级 LSTM 正是直接无缝对接这套统一表征;最后,它派出了基于一维序列卷积的深度学习官方基准 dc.models.torch_models.CNN,为我们在纯手工架构与工业级成熟模型之间搭设了公平对决的擂台。

模型输入说明
DeepChem 1D CNNSmilesToSeq token + one-hot官方基线
纯 Python LSTM同一份 token + mask本教程实现,只用训练集子集
RDKit 描述符 + 随机森林200+ 个描述符不知顺序,最难打败
纯 Python LSTM(字符打乱)打乱顺序的 token顺序重要性的判据

在 scaffold 切分下,训练集包含 895 个分子,测试集包含 112 个分子。我们手工实现的轻量 LSTM 参数量仅在 10410^4 量级,比 DeepChem 官方 CNN 足足轻巧了一个数量级,并且仅抽取了训练集中的 400 个样本进行快速训练。

模型测试 RMSE / logSMAER2R^2训练时长用到的训练样本
RDKit 描述符 + 随机森林0.436\mathbf{0.436}0.3300.8210.8 s895
纯 Python LSTM0.5040.5040.4050.76075 s400
纯 Python LSTM(字符打乱)0.7500.7500.6270.46875 s400
DeepChem 1D CNN0.8480.8480.6820.32119 s895

ESOL:四个模型的 RMSE

ESOL:预测-真值散点

横向审视这张沉甸甸的评测榜单,有三项极具震撼力的技术事实值得每一位计算化学研究者深思。

最引人注目的事实是:基于两百余个物理化学先验的 RDKit 描述符与随机森林组合,以无可匹敌的优势摘得桂冠(测试集 RMSE 达到惊人的 0.436 logS,仅耗时 0.8 秒)。它对 SMILES 字符串中的字符拓扑顺序一无所知,却毫无悬念地击败了所有深度序列模型。这在物理化学上是完全合理的:对于中低分子量的有机溶质而言,溶解过程的热力学平衡主要受控于分子的范德华体积、脂水分配系数、极性表面积以及氢键供受体数量等整体物化特征,而这些全局宏观不变量早已被成熟的 cheminformatics 描述符提炼得极其精准且廉价。

与此同时,本教程纯手工实现的轻量 LSTM 展现出了惊人的效能,以 0.504 的 RMSE 显著超越了 DeepChem 官方的 1D CNN(0.848)。令人惊叹的是,手工 LSTM 仅仅使用了 400 条训练样本、在单核 CPU 上纯纯迭代了 75 秒,且其参数规模比卷积基线小一个数量级。这一胜局不仅彻底验证了本教程底层数学推导与代码实现的无瑕纯真,更揭示了深度学习在小样本化学任务中的几何本性:一维卷积受限于局域感受野与大量通道冗余,在千条级的小分子数据集上极易出现参数过拟合;而具备递归记忆能力的循环神经单元能够将原子连接链条自然压缩进连续隐空间,在低数据量下展现出更优异的归纳偏置。

而当我们将 SMILES 字符序列随机打乱后,手写 LSTM 的 RMSE 迅速由 0.504 崩塌至 0.750,性能跌幅高达 49%,决定系数直接腰斩至 0.468。这一显著劣变再次提供了铁一般的证据,证明 LSTM 绝非依靠分子量等浅层频次信息走捷径,而是真切解析了由原子符号、括号分支与双键符号构成的线性格网语法。

在这里,我们必须秉持学术的绝对诚实:如果研究者仅仅将目光聚焦于“手写 LSTM 战胜了 DeepChem 官方深度模型”,便会轻易滑入学术营销的陷阱,从而故意掩盖传统机器学习在此类任务中更加实用高效的客观事实。在化学性质预测的辽阔图景中,基于物理描述符的树模型是所有序列模型必须直面的默认试金石,而且在中小样本场景下,它往往凭借强大的领域先验屡屡胜出。如图 fig_e01_esol_modelsfig_e02_esol_scatter 所展现的那样,科学的洞察永远建立在对各类模型能力边界的敬畏之上。

作为技术桥梁,本实验亦为读者生动示范了 DeepChem 的工业级集成范式:通过 load_delaney(featurizer=..., splitter='scaffold') 获得的训练、验证与测试数据集均为标准的 NumpyDataset 对象,若希望对接前沿开源工具或自研纯算法模块,仅需提取其底层的 .X 特征矩阵与 .y 标签数组即可畅通无阻。

8.4 实验四:SMILES 语言模型与分子生成

如果说性质预测是让网络扮演审判分子的理化检测仪,那么本实验则要求网络化身为创造物质的无机建筑师。我们将 1128 条真实药物分子的 SMILES 文本视为一门严谨的“化学语言”,在字符级尺度上训练一个纯 Python 自回归 LSTM 语言模型,并驱动它在空白画卷上从零逐字书写全新的合法分子

从零写出分子

在此,模型的学习目标精准落实了第 7.9 节所推导的交叉熵对数似然损失:

L=1Tt=1Tlogpθ(tokent+1token1..t)(8.3)\mathcal L=-\frac{1}{T}\sum_{t=1}^{T}\log p_\theta(\text{token}_{t+1}\mid \text{token}_{1..t}) \tag{8.3}

在完成分布拟合后,分子生成的采样过程引入了统计力学中经典的温度采样机制。我们将每一步网络输出的非归一化对数概率(logits)向量 zz 除以热力学温度系数 τ\tau,随后施加 softmax 归一化:

piexp ⁣(zi/τ)(8.4)p_i\propto\exp\!\big(z_i/\tau\big) \tag{8.4}

当温度趋近于绝对零度(τ0\tau\to 0)时,生成过程退化为极度保守且单调死板的贪心搜索,网络将陷入对高频常见子结构的无限自我复制;而当温度过高时,剧烈的热运动将引入过度随机的噪声,极易撕裂严苛的化学语法。本实验折中选取了兼顾创造力与结构约束的 τ=0.8\tau=0.8

在分子生成领域,模型的创造品质完全交由 RDKit 的图论解析内核进行客观裁决:

指标定义
有效率 validityChem.MolFromSmiles(s) is not None 的比例
唯一率 uniqueness去重后 / 生成总数
新颖率 novelty合法且不在训练集里的比例

我们在 1126 条清洗后的真实小分子上开展实验(900 条用于训练,120 条用于验证监控),字符级词典仅包含 41 个基本元素与符号 token。网络仅迭代了极其有限的 10 个周期,在两个随机种子下各驱动生成 400 条全新字符串。

种子训练 PPL验证 PPL有效率唯一率新颖率
03.233.430.3280.9050.233
13.303.210.4030.8480.295

语言模型训练曲线

生成分子的有效率 / 唯一率 / 新颖率

下述展示了生成阶段真实捕获的若干代表性分子实例,令人欣喜的是,它们不仅完全通过了 RDKit 的严苛化学价键校验,且在先前的训练集文献中毫无踪迹:

text
CC(=O)Nc1ccccc1Cl        N-乙酰基-2-氯苯胺
c1cccc(Cl)ccc1           氯苯(环的写法还带闭合数字)
CCC(C)CC(=O)NCC(=O)N
COc1ccc(cc1)Cl           对氯苯甲醚

fig_l01_lm_curvefig_l02_lm_statsfig_l03_lm_lengths 全景式呈现了这套极简生成器的学习轨迹。透过这些冰冷的指标,我们可以清晰读出该模型深层的智力特征。

在仅依托 900 个分子样本进行仅仅 10 轮粗浅训练的极简条件下,一个手写字符级模型能够达成 33% 至 40% 的语法有效率,已实属难能可贵。这表明网络仅凭自回归时序转移,便已经自发领悟了化学分子字符串中最深奥的非局部配对规则——包括支链括号的开闭配对、芳香环闭合数字的跨步守恒,乃至常见元素的标准化学价态限制。虽然这一数字与现代工业级在数百万超大规模分子库上训练所达成的 90% 以上有效率尚有差距,但其机理的完备性已毫无二致。

更为难得的是,模型所生成的分子表现出了极佳的多样性与探索精神:高达 85% 至 91% 的唯一率证明网络完全没有陷入退化性的重复死循环;而 23% 至 30% 的新颖率则意味着在所有成功满足化学语法的分子中,有近三分之一是此前人类喂给它的语料库中从未出现过的全新结构。其余合法语料虽带有已知骨架的影子,但这本就是统计语言模型逼近潜在概率分布的必然体现。此外,验证集困惑度(PPL 约 3.21~3.43)与训练集困惑度保持着紧密贴合,证明在仅有万级参数的紧凑架构下,模型在极其小巧的数据上保持了绝佳的泛化张力。

生成长度分布

然而,作为深具洞察力的科学探索者,我们必须清醒地认识到:“语法有效”绝不等于“化学合理”。语言模型所掌握的本质上只是一套一维符号串的上下文语法约束,它懂得如何配平圆括号、如何闭合苯环的编号,却并未真正内生出一套关于分子三维构象应变能、空间位阻、热力学稳定性以及生化合成可行性的深层物理模型。因此,高有效率仅仅证明它成为了一名合格的“打字员”,而在没有外部约束的自发采样下,许多合法结构往往会表现出不合常理的过度稠密环系或无法人工制备的极端张力。

在分子生成领域,有效性与多样性之间存在着永恒的平衡拉锯。若刻意调低采样温度 τ\tau,网络会退缩进极度狭窄的安全区,反复机械地吐出几个平庸的骨架;若盲目调高 τ\tau,奔放的探索则会瞬间冲跨脆弱的符号语法防线。这也正是为何纯粹的无监督生成仅仅是一场技术破晓,若想让模型真正想出具备成药价值或材料功能的目标分子,研究界在 2018 年之后迅速跨入了以强化学习微调打分、性质条件引导采样(Conditional Generation)以及在连续隐空间(Latent Space)中进行梯度定向优化的全新纪元。正如化学信息学中流传的一句箴言:“能写出分子”与“能想出分子”,终究是两个完全不同维度的科学境界。

8.5 实验五:材料带隙——一个“顺序不是信息”的负面实验

在机器学习的世界里,展示失败往往比炫耀胜利需要更大的学术勇气,也蕴含着更为深邃的物理真理。本实验选自 DeepChem 的 expt_gap 数据集,涵盖了 4604 种无机固体材料的实验测定光学带隙数值,其输入特征极为朴素,仅仅是材料的化学分子式字符串(例如磷酸铁锂记为 LiFePO4)。

在这里,每一位无机化学家与固态物理学家都能立刻指出一个显而易见的常识:化学式中元素的书写排布顺序纯属人类的主观约定。无论将氧化铁书写为标准的 Fe2O3,还是反常地写为 O3Fe2,它们在晶格实体中指代的均是完全同质的三维晶体。换言之,在无机化学式的字符链条中,根本不存在任何具有物理意义的时间或拓扑因果顺序——它仅仅是以紧凑字符串形式对晶胞内各元素化学计量比与组成浓度的另一种符号包装而已。

为了赤裸裸地暴露模型偏见的错配,我们将化学式拆解为由元素与计量数构成的离散 token 序列(例如 [Li, 1, Fe, 1, P, 1, O, 4]),并让两组截然不同的算法进行公平对抗:一方是完全摒弃顺序概念、仅统计各元素原子百分比特征并施加线性收缩的“元素分数 + 岭回归”模型;另一方则是如饥似渴寻找上下文长程模式的手写 LSTM 序列网络。在此基础之上,我们设计了一道严苛的置换不变性破坏测试:将测试集中每一个材料的“元素-计量数”配对随机重排,对比模型预测值在化学实体完全不变的前提下所发生的剧烈震荡。

模型测试 RMSE / eVMAER2R^2
元素分数 + 岭回归(只看组成1.080\mathbf{1.080}0.7840.356
LSTM(化学式 token 序列)1.2151.2150.7060.184

本实验从 expt_gap 中随机抽选了 1200 种材料(960 个用于训练,240 个用于独立测试),涵盖元素周期表中 81 种化学元素。需要说明的是,数据标签自身的总体标准差约为 1.53 eV;而在 MoleculeNet 官方排行榜中,融合了三维空间晶体学特征的成熟随机森林模型其平均绝对误差可下探至 0.45 eV 左右,本实验两组模型的预测水平自然无法与之比肩,因为我们的输入自始至终被严苛限制在纯化学式组成这一单薄维度上。

带隙:组成基线 vs LSTM

然而,最扣人心弦的真相隐藏在接下来的置换不变性敏感度测试中。在化学逻辑上,肆意颠倒化学式内部各元素的书写前后次序,材料本征带隙应当绝对恒定不变。

元素分数特征在重排前后的最大差异0.0(数学上必然)
LSTM 预测的绝对变化:中位数0.226 eV
LSTM 预测的绝对变化:均值0.694 eV
LSTM 重排后的 RMSE1.596 eV(原序 1.215 eV)

化学式重排导致的预测漂移

fig_b01_bandgap_modelsfig_b02_bandgap_perm 用无可辩驳的证据揭示了一场深刻的算法悲剧。

首先,在测试集总体精度上,不看任何顺序的简单岭回归基线全面击败了复杂的序列网络(1.080 eV 对比 1.215 eV,决定系数大幅领先)。这一结果在凝聚态物理上是完全必然的:固体的能带结构取决于电子波函数在晶格周期势场中的叠加,而化学式的字符先后完全不能表征这种三维周期对称性,强制提取所谓的“时序相关”完全是一场南辕北辙的徒劳。

其次,LSTM 将本不存在的伪时序当成了强烈的物理特征加以记忆与拟合。面对完全同质的同一种材料,仅仅因书写习惯从正序颠倒为逆序,LSTM 输出的带隙预测便产生了高达 0.694 eV 的平均绝对漂移(中位数漂移亦高达 0.226 eV),导致重排后的测试 RMSE 彻底劣化至 1.596 eV。要知道,带隙漂移 0.4~0.7 eV 已经足以在物理上将一种窄禁带半导体错误归类为绝缘体,其波动幅度已完全吞没了模型本身的固有误差!试想,倘若一位缺乏物理自觉的研究人员未曾执行置换对照实验,而仅仅草率地上报一份包含原始顺序的 RMSE 报告,这一深重的隐性系统缺陷将被永远掩盖在虚假的指标迷雾之中。

最后,这是现代机器学习中“归纳偏置错配(Inductive Bias Mismatch)”的一则经典反面教材。循环网络具有与生俱来的序列先验,它默认输入的前后相对位置承载着深刻的物理或因果动力学。当把这种强先验强行扣在本质服从置换不变性的空间聚集态数据上时,网络越强大、记忆越敏锐,其所学到的虚假关联对真实泛化能力的伤害也就越深重。

针对物质科学中形态各异的数据结构,我们究竟应当如何为序列模型划定合理的应用疆界?

场景该用什么
无机材料化学式 → 性质组成特征 + 树模型;或 GNN(当你有结构时)
有机分子 SMILES → 性质序列模型 图模型(图模型通常更好)
聚合物单体序列 → 性质序列模型(顺序真的有物理意义)
反应步骤 → 产物seq2seq(顺序是反应机理)

8.6 一张决策表:什么时候该用 LSTM

走过上述五个跌宕起伏的实验历程,我们可以凝练出一张直观而务实的选择指南。在材料与化学信息学研究中,切忌盲目追逐模型复杂度的浮华,而应当始终立足于数据内禀的对称性与真实物理规律,审慎决定计算工具的选型。

你的数据顺序有意义吗样本量建议
分子 SMILES有(连接关系)<10³LSTM / GRU(先做基线)
分子 SMILES>10⁴Transformer 或图模型
聚合物单体序列有(物理决定序列)10²~10⁴LSTM 的甜区
反应步骤有(机理)10²~10⁴seq2seq / LSTM
光谱、色谱、动力学曲线有(时间)10²~10⁵LSTM / 1D-CNN
无机化学式没有任意组成特征 + 树模型
元素组成向量没有任意全连接 / GBM
分子指纹没有任意全连接 / GBM

9. 优缺点、常见坑与实践清单

9.1 架构优势的物理本构

历经前述深厚的数学推导与五个跨越化学、材料维度的实证检验,我们终于可以跳出单一指标的局限,从第一性原理的高度系统审视长短时记忆网络这一经典架构的内在优势。

首当其冲的优势,在于记忆长度摆脱了静态谱半径的物理枷锁,进化为由数据驱动的自适应可训练参数。在正交初始化的传统循环网络中,信息沿时间轴回传的半衰期完全由隐藏权重矩阵 WhhW_{hh} 的谱半径在初始化瞬间锁死,是一个僵硬的全局静态属性;而 LSTM 则通过乘性门控,将有效记忆时间尺度转化为输入向量与内部状态的连续动力学函数。在需要永久驻留初始活性引发剂信息的时步,网络得以自主维持高通量的门控开度,而在面对无关溶剂扰动或重复链节时主动关闭闸门,实现了时间跨度上的弹性自适应。

其次,架构展现出极其宝贵的超参数宽容度与低数据饥渴度。正如我们在第 8.3 节小分子水溶性实验中所见,手工实现的精简 LSTM 仅调用了区区 400 条训练分子、模型参数仅在万级体量,其在全新母核上的泛化精度便足足超越了参数规模大其数倍的官方一维卷积模型,且与集成两百余项理化特征的成熟随机森林处于同一量级。在合成化学与材料物理等实验成本极其高昂的领域,可用样本规模往往被压制在数百至数千之间,而在这一“小数据”严苛区间内,LSTM 凭借先验强烈的递归时序归纳偏置,往往比动辄需要数十万数据进行预训练的大规模自注意力网络更为稳健可靠、易于驯服。

再者,推理推演过程具备严格的每步 O(1)\mathcal{O}(1) 常数级时空开销。由于隐状态 hth_t 与记忆状态 ctc_t 始终保持着固定的紧凑向量空间,模型在处理源源不断流入的流式数据时,无需像 Transformer 那样随着上下文序列的延伸而使显存与算力呈二次方爆炸。这一轻巧的常数级演化特征,赋予了它在原位在线光谱监测、连续流化学反应动力学控制以及低功耗边缘表征传感器领域的天然适用性。

最后,模型内在动力学具备极高的物理可解释性与诊断透明度。不同于注意力权重矩阵中扑朔迷离的高阶相关性,LSTM 内部的每一条轨迹——无论是随时间步起伏跌宕的门控开合开度、细胞状态 ctc_t 的积分储能演化,还是由时序敏感度所绘制出的端基影响力曲线——均可以直接映射为具有确定因果含义的连续物理演变。我们在第 6 章所绘制的全部深度动力学图谱,正是这一架构白盒属性的最佳佐证。

9.2 不可忽视的物理短板与失效暗礁

然而,正如热力学中不存在绝对绝热的理想卡诺循环一样,LSTM 的精巧机制同样背负着沉重的物理局限与工程隐患。

最为本质的硬伤,在于时序依赖的内在串行性对现代大规模算力的天然抗拒。在 LSTM 的状态转移方程中,时步 tt 处的细胞状态 ctc_t 与隐状态 hth_t 必须以前一时步 t1t-1 的输出为原料。这种严密的因果链条在拓扑上构成了不可解耦的时间轴串行依赖,导致前向推演与反向 BPTT 均无法像 Transformer 那样利用矩阵分块在时间维度上实现全并行的 GPU 吞吐,这构成了其难以直接扩展至数十亿参数预训练模型的最根本技术死结。

其次,常数误差传送带仅能庇护内部记忆 cc,而暴露于外部的隐状态 hh 通路依然面临不可逆的梯度损耗。正如定理 5.2 严密证明的那样,当信息试图穿透输出门并跨越层间向外投射时,必须经受输出门 oto_t、激活非线性 tanh\tanh 以及四套庞大稠密权重矩阵的层层阻滞。一旦遇到多层深度的非线性复合,由这些外部路径回传的误差信号依然会以指数形式衰减,使得隐状态通路最终难以支撑深层堆叠下的极端长程交互。

再者,遗忘门偏置 bfb_f 是一个极度隐蔽却足以决定生死的一阶超参数。在主流深度学习框架的早年默认实现中,所有偏置往往被粗暴地统一初始化为 0。然而在 60 步以上的长程时序任务中,若放任 bf=0b_f=0(对应初始遗忘概率高达 0.5),梯度的半衰期将在最初几个时步内被斩断,导致模型在起点便陷入不可逆的局部停滞;而仅仅将偏置人工提升至 bf=3.0b_f=3.0,就能让模型从完全不能收敛跃升至 1.0001.000 的全胜巅峰。将如此具有颠覆性的敏感项深埋在默认参数的盲区中,构成了许多初学者难以逾越的调试梦魇。

此外,tanh\tanh 激活函数的非线性饱和将引发严重的输出端梯度消失。当输入特征未做无量纲归一化、或累加通路中的细胞状态幅值 ct|c_t| 剧烈膨胀时,tanh(ct)=1tanh2(ct)\tanh'(c_t)=1-\tanh^2(c_t) 将不可避免地坠入极度平坦的饱和两翼,使得向后回传的误差信号几乎被硬性截断归零。这也从数学底层阐明了为何严格的输入标准化与梯度裁剪并非可选的工程修饰,而是维系模型生命线的基本法则。

最为严峻的认知陷阱,则在于模型极易被化学数据中的“伪时序”所蒙蔽。正如第 8.5 节在无机固体带隙实验中展示的警示案例,当将本质上服从置换对称性的无机化学式当成离散序列喂给网络时,强大的递归归纳偏置会反噬物理现实,将书写惯例中的偶然前后顺序强行拟合为虚假规律,导致同一物质仅仅颠倒书写次序便引发高达 0.694 eV 的荒谬预测漂移。

最后在代码实现与工程调试层面,LSTM 潜藏着极高的出错率与昂贵的校验成本。由于沿时间轴的梯度需要逐层回传并不断跨步相加,在手写 BPTT 时,隐藏状态梯度的跨时步累加(而非错误覆盖)、稠密权重向量的外积转置方向、以及填充批次中对填充位梯度的严格封杀(双向 mask),这三大关卡稍有不慎便会彻底破坏梯度的物理正确性。而为了利用有限差分排查这类隐匿错误,每一个权重标量的校验都需要重新执行两次完整序列的前向计算,在大序列长程模型上排查全局参数梯度的计算代价令人望而却步,这也是为何本教程必须坚持精简抽查范式的现实缘由。

9.3 在模型家族里的位置

在现代分子科学与材料智能计算的浩瀚谱系中,模型架构的选择从来不是非黑即白的线性替代,而是一场算法先验与材料物理内在对称性之间的精确对齐。下表归纳了当前主流时序与拓扑模型在记忆机理、时空复杂度及数据饥渴度上的全景图谱。

模型记忆机制记忆长度并行数据需求化学里典型用法
朴素 RNNWhhW_{hh} 的谱半径固定,~10 步教学、基线
GRU一对互补门可学,但缺独立 cc小数据序列任务
LSTM加法通路 + 三道门可学,bfb_f 决定起点少~中SMILES 建模、时序、生成
Transformer全局注意力理论无限大规模分子语言模型
GNN / MPNN消息传递由层数定部分分子性质预测(有图结构时首选)

从这张全景坐标系中,我们可以清晰洞察到不同架构的生存领地。当体系拥有严格且完备的三维晶格或分子图结构时,能够天然保持旋转与平移不变性的消息传递图神经网络(GNN/MPNN)始终是理化性质预测的绝对王者;当处理具有明确物理先后次序的“真时序”数据(如流动合成在线监测、受控聚合动力学演化、有机反应机理推进)、且样本规模因高昂实验成本而受限在数百至数千之间时,结构紧凑、归纳偏置强烈的 LSTM/GRU 则是最兼具稳定性与高性价比的黄金选择;唯有当数据体量突破数万乃至数百万大关、旨在从无标注的大规模分子语料库中提取深层通用表征时,高度并行且具有无限理论视野的 Transformer 才能真正释放其规模效应的威力;而对于本质服从置换对称性的无序材料组分向量与离散化学式,我们必须保持高度的物理审慎,坚决退避至抗过拟合能力更强的经典浅层基线之中。

LSTM 与注意力模型的位置

9.4 实践清单:从物理直觉到工程落地的十六项法则

为了帮助材料与化学研究者在真实的计算探索中避开暗礁、少走弯路,我们将前述所有的数学机理、反向传播推导与实证教训,熔铸为贯穿研究全生命周期的十六项实战法则。这些法则不再是割裂罗列的机械条目,而是构成了从问题甄别、炉温布设、过程巡检直至落笔撰文的完整科研方法论体系。

一、破土开工前的灵魂叩问(数据拓扑与基线确立)

在将任何一行化学数据送入循环神经网络之前,研究者必须首先发起三道直指物理本质的审慎诘问。

第一道防线,是对序列顺序真实性的苛刻甄别。在动手搭建复杂网络前,必须严肃自问:这段文本或时序的前后位置真的承载着化学因果或主链拓扑信息吗?最直观的检验手段,便是在数据准备阶段预先执行一次完全随机的语序打乱基准测试:如果将输入元素或单体次序彻底颠倒打乱后,模型的验证精度依然纹丝不动甚至毫无劣化,这便是一盏刺眼的警示红灯,证明当前数据本质上只是一袋服从置换不变性的成分集合,强行套用序列模型只会自欺欺人地拟合噪声。

第二道防线,是筑牢不看顺序的物理先验基线。在任何时序深度模型正式登场前,必须首先训练并锁定一组完全摒弃时序关联的传统模型——无论是基于单体摩尔分数的 Fox 方程多层感知机、基于物理化学描述符的随机森林,还是最朴素的全局均值常数预测。在真实的材料信息学研究中,如果一个复杂的循环网络在测试集上的表现不能以显著优势碾压这套“无顺序基线”,那么它在时间步展开中所学到的一切长程注意力便皆属虚妄。

第三道防线,是恪守杜绝化学同源泄漏的切分纪律。在划分训练集、验证集与测试集时,严禁使用盲目的随机抽样。对于有机分子药物任务,必须强制采用基于拓扑核心的 Murcko 骨架切分(Scaffold Split),以拷问模型对未见全新母核的外推能力;而对于动力学在线监测或高分子聚合反应,则必须严格按照时间箭头推进的物理先后顺序进行时序截断。任何掩耳盗铃式的随机抽样,都会因同源分子在各子集间的隐秘泄漏而导致模型性能被虚假高估。

二、步入熔炉时的严苛布设(数值预处理与网络初始化)

当确认问题契合循环模型后,在正式敲击代码展开网络时,必须在底层的张量空间中构筑严密的工程防火墙。

第四道防线,是对目标物理量纲施加严格的标准化缩放。在材料科学中,不同的性质往往横跨数个数量级——例如高分子的玻璃化转变温度通常分布在 300 K 附近,而半导体带隙则集中在 1 eV 的微小尺度。如果不将连续回归标签预先变换为零均值、单位方差的无量纲标准高斯分布,未经缩放的均方误差损失将导致梯度范数在不同任务间发生灾难性的量级震荡,使任何通用的学习率和权重更新彻底失准。

第五道防线,是在起跑线上果断开启遗忘门的启蒙偏置。在初始化 LSTM 参数时,必须彻底打破主流框架将偏置默认置零的陈旧惯性,将遗忘门偏置 bfb_f 显式初始化为 1.01.0;若面临序列跨度在 60 步以上的极限长程依赖挑战,更应毫不犹豫地将其推进至 2.02.0 甚至 3.03.0。这一微小的标量偏移,能够确保反向传播在网络尚未展开深度学习的初始幼态阶段,将误差传送带的透射系数强行维系在近乎透明的无损状态,防止初始阶段的梯度夭折。

第六道防线,是对循环转移权重施加严格的正交初始化。连接前后时步的循环权重矩阵 WW 必须坚决摒弃脆弱的高斯随机采样,全面采用正交矩阵初始化。这一几何约束能够使特征向量在时间轴上流转时保持内积与欧氏长度的等度量变换,将动力学系统在时间轴上的雅可比谱半径精准锚定在 1.0 附近,为长程梯度的稳定奔流奠定初始的拓扑坦途。

第七道防线,是实施由简入繁的课程学习渐进策略。在处理长达上百步的高分子长链或长周期光谱时序时,切忌一上来就将网络完全暴露在极限序列长度下。更科学的做法是采用时序尺度的课程学习(Curriculum Learning),引导网络先在经过截断的 10 至 20 步短序列上建立基础的局域化学语法,随后再逐步放开时间轴的约束跨度,使网络在稳定的认知基底上平滑扩展其记忆视野。

第八道防线,是在变长序列的两端构筑坚固的补齐掩码(Mask)防线。在处理非等长分子或材料文本时,补齐 padding 是不可避免的妥协。然而工程实践中极其容易犯下的致命错误,是只在前向传播中利用 mask 屏蔽无效输出,却在反向传播时遗忘了对掩码位的清零。严谨的循环实现必须在前向与反向 BPTT 两个方向上双向施加掩码过滤,确保填充位的虚假激活在向后回传时被彻底抹去,防止虚无的张量残渣污染前续真实化学基团的梯度积累。

三、烈火炼金时的状态巡检(动态监控与统计学防线)

当参数更新的齿轮开始轰鸣运转,研究者切不可将训练过程视为被动的等待,而必须化身为配备精密仪器的质检员,时刻洞察网络深处的动力学演变。

第九道防线,是筑牢全局范数梯度裁剪(Gradient Clipping)的防暴安全阀。虽然 LSTM 的加法通路从根基上削弱了梯度的指数爆炸,但在遭遇局部突发噪声或 tanh\tanh 函数的极度非线性转折时,梯度悬崖依然偶有发生。必须始终设置阈值 5.0\le 5.0 的全局范数裁剪,确保单步参数更新永远不会脱缰失控,捍卫流形优化的平滑推进。

第十道防线,是对内部门控的开合状态进行动态的极化体检。利用本教程所提供的 gate_statistics 等深层探针,定期输出输入门与遗忘门在整个批次上的分布直方图。一旦发现输入门 iti_t 或遗忘门 ftf_t 的激活值大规模向 0 或 1 两极极化塌缩,便表明网络正滑向功能性坏死或信息完全阻断的边缘,此时必须迅速果断地介入调整学习率或重置预激活偏置。

第十一道防线,是记录并绘制跨层梯度的动力学衰减谱。在训练周期的关键节点,主动监测反向传播从最后一层投射回第 0 层输入端的梯度模长比例。如果第 0 层的有效梯度范数相较于顶层发生了数个数量级的断崖式暴跌,这便是模型在当前任务中“记忆机能瘫痪”最直接的物理病理切片,它清晰地告诫你应当立即重构架构或加大遗忘偏置。

第十二道防线,是坚守至少 3 个独立随机种子的统计学敬畏。化学动力学中的分岔理论告诉我们,微小的初始扰动可能在非线性系统中引发宏观态的剧烈分野。正如第 6.4 节的长链实验所示,完全相同的网络配置在不同种子驱动下,其最终准确率可能在 0.23 的平庸与 1.00 的完胜之间剧烈横跳。严谨的研究必须永远在至少 3 个独立随机种子下重复实验,并始终以“均值 ± 标准差”的完整形式呈现指标,坚决摒弃挑选单一幸运种子的学术伪装。

四、落笔成文时的学术诚实(结果展示与严谨复现)

当所有的实验曲线尘埃落定、进入最终撰写科研成果的阶段,研究者的品格将接受终极的考验。

第十三道防线,是将序列置换对照实验列为必备的核心图表。在论文或技术报告中展示序列模型的亮眼战绩时,必须并列给出第 8.3 节与 8.5 节所示范的“序列顺序随机打乱”对照实验结果。唯有当清晰证明打乱语序会导致性能发生无可辩驳的严重倒退时,你所声称的“深度学习成功捕获了分子立体化学与拓扑时序特征”的科学论点才具备坚如磐石的立论根基。

第十四道防线,是主动开展跨表征与多尺度的鲁棒性压力测试。对于分子 SMILES 序列,必须主动检验模型在更换不同书写规范(Canonical vs. Non-canonical)、更换分子图遍历起始根节点、以及更换不同分子切分方式下的敏感度漂移。一个在微小表征扰动下便发生断崖式震荡的脆弱模型,绝不具备在真实湿实验中指导材料合成的实用价值。

第十五道防线,是毫无保留地披露模型参数体量与真实训练样本规模。正如本教程第 8.3 节的实证所示,手工实现的小模型能够在特定小样本任务上凭借架构优势击溃工业大模型。在行文中,必须清清楚楚、对等公开所有对照组模型的实际可训练参数量、FLOPs 开销以及所耗费的纯有效训练集样本数量,绝不通过模糊模型复杂度的对比来制造虚假的技术优越感。

第十六道防线,是敢于在正文中坦诚呈现失败与短板的科学勇气。在本教程中,我们用长达两个完整小节的篇幅,详尽记录了序列网络在 RDKit 传统描述符面前的甘拜下风(第 8.3 节),以及在无机化学式带隙预测中的滑铁卢与严重归纳偏置错配(第 8.5 节)。在科技写作的殿堂里,敢于客观呈现“我们输了”的负面实验,其所蕴含的物理洞见与启发价值,往往远胜于千篇一律的单方面歌功颂德。唯有清晰划定工具的失效边界,材料信息学的科学大厦才能真正耸立在坚实的基础之上。


10. 参考文献

10.1 经典论文(按教程出现顺序)

任何具有持久生命力的算法架构都不是凭空降临的灵光一闪,而是几代研究者在数学困境与工程壁垒前前赴后继突围的智力结晶。本节汇集了循着本教程推导脉络依次登场的 16 篇经典文献:从 1991 年 Hochreiter 对动力学系统梯度消失的开创性系统剖析、1997 年与 Schmidhuber 奠定 LSTM 根基的里程碑之作,到 Gers 引入遗忘门与窥视孔连接的结构完善,再到 Saxe 正交初始化、Pascanu 梯度裁剪以及 Greff 对变体空间的详尽搜索,每一篇文献都在本教程的代码与公式中留下了深刻的印记。

  1. Hochreiter, S. Untersuchungen zu dynamischen neuronalen Netzen. Diplomarbeit, TU München, 1991.(梯度消失的最早系统分析)
  2. Bengio, Y., Simard, P., Frasconi, P. Learning long-term dependencies with gradient descent is difficult. IEEE TNN, 1994.
  3. Hochreiter, S., Schmidhuber, J. Long Short-Term Memory. Neural Computation 9(8):1735–1780, 1997.
  4. Gers, F., Schmidhuber, J., Cummins, F. Learning to Forget: Continual Prediction with LSTM. Neural Computation 12(10), 2000.
  5. Gers, F., Schmidhuber, J. Recurrent Nets that Time and Count. IJCNN 2000.(peephole)
  6. Graves, A., Schmidhuber, J. Framewise phoneme classification with bidirectional LSTM. Neural Networks 18(5–6), 2005.
  7. Saxe, A., McClelland, J., Ganguli, S. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks. ICLR 2014.(正交初始化)
  8. Pascanu, R., Mikolov, T., Bengio, Y. On the difficulty of training recurrent neural networks. ICML 2013.(梯度裁剪)
  9. Cho, K. et al. Learning Phrase Representations using RNN Encoder–Decoder. EMNLP 2014.(GRU)
  10. Sutskever, I., Vinyals, O., Le, Q. Sequence to Sequence Learning with Neural Networks. NIPS 2014.
  11. Greff, K. et al. LSTM: A Search Space Odyssey. IEEE TNNLS 2017. (8 个 LSTM 变体的大规模对照,本教程第 3.8 节的变体表来自这里)
  12. Zaremba, W., Sutskever, I., Vinyals, O. Recurrent Neural Network Regularization. ICLR 2015.
  13. Gal, Y., Ghahramani, Z. A Theoretically Grounded Application of Dropout in Recurrent Neural Networks. ICML 2016.
  14. Jozefowicz, R., Zaremba, W., Sutskever, I. An Empirical Exploration of Recurrent Network Architectures. ICML 2015.
  15. Karpathy, A., Johnson, J., Li, F.-F. Visualizing and Understanding Recurrent Networks. CVPR 2016.
  16. Vaswani, A. et al. Attention Is All You Need. NIPS 2017.

10.2 化学 / 材料方向

当序列建模的深邃思想跨越学科藩篱步入微观物质世界,化学与材料科学经历了一场从离散手工规则向连续隐空间表征的深刻范式演变。本节精选了 11 篇将时序与拓扑深度学习深植于分子世界的基石之作:从 Fox 经典的共聚物玻璃化转变半经验状态方程、Delaney 水溶性基准数据集,到 MoleculeNet 标准化评测框架的构建,再到 Segler 利用 LSTM 开启小分子逆向从零生成的先河,它们共同勾勒出数据驱动分子与材料发现的现代轮廓。

  1. Delaney, J. S. ESOL: Estimating Aqueous Solubility Directly from Molecular Structure. J. Chem. Inf. Comput. Sci. 44(3), 2004.
  2. Fox, T. G. Influence of Diluent and of Copolymer Composition on the Glass Temperature of a Polymer System. Bull. Am. Phys. Soc. 1, 1956. (Fox 方程)
  3. Wu, Z. et al. MoleculeNet: A Benchmark for Molecular Machine Learning. Chem. Sci. 9, 2018.(DeepChem 的基准数据集)
  4. Ramsundar, B. et al. Deep Learning for the Life Sciences. O'Reilly, 2019.(DeepChem 官方书)
  5. Segler, M., Kogej, T., Tyrchan, C., Waller, M. Generating Focused Molecule Libraries for Drug Discovery with Recurrent Neural Networks. ACS Cent. Sci. 4(1), 2018.(LSTM 分子生成的代表作)
  6. Sanchez-Lengeling, B., Aspuru-Guzik, A. Inverse molecular design using machine learning. Science 361, 2018.
  7. Gupta, A. et al. Generative Recurrent Networks for De Novo Drug Design. Mol. Inf. 37, 2018.
  8. Kim, S. et al. Polymer Genome: A Data-Powered Polymer Informatics Platform. ACS Cent. Sci. 4(11), 2018.
  9. Ramprasad, R. et al. Machine learning in materials informatics. npj Comput. Mater. 3, 2017.
  10. Butler, K. et al. Machine learning for molecular and materials science. Nature 559, 2018.
  11. Kearnes, S. et al. Molecular graph convolutions: moving beyond fingerprints. J. Comput. Aided Mol. Des. 30, 2016.

10.3 教程与代码资源(写作时参考过的公开材料)

开源共享与纯粹透明是推动科学前沿平民化的真正动力。本教程在设计纯 Python 零依赖实现与全景叙事骨架时,深受多部享誉业界的经典开源文献与项目启发。在此,我们由衷致敬 Hochreiter 与 Gers 的原始手稿、Christopher Olah 脍炙人口的图解散文、Andrej Karpathy 极简优雅的 min-char-rnn、DeepChem 的模块化生态,以及 PyTorch 规范严谨的底层算子工程文档。

  1. Hochreiter 与 Schmidhuber 的原始 LSTM 论文及 Gers 的博士论文 (推导与 CEC 的原始表述)。
  2. Christopher Olah, Understanding LSTM Networks(2015)—— 图解风格影响了一代人的入门,本教程的插图主题有意与之互补。
  3. Karparthy 的 min-char-rnn(纯 NumPy 字符级 RNN)—— 零依赖实现的教学传统。
  4. DeepChem 官方文档与 dc.feat.SmilesToSeq 的实现 (本教程第 8.3 节的 token 化方式直接沿用它的约定)。
  5. PyTorch nn.LSTM 文档(本教程的方程编号与它的实现一致)。

附录 A:公式 ↔ 代码对照总表

为了帮助读者在严谨的数学符号体系与具体的数据结构实现之间架设毫无迟滞的双向心智索引,下表系统梳理了本教程核心公式与 code/lstm.py 中底层纯 Python 变量及操作函数的完全映射关系。

公式内容代码位置(code/lstm.py
(3.1) 第 1 式ft=σ(Wfzt+bf)f_t=\sigma(W_fz_t+b_f)LSTMLayer.forwardpre_f = ...; f = [sigmoid(v)...]
(3.1) 第 2 式it=σ(Wizt+bi)i_t=\sigma(W_iz_t+b_i)LSTMLayer.forwardpre_i / i
(3.1) 第 3 式gt=tanh(Wgzt+bg)g_t=\tanh(W_gz_t+b_g)LSTMLayer.forwardpre_g / g
(3.1) 第 4 式ct=ftct1+itgtc_t=f_t\odot c_{t-1}+i_t\odot g_tc_new = [ff*cc + ii*gg ...]
(3.1) 第 5 式ot=σ(Wozt+bo)o_t=\sigma(W_oz_t+b_o)pre_o / o
(3.1) 第 6 式ht=ottanh(ct)h_t=o_t\odot\tanh(c_t)h_new = [oo*tc ...]
(5.1)δot=δhttanh(ct)\delta o_t=\delta h_t\odot\tanh(c_t)do = hadamard(dh, tanh_c)
(5.2)δct\delta c_t 的合成dc = vadd(dc_next, ...)
(5.3)δf,δi,δg,δct1\delta f,\delta i,\delta g,\delta c_{t-1}df/di/dg/dc_prev = hadamard(...)
(5.4)peephole 对 ctc_t 的额外项dc = [dc[j] + do[j]*...*self.p_o[j] ...]
(5.5)peephole 对 ct1c_{t-1} 的额外项dc_prev = [dc_prev[j] + df[j]*...*p_f ...]
(5.6)门的 pre-activation 梯度dpf/dpi/dpg/dpo
(5.7)权重梯度(含 t\sum_tself.gW_f[j][k] += dpf[j]*zj[k]
(5.8)δzt=Wδu\delta z_t=\sum W^\top\delta udz = vecmat(dpf, W_f) + ...
(5.9)切回 xtx_tht1h_{t-1}dx[t], dh_next = split_concat(dz, d)
(5.12)(5.13)中心/五点差分numeric_gradient
(6.1)(6.2)半衰期demo_memory.py::experiment_forget_bias
(3.6)参数量LSTMLayer.n_parameters

附录 B:复现指南

科学研究的可信基石在于绝对的确定性与可复现性。本教程的全部推导结论、动力学曲线、实证榜单与可视化图表,均被封装于高度模块化的工程脚本之中。无论是无任何外部依赖的纯原生 Python 运行环境,还是搭载 DeepChem 的专业材料信息学平台,读者均可依据下述指引在数分钟内实现一键端到端重现。

B.1 环境要求

text
纯 Python 部分:Python ≥ 3.8,无第三方依赖
DeepChem 部分:deepchem ≥ 2.6(本教程验证于 2.8.0)、rdkit、pandas、
                scikit-learn、torch(CPU 即可)
画图:matplotlib ≥ 3.5

本教程正文所记录的全部基准数字,均在下述标准化软硬件环境中严格核准复现:

text
纯 Python 实验:Python 3.11.9
DeepChem 实验:Python 3.11.9 + deepchem 2.8.0 + rdkit 2024.09.6 + torch 2.3.1(CPU)
画图:matplotlib 3.9.1

B.2 三分钟跑通实训流水线

bash
cd code

# 1) 先确认底层实现无误:42 项单元测试(含 160+ 项高精度双向差分梯度检查,零依赖,0.2 秒)
python3 tests_lstm.py

# 2) 实验一~三:梯度动力学、极限记忆长度与遗忘门偏置扫掘(约 9 分钟;--quick 约 2 分钟)
python3 demo_memory.py

# 3) 实验四:共聚物序列拓扑 → 玻璃化转变温度 Tg 预测(约 5 分钟;--quick 约 15 秒)
python3 demo_polymer.py

# 4) 实验五:SMILES 字符级语言模型与分子逆向从零生成(约 4 分钟;--quick 约 40 秒)
python3 demo_smiles_lm.py

# 5) 实验六:DeepChem / ESOL 小分子水溶性基准对决(需要 deepchem 环境,约 6 分钟)
/path/to/python-with-deepchem demo_deepchem_esol.py

# 6) 实验七:无机固体材料带隙与置换不变性破坏负面实验(不需要 deepchem,约 1 分钟)
python3 demo_deepchem_bandgap.py

# 7) 高清重绘教程全景数据图表(需要 matplotlib)
MPLCONFIGDIR=/tmp/mplcache python3 make_figures.py

# 或者一条命令流水线跑完全部实验与图表渲染
bash run_all.sh

B.3 数据资产说明

  • 真实基准数据(涵盖 Delaney/ESOL 的 SMILES 及其实验 logS 溶解度、expt_gap 实验测定材料带隙)已由工程仓库完整打包固化于 code/data/ 目录中,即便在离线局域网环境下,所有实验均可百分之百独立运行复现;
  • 人工合成物理数据集(端基敏感度任务、共聚物微观序列)均由 chemdata.py 基于全局固定的随机数种子确定性生成,在任何计算平台上执行同一条指令均会产出分毫不差的数据张量。

附录 C:术语中英对照

为便利跨学科研究者在人工智能算法文献与材料化学专业语境之间自如切换,下表给出了教程所涉及核心术语的中英文规范对照及本教程中的特定物理涵义说明。

中文English说明
长短时记忆网络Long Short-Term Memory (LSTM)本教程主题
记忆单元 / 细胞状态cell state ctc_tLSTM 独有的加法通路
隐状态hidden state hth_t对外输出
遗忘门 / 输入门 / 输出门forget / input / output gate三道乘性门
候选状态candidate state gtg_t要写入的内容
窥视孔连接peephole connection门直接看 cc
常数误差传送带Constant Error Carousel (CEC)1991 年的核心思想
沿时间反向传播Backpropagation Through Time (BPTT)第 5 章
梯度消失 / 爆炸vanishing / exploding gradient第 2.2 节
乘性交互multiplicative interaction门的数学本质
输入/输出权重冲突input/output weight conflictLSTM 要解决的问题
半衰期half-life梯度衰减到一半的步数
骨架切分scaffold split分子任务的标准切分
二单元组diad相邻两个单体组成的序列单元
序列效应sequence effect组成相同、序列不同导致性质不同

本教程的全部数值、图像与结论都可以用附录 B 的命令复现。插图由图像模型按「手绘风格 #097」生成,是示意图,不可当作化学结构式使用。

《原子智能》· 纸质出版预备版 · PolyAI Team 著