Series · ML Math Derivations · Chapter 6

机器学习数学推导(六):逻辑回归与分类

从Sigmoid到Softmax,完整推导逻辑回归——交叉熵损失、梯度计算、正则化与多分类扩展,附Python验证。

开篇. 线性回归把输入映射成任意实数,但如果输出必须是 0 到 1 之间的概率呢?逻辑回归用一个优雅的小技巧解决了这件事:Sigmoid 压缩函数。它名字里带"回归",骨子里却是分类算法——而且它的数学是现代神经网络中每一个神经元的原型。

你将学到

  • 为什么 Sigmoid 是把实数压成概率的"自然"选择,以及它的导数为什么如此干净。
  • 如何在两行内从最大似然推出交叉熵损失。
  • 在分类任务上交叉熵为什么完胜 MSE——用一张梯度消失图把直觉讲透。
  • 二分类与 Softmax 多分类的完整梯度与 Hessian 推导,以及损失为什么严格凸。
  • L1 / L2 / Elastic Net 正则化,以及它们背后藏着的贝叶斯先验。
  • 决策边界的几何意义,以及类别不平衡下你真正需要的阈值无关指标(ROC / PR / AUC)。

预备知识

  • 微积分:链式法则、偏导。
  • 线性代数:矩阵乘法、转置。
  • 概率论:伯努利分布、类别分布、似然函数。
  • 熟悉 第 5 篇:线性回归

1. 从线性模型走向概率分类

1.1 原始线性输出的两个问题

线性回归给出 $\hat y = \mathbf{w}^\top \mathbf{x}$,输出范围没有任何限制。换到分类任务,立刻有两件事讲不通:

  1. 输出无界。 $\mathbf{w}^\top \mathbf{x} \in (-\infty, +\infty)$,但类别标签只能在一个有限集合里。
  2. 没有概率含义。 “你有多确定这封邮件是垃圾邮件?“在 $\mathbb{R}$ 里没法回答。

解决办法是引入一个链接函数(link function),把线性得分压到 $[0, 1]$ 区间。最经典的选择就是 Sigmoid。

1.2 Sigmoid 函数

Sigmoid 函数及其在 z=0 处的切线和导数曲线

Sigmoid(即 logistic 函数)定义为

$$ \sigma(z) = \frac{1}{1 + e^{-z}}. $$

把它想成一个"软开关”:$z$ 很负时基本是 $0$,$z$ 很正时基本是 $1$,在原点处刚好取 $0.5$。上图右侧画出的还有 $z=0$ 处的切线,斜率正好是 $1/4$——这是 Sigmoid 能达到的最陡斜率,下面会反复用到这一事实。

它有三条让数学计算极其舒服的性质。

性质 1 — 值域。 对所有 $z \in \mathbb{R}$,都有 $0 < \sigma(z) < 1$,所以输出天然是合法概率。

性质 2 — 对称性。 $\sigma(-z) = 1 - \sigma(z)$。这条性质让我们能用统一的形式同时写出 $P(y=0\mid \mathbf{x})$ 和 $P(y=1\mid \mathbf{x})$。

证明:

$$ \sigma(-z) = \frac{1}{1 + e^{z}} = \frac{e^{-z}}{1 + e^{-z}} = 1 - \sigma(z). \quad\square $$

性质 3 — 导数能用自己表示。 $\sigma'(z) = \sigma(z)\bigl(1 - \sigma(z)\bigr)$。这是后面交叉熵梯度坍缩成一行的根本原因。

证明:

$$ \sigma'(z) = \frac{e^{-z}}{(1 + e^{-z})^2} = \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}} = \sigma(z)\bigl(1 - \sigma(z)\bigr). \quad\square $$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))

z = np.linspace(-6, 6, 1000)
sig = sigmoid(z)

# 性质 1:值域 (0, 1)
print(f"min={sig.min():.6f}  max={sig.max():.6f}")

# 性质 2:对称性
print(f"对称性误差: {np.max(np.abs(sigmoid(-z) - (1 - sigmoid(z)))):.2e}")

# 性质 3:导数 vs 数值差分
num = np.gradient(sig, z)
ana = sig * (1 - sig)
print(f"导数误差: {np.max(np.abs(num - ana)):.2e}")

1.3 逻辑回归模型

二维分类数据上的决策边界与概率等高线

