• 2025年8月29日 星期五

3.8后向传播算法的应用

8 月 27, 2025

阶跃函数sigmoid的导数有:

φ(x)=(11+ex)=ex(1+ex)2=[111+ex]11+ex=φ(x)[1φ(x)]

这个可以用来代替阶跃函数。

常用的非线性函数双曲正切tah函数表达式如下:

φ(x)=exexex+ex

这个tanh的导数有:

φ(x)=(exexex+ex)=(ex+ex)2(exex)2(ex+ex)2=1[exexex+ex]2=1[φ(x)]2

对于目标函数,可以用预测值y和真实值Y差的模的平方:

E=12|yY|2

但通常用基于softmax和交叉熵(cross-entropy)的目标函数。

这些是什么东西?

一、Softmax 函数是什么?

✅ 定义:

Softmax 是一个将实数向量变换为概率分布的函数。设输入为向量 z = [z1, z2, ……, zn],Softmax 输出为:

Softmax(zi)=ezij=1nezj

✅ 特点:

  • 输出值范围在 (0, 1) 之间;
  • 所有输出值加起来是 1,所以可以看作是一个概率分布;
  • 最大值对应的类的概率最大,适用于分类问题。

✅ 应用场景:

  • 多分类神经网络的输出层;
  • 强化学习中的策略分布;
  • 注意力机制中的归一化权重(softmax attention)。

二、交叉熵函数是什么?

✅ 定义:

交叉熵衡量的是两个概率分布之间的差异,常用于度量模型输出的概率分布与真实标签之间的距离。

设真实标签为 one-hot 编码的向量 Y,预测输出为 softmax 概率 y,交叉熵损失函数定义为:

CrossEntropy(Y,y)=i=1nYilog(yi)

✅ 实际效果:

  • 如果预测 yi 趋近于真实标签对应的 1,则损失趋近于 0;
  • 如果预测错误(即真实标签对应的 yi 趋近于 0),则损失趋近于 +∞;
  • 因此它鼓励模型“自信且正确”地做出分类。

↓那么就可以用softmax+交叉熵来证明一个非常简洁的求偏导公式↓


三、Softmax + CrossEntropy 的组合:为什么要一起用?

在 PyTorch、TensorFlow 等框架中,这两个通常合并为一个函数(如 F.cross_entropy()),原因如下:

  1. 数值稳定性:单独计算 softmax 后再计算 log,容易造成梯度爆炸或 underflow;
  2. 优化效率:合并后的函数可以直接用更快更稳定的算法实现;
  3. 梯度简洁:反向传播时,Softmax + CrossEntropy 的梯度简洁优雅,便于学习和实现。

✅ 反向传播的梯度(多分类):

设 L 为交叉熵损失,zi 为 softmax 输入,Yi 为真实标签(one-hot),则:

Lzi=yiYi

这意味着反向传播时,只需预测概率 – 实际标签,非常高效!


四、举个例子

假设我们有三个类别,模型输出 logits 是: z=[2.0,1.0,0.1]

用 softmax 得到: y=Softmax(z)=[0.659,0.242,0.099]

假设真实标签是第一类(即 Y = [1, 0, 0]),那么交叉熵损失是: −log⁡(0.659)≈0.417


而对于此处的【三】,推理证明过程如下:

这个简洁优雅的偏导公式:

Ezi=yiYi

或者向量形式:

Ez=yY

是 Softmax + CrossEntropy 的组合在反向传播中的黄金公式,我们下面用逐步推导法来详细证明它,逻辑清晰,结果精确。


🧠 前提定义

设:

模型输出 logits 向量为 z = [z1, z2, ……, zn]

softmax 输出为

yi=ezij=1nezj

真实标签为 one-hot 向量 Y = [Y1, Y2, ……., Yn]

损失函数为交叉熵:

E=i=1nYilog(yi)

✅ 目标:求 E对zk的偏导


🔶 第一步:链式法则分步计算

Ezk=i=1nEyiyizk

🔶 第二步:分别求导

① 交叉熵对 softmax 输出的导数

Eyi=Yiyi

② softmax 输出对 z 的偏导

分情况讨论(这是关键):

yizk={yi(1yi)if i=kyiykif ik

🔶 第三步:合并两部分

将上面两项相乘并相加:

Ezk=i=1n(Yiyi)yizk

我们将它拆分为两部分:

当 i = k:

(Ykyk)yk(1yk)=Yk(1yk)

当 i ≠ k:

ik(Yiyi)(yiyk)=ikYiyk=ykikYi

而 one-hot 编码下

ikYi=1Yk

,因此:

Ezk=Yk(1yk)+yk(1Yk)=ykYk

✅ 总结结果

Ezk=ykYkEz=yY

这个推导成立的前提是使用 softmax + cross entropy 的组合,并且标签是 one-hot 向量


🎓 延伸说明:为什么这很重要?

  • 这个公式使得反向传播极其高效,避免了显式求导和链式展开;
  • 框架如 PyTorch、TensorFlow 在 CrossEntropyLoss 中自动融合了 softmax 和 log 操作,实现了这个精确求导;
  • 也说明了 softmax 输出已经是概率分布,损失的梯度本质上就是“预测误差”。

上面就是多层神经网络的第二个改进,这个是比原来的E要好的(↓)

E=12|yY|2

多层神经网络的第三个改进是随机梯度下降法SGD,要点如下:

  1. 不用输入每个样本就去更新参数;而是输入一批样本(BATCH/MINI-MATCH),求出这些样本的梯度平均值后,根据平均值来改变参数。
  2. 在神经网络训练中,样本数(BATCH-SIZE)大概设置在50-200之间
    • 按照BATCH遍历所有训练样本一次,这一次称为一个EPOCH
  3. 对于所有训练数据,根据BATCH-SIZE分割为不同的BATCH。

实际训练中,根据BATCH多次遍历所有训练样本,即训练不止一个EPOCH,增加BATCH中训练样本的随机性。

本章节的思考部分,请至第二页继续阅读👇

Avatar photo

李星海

简介: 2025-今 浙江农林大学 | 2022-今 广州白蓝碗蛋科技有限公司 | 2022-2024 广州商学院 | 2019-2022 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。