神经网络反向传播推导笔记 (整理版)

这是一份根据你提供的20页手写笔记整理而成的详细文档。

我已将你的笔记内容进行了系统化的重组,保留了你对维度变化求和逻辑 以及微观/宏观视角的精彩分析,并在必要处增加了【勘误/补充】以确保数学严谨性。


神经网络反向传播推导笔记 (整理版)

第一部分:预备知识与符号定义

(基于笔记 Page 5, 2)

1. 核心目标

我们现在的任务是求 θ\thetaθ,使得代价函数 J(θ)J(\theta)J(θ) 尽可能小。我们要使用梯度下降 (Gradient Descent) 的方法。

  • 把 J(θ)J(\theta)J(θ) 看作是关于 θ1,θ2\theta_1, \theta_2θ1,θ2 的多元函数。
  • 多元函数沿梯度 (Gradient) 的反方向下降最快。
  • 第一步:求导数,即求梯度。

2. 维度定义 (Shapes)

假设样本量 m=5000m=5000m=5000,分类数 K=10K=10K=10。

  • 输入数据 XXX (即 a(1)a^{(1)}a(1)): Shape (5000,401)(5000, 401)(5000,401) (含偏置)。
  • 权重矩阵 :
    • θ1\theta_1θ1: Shape (25,401)(25, 401)(25,401) (25个隐藏单元,401个输入特征)。
    • θ2\theta_2θ2: Shape (10,26)(10, 26)(10,26) (10个输出单元,26个隐藏特征)。
  • 中间层 :
    • a(2)a^{(2)}a(2): Shape (5000,26)(5000, 26)(5000,26) (含偏置)。
    • z(3)z^{(3)}z(3): Shape (5000,10)(5000, 10)(5000,10)。

3. 代价函数

J(θ)=−1m∑i=1m∑k=1K[yk(i)log⁡(hθ(x(i))k)+(1−yk(i))log⁡(1−hθ(x(i))k)] J(\theta) = -\frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K [ y_k^{(i)} \log(h_\theta(x^{(i)})k) + (1-y_k^{(i)}) \log(1-h\theta(x^{(i)})_k) ] J(θ)=−m1i=1∑mk=1∑K[yk(i)log(hθ(x(i))k)+(1−yk(i))log(1−hθ(x(i))k)]


第二部分:输出层误差 δ(3)\delta^{(3)}δ(3) 的推导

(基于笔记 Page 1, 3, 6, 7, 8, 9)

1. 定义误差项 δ\deltaδ

我们定义一个中间变量 δ(l)\delta^{(l)}δ(l)(误差项):
δ(l)=∂J∂z(l) \delta^{(l)} = \frac{\partial J}{\partial z^{(l)}} δ(l)=∂z(l)∂J

即:代价函数对第 lll 层线性输入的偏导数。

2. 链式法则推导

对于输出层 z(3)z^{(3)}z(3),其激活输出为 a(3)=g(z(3))=11+e−z(3)a^{(3)} = g(z^{(3)}) = \frac{1}{1+e^{-z^{(3)}}}a(3)=g(z(3))=1+e−z(3)1。

δ(3)=∂J∂z(3)=∂J∂a(3)⋅∂a(3)∂z(3) \delta^{(3)} = \frac{\partial J}{\partial z^{(3)}} = \frac{\partial J}{\partial a^{(3)}} \cdot \frac{\partial a^{(3)}}{\partial z^{(3)}} δ(3)=∂z(3)∂J=∂a(3)∂J⋅∂z(3)∂a(3)

  • 前一项 (∂J∂a(3)\frac{\partial J}{\partial a^{(3)}}∂a(3)∂J) :
    ∂J∂a(3)=−ya(3)+1−y1−a(3)=a(3)−ya(3)(1−a(3)) \frac{\partial J}{\partial a^{(3)}} = -\frac{y}{a^{(3)}} + \frac{1-y}{1-a^{(3)}} = \frac{a^{(3)} - y}{a^{(3)}(1-a^{(3)})} ∂a(3)∂J=−a(3)y+1−a(3)1−y=a(3)(1−a(3))a(3)−y
  • 后一项 (Sigmoid 求导) :
    ∂a(3)∂z(3)=a(3)(1−a(3)) \frac{\partial a^{(3)}}{\partial z^{(3)}} = a^{(3)}(1 - a^{(3)}) ∂z(3)∂a(3)=a(3)(1−a(3))

