配音

Lecture 6-7:生成学习与朴素贝叶斯

课程简介

GDA 高斯判别分析、朴素贝叶斯、拉普拉斯平滑。

🎬 本课程视频:Stanford CS229 — 斯坦福机器学习


一、判别学习与生成学习

1.1 两种学习范式

之前学习的算法都属于判别学习算法(Discriminative Learning)——直接学习 $P(y|x)$ 或 $h_\theta(x)$。

生成学习算法(Generative Learning)建模 $P(x|y)$ 和 $P(y)$,通过贝叶斯定理计算 $P(y|x)$:

$$P(y|x) = \frac{P(x|y) P(y)}{P(x)}$$

对于二分类:

$$P(y=1|x) = \frac{P(x|y=1) P(y=1)}{P(x|y=1) P(y=1) + P(x|y=0) P(y=0)}$$

1.2 直观对比

判别方法关注"类别之间的边界在哪里",生成方法关注"每个类别的数据是如何生成的"。

区分大象和狗的例子:
- 判别方法:学习一条决策边界
- 生成方法:分别建立大象模型和狗模型

二、高斯判别分析(GDA)

2.1 模型假设

GDA 假设 $P(x|y)$ 服从多元高斯分布:

$$y \sim \text{Bernoulli}(\phi)$$
$$x|y=0 \sim \mathcal{N}(\mu_0, \Sigma)$$
$$x|y=1 \sim \mathcal{N}(\mu_1, \Sigma)$$

其中 $\phi$ 是 $y=1$ 的概率,$\mu_0$ 和 $\mu_1$ 是均值,$\Sigma$ 是共享协方差矩阵。

多元高斯分布的概率密度函数:

$$P(x|y=k) = \frac{1}{(2\pi)^{n/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2} (x-\mu_k)^T \Sigma^{-1} (x-\mu_k)\right)$$

2.2 参数估计

通过最大化对数似然得到参数估计:

$$\phi = \frac{1}{m} \sum_{i=1}^{m} 1{y^{(i)} = 1}$$

$$\mu_0 = \frac{\sum_{i=1}^{m} 1{y^{(i)} = 0} x^{(i)}}{\sum_{i=1}^{m} 1{y^{(i)} = 0}}$$

$$\mu_1 = \frac{\sum_{i=1}^{m} 1{y^{(i)} = 1} x^{(i)}}{\sum_{i=1}^{m} 1{y^{(i)} = 1}}$$

$$\Sigma = \frac{1}{m} \sum_{i=1}^{m} (x^{(i)} - \mu_{y^{(i)}})(x^{(i)} - \mu_{y^{(i)}})^T$$

2.3 决策边界

GDA 的 $P(y=1|x)$ 是 Sigmoid 函数作用于输入的线性函数——决策边界是线性的。

2.4 GDA vs 逻辑回归

方面 GDA 逻辑回归
假设 $P(x y)$ 服从高斯分布
效率 数据服从高斯时更高效 更鲁棒
数据量 少数据时更好 大数据时更好
训练 闭式解 需要迭代

关键 insight:如果数据真的服从高斯分布,GDA 只需约 1/3 的数据就能达到逻辑回归的准确率。

三、朴素贝叶斯

3.1 文本分类问题

朴素贝叶斯是文本分类中最经典的算法。考虑垃圾邮件分类:

词袋模型(Bag of Words):设词汇表大小为 $n$,

$$x_j = \begin{cases} 1, & \text{词 $j$ 出现在邮件中} \ 0, & \text{没有出现} \end{cases}$$

3.2 朴素贝叶斯假设

特征条件独立假设:在给定类别 $y$ 的条件下,每个特征 $x_j$ 相互独立。

$$P(x_1, x_2, ..., x_n | y) = \prod_{j=1}^{n} P(x_j | y)$$

这个假设显然不成立,但算法仍然表现良好。

3.3 参数估计

$$\phi_{j|y=1} = \frac{\sum_{i=1}^{m} 1{x_j^{(i)} = 1 \land y^{(i)} = 1}}{\sum_{i=1}^{m} 1{y^{(i)} = 1}}$$

$$\phi_{j|y=0} = \frac{\sum_{i=1}^{m} 1{x_j^{(i)} = 1 \land y^{(i)} = 0}}{\sum_{i=1}^{m} 1{y^{(i)} = 0}}$$

$$\phi_y = \frac{\sum_{i=1}^{m} 1{y^{(i)} = 1}}{m}$$

预测时计算 $P(y=1|x) = \frac{P(x|y=1) P(y=1)}{P(x)}$。

3.4 拉普拉斯平滑

问题:如果测试邮件中出现训练集从未见过的词,概率变为 0。

解决方案:拉普拉斯平滑(Laplacian Smoothing)——在每个计数上加 1:

$$\phi_{j|y=1} = \frac{\sum_{i=1}^{m} 1{x_j^{(i)} = 1 \land y^{(i)} = 1} + 1}{\sum_{i=1}^{m} 1{y^{(i)} = 1} + 2}$$

更一般地,如果 $x_j$ 有 $k$ 个取值:

