用 Excel 展示 LSTM 的计算过程从门控前向传播到 BPTT摘要本文通过一个可手工验证的最小案例使用 Excel 展示 LSTM 的完整计算过程包括两个时间步的前向传播、输出层与损失函数、通过时间反向传播BPTT的关键梯度计算、参数更新以及更新后结果验证。相比直接给出代码Excel 更适合把每一步门控、状态更新和梯度链条展开便于课程作业展示、课堂讲解和基础概念理解。1. 写在前面学习 LSTM 时很多人会先记住几个关键词例如遗忘门、输入门、输出门、细胞状态、隐藏状态。但真正到了手工推导阶段问题才会暴露出来。最常见的困难有两个不清楚每个门在当前时间步到底控制了什么不清楚最终损失是如何沿时间方向传回前一时刻的MLP 的难点主要在层间传播而 LSTM 的难点不仅在层还在时间维度。也就是说误差不仅要从输出层往前传还要从后一个时间步往前一个时间步传。这也是为什么很多人会觉得 LSTM 比普通前馈网络更难理解。如果直接看框架代码这些过程通常被封装掉了。代码能跑通不代表真正理解了每个量是怎么变化的。Excel 的好处就在这里。它会把每一个中间变量固定在单元格里让公式关系、引用关系和数值结果全部可见。因此用 Excel 展示 LSTM不是为了替代代码训练而是为了把最基础的计算链条讲清楚。2. 模型结构说明本文采用一个最小可验证的 LSTM 结构单单元 LSTM序列长度为 2输入序列为两个时间步x1 和 x2初始隐藏状态 h0 0初始细胞状态 c0 0第二个时间步的隐藏状态 h2 再接一个线性输出层得到最终预测值 y_hat这样设计的目的很直接结构尽可能小但前向传播、状态更新、时间反向传播和参数更新这些核心环节都还在。本例中的设定如下项目数值输入 x10.50输入 x20.80目标值 y0.40初始 h00.00初始 c00.00学习率 η0.10门控激活函数Sigmoid候选状态激活函数tanh损失函数0.5 × (y_hat - y)^23. 为什么要用 Excel 展示 LSTM 计算过程Excel 的作用主要在于把 LSTM 中较多的中间变量逐步展开使计算过程更加清晰。3.1 各中间变量可以单独展示在 LSTM 的计算过程中遗忘门、输入门、候选状态、输出门、细胞状态和隐藏状态都会随着时间步变化。若只看最终输出结果不容易判断中间计算是否正确。将这些变量分别列出后可以更直观地观察它们的变化过程。3.2 便于按步骤检查公式LSTM 的计算包含多个非线性函数和状态更新公式若中间某一步出现错误后续结果也会受到影响。使用 Excel 可以把每一步公式单独写出并通过单元格引用检查各变量之间的对应关系。3.3 便于梳理计算步骤由于 LSTM 涉及多个门控变量和状态更新计算过程相对复杂。将其放在 Excel 中逐步展开后可以更清楚地看到各变量之间的关系也便于检查每一步的结果是否一致。4. LSTM 的前向传播LSTM 在每个时间步都会先计算四组门控或候选变量然后再更新细胞状态和隐藏状态。对于任一时间步 t公式如下a_f(t) Wf_h * h(t-1) Wf_x * x(t) bf f(t) σ(a_f(t)) a_i(t) Wi_h * h(t-1) Wi_x * x(t) bi i(t) σ(a_i(t)) a_g(t) Wg_h * h(t-1) Wg_x * x(t) bg g(t) tanh(a_g(t)) a_o(t) Wo_h * h(t-1) Wo_x * x(t) bo o(t) σ(a_o(t)) c(t) f(t) * c(t-1) i(t) * g(t) h(t) o(t) * tanh(c(t))这里的含义可以直接理解为遗忘门决定旧状态保留多少输入门决定新信息写入多少候选状态提供新的状态候选值输出门决定当前时刻输出多少隐藏状态在 Excel 的Forward工作表中把 t1 和 t2 的关键变量全部展开并为每一行保留变量名称数学表达式Excel 公式文本数值结果这样做的好处是既能展示理论公式也能展示表格里具体怎么实现。5. 输出层与损失函数第二个时间步的隐藏状态 h2 会进入一个线性输出层得到最终预测值y_hat Wy * h2 by损失函数采用平方误差的一半L 0.5 × (y_hat - y)^2这一部分看起来简单但它是整个反向传播的起点。后面的所有梯度最终都要从损失函数回传。6. 为什么 LSTM 的反向传播更复杂对于普通前馈网络误差主要沿层的方向传播。对于 LSTM误差除了沿层传播还要沿时间方向传播。这意味着t2 的损失会影响 t2 的门控参数t2 的损失还会通过隐藏状态和细胞状态继续影响 t1 的参数因此LSTM 的训练本质上是 BPTT也就是 Through Time 的链式法则展开。真正的难点不是公式多而是依赖关系更长、路径更多。7. BPTT 的核心推导7.1 从输出层开始先对输出层求导dL/dy_hat y_hat - y ∂L/∂Wy (dL/dy_hat) × h2 ∂L/∂by dL/dy_hat然后把梯度传回 h2dL/dh2 (dL/dy_hat) × Wy这一步完成后误差信号就会从输出层进入 LSTM 单元。7.2 从 h2 回到 c2 和各门由于h2 o2 × tanh(c2)所以梯度会被拆成两部分一部分流向输出门 o2一部分流向细胞状态 c2再由 c2 继续往前拆解到遗忘门 f2输入门 i2候选状态 g2每个门在反向传播时都要乘上对应激活函数的导数sigmoid 的导数σ(x)(1-σ(x))tanh 的导数1-tanh²(x)7.3 从 t2 继续传回 t1LSTM 反向传播真正麻烦的地方在这里。t2 的误差不会停留在当前时刻。它会通过 recurrent 权重把一部分误差传回 h1通过细胞状态路径把一部分误差传回 c1于是 t1 也要重复类似的求导步骤。也就是说前一个时间步虽然没有直接接输出层但它仍然会对最终损失负责。这也是 LSTM 区别于简单网络的关键状态具有跨时间步传递的性质所以梯度也必须跨时间步回传。8. 参数梯度汇总在 Excel 的Backprop工作表中我没有只给最终梯度结果而是把关键中间梯度项也列出来例如dL/dy_hatdL/dh2dL/dc2da_o2、da_f2、da_i2、da_g2dh1_futuredc1_futuredc1_totalda_o1、da_f1、da_i1、da_g1最后再把这些中间量汇总成每个参数的最终梯度。这样的展示方式比只写一页最终公式更有说服力因为它保留了完整的链式法则路径。9. 参数更新所有梯度求出后使用梯度下降统一更新参数new_parameter old_parameter - η × gradient在 Excel 的Update工作表中我把下面这些内容放在同一张表里参数名初始值梯度学习率更新后值这样能直接看到每个参数如何变化而不是只看到一个最终结果。10. 为什么更新后还要重新前向传播很多作业写到参数更新就结束了这其实不够完整。参数改变以后必须再做一次前向传播重新计算y_hat_newL_new只有当L_new L时才能说明这次梯度方向是正确的。也就是说一个完整的 LSTM 单次训练闭环应该是输入序列 → 前向传播 → 计算损失 → BPTT 反向传播 → 更新参数 → 再次前向传播 → 比较损失是否下降11. Excel 文件结构设计为了让整个过程更清晰我将 Excel 文件拆成了以下几个工作表工作表作用ReadMe说明模型结构、损失函数和工作表用途Inputs输入序列、目标值、学习率和初始参数Forward展示两个时间步的门控、状态更新和最终输出Backprop展示 BPTT 的关键梯度与最终参数梯度Update根据梯度更新参数并重新计算输出与损失Summary汇总初始损失、更新后损失和下降比例这样的结构有一个直接好处读者只要按工作表顺序查看就能完整走一遍 LSTM 的训练过程。12. 总结通过这次整理可以看出 LSTM 的计算过程比普通前馈网络更复杂因为它不仅要计算各个门控变量还要处理细胞状态和隐藏状态在不同时间步之间的传递。将整个过程放到 Excel 中展开的方式有几个明显的优势每一步变量都能看到链式法则路径清楚参数更新过程完整更新后还能验证损失是否变化因此这种方式非常适合解释 LSTM 的最小训练闭环。它不追求复杂任务也不追求大模型规模而是把最核心的门控逻辑、状态更新逻辑和时间反向传播逻辑讲明白。附件说明本文对应的 Excel 文件已按课程要求单独提交文件内容包括前向传播、损失计算、BPTT 反向传播、参数更新以及更新后结果验证。