两者相乘,分母抵消
δ(3)=(a(3)−y) \delta^{(3)} = (a^{(3)} - y) δ(3)=(a(3)−y)

3. 维度分析 (由微观到宏观)

  • 不要被公式吓到 (Page 7):根据导数的加法可裂性,完全可以拆成和式分别求导。
  • JJJ 是一个单纯的标量(数字),但 a(3)a^{(3)}a(3) 是一个 (5000,10)(5000, 10)(5000,10) 的矩阵。
  • ∂J∂a(3)\frac{\partial J}{\partial a^{(3)}}∂a(3)∂J 其实理解为对 a(3)a^{(3)}a(3) 的各个分量(元素)分别求导组成的二维数组。
  • 显然,对于 JJJ 中的某一项求导时,不带 aik(3)a^{(3)}_{ik}aik(3) 的项导数都是 0。

结论

将各个元素组合在一起,就有:
δ(3)=H−Y \delta^{(3)} = H - Y δ(3)=H−Y

  • 其 Shape 为 (5000,10)(5000, 10)(5000,10)。
  • 对应代码:d3t = ht - yt (在 for 循环中是 (1,10)(1, 10)(1,10),整体是 (5000,10)(5000, 10)(5000,10))。

第三部分:隐藏层误差 δ(2)\delta^{(2)}δ(2) 的推导 (难点)

(基于笔记 Page 2, 4, 10, 11, 12, 13, 14, 15, 16)

1. 计算链条的区别 (Page 10)

  • 前向传播 (a(2)→z(3)a^{(2)} \to z^{(3)}a(2)→z(3)):是每个元素 1对1 向后传导,然后再加总。
  • 反向传播 (δ(3)→δ(2)\delta^{(3)} \to \delta^{(2)}δ(3)→δ(2)) :从 a(2)a^{(2)}a(2) 到 z(3)z^{(3)}z(3) 是全连接层 ,不再是元素到元素的一一对应,因此必须要用求和 (Page 11)。

2. 数学推导

目标:求 δj(2)=∂J∂zj(2)\delta^{(2)}_j = \frac{\partial J}{\partial z^{(2)}_j}δj(2)=∂zj(2)∂J。

针对第 jjj 个神经元,它影响了下一层(输出层)所有的 S3=10S_3=10S3=10 个神经元。

根据链式法则:
δj(2)=∑k=1S3(∂J∂zk(3)⋅∂zk(3)∂zj(2)) \delta^{(2)}j = \sum{k=1}^{S_3} \left( \frac{\partial J}{\partial z^{(3)}_k} \cdot \frac{\partial z^{(3)}_k}{\partial z^{(2)}_j} \right) δj(2)=k=1∑S3(∂zk(3)∂J⋅∂zj(2)∂zk(3))

拆解中间项 (Page 14-15)

  1. 已知 ∂J∂zk(3)=δk(3)\frac{\partial J}{\partial z^{(3)}_k} = \delta^{(3)}_k∂zk(3)∂J=δk(3)。
  2. 已知 zk(3)=∑p=1S2Θkp(2)ap(2)=∑Θkp(2)g(zp(2))z^{(3)}k = \sum{p=1}^{S_2} \Theta^{(2)}_{kp} a^{(2)}p = \sum \Theta^{(2)}{kp} g(z^{(2)}_p)zk(3)=∑p=1S2Θkp(2)ap(2)=∑Θkp(2)g(zp(2))。
  3. 对 zj(2)z^{(2)}_jzj(2) 求导时,只有当 p=jp=jp=j 时导数不为 0 ,其他项均为 0。
    ∂zk(3)∂zj(2)=Θkj(2)⋅g′(zj(2)) \frac{\partial z^{(3)}_k}{\partial z^{(2)}j} = \Theta^{(2)}{kj} \cdot g'(z^{(2)}_j) ∂zj(2)∂zk(3)=Θkj(2)⋅g′(zj(2))

