Excel实现LSTM完整计算流程
-
- 第一部分:基础信息区(A1:B15)
-
- [步骤 1:输入符号对照表](#步骤 1:输入符号对照表)
- [步骤 2:输入网络超参数](#步骤 2:输入网络超参数)
- [步骤 3:输入初始数据](#步骤 3:输入初始数据)
- 第二部分:正向传播(A21:R38)
-
- [步骤 4:Step1 拼接输入向量](#步骤 4:Step1 拼接输入向量)
- [步骤 5:Step2 输入四个权重矩阵并计算原始值 net](#步骤 5:Step2 输入四个权重矩阵并计算原始值 net)
-
- [5.1 输入四个权重矩阵(3 行 5 列)](#5.1 输入四个权重矩阵(3 行 5 列))
- [5.2 计算四个门的原始值 net(矩阵乘法)](#5.2 计算四个门的原始值 net(矩阵乘法))
- [步骤 6:Step3 通过激活函数得到四个门的值](#步骤 6:Step3 通过激活函数得到四个门的值)
- [步骤 7:Step4 更新 Cell 状态 C₁(长期记忆)](#步骤 7:Step4 更新 Cell 状态 C₁(长期记忆))
- [步骤 8:Step5 计算隐藏状态 h₁(最终输出)](#步骤 8:Step5 计算隐藏状态 h₁(最终输出))
- 第三部分:反向传播(A40:BV58)
-
- [步骤 9:计算损失函数 L](#步骤 9:计算损失函数 L)
- [步骤 10:初始化梯度∂L/∂h₁](#步骤 10:初始化梯度∂L/∂h₁)
- [步骤 11:反向 Step1 计算∂L/∂o₁和∂L/∂wo](#步骤 11:反向 Step1 计算∂L/∂o₁和∂L/∂wo)
-
- [11.1 计算∂L/∂o₁](#11.1 计算∂L/∂o₁)
- [11.2 计算∂L/∂wo(外积,3×1 × 1×5 = 3×5 矩阵)](#11.2 计算∂L/∂wo(外积,3×1 × 1×5 = 3×5 矩阵))
- [步骤 12:反向 Step2 计算∂L/∂tanh (C₁)](#步骤 12:反向 Step2 计算∂L/∂tanh (C₁))
- [步骤 13:反向 Step3 计算∂L/∂C₁(Cell 链核心)](#步骤 13:反向 Step3 计算∂L/∂C₁(Cell 链核心))
- [步骤 14:反向 Step4 计算输入门 wi 和候选值 wu 的梯度](#步骤 14:反向 Step4 计算输入门 wi 和候选值 wu 的梯度)
-
- [14.1 输入门 wi 的梯度](#14.1 输入门 wi 的梯度)
- [14.2 候选值 wu 的梯度](#14.2 候选值 wu 的梯度)
- [步骤 15:反向 Step5 计算遗忘门 wf 的梯度](#步骤 15:反向 Step5 计算遗忘门 wf 的梯度)
- 第四部分:梯度汇总与参数更新(A60:H80)
-
- [步骤 16:最终梯度汇总](#步骤 16:最终梯度汇总)
- [步骤 17:参数更新(梯度下降)](#步骤 17:参数更新(梯度下降))
- 实验总结
第一部分:基础信息区(A1:B15)
步骤 1:输入符号对照表
| 单元格 | 输入内容 | 格式 |
|---|---|---|
| A1 | LSTM 完整计算流程(复刻手算版) | 合并 A1:H1,居中,字号 14 加粗 |
| A3 | 符号对照表 | 加粗 |
| A4 | wf | |
| B4 | 遗忘门权重矩阵 | |
| A5 | wi | |
| B5 | 输入门权重矩阵 | |
| A6 | wu | |
| B6 | 候选值权重矩阵 | |
| A7 | wo | |
| B7 | 输出门权重矩阵 |
步骤 2:输入网络超参数
| 单元格 | 输入内容 | 格式 |
|---|---|---|
| A9 | 网络超参数 | 加粗 |
| A10 | 输入维度 d | |
| B10 | 2 | |
| A11 | 隐藏维度 h | |
| B11 | 3 | |
| A12 | 序列长度 T | |
| B12 | 1 | |
| A13 | 学习率 η | |
| B13 | 0.01 |
步骤 3:输入初始数据
| 单元格 | 输入内容 | 说明 |
|---|---|---|
| A15 | 初始数据 | 加粗 |
| A16 | x₁(当前输入) | |
| D16 | 0.5 | x₁[0] |
| E16 | 0.8 | x₁[1] |
| A17 | h₀(上一时刻隐藏状态) | |
| D17 | 0.1 | h₀[0] |
| E17 | 0.2 | h₀[1] |
| F17 | 0.3 | h₀[2] |
| A18 | C₀(上一时刻 Cell 状态) | |
| D18 | 0 | C₀[0] |
| E18 | 0 | C₀[1] |
| F18 | 0 | C₀[2] |
| A19 | y(真实值) | |
| D19 | 20 | y[0] |
| E19 | 20 | y[1] |
| F19 | 20 | y[2] |
检查点:现在你的 Excel 前 19 行应该和初始数据完全一致。

第二部分:正向传播(A21:R38)
步骤 4:Step1 拼接输入向量
| 单元格 | 输入内容 / 公式 | 说明 |
|---|---|---|
| A21 | 正向传播 Step1:拼接输入向量 | 加粗 |
| A22 | [h₀, x₁] | |
| D22 | =D17 | 复制 h₀[0] |
| E22 | =E17 | 复制 h₀[1] |
| F22 | =F17 | 复制 h₀[2] |
| G22 | =D16 | 复制 x₁[0] |
| H22 | =E16 | 复制 x₁[1] |
结果:D22:H22 应该显示 0.1 0.2 0.3 0.5 0.8
步骤 5:Step2 输入四个权重矩阵并计算原始值 net
5.1 输入四个权重矩阵(3 行 5 列)
| 单元格 | 输入内容 | 单元格 | 输入内容 | 单元格 | 输入内容 | ||||
|---|---|---|---|---|---|---|---|---|---|
| A24 | wf(遗忘门权重) | ||||||||
| D24 | 0.1 | E24 | 0.2 | F24 | 0.3 | G24 | 0.4 | H24 | 0.5 |
| D25 | 0.2 | E25 | 0.1 | F25 | 0.2 | G25 | 0.3 | H25 | 0.4 |
| D26 | 0.3 | E26 | 0.3 | F26 | 0.1 | G26 | 0.2 | H26 | 0.1 |
| A28 | wi(输入门权重) | ||||||||
| D28 | 0.1 | E28 | 0.1 | F28 | 0.1 | G28 | 0.1 | H28 | 0.1 |
| D29 | 0.2 | E29 | 0.2 | F29 | 0.2 | G29 | 0.2 | H29 | 0.2 |
| D30 | 0.3 | E30 | 0.3 | F30 | 0.3 | G30 | 0.3 | H30 | 0.3 |
| A32 | wu(候选值权重) | ||||||||
| D32 | 0.1 | E32 | 0.1 | F32 | 0.5 | G32 | 0.6 | H32 | 0.7 |
| D33 | 0.2 | E33 | 0.2 | F33 | 0.6 | G33 | 0.7 | H33 | 0.8 |
| D34 | 0.3 | E34 | 0.3 | F34 | 0.7 | G34 | 0.8 | H34 | 0.9 |
| A36 | wo(输出门权重) | ||||||||
| D36 | 0.4 | E36 | 0.4 | F36 | 0.4 | G36 | 0.4 | H36 | 0.4 |
| D37 | 0.5 | E37 | 0.5 | F37 | 0.5 | G37 | 0.5 | H37 | 0.5 |
| D38 | 0.6 | E38 | 0.6 | F38 | 0.6 | G38 | 0.6 | H38 | 0.6 |
5.2 计算四个门的原始值 net(矩阵乘法)
关键操作:Excel 矩阵乘法用
MMULT函数,转置用TRANSPOSE函数
- 新版 Excel(365/2021):直接输入公式按回车,会自动填充 3 个结果
- 旧版 Excel(2019 及以前):先选中 3 个输出单元格,输入公式后按 Ctrl+Shift+Enter
| 输出区域 | 公式 | 说明 |
|---|---|---|
| J24:J26 | =MMULT(D24:H26,TRANSPOSE(D22:H22)) |
net_f = wf·[h₀,x₁]ᵀ |
| J28:J30 | =MMULT(D28:H30,TRANSPOSE(D22:H22)) |
net_i = wi·[h₀,x₁]ᵀ |
| J32:J34 | =MMULT(D32:H34,TRANSPOSE(D22:H22)) |
net_u = wu·[h₀,x₁]ᵀ |
| J36:J38 | =MMULT(D36:H38,TRANSPOSE(D22:H22)) |
net_o = wo·[h₀,x₁]ᵀ |
检查点:
- J24:J26 应该是
0.74 0.57 0.30 - J28:J30 应该是
0.19 0.38 0.57 - J32:J34 应该是
1.04 1.23 1.42 - J36:J38 应该是
0.76 0.95 1.14
步骤 6:Step3 通过激活函数得到四个门的值
Excel 内置函数:
- sigmoid(x) =
1/(1+EXP(-x))- tanh(x) =
TANH(x)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| L24:L26 | =1/(1+EXP(-J24)) |
f₁ = σ(net_f) 遗忘门 |
| L28:L30 | =1/(1+EXP(-J28)) |
i₁ = σ(net_i) 输入门 |
| L32:L34 | =TANH(J32) |
u₁ = tanh(net_u) 候选值 |
| L36:L38 | =1/(1+EXP(-J36)) |
o₁ = σ(net_o) 输出门 |
检查点:
- L24:L26 ≈
0.677 0.639 0.574 - L28:L30 ≈
0.547 0.594 0.639 - L32:L34 ≈
0.862 0.831 0.890 - L36:L38 ≈
0.681 0.721 0.758
步骤 7:Step4 更新 Cell 状态 C₁(长期记忆)
公式:C₁ = f₁⊙C₀ + i₁⊙u₁(⊙是对应元素相乘,Excel 里用 *)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| N24:N26 | =L24*D18 + L28*L32 |
C₁[0] = f₁[0]*C₀[0] + i₁[0]*u₁[0] |
检查点:N24:N26 ≈ 0.472 0.494 0.569
步骤 8:Step5 计算隐藏状态 h₁(最终输出)
公式:h₁ = o₁⊙tanh(C₁)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| P24:P26 | =TANH(N24) |
tanh(C₁) |
| R24:R26 | =L36*P24 |
h₁ = o₁⊙tanh(C₁) |
检查点:R24:R26 ≈ 0.300 0.329 0.389

第三部分:反向传播(A40:BV58)
步骤 9:计算损失函数 L
公式:L = Σ(h₁[j] - y[j])²
| 单元格 | 公式 | 说明 |
|---|---|---|
| A40 | 反向传播 | 加粗 |
| A41 | 损失函数 L | |
| C41 | =SUMSQ(R24:R26-D19:F19) |
计算平方和 |
检查点:C41 ≈ 1161.89
步骤 10:初始化梯度∂L/∂h₁
公式:∂L/∂h₁ = 2*(h₁ - y)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| T24:T26 | =2*(R24-D19) |
∂L/∂h₁ |
检查点:T24:T26 ≈ -39.40 -39.34 -39.22
步骤 11:反向 Step1 计算∂L/∂o₁和∂L/∂wo
11.1 计算∂L/∂o₁
公式:∂L/∂o₁ = ∂L/∂h₁ ⊙ tanh(C₁)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| V24:V26 | =T24*P24 |
∂L/∂o₁ |
检查点:V24:V26 ≈ -17.38 -17.94 -20.12
11.2 计算∂L/∂wo(外积,3×1 × 1×5 = 3×5 矩阵)
| 输出区域 | 公式 | 说明 |
|---|---|---|
| X24:AB26 | =MMULT(V24:V26,D22:H22) |
∂L/∂wo = ∂L/∂o₁ ·[h₀,x₁]ᵀ |
检查点:X24 ≈ -1.74,AB26 ≈ -16.10
步骤 12:反向 Step2 计算∂L/∂tanh (C₁)
公式:∂L/∂tanh(C₁) = ∂L/∂h₁ ⊙ o₁
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| AD24:AD26 | =T24*L36 |
∂L/∂tanh(C₁) |
检查点:AD24:AD26 ≈ -26.83 -28.37 -29.73
步骤 13:反向 Step3 计算∂L/∂C₁(Cell 链核心)
公式:∂L/∂C₁ = ∂L/∂tanh(C₁) ⊙ tanh'(C₁),其中 tanh'(x) = 1 - tanh²(x)
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| AF24:AF26 | =1-P24^2 |
tanh'(C₁) |
| AH24:AH26 | =AD24*AF24 |
∂L/∂C₁ |
检查点:AH24:AH26 ≈ -21.62 -22.47 -21.91
步骤 14:反向 Step4 计算输入门 wi 和候选值 wu 的梯度
14.1 输入门 wi 的梯度
公式:
∂L/∂i₁ = ∂L/∂C₁ ⊙ u₁σ'(net_i) = σ(net_i)*(1-σ(net_i))∂L/∂wi = (∂L/∂i₁ ⊙ σ'(net_i)) · [h₀,x₁]ᵀ
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| AJ24:AJ26 | =AH24*L32 |
∂L/∂i₁ |
| AL24:AL26 | =L28*(1-L28) |
σ'(net_i) |
| AN24:AN26 | =AJ24*AL24 |
∂L/∂i₁ ⊙ σ'(net_i) |
| AP24:AT26 | =MMULT(AN24:AN26,D22:H22) |
∂L/∂wi |
检查点:AP24 ≈ -0.46,AT26 ≈ -3.60
14.2 候选值 wu 的梯度
公式:
∂L/∂u₁ = ∂L/∂C₁ ⊙ i₁tanh'(net_u) = 1 - tanh²(net_u)∂L/∂wu = (∂L/∂u₁ ⊙ tanh'(net_u)) · [h₀,x₁]ᵀ
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| AV24:AV26 | =AH24*L28 |
∂L/∂u₁ |
| AX24:AX26 | =1-L32^2 |
tanh'(net_u) |
| AZ24:AZ26 | =AV24*AX24 |
∂L/∂u₁ ⊙ tanh'(net_u) |
| BB24:BF26 | =MMULT(AZ24:AZ26,D22:H22) |
∂L/∂wu |
检查点:BB24 ≈ -0.30,BF26 ≈ -2.33
步骤 15:反向 Step5 计算遗忘门 wf 的梯度
公式:
∂L/∂f₁ = ∂L/∂C₁ ⊙ C₀∂L/∂wf = (∂L/∂f₁ ⊙ σ'(net_f)) · [h₀,x₁]ᵀ
| 输出区域 | 公式(输入第一个后下拉) | 说明 |
|---|---|---|
| BH24:BH26 | =AH24*D18 |
∂L/∂f₁(因为 C₀=0,所以全为 0) |
| BJ24:BJ26 | =L24*(1-L24) |
σ'(net_f) |
| BL24:BL26 | =BH24*BJ24 |
∂L/∂f₁ ⊙ σ'(net_f) |
| BN24:BR26 | =MMULT(BL24:BL26,D22:H22) |
∂L/∂wf(全零矩阵) |
检查点:BN24:BR26 全部为 0
第四部分:梯度汇总与参数更新(A60:H80)
步骤 16:最终梯度汇总
把上面计算的四个梯度矩阵整理到一起,方便查看:
| 单元格 | 输入内容 | 公式(输入第一个后右拉+ 下拉) |
|---|---|---|
| A60 | 最终梯度汇总 | 加粗 |
| A62 | ∂L/∂wo | |
| D62 | =X24 |
填充 D62:H64 |
| A66 | ∂L/∂wu | |
| D66 | =BB24 |
填充 D66:H68 |
| A70 | ∂L/∂wi | |
| D70 | =AP24 |
填充 D70:H72 |
| A74 | ∂L/∂wf | |
| D74 | =BN24 |
填充 D74:H76 |
步骤 17:参数更新(梯度下降)
公式:新权重 = 旧权重 - 学习率 × 梯度
关键:学习率用绝对引用
$B$13,这样下拉右拉时不会变
| 单元格 | 输入内容 | 公式(输入第一个后右拉+ 下拉) |
|---|---|---|
| A78 | 更新后的权重 | 加粗 |
| A80 | wo(新) | |
| D80 | =D36 - $B$13*D62 |
填充 D80:H82 |
| A84 | wu(新) | |
| D84 | =D32 - $B$13*D66 |
填充 D84:H86 |
| A88 | wi(新) | |
| D88 | =D28 - $B$13*D70 |
填充 D88:H90 |
| A92 | wf(新) | |
| D92 | =D24 - $B$13*D74 |
填充 D92:H94(和旧 wf 一样,因为梯度为 0) |
检查点:D80 ≈ 0.417,H80 ≈ 0.539

实验总结
- 所有计算都和手算一致
- 可以修改任何初始数据(比如 x₁、h₀、权重矩阵、学习率),所有结果会自动更新
- 每个步骤都对应手算的公式,方便对照理解