1. 从分类问题到Softmax回归
在机器学习的实际应用中,分类问题可以说是最常见也最基础的任务类型。但很多初学者可能没有意识到,分类问题其实存在两种不同的理解方式:
- 硬分类:我们只关心样本最终属于哪个类别。比如判断一张图片是"猫"还是"狗",输出就是一个确定的类别标签。
- 软分类:我们关心样本属于每个类别的概率。比如同一张图片,输出可能是"猫:0.7,狗:0.3"这样的概率分布。
这两种视角看似不同,但在实际应用中往往相互交织。即使我们最终只需要一个确定的类别标签(硬分类),使用能够输出概率分布(软分类)的模型通常效果更好。这就引出了我们今天要讨论的Softmax回归模型。
提示:虽然Softmax回归名字中有"回归",但它实际上是解决分类问题的经典方法,特别适用于多分类场景。
2. 分类问题的数学表示
2.1 输入特征的表示
假设我们有一个简单的图像分类任务,每张图片是2×2的灰度图。我们可以将每个像素的灰度值作为特征,这样一个图像就可以表示为四个特征值:x₁, x₂, x₃, x₄。假设我们要将这些图片分类为"猫"、"鸡"或"狗"三类。
2.2 标签的编码方式
如何表示这些类别标签呢?最直观的方式可能是用整数编码:
- 1代表"狗"
- 2代表"猫"
- 3代表"鸡"
但这种编码方式暗含了类别之间的顺序关系(1<2<3),而实际上这些类别并没有自然的顺序。更好的方式是使用独热编码(one-hot encoding):
- "猫" → (1, 0, 0)
- "鸡" → (0, 1, 0)
- "狗" → (0, 0, 1)
独热编码是一个与类别数量相同的向量,只有对应类别的位置为1,其他都为0。这种表示方法避免了人为引入的类别顺序关系,更适合分类问题。
3. Softmax回归的网络架构
3.1 从线性回归到分类
在线性回归中,我们使用一个仿射变换(线性变换加偏置)来预测连续值。对于分类问题,我们需要为每个类别都建立一个这样的变换。在我们的例子中:
- 输入特征维度d=4(2×2图像的4个像素值)
- 输出类别数q=3(猫、鸡、狗)
因此我们需要:
- 权重矩阵W ∈ ℝ^(3×4) (共12个参数)
- 偏置向量b ∈ ℝ^3 (共3个参数)
对于输入x ∈ ℝ^4,未归一化的预测(logits)计算为:
o = Wx + b ∈ ℝ^3
3.2 全连接层的概念
Softmax回归可以看作是一个单层的全连接神经网络:
- 每个输出节点都与所有输入节点相连
- 这种结构也称为全连接层或稠密层(Dense Layer)
全连接层的参数量为O(dq),当d和q都很大时(比如在深度学习中),这会带来巨大的计算开销。在实际应用中,我们可以通过一些技巧(如批处理)来减少计算量,将复杂度降低到O(dq/n),其中n是批量大小。
4. Softmax运算详解
4.1 为什么需要Softmax
直接使用线性层的输出o作为预测存在两个问题:
- 输出值的和不一定为1
- 输出值可能为负数
这与概率的基本性质(非负且和为1)相矛盾。Softmax函数正是为了解决这个问题而设计的。
4.2 Softmax的定义
对于未归一化的预测o ∈ ℝ^q,Softmax函数定义为:
ŷ_j = exp(o_j) / ∑_{k=1}^q exp(o_k) 对于j=1,...,q
这样处理后:
- 所有ŷ_j ≥ 0
- ∑ŷ_j = 1
- 保持了原始logits的大小顺序
4.3 Softmax的性质
虽然Softmax是非线性函数,但Softmax回归仍然被视为线性模型,因为:
- 决策边界仍然是线性的
- 输出仅依赖于输入的线性组合
- 非线性仅出现在最后的归一化步骤
5. 批量计算与矢量化
在实际实现中,我们通常使用批量处理来提高计算效率。假设批量大小为n,则:
- 输入矩阵X ∈ ℝ^(n×d)
- 权重矩阵W ∈ ℝ^(d×q)
- 偏置b ∈ ℝ^(1×q)
批量计算可以表示为:
O = XW + b ∈ ℝ^(n×q)
然后对O的每一行独立应用Softmax运算。这种矢量化实现可以充分利用现代硬件(如GPU)的并行计算能力。
6. 损失函数:交叉熵
6.1 最大似然估计
为了训练模型,我们需要定义一个衡量预测好坏的损失函数。在分类问题中,最常用的是交叉熵损失,它源于最大似然估计的思想。
对于真实标签y(独热编码)和预测ŷ,交叉熵损失定义为:
L(y, ŷ) = -∑_{j=1}^q y_j log(ŷ_j)
由于y是独热编码,实际上只有真实类别对应的那一项对损失有贡献。
6.2 损失函数的特性
- 当预测概率ŷ接近真实标签y时,损失趋近于0
- 当预测概率ŷ远离真实标签y时,损失会很大
- 完美预测时(ŷ=y),损失为0(但在实践中由于标签噪声等原因很难达到)
7. Softmax的梯度计算
理解Softmax回归的梯度对于实现反向传播至关重要。让我们推导一下损失函数对未归一化预测o的梯度:
∂L/∂o_j = ŷ_j - y_j
这个结果非常简洁且有意义:梯度就是预测概率与真实标签的差。当预测准确时(ŷ≈y),梯度很小;当预测不准时,梯度较大,推动参数更快更新。
8. 实际应用中的注意事项
8.1 数值稳定性问题
在实际计算Softmax时,直接计算exp(o_j)可能会遇到数值上溢的问题,特别是当o_j很大时。解决方法是对所有o_j减去最大值:
ŷ_j = exp(o_j - max(o)) / ∑ exp(o_k - max(o))
这样既不改变结果,又避免了数值问题。
8.2 学习率的选择
由于梯度表达式简单(ŷ-y),Softmax回归通常对学习率不太敏感。但过大学习率仍可能导致震荡,建议从较小的值(如0.01)开始尝试。
8.3 类别不平衡问题
当某些类别样本数远多于其他类别时,模型可能会偏向多数类。解决方法包括:
- 对少数类样本加权
- 对多数类样本欠采样
- 使用Focal Loss等改进的损失函数
9. 与其他分类方法的比较
9.1 与逻辑回归的关系
逻辑回归可以看作是二分类情况下的Softmax回归。当类别数q=2时,两者本质上是等价的。
9.2 与SVM的比较
支持向量机(SVM)也常用于分类,但与Softmax回归有本质区别:
- SVM寻找最大间隔超平面
- Softmax回归输出概率分布
- SVM通常对异常值更鲁棒
- Softmax结果更容易解释
10. 扩展与进阶
10.1 多标签分类
标准的Softmax回归假设每个样本只属于一个类别。如果样本可能属于多个类别(多标签问题),可以使用多个二分类器或修改Softmax的形式。
10.2 温度参数
在有些应用中,会引入温度参数T来调整Softmax的"软硬"程度:
ŷ_j = exp(o_j/T) / ∑ exp(o_k/T)
T>1使分布更平滑,T<1使分布更尖锐。这在知识蒸馏等场景中很有用。
10.3 与深度神经网络的结合
Softmax回归虽然简单,但可以作为复杂神经网络的最后一层。现代深度学习中,通常会用深度网络提取特征,然后用Softmax回归进行分类。