二分类($y \in \{0, 1\}$)下,模型为

$$ P(y = 1 \mid \mathbf{x}) = \sigma(\mathbf{w}^\top \mathbf{x}), \qquad P(y = 0 \mid \mathbf{x}) = 1 - \sigma(\mathbf{w}^\top \mathbf{x}). $$

利用伯努利分布的概率质量函数,两种情况可以合写成

$$ P(y \mid \mathbf{x}) = \hat y^{\,y} (1 - \hat y)^{1 - y}, \qquad \hat y = \sigma(\mathbf{w}^\top \mathbf{x}). $$

$y = 1$ 时它返回 $\hat y$,$y = 0$ 时返回 $1 - \hat y$。上图直观地展示了模型的几何含义:决策边界 $\mathbf{w}^\top\mathbf{x} = 0$ 是一个超平面,橙色箭头 $\mathbf{w}$ 是这条超平面的法向量——沿着 $\mathbf{w}$ 方向走,预测概率从 $0.5$ 一路推向 $1$。


2. 最大似然估计与交叉熵损失

2.1 构造似然函数

给定独立同分布样本 $\{(\mathbf{x}_i, y_i)\}_{i=1}^N$,联合似然为

$$ L(\mathbf{w}) = \prod_{i=1}^N P(y_i \mid \mathbf{x}_i; \mathbf{w}) = \prod_{i=1}^N \hat y_i^{\,y_i}(1 - \hat y_i)^{1 - y_i}. $$

我们想找的是让所有观测标签出现概率最大的那组参数 $\mathbf{w}$。

2.2 从对数似然到交叉熵

取对数(单调变换,最优解不变):

$$ \ell(\mathbf{w}) = \sum_{i=1}^N \bigl[\, y_i \ln \hat y_i + (1 - y_i)\ln(1 - \hat y_i) \,\bigr]. $$

最大化 $\ell$ 等价于最小化它的负均值,也就是大名鼎鼎的二元交叉熵损失

$$ \boxed{\;\mathcal{L}(\mathbf{w}) = -\frac{1}{N} \sum_{i=1}^N \bigl[\, y_i \ln \hat y_i + (1 - y_i)\ln(1 - \hat y_i) \,\bigr].\;} $$

信息论视角。 交叉熵 $H(p, q) = -\sum_x p(x) \ln q(x)$ 衡量"用 $q$ 设计的编码去编码来自 $p$ 的样本,需要多花多少比特”。这里 $p$ 是 one-hot 真实标签,$q$ 是 Sigmoid 输出,所以最小化 $\mathcal{L}$ 字面意义就是把预测分布往真实分布上拉。

2.3 为什么不能用 MSE?

交叉熵 vs MSE:损失曲线和真实标签为 1 时的梯度幅值

如果天真地选 MSE 作为损失 $\mathcal{L}_{\text{MSE}} = \tfrac12(\hat y - y)^2$,那么对 logit $z = \mathbf{w}^\top\mathbf{x}$ 的梯度是

$$ \frac{\partial \mathcal{L}_{\text{MSE}}}{\partial z} = (\hat y - y)\,\sigma'(z) = (\hat y - y)\,\hat y(1 - \hat y). $$

多出来的 $\hat y(1-\hat y)$ 因子上界是 $1/4$,且当 $\hat y \to 0$ 或 $\hat y \to 1$ 时直接归零。换句话说,模型若自信地错了(比如 $\hat y \approx 0$ 但 $y = 1$),MSE 几乎给不出梯度,学习就此瘫痪。

交叉熵根本没有这个因子:

$$ \frac{\partial \mathcal{L}_{\text{CE}}}{\partial z} = \hat y - y. $$

上图右半部分把这点画得很清楚:当 $y=1$ 而模型预测 $\hat y \approx 0$ 时,交叉熵的梯度接近最大值(用力推);MSE 的梯度却接近零(直接躺平)。

1
2
3
4
5
# 真实标签 y = 1 时,对 logit z 的梯度幅值对比
y_hat = np.linspace(1e-3, 1 - 1e-3, 500)
grad_mse = np.abs((y_hat - 1) * y_hat * (1 - y_hat))
grad_ce  = np.abs(y_hat - 1)
# CE 在最关键的"自信错"区域占据绝对优势。

3. 梯度推导与优化

3.1 关键的"约掉"步骤

