Softmax 回归
逻辑回归的多分类版——从"是不是"到"是哪个"
01 核心原理(大白话版)
逻辑回归解决的是二分类问题:输出一个概率,告诉你"是"的可能性。
Softmax 回归把它推广到多分类:同时输出 K 个概率,每个对应一个类别,所有概率加起来等于 1。
Sigmoid 怎么变成 Softmax?
逻辑回归(二分类)
一个线性分数 z,通过 Sigmoid 压到 (0,1),输出"是类别1"的概率。
Softmax 回归(多分类)
K 个线性分数(logits),通过 Softmax 归一化成 K 个概率,取最大的那个类别。
Softmax 公式:$P(y=k) = \dfrac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}}$。指数放大差距,归一化保证概率之和为 1。当 K=2 时,Softmax 等价于 Sigmoid——逻辑回归是 Softmax 的特例。
一步步构建 Softmax 回归
与逻辑回归相比,标签 y 从 0/1 扩展到 0/1/2,三类数据分布在不同区域。
对于 K 个类别,先计算每类的原始分数(logit),再用 Softmax 转成概率分布:
所有类别的概率之和恰好为 1,每个概率在 (0,1) 之间。非向量化写法——逐步展开,方便理解:
// 假设有 3 类,每类一个原始分数(logit) const logits = [2.0, 1.0, 0.5]; // 类别 0、1、2 的分数 // 第一步:e 的幂次 const exps = [Math.exp(2.0), Math.exp(1.0), Math.exp(0.5)]; // [7.389, 2.718, 1.649] // 第二步:求和 const sum = exps[0] + exps[1] + exps[2]; // 11.756 // 第三步:归一化,得到概率 const probs = [exps[0]/sum, exps[1]/sum, exps[2]/sum]; // [0.629, 0.231, 0.140] → 三者之和 = 1
向量化写法(同时处理所有类别,减去最大值防止 exp 溢出):
交叉熵的一般式(对所有类别求和):
其中 $y_k$ 是 one-hot 标签:把类别编号变成一个向量,真实类别那位填 1,其余填 0。例如三分类中真实类别是 1,则 $\mathbf{y} = [0, 1, 0]$。求和时只有真实类别 $c$ 那一项不为零,于是式子化简为:
这里是重点!通俗来说:Softmax 输出的是一个概率数组,one-hot 就是用真实标签 y 去选其中哪一段。写成代码极其简单,就是下面的 probs[y]。
类比逻辑回归:Sigmoid 输出一个数,用 y ∈ {0, 1} 做选择(是或否);Softmax 输出 K 个数,用 y ∈ {0,1,...,K-1} 当下标做选择——本质完全一样,只是从二选一变成了 K 选一。
$p_c$ 是模型给真实类别的概率。预测越准 $p_c \to 1$,$-\log(1)=0$ 损失趋零;预测完全错误时 $p_c \to 0$,损失趋无穷——错得越离谱惩罚越重。
每个类别有自己的权重向量,梯度形式与逻辑回归完全一致:err = pred - label,只是现在同时更新 K 组参数。
四段拼在一起,加上可视化,就是完整演示代码——看下面。
02 代码
03 学术性讲解
Softmax 回归(也称多项逻辑回归)是逻辑回归在多分类问题上的推广,适用于输出互斥的 K 个类别。
Softmax 函数
给定 K 个类别的线性分数(logits)z₁, z₂, ..., z_K:
其中 $z_k = w_k \cdot x + b_k$ 是第 k 类的线性组合。
损失函数:多分类交叉熵
只惩罚真实类别的预测概率:
其中 c 是样本的真实类别。等价于所有类别的完整交叉熵 −Σ y_k log p_k(one-hot 编码后非真实类别项为 0)。
梯度推导
Softmax + 交叉熵联合求导后,梯度形式极为简洁:
与逻辑回归的梯度形式完全一致——err = 预测概率 − 真实标签,只是 K 个类别各有一套参数。
决策边界
类别 i 和类别 j 的决策边界是两者概率相等的超平面:
K 个类别产生 K(K-1)/2 条两两决策边界,将特征空间划分为 K 个区域。
总结
多分类问题
Softmax
多分类交叉熵
K 个概率