Softmax 回归 — 学习笔记
4.1 Softmax 回归 — 学习笔记
一、分类问题 vs 回归问题
- 回归:预测"多少"——房价、胜场数、住院天数(连续值)
- 分类:预测"哪个类别"——垃圾邮件/正常、猫/鸡/狗(离散值)
二、标签编码:为什么用 One-Hot
One-Hot 编码:向量长度 = 类别数,对应类别的位置为 1,其余为 0。
为什么不用数字 1, 2, 3?
- 数字自带大小关系:3 > 2 > 1,暗示"狗 > 鸡 > 猫",但类别之间没有大小之分。
- 数字自带距离关系:2-1=1,暗示"猫和鸡的距离 = 鸡和狗的距离",这也是无意义的。
- One-Hot 向量互相垂直,没有大小和远近之分,每个类别平等。
注:当类别本身有顺序时(如评分 1-5 星、衣服尺码 S/M/L),用数字是合理的,这叫有序分类(ordinal regression)。
三、线性模型
每个输出 o_j 是所有输入 x 的加权和(仿射函数):
矩阵形式:\mathbf{o} = \mathbf{W}\mathbf{x} + \mathbf{b}
- \mathbf{W} \in \mathbb{R}^{d \times q}:d 个输入特征,q 个输出类别
- 示意图中,每个输入节点到每个输出节点都有连线,代表一个权重 w
四、为什么需要 Softmax
线性模型的输出 o_i 存在两个问题:
- 不能保证非负:o_i 可以是任意实数(-\infty 到 +\infty)
- 不能保证和为 1:不满足概率的基本性质
例子:卧室数量与买房概率正相关,线性模型对豪宅(20 间卧室)的预测可能超过 1。
Softmax 的定义
\hat{y}_i = \frac{\exp(o_i)}{\sum_{j=1}^q \exp(o_j)}
- 取指数 \exp(o_i):保证非负,且保持单调性(o_1 > o_2 \Rightarrow \exp(o_1) > \exp(o_2))
- 除以总和:保证所有概率加起来等于 1(归一化)
重要性质:softmax 保持排序不变,所以判断哪个类别概率最大时,直接比较 o_i 即可,无需算 softmax:
\operatorname*{argmax}_j \hat{y}_j = \operatorname*{argmax}_j o_j
与 Probit 模型的对比
| Softmax | Probit | |
|---|---|---|
| 挤压函数 | Sigmoid / Softmax | 正态分布 CDF \Phi(x) |
| 噪声假设 | Logistic 分布 | 正态分布 |
| 优点 | 计算简洁,优化问题好 | 理论上优雅 |
| 缺点 | — | 实际效果不如 softmax,优化不够好 |
五、向量化计算
将单个样本扩展为一个 minibatch(n 个样本):
\mathbf{O} = \mathbf{X}\mathbf{W} + \mathbf{b}, \quad \hat{\mathbf{Y}} = \mathrm{softmax}(\mathbf{O})
- \mathbf{X} \in \mathbb{R}^{n \times d}:n 个样本,每个 d 维特征
- \mathbf{O} \in \mathbb{R}^{n \times q}:n 个样本,每个 q 个类别的原始分数
- o_{i,j}:第 i 个样本属于第 j 类的原始分数
- softmax 逐行作用,每行独立归一化
一次矩阵乘法算出整个 minibatch 的所有分数,比逐个计算快得多。
六、损失函数:交叉熵
推导过程(极大似然估计)
目标:最大化所有样本的联合概率(独立同分布假设):
P(\mathbf{Y} \mid \mathbf{X}) = \prod_{i=1}^n P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)})
- \mathbf{x}^{(i)}:第 i 个样本的特征
- \mathbf{y}^{(i)}:第 i 个样本的标签(one-hot)
- 每个样本对应一个标签,标签之间相互独立
取负对数(乘积变求和,最大化变最小化):
-\log P(\mathbf{Y} \mid \mathbf{X}) = \sum_{i=1}^n l(\mathbf{y}^{(i)}, \hat{\mathbf{y}}^{(i)})
单个样本的损失(交叉熵损失):
l(\mathbf{y}, \hat{\mathbf{y}}) = -\sum_{j=1}^q y_j \log \hat{y}_j
- 由于 y 是 one-hot,求和后只剩正确类别那一项
- 例:\mathbf{y} = (0, 1, 0),则 l = -\log \hat{y}_2
为什么叫"交叉"熵
公式中用了两个不同的分布:
H(P, Q) = -\sum_j P(j) \log Q(j)
- P(j) 在外面当权重(真实分布)
- Q(j) 在 \log 里面(估计分布)
两个分布"交叉"使用,故名交叉熵。对比熵 H(P) = -\sum_j P(j) \log P(j),用的是同一个分布。
梯度形式
\frac{\partial l}{\partial o_j} = \hat{y}_j - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j
梯度 = 模型预测 - 真实标签,与线性回归的梯度形式一致。
交叉熵的最小值
结论:H(P, Q) \geq H(P),等号当且仅当 P = Q。
证明(利用 \log x \leq x - 1):
H(P, Q) - H(P) = \sum_j P(j) \log \frac{P(j)}{Q(j)} \geq \sum_j P(j) \left(\frac{Q(j)}{P(j)} - 1\right) = \sum_j (Q(j) - P(j)) = 0
七、信息论视角
熵(Entropy)
H[P] = \sum_j -P(j) \log P(j)
表示编码来自分布 P 的数据所需的最少信息量(单位:nat)。
惊讶度(Surprisal)
-\log P(j):观察到事件 j 时的"惊讶程度"。概率越低,惊讶越大。
交叉熵的两种理解
- 极大似然:最大化观测数据出现的概率
- 最小化惊讶度:让模型的预测尽可能接近真实分布,减少编码标签所需的信息量
八、计算效率优化
全连接层参数量 \mathcal{O}(dq),当 d, q 很大时开销很高。两种压缩方法:
Deep Fried Convnets
将权重矩阵 \mathbf{W} 分解为排列 + 傅里叶变换 + 缩放的组合。FFT 计算复杂度 \mathcal{O}(d \log d),远低于 \mathcal{O}(d^2)。
四元数分解
将 \mathbf{W} 拆成 n 个小矩阵,参数量从 dq 降到 dq/n。
精度损失来源:强制权重矩阵服从特殊结构,自由度减少,有些变换无法精确表达。
九、激活函数(补充概念)
激活函数是加在神经网络每层输出上的非线性函数。没有它,多层网络等价于单层线性变换。常见激活函数:
| 名称 | 公式 | 用途 |
|---|---|---|
| ReLU | \max(0, x) | 隐藏层最常用 |
| Sigmoid | \frac{1}{1+e^{-x}} | 二分类输出层 |
| Softmax | \frac{e^{o_j}}{\sum e^{o_k}} | 多分类输出层 |
十、总结
| 概念 | 作用 |
|---|---|
| One-Hot | 公平表示无序类别 |
| 线性模型 \mathbf{o} = \mathbf{Wx} + \mathbf{b} | 从特征到原始分数 |
| Softmax | 将原始分数压缩为概率分布 |
| 交叉熵损失 | 衡量预测分布与真实分布的差距 |
| 极大似然估计 | 交叉熵损失的理论基础 |
| 信息论 | 交叉熵的另一种理解:最小化惊讶度 |