Excel 复现 LSTM 完整计算过程(含正向 / 反向传播 + 参数更新)
前言
LSTM(长短期记忆网络)作为处理序列数据的核心模型,其复杂的门控机制和反向传播过程一直是深度学习入门的难点。本文将基于一个极简 LSTM 实例(输入维度 2,隐藏维度 3,序列长度 1),手把手教你在 Excel 中完整复现从正向传播、反向求导到参数更新的全流程。通过手动计算和 Excel 公式验证,你将彻底理解 LSTM 每个门的物理意义和梯度流动路径。
一、准备工作:参数与符号定义
1.1 核心符号对照表
表格
| 符号 | 名称 | 维度 | 作用 |
|---|---|---|---|
| wf | 遗忘门权重矩阵 | 3×5 | 控制旧记忆的保留比例 |
| wi | 输入门权重矩阵 | 3×5 | 控制新信息的写入比例 |
| wu | 候选记忆权重矩阵 | 3×5 | 生成待写入的新记忆内容 |
| wo | 输出门权重矩阵 | 3×5 | 控制 Cell 状态的输出比例 |
| h0 | 初始隐藏状态 | 1×3 | 上一时刻的短期记忆 |
| C0 | 初始 Cell 状态 | 1×3 | 上一时刻的长期记忆 |
| x1 | 当前时刻输入 | 1×2 | 序列的第一个输入向量 |
| η | 学习率 | 标量 | 控制参数更新的步长 |
1.2 网络超参数与初始数据
表格
| 参数 | 值 | 说明 |
|---|---|---|
| 输入维度 d | 2 | 每个时间步输入向量的长度 |
| 隐藏维度 h | 3 | 隐藏状态和 Cell 状态的维度 |
| 序列长度 T | 1 | 本次仅计算一个时间步 |
| 初始输入 x1 | [0.5, 0.8] | 第一个时间步的输入 |
| 初始隐藏状态 h0 | [0.1, 0.2, 0.3] | 上一时刻的隐藏状态 |
| 初始 Cell 状态 C0 | [0.0, 0.0, 0.0] | 初始长期记忆为 0 |
| 真实值 y | [20, 20, 20] | 用于计算损失的标签 |
| 学习率 η | 0.01 | 梯度下降的步长 |
1.3 初始权重矩阵(3×5)
plaintext
# 遗忘门权重 wf
[[0.1, 0.2, 0.3, 0.4, 0.5],
[0.2, 0.1, 0.2, 0.3, 0.4],
[0.3, 0.3, 0.1, 0.2, 0.1]]
# 输入门权重 wi
[[0.1, 0.1, 0.1, 0.1, 0.1],
[0.2, 0.2, 0.2, 0.2, 0.2],
[0.3, 0.3, 0.3, 0.3, 0.3]]
# 候选记忆权重 wu
[[0.1, 0.1, 0.5, 0.6, 0.7],
[0.2, 0.2, 0.6, 0.7, 0.8],
[0.3, 0.3, 0.7, 0.8, 0.9]]
# 输出门权重 wo
[[0.4, 0.4, 0.4, 0.4, 0.4],
[0.5, 0.5, 0.5, 0.5, 0.5],
[0.6, 0.6, 0.6, 0.6, 0.6]]
二、Excel 表格结构设计
创建一个 Excel 文件,包含以下 6 个工作表,每个工作表对应一个计算阶段:
- 参数设置:存放所有初始参数和超参数
- 权重矩阵:存放四个初始权重矩阵
- 正向传播:计算四个门的值、Cell 状态和隐藏状态
- 反向传播:计算损失函数和各权重的梯度
- 参数更新:根据梯度更新权重矩阵
- 结果汇总:对比更新前后的权重和损失变化
三、第一步:正向传播(Forward Pass)
正向传播的核心是通过四个门控机制更新长期记忆(Cell 状态)和短期记忆(隐藏状态)。
3.1 拼接输入向量
将上一时刻隐藏状态 h0 和当前输入 x1 拼接成一个 5 维向量: [h0,x1]=[0.1,0.2,0.3,0.5,0.8]
Excel 公式:
- 单元格 A1:
=参数设置!B2(h0[0]) - 单元格 B1:
=参数设置!C2(h0[1]) - 单元格 C1:
=参数设置!D2(h0[2]) - 单元格 D1:
=参数设置!B3(x1[0]) - 单元格 E1:
=参数设置!C3(x1[1])
3.2 计算四个门的原始值(net)
每个门的原始值通过权重矩阵与拼接向量的点积计算得到: netf=wf⋅[h0,x1]T neti=wi⋅[h0,x1]T netu=wu⋅[h0,x1]T neto=wo⋅[h0,x1]T
Excel 公式(以 net_f 为例):
- net_f [0](单元格 A3):
=SUMPRODUCT(权重矩阵!A1:E1, 正向传播!A1:E1) - net_f [1](单元格 A4):
=SUMPRODUCT(权重矩阵!A2:E2, 正向传播!A1:E1) - net_f [2](单元格 A5):
=SUMPRODUCT(权重矩阵!A3:E3, 正向传播!A1:E1)
同理,net_i、net_u、net_o 分别使用权重矩阵中对应的行计算。
计算结果:
- netf=[0.74,0.57,0.30]
- neti=[0.19,0.38,0.57]
- netu=[1.04,1.23,1.42]
- neto=[0.76,0.95,1.14]
3.3 通过激活函数得到门控值
- 遗忘门、输入门、输出门使用 sigmoid 激活函数:σ(x)=1+e−x1
- 候选记忆使用 tanh 激活函数:tanh(x)=ex+e−xex−e−x
Excel 公式:
- sigmoid 函数:
=1/(1+EXP(-x)) - tanh 函数:
=TANH(x)
计算结果:
- 遗忘门 f1=σ(netf)=[0.677,0.639,0.574]
- 输入门 i1=σ(neti)=[0.547,0.594,0.639]
- 候选记忆 u1=tanh(netu)=[0.862,0.831,0.890]
- 输出门 o1=σ(neto)=[0.681,0.721,0.758]
3.4 更新 Cell 状态(长期记忆)
Cell 状态更新公式: C1=f1⊙C0+i1⊙u1 其中 ⊙ 表示逐元素相乘。
由于初始 Cell 状态 C0=[0,0,0],因此: C1=i1⊙u1
Excel 公式(以 C1 [0] 为例):
- 单元格 A15:
=正向传播!B3*参数设置!B4 + 正向传播!C3*正向传播!D3
计算结果: C1=[0.472,0.494,0.569]
3.5 计算隐藏状态(短期输出)
隐藏状态计算公式: h1=o1⊙tanh(C1)
Excel 公式(以 h1 [0] 为例):
- 单元格 A18:
=正向传播!E3*TANH(正向传播!A15)
计算结果: h1=[0.300,0.329,0.389]
四、第二步:反向传播(Backward Pass)
反向传播的核心是通过链式法则计算损失函数对每个权重的梯度,为参数更新做准备。
4.1 计算损失函数
使用均方误差损失函数: L=∑j=13(h1[j]−y[j])2
Excel 公式:
- 单元格 A2:
=SUM((正向传播!A18:C18-参数设置!B5:D5)^2)
计算结果: L=(0.3−20)2+(0.329−20)2+(0.389−20)2=1161.89
4.2 初始化隐藏状态梯度
∂h1∂L=2⋅(h1−y)
Excel 公式(以∂L/∂h1 [0] 为例):
- 单元格 A5:
=2*(正向传播!A18-参数设置!B5)
计算结果: ∂h1∂L=[−39.40,−39.34,−39.22]
4.3 计算输出门梯度 ∂wo∂L
步骤 1:计算输出门值的梯度 ∂o1∂L
∂o1∂L=∂h1∂L⊙tanh(C1)
Excel 公式:
- 单元格 A8:
=反向传播!A5*TANH(正向传播!A15)
计算结果: ∂o1∂L=[−17.38,−17.94,−20.12]
步骤 2:计算输出门权重的梯度 ∂wo∂L
∂wo∂L=∂o1∂L⋅[h0,x1] 这是一个 3×1 向量与 1×5 向量的外积,结果为 3×5 矩阵。
Excel 公式(以∂L/∂wo [0,0] 为例):
- 单元格 A11:
=反向传播!A8*正向传播!A1
计算结果:
-1.74 & -3.48 & -5.21 & -8.69 & -13.90 \\ -1.79 & -3.59 & -5.38 & -8.97 & -14.35 \\ -2.01 & -4.02 & -6.04 & -10.06 & -16.10 \end{bmatrix}$$
4.4 计算 Cell 状态梯度 ∂C1∂L
Cell 状态有两条路径通向损失函数:
- 路径 1:C1→tanh(C1)→h1→L
- 路径 2:C1→C2→...→L(由于 T=1,此路径不存在)
tanh 函数的导数:tanh′(x)=1−tanh2(x)
因此: ∂C1∂L=∂tanh(C1)∂L⊙tanh′(C1) 其中 ∂tanh(C1)∂L=∂h1∂L⊙o1
Excel 公式(以∂L/∂C1 [0] 为例):
- 单元格 A17:
=反向传播!A5*正向传播!E3*(1-TANH(正向传播!A15)^2)
计算结果: ∂C1∂L=[−21.62,−22.47,−21.91]
4.5 计算输入门梯度 ∂wi∂L
步骤 1:计算输入门值的梯度 ∂i1∂L
∂i1∂L=∂C1∂L⊙u1
Excel 公式:
- 单元格 A20:
=反向传播!A17*正向传播!D3
计算结果: ∂i1∂L=[−18.64,−18.67,−19.50]
步骤 2:计算 sigmoid 函数的导数
σ′(x)=σ(x)⋅(1−σ(x))
Excel 公式(以 σ'(net_i [0]) 为例):
- 单元格 A23:
=正向传播!C3*(1-正向传播!C3)
计算结果: σ′(neti)=[0.248,0.241,0.231]
步骤 3:计算输入门权重的梯度 ∂wi∂L
∂wi∂L=∂i1∂L⊙σ′(neti)⋅[h0,x1]
Excel 公式(以∂L/∂wi [0,0] 为例):
- 单元格 A26:
=反向传播!A20*反向传播!A23*正向传播!A1
计算结果:
-0.46 & -0.93 & -1.39 & -2.31 & -3.70 \\ -0.45 & -0.90 & -1.35 & -2.25 & -3.60 \\ -0.45 & -0.90 & -1.35 & -2.25 & -3.60 \end{bmatrix}$$
4.6 计算候选记忆梯度 ∂wu∂L
步骤 1:计算候选记忆值的梯度 ∂u1∂L
∂u1∂L=∂C1∂L⊙i1
Excel 公式:
- 单元格 A32:
=反向传播!A17*正向传播!C3
计算结果: ∂u1∂L=[−11.83,−13.35,−14.00]
步骤 2:计算 tanh 函数的导数
tanh′(netu)=1−tanh2(netu)
Excel 公式(以 tanh'(net_u [0]) 为例):
- 单元格 A35:
=1-正向传播!D3^2
计算结果: tanh′(netu)=[0.257,0.309,0.208]
步骤 3:计算候选记忆权重的梯度 ∂wu∂L
∂wu∂L=∂u1∂L⊙tanh′(netu)⋅[h0,x1]
Excel 公式(以∂L/∂wu [0,0] 为例):
- 单元格 A38:
=反向传播!A32*反向传播!A35*正向传播!A1
计算结果:
-0.30 & -0.61 & -0.91 & -1.52 & -2.43 \\ -0.41 & -0.82 & -1.24 & -2.06 & -3.30 \\ -0.29 & -0.58 & -0.87 & -1.46 & -2.33 \end{bmatrix}$$
4.7 计算遗忘门梯度 ∂wf∂L
由于初始 Cell 状态 C0=[0,0,0],因此: ∂f1∂C1=C0=[0,0,0] ∂f1∂L=∂C1∂L⊙∂f1∂C1=[0,0,0] ∂wf∂L=[0]3×5
关键理解:当没有旧记忆时,遗忘门对损失函数没有贡献,因此梯度为零,参数不会更新。
五、第三步:参数更新(Gradient Descent)
使用梯度下降法更新权重矩阵: wnew=wold−η⋅∂w∂L
Excel 公式(以 wo [0,0] 为例):
- 单元格 A2:
=权重矩阵!G1 - 参数设置!B6*反向传播!A11
更新结果(部分):
- wo[0,:]new=[0.417,0.435,0.452,0.487,0.539]
- wu[0,:]new=[0.103,0.106,0.509,0.615,0.724]
- wi[0,:]new=[0.105,0.109,0.114,0.123,0.137]
- wf 保持不变(梯度为零)
六、结果验证与总结
6.1 关键结果对比
表格
| 指标 | 更新前 | 更新后 | 变化趋势 |
|---|---|---|---|
| 损失函数 L | 1161.89 | 待计算 | 应下降 |
| 隐藏状态 h1 | [0.300, 0.329, 0.389] | 待计算 | 应向 [20,20,20] 靠近 |
| 输出门权重 wo | 全 0.4/0.5/0.6 | 整体增大 | 因为梯度为负,减去负数相当于加 |
6.2 核心结论
-
门控机制的物理意义:
- 遗忘门:控制旧记忆的保留比例
- 输入门:控制新信息的写入比例
- 候选记忆:提供待写入的新内容
- 输出门:控制长期记忆的输出比例
-
梯度流动特点:
- 当没有旧记忆时,遗忘门梯度为零,参数不更新
- 输出门梯度最大,对损失的贡献最显著
- Cell 状态是梯度流动的核心枢纽
-
Excel 实现的优势:
- 可视化每个计算步骤,便于理解
- 可手动修改参数,观察结果变化
- 验证深度学习框架的计算结果
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)