对单样本,$\mathcal{L} = -\bigl[y \ln \hat y + (1 - y)\ln(1 - \hat y)\bigr]$,其中 $\hat y = \sigma(z)$,$z = \mathbf{w}^\top\mathbf{x}$。链式法则:

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{w}} = \frac{\partial \mathcal{L}}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial z} \cdot \frac{\partial z}{\partial \mathbf{w}}. $$
  • 损失对预测: $\dfrac{\partial \mathcal{L}}{\partial \hat y} = -\dfrac{y}{\hat y} + \dfrac{1 - y}{1 - \hat y}$。
  • Sigmoid 导数(性质 3): $\dfrac{\partial \hat y}{\partial z} = \hat y(1 - \hat y)$。
  • 线性部分: $\dfrac{\partial z}{\partial \mathbf{w}} = \mathbf{x}$。

把三项乘起来:

$$ \frac{\partial \mathcal{L}}{\partial \mathbf{w}} = \left(-\frac{y}{\hat y} + \frac{1 - y}{1 - \hat y}\right) \cdot \hat y(1 - \hat y) \cdot \mathbf{x} = \bigl[-y(1 - \hat y) + (1 - y)\hat y\bigr]\mathbf{x} = (\hat y - y)\,\mathbf{x}. $$

Sigmoid 导数中的 $\hat y$ 和 $1 - \hat y$ 恰好把 $\partial \mathcal{L}/\partial \hat y$ 里的 $1/\hat y$ 和 $1/(1-\hat y)$ 分母约掉,留下漂亮的结果

$$ \boxed{\;\frac{\partial \mathcal{L}}{\partial \mathbf{w}} = (\hat y - y)\,\mathbf{x}.\;} $$

3.2 全批量梯度

在 $N$ 个样本上求平均并堆成矩阵:

$$ \nabla_{\mathbf{w}} \mathcal{L} = \frac{1}{N}\sum_{i=1}^N (\hat y_i - y_i)\,\mathbf{x}_i = \frac{1}{N}\,\mathbf{X}^\top(\hat{\mathbf{y}} - \mathbf{y}), $$

其中 $\mathbf{X} \in \mathbb{R}^{N \times d}$ 是数据矩阵。

3.3 Hessian 与凸性

对 $(\hat y_i - y_i)\mathbf{x}_i$ 再求一次导:

$$ \nabla^2 \mathcal{L} = \frac{1}{N}\sum_{i=1}^N \hat y_i(1 - \hat y_i)\,\mathbf{x}_i \mathbf{x}_i^\top = \frac{1}{N}\,\mathbf{X}^\top \mathbf{S}\, \mathbf{X}, $$

这里 $\mathbf{S} = \operatorname{diag}\bigl(\hat y_i(1-\hat y_i)\bigr)$。对任意非零向量 $\mathbf{v}$:

$$ \mathbf{v}^\top \nabla^2 \mathcal{L}\, \mathbf{v} = \frac{1}{N} \sum_i \hat y_i(1 - \hat y_i)(\mathbf{v}^\top \mathbf{x}_i)^2 \geq 0, $$

所以 Hessian 半正定,损失函数严格凸——存在唯一全局最优解,任何合理的优化器都会收敛到它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 用数值差分校验梯度公式
np.random.seed(42)
N, d = 50, 3
X = np.random.randn(N, d)
y = (sigmoid(X @ np.array([1.0, -0.5, 0.3])) > 0.5).astype(float)
w = np.zeros(d)

grad_ana = X.T @ (sigmoid(X @ w) - y) / N

eps, grad_num = 1e-5, np.zeros(d)
def loss(w_):
    p = sigmoid(X @ w_)
    return -np.mean(y*np.log(p+1e-15) + (1-y)*np.log(1-p+1e-15))
for j in range(d):
    e = np.zeros(d); e[j] = eps
    grad_num[j] = (loss(w + e) - loss(w - e)) / (2 * eps)

print(f"最大差距: {np.max(np.abs(grad_ana - grad_num)):.2e}")