$$\phi_{j|y} = \frac{\text{count}(x_j, y) + 1}{\text{count}(y) + k}$$

拉普拉斯平滑保证所有词的概率为正数,本质上是添加 Dirichlet 先验。

3.5 多项式事件模型

变体:$x_i$ 表示邮件中第 $i$ 个位置的词在词汇表中的索引。

参数:
- $\phi_y = P(y)$
- $\phi_{k|y} = P(\text{词}=k | y)$

似然函数:

$$P(x, y) = P(y) \prod_{i=1}^{n} P(x_i | y)$$

这个模型利用了词的频率信息,而不仅仅是是否出现。

class NaiveBayes:
    def __init__(self, vocab_size, smooth=1.0):
        self.V = vocab_size
        self.smooth = smooth

    def fit(self, X, y):
        m = len(y)
        self.phi_y = np.mean(y)
        count_y1 = X[y == 1].sum(axis=0)
        count_y0 = X[y == 0].sum(axis=0)
        n_y1 = (y == 1).sum()
        n_y0 = (y == 0).sum()
        self.phi_j_y1 = (count_y1 + self.smooth) / (n_y1 + self.smooth * 2)
        self.phi_j_y0 = (count_y0 + self.smooth) / (n_y0 + self.smooth * 2)

    def predict(self, X):
        log_p1 = np.log(self.phi_y) + X @ np.log(self.phi_j_y1) + (1-X) @ np.log(1-self.phi_j_y1)
        log_p0 = np.log(1-self.phi_y) + X @ np.log(self.phi_j_y0) + (1-X) @ np.log(1-self.phi_j_y0)
        return (log_p1 > log_p0).astype(int)

四、总结

  1. 生成学习 建模 $P(x|y)$ 和 $P(y)$,通过贝叶斯定理做分类
  2. GDA 假设每类数据服从高斯分布,$n$ 较小时效果好
  3. 朴素贝叶斯 假设特征条件独立,特别适合文本分类
  4. 拉普拉斯平滑 解决零概率问题
  5. GDA 和逻辑回归的决策边界都是线性的

五、生成学习 vs 判别学习的深入讨论

5.1 什么时候选择生成算法

生成学习算法在以下场景中具有优势:

  1. 小样本学习:当训练数据较少时,生成算法通过更强的假设(数据分布形式)弥补数据不足
  2. 缺失特征处理:生成模型可以自然地处理缺失特征——通过边缘化缺失特征来计算概率
  3. 异常检测:生成模型可以计算 $P(x)$,当概率低于阈值时判定为异常
  4. 半监督学习:生成模型可以利用未标注数据来改进分布估计

5.2 什么时候选择判别算法

  1. 充足数据:当数据量足够大时,判别算法通常表现更好,因为它不依赖于可能错误的数据分布假设
  2. 复杂特征关系:当特征关系复杂,难以用简单分布建模时
  3. 重点关注分类边界:如果目标是精确分类而非理解数据生成过程

5.3 经验法则

Andrew Ng 和 Michael Jordan 的研究表明:随着训练数据量的增加,判别算法的渐近性能通常优于生成算法。但在数据量较少的情况下,生成算法凭借其更强的假设往往表现更好。

5.4 文本分类实战建议

使用朴素贝叶斯进行文本分类时,以下技巧可以提升效果:

朴素贝叶斯虽然假设简单,但在文本分类任务中,配合这些工程技巧,效果往往能媲美甚至超过更复杂的模型,而训练和推理速度却快得多。

文本分类中的实践考量

在文本分类中应用朴素贝叶斯时,有几个重要的实践要点。首先是特征选择——虽然朴素贝叶斯可以处理高维特征,但去除停用词(如"的"、"是"、"在"等高频但信息量低的词)可以显著降低噪声。其次是 N-gram 特征扩展——除了单个词(Unigram),我们还可以使用相邻词对(Bigram)作为特征,捕捉"不____好"这样的否定结构。

朴素贝叶斯的一个有趣变体是多项式朴素贝叶斯(Multinomial Naive Bayes),它直接对词频进行建模,而不是使用词是否出现的二元指示。在文本分类任务中,多项朴素贝叶斯通常比伯努利朴素贝叶斯表现更好,因为它利用了词频这一额外信息。另一个重要变体是互补朴素贝叶斯(Complement Naive Bayes),它通过使用互补集(非该类的数据)来估计参数,特别适合不平衡数据集。

朴素贝叶斯的优缺点总结

朴素贝叶斯的最大优势是简单、快速、在特征条件独立假设下是最优分类器。即使在假设不成立时,它往往仍然表现良好——因为分类决策通常对概率估计的精度不敏感。它的主要缺点包括:无法学习特征之间的交互关系(因为条件独立假设忽略了特征相关性);在特征高度相关的场景下(如图像数据)表现不佳;对于罕见词(没有在训练集中出现的词),零概率问题虽然可以通过拉普拉斯平滑缓解但无法完全消除。尽管如此,朴素贝叶斯仍然是文本分类、垃圾邮件过滤、情感分析等任务的基线算法——任何一个新的分类器首先要击败它。

延伸阅读