Excel实现LSTM示例

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

实验总结

  1. 所有计算都和手算一致
  2. 可以修改任何初始数据(比如 x₁、h₀、权重矩阵、学习率),所有结果会自动更新
  3. 每个步骤都对应手算的公式,方便对照理解
相关推荐
完成大叔9 小时前
对话管理模式驱动的智能助手应用
人工智能
不懒不懒9 小时前
【LangChain RAG 入门实战:PDF 文档检索问答】
人工智能
@蔓蔓喜欢你9 小时前
浏览器扩展开发:打造个性化浏览体验
人工智能·ai
海兰9 小时前
【应用实战】基于Dify与多Agent的凭证与档案管理
人工智能
嗝o゚9 小时前
昇腾CANN cann-recipes-infer 仓:LLaMA 推理最佳实践,从模型到服务
人工智能·llama·cann
迁旭9 小时前
Claude Code 项目 /init 命令详解
前端·javascript·chrome·机器学习·语言模型·gpt-3
2601_958815169 小时前
iPhone 17 护眼钢化膜怎么选?悟赫德观复盾护景贴解析
人工智能·科技·智能手机·圆偏振光护眼·观复盾护景贴·护眼钢化膜·iphone17护眼钢化膜
一条泥憨鱼9 小时前
能够让AI做事的“Skill“有什么奥秘
人工智能·ai·agent·rag·skill·mcp
初心未改HD9 小时前
LLM应用开发之模型微调技术详解
人工智能