3.4 优化算法

  • 批量梯度下降(BGD): $\mathbf{w} \leftarrow \mathbf{w} - \eta \cdot \tfrac{1}{N}\mathbf{X}^\top(\hat{\mathbf{y}} - \mathbf{y})$。稳定,但每个 epoch 慢。
  • 随机梯度下降(SGD): 每次随机抽一个样本 $i$,$\mathbf{w} \leftarrow \mathbf{w} - \eta(\hat y_i - y_i)\mathbf{x}_i$。噪声大,但能扛超大数据。
  • 小批量梯度下降: 在大小为 $b$ 的 mini-batch 上求平均梯度。工业界默认。
  • 牛顿法 / IRLS: 利用 $\nabla^2 \mathcal{L}$ 实现二次收敛——因为 Hessian 容易算且半正定,可行。

4. 多分类推广:Softmax 回归

4.1 从二分类到 K 类

$K \geq 3$ 时,每个类别 $k$ 学一个权重向量 $\mathbf{w}_k$,类别 $k$ 的得分是 $z_k = \mathbf{w}_k^\top \mathbf{x}$。Softmax 把这些得分变成一组概率:

$$ P(y = k \mid \mathbf{x}) = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}. $$

Softmax 是 软化的 argmax:先取指数(保证为正),再归一化(保证求和为 1)。最大的得分获得最多概率质量,但每个类别仍能分到一点。

K=3 时的 Softmax 概率单纯形与若干 logits 示例

几何上,每个 Softmax 输出都是概率单纯形上的一点——上图就是 $K = 3$ 时的三角形。三个顶点对应"完全确定"的预测,正中央的 $(1/3, 1/3, 1/3)$ 是最不确定的状态;图中的三组示例 logits 展示了"得分越集中,决策越清晰"这一直觉。

4.2 One-Hot 标签下的交叉熵

真实类别为 $c$ 时,把它编成 one-hot 向量 $\mathbf{t}$,$t_k = \mathbb{1}[k = c]$。损失为

$$ \mathcal{L} = -\sum_{k=1}^K t_k \ln P(y = k \mid \mathbf{x}) = -\ln P(y = c \mid \mathbf{x}) = -z_c + \ln \sum_{j=1}^K e^{z_j}. $$

这就是多分类的负对数似然(NLL)

4.3 Softmax 梯度——同样的优雅形式

对 $z_k$ 求导:

  • 当 $k = c$:$\dfrac{\partial \mathcal{L}}{\partial z_c} = -1 + P_c$。
  • 当 $k \neq c$:$\dfrac{\partial \mathcal{L}}{\partial z_k} = P_k$。

两种情况合写成一行:

$$ \boxed{\;\frac{\partial \mathcal{L}}{\partial z_k} = P_k - t_k.\;} $$

形式上和二分类一模一样——预测概率减去真实标签。再通过 $z_k = \mathbf{w}_k^\top \mathbf{x}$ 把梯度传到权重上:

$$ \nabla_{\mathbf{W}} \mathcal{L} = \frac{1}{N}\,\mathbf{X}^\top(\hat{\mathbf{Y}} - \mathbf{T}), $$

其中 $\mathbf{W} \in \mathbb{R}^{d \times K}$ 把每个类别的权重向量按列堆起来。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def stable_softmax(z):
    z = z - z.max(axis=-1, keepdims=True)
    e = np.exp(z)
    return e / e.sum(axis=-1, keepdims=True)

K, c = 4, 2
z = np.random.randn(K)
t = np.eye(K)[c]
grad_ana = stable_softmax(z) - t

eps, grad_num = 1e-5, np.zeros(K)
for k in range(K):
    e = np.zeros(K); e[k] = eps
    grad_num[k] = (-np.log(stable_softmax(z + e)[c])
                   + np.log(stable_softmax(z - e)[c])) / (2 * eps)

print(f"最大差距: {np.max(np.abs(grad_ana - grad_num)):.2e}")

5. 正则化

5.1 L2 正则化(岭回归)

$$ \mathcal{L}_{\text{reg}} = \mathcal{L} + \frac{\lambda}{2}\|\mathbf{w}\|_2^2. $$

梯度多出 $\lambda \mathbf{w}$ 一项,SGD 更新就变成了权重衰减

$$ \mathbf{w} \leftarrow (1 - \eta\lambda)\mathbf{w} - \frac{\eta}{N}\mathbf{X}^\top(\hat{\mathbf{y}} - \mathbf{y}). $$

贝叶斯解释。 L2 等价于在 $\mathbf{w} \sim \mathcal{N}(\mathbf{0}, \tfrac{1}{\lambda}\mathbf{I})$ 这一高斯先验下做 MAP 估计。

