第一部分:基础信息区(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
在这里插入图片描述

实验总结

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

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