第一部分:基础信息区(A1:B15)

步骤 1:输入符号对照表

单元格输入内容格式
A1LSTM 完整计算流程(复刻手算版)合并 A1:H1,居中,字号 14 加粗
A3符号对照表加粗
A4wf
B4遗忘门权重矩阵
A5wi
B5输入门权重矩阵
A6wu
B6候选值权重矩阵
A7wo
B7输出门权重矩阵

步骤 2:输入网络超参数

单元格输入内容格式
A9网络超参数加粗
A10输入维度 d
B102
A11隐藏维度 h
B113
A12序列长度 T
B121
A13学习率 η
B130.01

步骤 3:输入初始数据

单元格输入内容说明
A15初始数据加粗
A16x₁(当前输入)
D160.5x₁[0]
E160.8x₁[1]
A17h₀(上一时刻隐藏状态)
D170.1h₀[0]
E170.2h₀[1]
F170.3h₀[2]
A18C₀(上一时刻 Cell 状态)
D180C₀[0]
E180C₀[1]
F180C₀[2]
A19y(真实值)
D1920y[0]
E1920y[1]
F1920y[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 列)
单元格输入内容单元格输入内容单元格输入内容
A24wf(遗忘门权重)
D240.1E240.2F240.3G240.4H240.5
D250.2E250.1F250.2G250.3H250.4
D260.3E260.3F260.1G260.2H260.1
A28wi(输入门权重)
D280.1E280.1F280.1G280.1H280.1
D290.2E290.2F290.2G290.2H290.2
D300.3E300.3F300.3G300.3H300.3
A32wu(候选值权重)
D320.1E320.1F320.5G320.6H320.7
D330.2E330.2F330.6G330.7H330.8
D340.3E340.3F340.7G340.8H340.9
A36wo(输出门权重)
D360.4E360.4F360.4G360.4H360.4
D370.5E370.5F370.5G370.5H370.5
D380.6E380.6F380.6G380.6H380.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*L32C₁[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*P24h₁ = 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^2tanh'(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^2tanh'(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更新后的权重加粗
A80wo(新)
D80=D36 - $B$13*D62填充 D80:H82
A84wu(新)
D84=D32 - $B$13*D66填充 D84:H86
A88wi(新)
D88=D28 - $B$13*D70填充 D88:H90
A92wf(新)
D92=D24 - $B$13*D74填充 D92:H94(和旧 wf 一样,因为梯度为 0)

检查点:D80 ≈ 0.417,H80 ≈ 0.539
在这里插入图片描述

实验总结

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

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

更多推荐