Softmax 回归
从回归到分类:用 Softmax 把任意实数分数转换成概率分布,并用交叉熵作为损失函数完成多类别分类建模。
回归 vs 分类
之前我们学习的任务有一个统一的名字,叫做 回归 (Regression): 模型从一组输入特征(如房屋面积、楼层、地段)出发, 拟合出一条贯穿样本的连续函数,再读出对应的 连续数值 输出(如房价)。 "回归"一词来自统计学,强调的正是 用模型反推输入与输出之间潜在的连续关系 。
因此,回归任务的输出空间是一段 实数区间 —— 可以是 100 万、150.5 万、也可以是 200 万, 取值连续、无穷多,不需要、也无法预先枚举出所有可能的答案。
但很多任务的答案 不是数 ,而是要从一组离散的 类别 里挑一个:
- 这张图片是猫还是狗?
- 这封邮件是垃圾邮件还是正常邮件?
- 手写数字 0~9,写的是哪个?
这类问题叫 分类 (Classification)——输出是离散的类别, 而不是连续的数值。
左图展示回归(连续输出)与分类(离散输出)在输入输出形态上的差异; 右图列举两类典型分类任务——猫狗二分类、MNIST 十类手写数字识别。 相关公开数据集: MNIST · Dogs vs. Cats 。
One-hot 编码
现实里我们用「猫」「狗」「人」这样的 文字标签 区分类别——人一眼就懂。 但神经网络的输入与输出本质上都是 实数张量 , 所以做分类前的第一个问题是: 如何把这些离散的类别符号映射为可输入网络的数值表示?
最直白的想法:每个类别给一个编号,比如 。 看似简洁,可 仔细想想 ——这种编号方式合理吗?
- 数值大小没有意义——猫不比狗"小"
- 数值间距没有意义——狗和人的差距不该是猫和狗的两倍
这些都是模型会把它当真去"误读"的人为大小关系。我们需要一种 不引入额外数值含义 的编码方式。
解决方案: One-hot 编码 。 有 n 个类别,每个类别用一个 n 维向量表示,只有对应位置为 1,其余为 0:
这样每个类别在独立的维度上,彼此正交,不存在人为的大小关系。
点击下方任意类别按钮,右侧 Tensor 会切换为对应的 one-hot 向量 ——只有该类别所在位置为 1,其余为 0。
Softmax 函数
前面我们用 one-hot 把类别表示成了一个 n 维向量——但这只是 真实标签 的表示, 是给损失函数对照用的"标准答案"。模型自己又该如何 输出 一个能与 one-hot 对应的预测呢?
最自然的设计是让输出层的 神经元数量与类别数对齐 : n 个类别就配 n 个输出神经元,每个神经元给一个分数,分数最高的那个类别就是模型当前更倾向的判断。 这样网络的输出就是一个长度为 n 的向量,可以与 n 维 one-hot 标签放在同一个空间里直接比较。
这一组分数有个专门的名字叫 logits ——它就是 输出层的最后一次线性变换 的结果, 没有 经过任何归一化或非线性激活, 因此每个分量取值可以是任意实数:
可这里有个问题——logits 的 取值可以是任意实数 ,可正可负、可大可小。 但我们真正想得到的是 概率 (非负、求和为 1,便于解读为"属于该类的可能性")。 所以下一个问题就是—— 怎么把一组任意实数变成一组合法的概率?
Softmax 函数 把分数转换为概率分布:
经过 Softmax 后,所有输出都是正数,且求和等于 1——可以解读为属于每个类别的概率。
为什么要用 exp? 两个原因:
- 对任意实数都返回正数 → 满足"概率非负"
- 是单调递增的,并且能放大较大的 logit ——分数最高的类别会得到压倒性的概率,这正是分类想要的"果断"行为
交互式:Softmax 计算器
拖动下方滑块改变三个 logit 值,观察 Softmax 概率分布如何随之变化。
实践:实现 Softmax 函数
用 PyTorch 手写 Softmax 计算,并与 torch.softmax() 结果对比验证。
交叉熵损失函数
分类任务需要新的损失函数。先看看 MSE 行不行:
真实标签: (类别 2)
预测 A: → MSE = 0.18
预测 B: → MSE = 0.173
按分类直觉, 预测 A 明显更好 ——它在正确类别上给出了 的概率,高于 B 的 。
但 MSE 给出了相反的结论:A 的 MSE(0.18)反而比 B(0.173)更大。 MSE 不能正确评估分类效果!
问题出在哪?MSE 衡量的是 逐项数值差 ,对错误类别上的小幅波动也会"斤斤计较"; 但对分类来说,真正重要的只有一件事—— 正确类别的概率有没有足够高 。 所以我们需要一种 专门盯着正确类别概率 的损失。
这就是 交叉熵 (Cross-Entropy)——分类任务的标准损失函数:
与 one-hot 搭配时,只有真实类别对应的那一项不为零,简化为:
直觉:正确类别的预测概率越高, 值越小(损失越小)。 反之,如果正确类别的概率很低,损失会急剧增大。
下方是一个交互式演示:曲线绘制了 随正确类别概率 在 区间上的变化,红点是当前所处的位置。 拖动滑块改变 值,可以观察损失如何随之变化—— 重点感受 趋近于 0 时损失迅速飙升的"急剧增大"行为, 这正是交叉熵能够强力惩罚"对正确答案没信心"的根本原因。
实践:手推 Softmax 前向过程
给定一组具体的输入和权重,逐步演算从输入到 Softmax 到交叉熵损失的完整计算过程,每一步右侧的 Tensor 都展示当前中间结果。