• 周一. 7 月 27th, 2026

3.8后向传播算法的应用

8 月 27, 2025

阶跃函数sigmoid的导数有:

φ′(x)=(11+e−x)′=e−x(1+e−x)2=[1−11+e−x]11+e−x=φ(x)[1−φ(x)]

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

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

φ(x)=ex−e−xex+e−x

这个tanh的导数有:

φ′(x)=(ex−e−xex+e−x)′=(ex+e−x)2−(ex−e−x)2(ex+e−x)2=1−[ex−e−xex+e−x]2=1−[φ(x)]2

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

E=12|y−Y|2

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

这些是什么东西?

一、Softmax 函数是什么?

✅ 定义:

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

Softmax(zi)=ezi∑j=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),则:

∂L∂zi=yi−Yi

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


四、举个例子

假设我们有三个类别,模型输出 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


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

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

∂E∂zi=yi−Yi

或者向量形式:

∂E∂z=y−Y

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


🧠 前提定义

设:

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

softmax 输出为

yi=ezi∑j=1nezj

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

损失函数为交叉熵:

E=−∑i=1nYilog⁡(yi)

✅ 目标:求 E对zk的偏导


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

∂E∂zk=∑i=1n∂E∂yi⋅∂yi∂zk

🔶 第二步:分别求导

① 交叉熵对 softmax 输出的导数

∂E∂yi=−Yiyi

② softmax 输出对 z 的偏导

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

∂yi∂zk={yi(1−yi)if i=k−yiykif i≠k

🔶 第三步:合并两部分

将上面两项相乘并相加:

∂E∂zk=∑i=1n(−Yiyi)⋅∂yi∂zk

我们将它拆分为两部分:

当 i = k:

(−Ykyk)⋅yk(1−yk)=−Yk(1−yk)

当 i ≠ k:

∑i≠k(−Yiyi)⋅(−yiyk)=∑i≠kYiyk=yk∑i≠kYi

而 one-hot 编码下

∑i≠kYi=1−Yk

,因此:

∂E∂zk=−Yk(1−yk)+yk(1−Yk)=yk−Yk

✅ 总结结果

∂E∂zk=yk−Yk⇒∂E∂z=y−Y

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


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

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

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

E=12|y−Y|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 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。