每日一问之多元分类为什么使用 softmax 函数

多分类问题为什么使用 softmax 函数,其背后的数学原理是什么?

周五的时候,总结了二分类使用 sigmoid 作为激活函数的原因,今天来总结多元分类问题使用 softmax 函数的原因。主要是下面这几个要点:

  • 多项分布与多元分类
  • 指数族分布
  • softmax 函数的推导

多项分布与多元分类

多项分布是二项分布(伯努利分布)的推广,推广至 k 个不同的类别。伯努利分布的典型例子是抛硬币,而多项分布的典型例子是投骰子,一个骰子总共有 6 种可能的结果,即是 6 个类别非多分类问题。

在单次试验中,假设共有 k 种可能的情况,每种情况的概率分别为 μ = [μ1, μ2, … , μk]。但是所有情况发生的总概率是为 100%,所以有 Σk μk = 1。记 x ∈ {x1,x2, … , xk },xk ∈ {0,1},且 Σk xk = 1,这样即表示 xk 中只有一个为 1,其余为 0 ,也就是说每次试验只有一种可能。这种方法在机器学习中称为 one-hot 编码(可以参考这篇文章: 数据预处理-对类别数据的处理方法

使用 one-hot 编码处理类别数据后,假设 x3 = 1,其 one-hot 向量为:x = (0,0,1,0,0…)T。如果通过参数 μ 来表示关于 xk 的概率,可以写成如下式子:
P ( x ∣ μ ) = P ( x 1 , x 2 , . . . , x k ∣ μ ) = ∏ k = 1 K μ k x k P(\mathbf{x}|\mu) =P(x_{1},x_{2},...,x_{k}|\mu)=\prod_{k=1}^{K}\mu_{k}^{x_{k}} P(xμ)=P(x1,x2,...,xkμ)=k=1Kμkxk

指数族分布

在这里再提一下指数族分布的概念,同样后面推导公式的时候会用到。

指数族分布(Exponential family Distribution )是在给定参数 η 后,基于 x 的分布。定义式如下所示:
p ( x ∣ η ) = h ( x ) g ( η ) e x p { η T μ ( x ) } p(x|η) = h(x)g(η)exp\left \{ η^{T}μ(x)\right \} p(xη)=h(x)g(η)exp{ηTμ(x)} 其中 x 可以为标量也可以为向量,可以是离散的,也可以是连续的。η 表示分布的自然参数。μ(x) 是关于 x 的函数。函数 g(η) 可以解释为确保分布标准化的系数,它满足下面式子:
g ( η ) ∫ h ( x ) e x p { η T μ ( x ) } d x = 1 g(η)\int h(x)exp\left \{ η^{T}μ(x)\right \}dx = 1 g(η)h(x)exp{ηTμ(x)}dx=1

softmax 函数的推导

同样,知道了 softmax 函数的推导,也就知道为什么多元分类会使用 softmax 函数了。

再次,回到多项分布的式子:
P ( x ∣ μ ) = P ( x 1 , x 2 , . . . , x k ∣ μ ) = ∏ k = 1 K μ k x k P(\mathbf{x}|\mu) =P(x_{1},x_{2},...,x_{k}|\mu)=\prod_{k=1}^{K}\mu_{k}^{x_{k}} P(xμ)=P(x1,x2,...,xkμ)=k=1Kμkxk
将其 log 化后,再以指数函数进行转换可以得到(用另一种表达形式):
P ( x ∣ μ ) = ∏ k = 1 K μ k x k = e x p ( ∑ k = 1 M x k l n μ k ) P(\mathbf{x}|\mu) =\prod_{k=1}^{K}\mu_{k}^{x_{k}} = exp(\sum_{k=1}^{M}x_{k}ln\mu_{k}) P(xμ)=k=1Kμkxk=exp(k=1Mxklnμk)
p ( x ∣ η ) = h ( x ) g ( η ) e x p { η T μ ( x ) } p(x|η) = h(x)g(η)exp\left \{ η^{T}μ(x)\right \} p(xη)=h(x)g(η)exp{ηTμ(x)}
将多项分布的式子和指数族的式子对比,发现是符合指数族分布的特征的。其中 ηk = lnμkη =(η1, … , ηM)T;μ(x) = x;h(x) = 1;g(η)=1。多项分布也就可以表示成下面的形式:
P ( x ∣ μ ) = e x p { η T x } P(\mathbf{x}|\mu) = exp\left \{ \eta ^{T} \mathbf{x} \right \} P(xμ)=exp{ηTx}

需要注意的是,参数 μ 并不独立,其是有限定范围的,即受到下面式子的约束:
∑ k = 1 M μ k = 1 \sum_{k=1}^{M}\mu_{k}=1 k=1Mμk=1
总共有 M 个参数,我们只需要求解出 M-1,就可以计算出全部的参数了。因此,有:

P.S:softmax 函数的推导会比 sigmoid 函数要绕,想要弄清楚的话,还请耐心一点点。

可以确定出:
l n ( μ k 1 − ∑ j μ j ) = η k ln(\frac{\mu_{k}}{1-\sum_{j}\mu_{j}})=\eta _{k} ln(1jμjμk)=ηk

此时令 μj 如下所示,已知 M 个参数的总概率为 1 和 M-1 个参数的概率,所以第 M 个参数的概率就很容易求得:
μ j = 1 − ∑ j M − 1 μ j \mu_{j} =1-\sum_{j}^{M-1}\mu_{j} μj=1jM1μj
已知 ηk 的公式,可以得到:
e η k = μ k μ j , μ j = μ k e η k e^{\eta_{k}} = \frac{\mu_{k}}{\mu_{j}},\mu_{j} = \frac{\mu_{k}}{e^{\eta_{k}}} eηk=μjμkμj=eηkμk

因为有限制条件:
∑ k = 1 K μ k = 1 \sum_{k=1}^{K}\mu_{k}=1 k=1Kμk=1
所以,可以得到:
∑ k = 1 K μ k = ∑ k = 1 K e η k μ j = 1 \sum_{k=1}^{K}\mu_{k} = \sum_{k=1}^{K}e^{\eta_{k}}\mu_{j} = 1 k=1Kμk=k=1Keηkμj=1
移项可以得到:
μ j = 1 ∑ k = 1 K e η k \mu_{j} = \frac{1}{\sum_{k=1}^{K}e^{\eta_{k}}} μj=k=1Keηk1
μj = μk / eηk,代入上式,可得:
μ k = e η k ∑ k = 1 K e η k \mu_{k} = \frac{e^{\eta_{k}}}{\sum_{k=1}^{K}e^{\eta_{k}}} μk=k=1Keηkeηk
为了区别分母的累加,将分母部分的下标 k 改为 j,既有:
μ k = e η k ∑ j e η j \mu_{k} = \frac{e^{\eta_{k}}}{\sum_{j}e^{\eta_{j}}} μk=jeηjeηk
以上就是 softmax 函数的推导过程了。

P.S:文中有错欢迎指出,互相学习。以及欢迎关注我的公众号 ?

<think>嗯,用户这次的问题聚焦在Softmax损失函数和交叉熵的关系上,看来ta对之前解释的"Softmax分类器 vs 损失函数"区别已经理解了,现在想深入理解它们的组合使用逻辑。从ta特意强调"参考站内引用"来看,可能是在做学术研究或写代码实现,需要严谨的数学解释。 用户引用的资料[1][2][4]都明确指出交叉熵损失通常与Softmax配对使用,但没解释深层原因。这需要从三个层面展开: 1. 数学层面:Softmax输出的概率分布天然适配交叉熵的度量方式。因为交叉熵衡量两个概率分布的差异,而Softmax恰好将logits转化为概率分布,两者形成概率空间的标准度量链[^1][^4]。 2. 梯度层面:这是关键!当Softmax+交叉熵组合时,会出现美妙的梯度简化。假设对第k类(真实类)的分数$z_k$求导,梯度会简化为$(p_k - 1)$,而非Softmax单独求导时的复杂雅可比矩阵[^2]。这种简洁梯度大幅提升训练效率。 3. 工程层面:引用[4]的Log-Softmax实现揭示了数值稳定性问题。单独计算Softmax的指数可能溢出,但log_softmax + NLLLoss的组合能通过log-sum-exp技巧规避[^4]。 用户可能还隐含想知道"为什么不搭配其他损失函数"。比如均方误差(MSE)在概率空间会导致梯度消失——当预测接近正确时梯度反而趋于零,而交叉熵的梯度与误差成正比,更利于优化[^1]。 需要特别注意提醒用户:某些框架(如PyTorch)将Softmax和交叉熵合并成nn.CrossEntropyLoss,这时不需要显式添加Softmax层,因为该函数内部已经包含数值稳定的联合实现[^4]。但若用户自己实现,就必须处理数值稳定性问题。 最后用温度系数调节的例子说明实际应用场景,这样用户能感受到理论如何落地。温度系数$\tau$那段可能对做模型蒸馏的用户特别有用。</think>Softmax损失函数与交叉熵损失函数多分类任务中通常结合使用,二者形成紧密的数学和计算协同关系,具体原理如下: --- ### 、核心关系:概率转换与误差度量的协同 1. **功能分工** - **Softmax函数**:将神经网络输出的原始分数(logits)**转换为概率分布** $$ p_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \quad \text{(满足} \sum p_i=1\text{)} $$ 例如输入 $z=[3.2, 5.1, -1.7]$ → 输出 $p≈[0.106, 0.879, 0.015]$[^3] - **交叉熵损失**:**评估预测概率$p$与真实标签$y$的差异** $$ L = -\sum_{i=1}^{K} y_i \log(p_i) $$ 例如 $y=[0,1,0]$, $p=[0.2,0.7,0.1]$ → $L=-\log(0.7)≈0.357$[^4] 2. **工作流程** ```mermaid graph LR A[Logits] --> B(Softmax函数) --> C[概率分布] C --> D(交叉熵损失) --> E[损失值] E --> F[反向传播优化] ``` --- ### 二、为何必须结合使用? #### 1. **数学致性** - Softmax输出是**概率分布**,交叉熵是**衡量两个概率分布差异**的工具(KL散度的组成部分)[^1] - 若使用其他损失函数(如MSE),会违反概率空间的度量规则: - MSE假设输出独立,但Softmax概率相互依赖($\sum p_i=1$) - MSE对概率的惩罚不对称($p=0.9$时$L_{MSE}=0.01$,但$p=0.6$时$L_{MSE}=0.16$,而交叉熵更敏感) #### 2. **梯度优化效率** - **组合梯度公式简化**: $$ \frac{\partial L}{\partial z_i} = p_i - y_i $$ 当$y_i=1$(真实类)时,梯度为$p_i-1$;错误类梯度为$p_i$[^2] - **对比单独使用Softmax**: - 若Softmax配MSE损失,梯度含$\frac{\partial p_j}{\partial z_i}$的复杂雅可比矩阵 - 交叉熵梯度直接与误差成正比,收敛更快 #### 3. **数值稳定性** - **Log-Softmax技巧**(避免指数溢出): $$ \log(p_i) = z_i - \log(\sum e^{z_j}) $$ 交叉熵损失可表示为: $$ L = - \left( z_y - \log(\sum e^{z_j}) \right) $$ 此形式在代码实现中避免大数值计算(如PyTorch的`nn.CrossEntropyLoss`已内置)[^4] #### 4. **损失敏感度合理** - 交叉熵对错误预测惩罚更严厉: - $p_{\text{正确}}→1$时,$L→0$ - $p_{\text{正确}}→0$时,$L→∞$ - 例如: | 场景 | $p_{\text{正确}}$ | 交叉熵损失 | |---------------------|-------------------|------------| | 较好预测 | 0.8 | 0.223 | | 错误预测(置信高) | 0.01 | 4.605 | | 错误预测(置信低) | 0.4 | 0.916 | --- ### 三、与其他损失函数的对比 | 损失函数 | 适配Softmax? | 梯度特性 | 典型问题 | |----------------|---------------|------------------------|------------------------| | **交叉熵** | ✅ 最佳 | $\frac{\partial L}{\partial z_i} = p_i - y_i$ | 无 | | **均方误差** | ❌ 不推荐 | 含复杂雅可比矩阵 | 梯度消失、收敛慢 | | **Hinge损失** | ❌ 不适用 | 仅支持分数比较 | 需分数边界而非概率 | > ⚠️ 注意:某些框架(如PyTorch)的`CrossEntropyLoss`已包含Softmax,无需额外添加层[^4] --- ### 四、实际应用示例 ```python # PyTorch 中的标准实现(Softmax+交叉熵合并) import torch.nn as nn loss_fn = nn.CrossEntropyLoss() # 内置Softmax # 输入:logits (未归化的分数), targets (类别索引) logits = torch.tensor([[2.0, 1.0, 0.1], [1.5, 3.0, 0.5]]) targets = torch.tensor([0, 2]) # 真实类别索引 loss = loss_fn(logits, targets) # 自动计算Softmax+交叉熵 ``` --- ### 总结:协同优势 | 组件 | 贡献 | |-----------------|--------------------------------------------------------------| | **Softmax** | 提供概率解释性,满足$\sum p_i=1$的约束 | | **交叉熵** | 提供概率空间的高效优化目标,梯度与误差直接挂钩 | | **联合效果** | 形成端到端的概率生成与评估闭环,成为多分类任务的事实标准方案 | --- **相关问题** 1. 为什么交叉熵损失比均方误差更适合概率输出? 2. 如何实现数值稳定的Softmax交叉熵损失函数? 3. 多标签分类任务能否使用Softmax+交叉熵? 4. 温度系数(Temperature)如何影响Softmax的输出? 5. 交叉熵损失与KL散度有何数学关系? > 参考资料: > [^1]: Softmax将logits转为概率,交叉熵衡量概率分布差异 > [^2]: 联合使用可实现高效的梯度计算 $\frac{\partial L}{\partial z_i} = p_i - y_i$ > [^3]: Softmax输出标准化概率分布(如$[3.2,5.1,-1.7]→[0.106,0.879,0.015]$) > [^4]: 实际框架中常合并实现(如PyTorch的`CrossEntropyLoss`),包含Log-Softmax技巧防溢出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值