5.2 L1 正则化(Lasso)

$$ \mathcal{L}_{\text{reg}} = \mathcal{L} + \lambda \|\mathbf{w}\|_1. $$

L1 在零点不可导,用次梯度 $\partial_{w_j}\|\mathbf{w}\|_1 = \operatorname{sign}(w_j)$,再做 proximal/软阈值更新。L1 在原点的"尖角"会把许多系数精确推到零,从而实现自动特征选择。

贝叶斯解释。 L1 对应拉普拉斯先验 $p(w_j) \propto e^{-\lambda|w_j|}$;零点处的尖峰正是稀疏性的来源。

5.3 Elastic Net

$$ \mathcal{L}_{\text{reg}} = \mathcal{L} + \lambda_1 \|\mathbf{w}\|_1 + \frac{\lambda_2}{2}\|\mathbf{w}\|_2^2. $$

把 L1 的稀疏性和 L2 的稳定性合在一起,特别适合特征高度相关的场景。


6. 决策边界与几何

6.1 二分类边界

逻辑回归在 $\hat y \geq 0.5$ 时预测正类,也就是 $\mathbf{w}^\top \mathbf{x} \geq 0$。所以决策边界是超平面

$$ \mathbf{w}^\top \mathbf{x} + b = 0. $$

样本点 $\mathbf{x}_0$ 到边界的有符号距离为

$$ d = \frac{\mathbf{w}^\top \mathbf{x}_0 + b}{\|\mathbf{w}\|}, $$

而 $|d|$ 衡量的就是模型分类的"置信度"。

线性分类器视角下的逻辑回归:法向量与有符号距离

上图把三件事一次讲清楚:

  1. 决策边界就是一条超平面(二维下是一条直线)。
  2. 权重向量 $\mathbf{w}$ 就是这条超平面的法向量
  3. 范数 $\|\mathbf{w}\|$ 决定了概率过渡的陡峭程度:$\|\mathbf{w}\|$ 越大,从 $\hat y \approx 0.27$ 到 $\hat y \approx 0.73$ 的"过渡带"就越窄。

6.2 多分类决策区域

对 Softmax 回归来说,“对 $z_k$ 取 argmax"这一规则把特征空间划分成 $K$ 个凸区域。类别 $j$ 与类别 $k$ 之间的分界面是超平面

$$ (\mathbf{w}_j - \mathbf{w}_k)^\top \mathbf{x} + (b_j - b_k) = 0, $$

所以两两边界全都是线性的。


7. 模型评估

7.1 混淆矩阵和核心指标

二分类下:

预测为正预测为负
实际为正TPFN
实际为负FPTN
$$ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}, \quad \text{Precision} = \frac{TP}{TP + FP}, \quad \text{Recall} = \frac{TP}{TP + FN}, \quad F_1 = \frac{2 \cdot \text{Prec} \cdot \text{Rec}}{\text{Prec} + \text{Rec}}. $$

把精确率读作"我标记出来的,有多少是真的?",召回率读作"真的那些,我抓到了多少?"。只优化其中一个几乎一定是错的。

7.2 类别不平衡:准确率会撒谎

类别极度不平衡下两个分类器的混淆矩阵

当正类很稀少(比如 95% 负样本,5% 正样本),一个只会预测负类的傻瓜分类器都能拿到 95% 的准确率,但它实际上一个正样本都没找到,根本没用。右边训练后的模型牺牲了一点点准确率,却真正解决了问题——它的 $F_1$ 远远更高,即使准确率更低。结论:类别不平衡时,accuracy 必须和 precision / recall / $F_1$ 一起看。

7.3 ROC、PR 与 AUC

