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

这是一份根据你提供的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=1mk=1K[yk(i)log(hθ(x(i))k)+(1yk(i))log(1hθ(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+ez(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)Jz(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+1a(3)1y=a(3)(1a(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)(1a(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)=HY

  • 其 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=1S3(zk(3)Jzj(2)zk(3))

拆解中间项 (Page 14-15)

  1. 已知 ∂J∂zk(3)=δk(3)\frac{\partial J}{\partial z^{(3)}_k} = \delta^{(3)}_kzk(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=1S3(δ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=1S3δ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))Ta(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))Ta(2)=(HY)Ta(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))Ta(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_kk

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值