前言

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 个工作表,每个工作表对应一个计算阶段:

  1. 参数设置:存放所有初始参数和超参数
  2. 权重矩阵:存放四个初始权重矩阵
  3. 正向传播:计算四个门的值、Cell 状态和隐藏状态
  4. 反向传播:计算损失函数和各权重的梯度
  5. 参数更新:根据梯度更新权重矩阵
  6. 结果汇总:对比更新前后的权重和损失变化

三、第一步:正向传播(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. 路径 1:C1​→tanh(C1​)→h1​→L
  2. 路径 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 核心结论

  1. 门控机制的物理意义

    • 遗忘门:控制旧记忆的保留比例
    • 输入门:控制新信息的写入比例
    • 候选记忆:提供待写入的新内容
    • 输出门:控制长期记忆的输出比例
  2. 梯度流动特点

    • 当没有旧记忆时,遗忘门梯度为零,参数不更新
    • 输出门梯度最大,对损失的贡献最显著
    • Cell 状态是梯度流动的核心枢纽
  3. Excel 实现的优势

    • 可视化每个计算步骤,便于理解
    • 可手动修改参数,观察结果变化
    • 验证深度学习框架的计算结果
Logo

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

更多推荐