扫动阈值 $\tau$("$\hat y \geq \tau$ 才判正”),可以画出两条曲线:

  • ROC:以 FPR ($= FP/(FP+TN)$) 为横轴、TPR ($= \text{Recall}$) 为纵轴。
  • PR:以 recall 为横轴、precision 为纵轴。

ROC 曲线与 PR 曲线,并阴影标出 AUC 区域

AUC 是 ROC 曲线下的面积。AUC = 1 表示完美排序,AUC = 0.5 表示随机猜测。它有一个干净的概率含义:AUC 等于"随机抽一个正样本和一个负样本,正样本得分高于负样本的概率"。

正类极度稀少时,PR 曲线和平均精度(AP)通常比 ROC 更有信息量——因为 ROC 中 FPR 的分母 $FP + TN$ 被巨量负样本主导,模型间的差异都被淹没了。


8. 实现细节

8.1 数值稳定的 Sigmoid

$z$ 很负时 $e^{-z}$ 会上溢,需要分支处理:

1
2
3
4
5
6
def stable_sigmoid(z):
    return np.where(
        z >= 0,
        1 / (1 + np.exp(-z)),
        np.exp(z) / (1 + np.exp(z)),
    )

8.2 数值稳定的 Softmax

直接计算 $e^{z_k}$ 在 logits 很大时会上溢。利用 Softmax 的平移不变性 $\operatorname{softmax}(z) = \operatorname{softmax}(z - \max_j z_j)$:

1
2
3
4
def stable_softmax(z):
    z = z - np.max(z, axis=-1, keepdims=True)
    e = np.exp(z)
    return e / np.sum(e, axis=-1, keepdims=True)

8.3 完整的二分类实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np

class LogisticRegression:
    def __init__(self, learning_rate=0.01, n_iterations=1000,
                 regularization='l2', lambda_reg=0.01):
        self.lr, self.n_iter = learning_rate, n_iterations
        self.reg, self.lambda_reg = regularization, lambda_reg
        self.w = None

    def _sigmoid(self, z):
        return np.where(z >= 0,
                        1 / (1 + np.exp(-z)),
                        np.exp(z) / (1 + np.exp(z)))

    def fit(self, X, y):
        N, d = X.shape
        self.w = np.zeros(d)
        for _ in range(self.n_iter):
            y_hat = self._sigmoid(X @ self.w)
            grad = X.T @ (y_hat - y) / N
            if self.reg == 'l2':
                grad += self.lambda_reg * self.w
            elif self.reg == 'l1':
                grad += self.lambda_reg * np.sign(self.w)
            self.w -= self.lr * grad

    def predict_proba(self, X):
        return self._sigmoid(X @ self.w)

    def predict(self, X, threshold=0.5):
        return (self.predict_proba(X) >= threshold).astype(int)

8.4 完整的多分类实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class SoftmaxRegression:
    def __init__(self, learning_rate=0.01, n_iterations=1000,
                 lambda_reg=0.01):
        self.lr, self.n_iter = learning_rate, n_iterations
        self.lambda_reg = lambda_reg
        self.W = None

    def _softmax(self, Z):
        Z = Z - Z.max(axis=1, keepdims=True)
        e = np.exp(Z)
        return e / e.sum(axis=1, keepdims=True)

    def fit(self, X, y):
        N, d = X.shape
        K = int(y.max()) + 1
        self.W = np.zeros((d, K))
        T = np.zeros((N, K)); T[np.arange(N), y] = 1
        for _ in range(self.n_iter):
            Y_hat = self._softmax(X @ self.W)
            grad = X.T @ (Y_hat - T) / N + self.lambda_reg * self.W
            self.W -= self.lr * grad

    def predict_proba(self, X):
        return self._softmax(X @ self.W)

    def predict(self, X):
        return np.argmax(self.predict_proba(X), axis=1)

9. 习题

习题 1 — Sigmoid 性质

题目: 证明 $\sigma'(z) = \sigma(z)(1 - \sigma(z))$ 与 $\sigma(-z) = 1 - \sigma(z)$。

解答:

$$ \sigma'(z) = \frac{e^{-z}}{(1+e^{-z})^2} = \sigma(z)\bigl(1-\sigma(z)\bigr), \qquad \sigma(-z) = \frac{1}{1+e^{z}} = 1 - \sigma(z). \quad\square $$

习题 2 — 从 MLE 推导交叉熵

题目: 从最大似然估计出发,推导二分类逻辑回归的交叉熵损失。

解答: 似然 $L = \prod_i \hat y_i^{y_i}(1-\hat y_i)^{1-y_i}$。取对数、取负、取均值:

$$ \mathcal{L} = -\frac{1}{N}\sum_i \bigl[y_i \ln \hat y_i + (1 - y_i)\ln(1 - \hat y_i)\bigr]. \quad\square $$

习题 3 — Softmax 梯度

题目: 推导 Softmax 交叉熵的 $\partial \mathcal{L} / \partial z_k$。

解答: 设 $P_k = e^{z_k}/\sum_j e^{z_j}$,$\mathcal{L} = -\ln P_c$,则

$$ \frac{\partial \mathcal{L}}{\partial z_k} = P_k - \mathbb{1}[k = c] = P_k - t_k, $$

形式上与二分类的梯度完全一致。

习题 4 — 正则化的贝叶斯先验

题目: L2 与 L1 正则化分别对应什么先验?

解答: L2 对应高斯先验 $\mathbf{w} \sim \mathcal{N}(\mathbf{0}, \lambda^{-1}\mathbf{I})$,因为 $-\ln p(\mathbf{w}) \propto \tfrac{\lambda}{2}\|\mathbf{w}\|^2$。L1 对应拉普拉斯先验 $p(w_j) \propto e^{-\lambda|w_j|}$;零点处的尖峰正是 MAP 解会精确为零(即稀疏)的原因。

习题 5 — 决策边界

题目: 证明 $\mathbf{w}^\top\mathbf{x} + b = 0$ 是超平面,并说明 $\mathbf{w}$ 的方向与 $\|\mathbf{w}\|$ 各自起什么作用。

解答: 该集合是一个仿射超平面,法向量为 $\mathbf{w}$,偏置由 $b$ 控制。$\mathbf{w}$ 的方向决定超平面的朝向;$\|\mathbf{w}\|$ 决定 Sigmoid 过渡的陡峭程度($\|\mathbf{w}\|$ 越大,$\hat y$ 从 $0$ 跳到 $1$ 的过渡区越窄)。$\mathbf{x}_0$ 到边界的有符号距离为 $d = (\mathbf{w}^\top\mathbf{x}_0 + b)/\|\mathbf{w}\|$。


Q&A

为什么叫"逻辑回归",明明是分类?

历史包袱。最早 logistic 函数被用来对概率做回归,分类是后来才扩展出去的应用,但名字保留下来了。

和线性回归的本质区别在哪?

在输出空间和似然假设。线性回归假设连续目标 + 高斯噪声(MSE = 高斯负对数似然);逻辑回归假设伯努利标签(CE = 伯努利负对数似然)。两者都是广义线性模型 (GLM) 的特例,区别只在链接函数和噪声分布。

逻辑回归能拟合非线性边界吗?

单纯的逻辑回归不行——它的边界永远是输入空间里的超平面。但你可以通过 (a) 多项式特征、(b) 核方法、(c) 把它套进神经网络的某一层,得到任意非线性的决策边界,同时保留交叉熵损失。

Softmax 和多个独立 Sigmoid 该怎么选?

Softmax 强制 $\sum_k P_k = 1$,适用于互斥的单标签分类;多个独立 Sigmoid 允许标签之间没有约束,适用于多标签分类(一张图既可以是"户外"也可以是"晴天")。

正则化系数 $\lambda$ 怎么选?

交叉验证。在 $\lambda \in \{10^{-4}, 10^{-3}, \dots, 10^{2}\}$ 上扫一遍,选验证集损失最低的那个(不平衡数据用 AUC 选)。

逻辑回归为什么是凸优化问题?

Hessian $\nabla^2 \mathcal{L} = \tfrac{1}{N}\mathbf{X}^\top \mathbf{S}\,\mathbf{X}$ 半正定,因为对角元 $\hat y_i(1 - \hat y_i) \in (0, 1/4]$ 非负。凸性保证:任何局部最优都是全局最优。

逻辑回归 vs SVM?

维度逻辑回归SVM
损失交叉熵Hinge loss
输出校准过的概率决策值(无概率含义)
稀疏性所有样本都贡献梯度只有支持向量贡献
核技巧需要改造天然支持
适用场景需要概率估计、下游做校准硬分类、复杂非线性边界

参考文献

  • Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer. Chapter 4.
  • Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.). Springer. Chapter 4.
  • Murphy, K. P. (2012). Machine Learning: A Probabilistic Perspective. MIT Press. Chapter 8.
  • Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. Chapter 5.
  • Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley.

系列导航

主题链接
5线性回归<- 上一篇
6逻辑回归与分类当前位置
7决策树下一篇 ->
8支持向量机前往 ->
9朴素贝叶斯前往 ->

Liked this piece?

Follow on GitHub for the next one — usually one a week.

GitHub