Skip to content

Softmax 函数求导中为什么要分对角线元素和非对角线元素两种情况

因为 Softmax 与其他普通的激活函数(如 Sigmoid、ReLU)有着根本性的不同:它是一个“存在零和博弈”的函数。


我们可以从“物理直觉”和“数学原理”两个层面来彻底拆解它:

1. 物理直觉层:分蛋糕的“零和博弈”

Softmax 的核心作用,是把一堆任意大小的打分(线性输出 a),转换成总和永远为 1 的概率分布(激活输出 y)。你可以把它想象成几个人在分一个固定大小的蛋糕。

现在我们要探究的是:当输入分数 as 发生变化时,输出概率 yj 会怎么变?

  • 情况 A:自己对自己(j=s 假设你(索引为 s)的考试打分 as 提高了。那么你在所有人中的相对优势变大了,你分到的蛋糕份额 ys 理所当然会增加。这是一种正向的影响。
  • 情况 B:别人对自己(js 假设别人的考试打分 as 提高了。此时你的打分 aj 并没有变。但是,因为蛋糕的总量只有 1,别人分走的蛋糕变多了,你的份额 yj 就必然会被挤压而减少。这是一种负向的影响。

你看,同一个分数 as 的增加,对自身概率和其他类别概率的影响方向是完全相反的!这就是为什么在数学上,我们绝对不能用同一个公式来套用。

2. 数学原理层:分子到底是不是常数?

数学永远是物理直觉的严谨表达。我们回到 Softmax 的公式:

yj=eajkeak

我们要对其中的某个变量 as 求偏导数:as(eajkeak)

这里的分母 S=keak=ea0++eas++ea9无论你对哪个 as 求导,分母里永远都包含 as,所以分母求导永远是 eas

真正的分水岭在于分子 eaj

  • j=s 时: 此时分子是 eas。对 as 来说,分子是一个自变量。所以分子求导 (eas)=eas。这就导出了最后 ys(1ys) 的结果。
  • js 时: 此时分子是 eaj(比如我们在对 a2 求导,但分子是 ea5)。在微积分中,对 a2 求偏导时,所有不是 a2 的字母统统被视为常数!所以,这里的分子是一个常数,常数求导 (eaj)=0。这就导出了最后 yjys 那个带有负号(代表份额被挤压)的结果

3. 为什么叫“对角线”和“非对角线”?

因为网络的输出是一个包含 10 个概率的向量 y,输入是一个包含 10 个分数的向量 a2。 当一个长度为 10 的向量,对另一个长度为 10 的向量求导时,产生的结果是一个 10×10 的矩阵(也就是我们说的雅可比矩阵 Jacobian Matrix)。

在这个 10×10 的矩阵里:

  • 第 0 行第 0 列、第 1 行第 1 列…… 这些行号和列号相等(j=s)的元素,正好排在矩阵的对角线上。它们代表了“自己对自己”的影响。
  • 除了对角线之外的其他所有位置,行号和列号都不等(js),它们排在矩阵的非对角线上。它们代表了“别人对自己”的挤压效应。

不知道通过这种“分蛋糕”的比喻加上分子常数判定法则,有没有帮你彻底扫清对 j=sjs 分类讨论的疑惑?

基于 Kaggle MNIST 数据集,使用纯 numpy 从零实现