代回求和公式 (Page 15)
δj(2)=∑k=1S3(δk(3)⋅Θkj(2)⋅g′(zj(2))) \delta^{(2)}j = \sum{k=1}^{S_3} \left( \delta^{(3)}k \cdot \Theta^{(2)}{kj} \cdot g'(z^{(2)}_j) \right) δj(2)=k=1∑S3(δk(3)⋅Θkj(2)⋅g′(zj(2)))

提取公因式 g′(zj(2))g'(z^{(2)}_j)g′(zj(2)):
δj(2)=(∑k=1S3δk(3)⋅Θkj(2))⋅g′(zj(2)) \delta^{(2)}j = \left( \sum{k=1}^{S_3} \delta^{(3)}k \cdot \Theta^{(2)}{kj} \right) \cdot g'(z^{(2)}_j) δj(2)=(k=1∑S3δk(3)⋅Θkj(2))⋅g′(zj(2))

3. 矩阵化 (Linear Algebra Magic)

观察括号内的求和项 ∑δk(3)⋅Θkj(2)\sum \delta^{(3)}k \cdot \Theta^{(2)}{kj}∑δk(3)⋅Θkj(2)。

  • δ(3)\delta^{(3)}δ(3) Shape: (5000,10)(5000, 10)(5000,10)。
  • Θ(2)\Theta^{(2)}Θ(2) Shape: (10,26)(10, 26)(10,26)。
  • 为了让维度匹配并实现上述求和,我们需要用到 Θ(2)\Theta^{(2)}Θ(2) 的转置

δ(2)=(δ(3)⋅(Θ(2))T)⊙g′(z(2)) \delta^{(2)} = (\delta^{(3)} \cdot (\Theta^{(2)})^T) \odot g'(z^{(2)}) δ(2)=(δ(3)⋅(Θ(2))T)⊙g′(z(2))
(注:⊙\odot⊙ 表示逐元素相乘)

维度检查 (Page 16):

  • δ(3)\delta^{(3)}δ(3): (5000,10)(5000, 10)(5000,10)
  • (Θ(2))T(\Theta^{(2)})^T(Θ(2))T: (10,26)(10, 26)(10,26) (转置后)
  • 相乘结果: (5000,26)(5000, 26)(5000,26)
  • g′(z(2))g'(z^{(2)})g′(z(2)): (5000,26)(5000, 26)(5000,26)
  • 完美匹配!

第四部分:梯度的计算

(基于笔记 Page 17, 18, 19, 20)

1. 目标

求 ∂J∂Θ(l)\frac{\partial J}{\partial \Theta^{(l)}}∂Θ(l)∂J。

2. 推导

∂J∂Θij(l)=∂J∂zi(l+1)⋅∂zi(l+1)∂Θij(l) \frac{\partial J}{\partial \Theta^{(l)}_{ij}} = \frac{\partial J}{\partial z^{(l+1)}_i} \cdot \frac{\partial z^{(l+1)}i}{\partial \Theta^{(l)}{ij}} ∂Θij(l)∂J=∂zi(l+1)∂J⋅∂Θij(l)∂zi(l+1)

  • 前一项是 δi(l+1)\delta^{(l+1)}_iδi(l+1)。
  • 后一项:因为 z=Θaz = \Theta az=Θa,对权重求导剩下的是输入 aj(l)a^{(l)}_jaj(l)。

所以:
∂J∂Θij(l)=δi(l+1)⋅aj(l) \frac{\partial J}{\partial \Theta^{(l)}_{ij}} = \delta^{(l+1)}_i \cdot a^{(l)}_j ∂Θij(l)∂J=δi(l+1)⋅aj(l)

3. 矩阵形式 (Page 19-20)

这是一个外积的形式,对应到整个 Batch (5000个样本):

∂J∂Θ(l)=(δ(l+1))T⋅a(l) \frac{\partial J}{\partial \Theta^{(l)}} = (\delta^{(l+1)})^T \cdot a^{(l)} ∂Θ(l)∂J=(δ(l+1))T⋅a(l)

维度验证 (以 Layer 2 为例)

  • 我们要得到的梯度矩阵 Shape: (10,26)(10, 26)(10,26)。
  • δ(3)\delta^{(3)}δ(3) Shape: (5000,10)(5000, 10)(5000,10) →\to→ 转置后 (10,5000)(10, 5000)(10,5000)。
  • a(2)a^{(2)}a(2) Shape: (5000,26)(5000, 26)(5000,26)。
  • 运算: (10,5000)×(5000,26)=(10,26)(10, 5000) \times (5000, 26) = (10, 26)(10,5000)×(5000,26)=(10,26)。

4. 最终总结公式

  • Layer 2 Gradient :
    ∂J∂Θ(2)=(δ(3))T⋅a(2)=(H−Y)T⋅a(2) \frac{\partial J}{\partial \Theta^{(2)}} = (\delta^{(3)})^T \cdot a^{(2)} = (H-Y)^T \cdot a^{(2)} ∂Θ(2)∂J=(δ(3))T⋅a(2)=(H−Y)T⋅a(2)
  • Layer 1 Gradient :
    ∂J∂Θ(1)=(δ(2))T⋅a(1) \frac{\partial J}{\partial \Theta^{(1)}} = (\delta^{(2)})^T \cdot a^{(1)} ∂Θ(1)∂J=(δ(2))T⋅a(1)
    其中 δ(2)=(δ(3)⋅(Θ(2))T)⊙g′(z(2))\delta^{(2)} = (\delta^{(3)} \cdot (\Theta^{(2)})^T) \odot g'(z^{(2)})δ(2)=(δ(3)⋅(Θ(2))T)⊙g′(z(2))。

【勘误与补充说明】

  1. 关于转置符号

    • 在笔记 Page 19 中,写的是 (δ(3))T@a(2)(\delta^{(3)})^T @ a^{(2)}(δ(3))T@a(2)。这是完全正确的(维度 (10,5000)×(5000,26)(10, 5000) \times (5000, 26)(10,5000)×(5000,26))。
    • 在代码实现中,有时会看到 d3.T * a2,只要保证这是矩阵乘法即可。
  2. 关于 δ(2)\delta^{(2)}δ(2) 的切片

    • 笔记 Page 10 提到了 insert z0。在实际计算 δ(2)\delta^{(2)}δ(2) 时,我们通过矩阵乘法 δ(3)⋅(Θ(2))T\delta^{(3)} \cdot (\Theta^{(2)})^Tδ(3)⋅(Θ(2))T 得到的矩阵是 (5000,26)(5000, 26)(5000,26),包含了对 Bias 单元的"误差"。
    • 重要 :Bias 单元 a0(2)a^{(2)}_0a0(2) 是常数 1,它不连接到上一层(没有 Θ\ThetaΘ 指向它),所以它的误差不需要继续反向传播给 Layer 1。
    • 因此,在计算 ∂J∂Θ(1)\frac{\partial J}{\partial \Theta^{(1)}}∂Θ(1)∂J 之前,通常需要把 δ(2)\delta^{(2)}δ(2) 的第 0 列去掉(即切片操作 delta2[:, 1:])。
  3. 关于求和符号与矩阵乘法

    • 笔记 Page 13 强调"从 δik\delta_{ik}δik 到 δj\delta_jδj 的推导只是矩阵元素的组合"。这句话非常深刻。矩阵乘法 (Θ)T⋅δ(\Theta)^T \cdot \delta(Θ)T⋅δ 本质上就是执行了 Page 4 中的那个求和公式 ∑k\sum_k∑k。

这份文档完整涵盖了你笔记中的所有核心思想和推导细节。如果需要针对某一步骤(比如正则化项的加入)进行扩展,请告诉我!

相关推荐
love530love2 小时前
【笔记】华硕 ROG MAXIMUS Z890 HERO 主板 BIOS 更新完整操作实录
运维·人工智能·windows·笔记·单片机·嵌入式硬件·bios
深度学习实战训练营2 小时前
Monodepth:基于左右一致性的无监督单目深度估计,单目估计的起步-k学长深度学习专栏
人工智能·深度学习
逐梦苍穹2 小时前
为什么 AI 时代用 macOS 更好(以及如何少踩坑)
人工智能·macos
碎碎思2 小时前
FINN:FPGA AI 推理新范式 —— 定制化、高性能、量化神经网络编译器框架
人工智能·深度学习·神经网络·机器学习·fpga开发
光锥智能2 小时前
钉钉发布全球首个工作智能操作系统Agent OS,重构AI时代的工作方式
人工智能·重构·钉钉
论缘投稿网2 小时前
论文生成降重会改变内容吗
人工智能·深度学习·aigc
得助智能-垂类大模型2 小时前
电销选ai智能外呼系统还是人工拨打电话?得助智能外呼效率提升10倍成本直降5倍!
人工智能·ai·销售·得助智能·电销·智能外呼系统·呼叫系统
zhaodiandiandian2 小时前
生成式AI落地潮:从技术狂欢到商业价值重构
人工智能·重构
小程故事多_802 小时前
用Agent与大模型实现Web项目全自动化生成:从需求到部署的完整落地方案
运维·前端·人工智能·自动化·aigc