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)
四、总结
- 生成学习 建模 $P(x|y)$ 和 $P(y)$,通过贝叶斯定理做分类
- GDA 假设每类数据服从高斯分布,$n$ 较小时效果好
- 朴素贝叶斯 假设特征条件独立,特别适合文本分类
- 拉普拉斯平滑 解决零概率问题
- GDA 和逻辑回归的决策边界都是线性的
五、生成学习 vs 判别学习的深入讨论
5.1 什么时候选择生成算法
生成学习算法在以下场景中具有优势:
- 小样本学习:当训练数据较少时,生成算法通过更强的假设(数据分布形式)弥补数据不足
- 缺失特征处理:生成模型可以自然地处理缺失特征——通过边缘化缺失特征来计算概率
- 异常检测:生成模型可以计算 $P(x)$,当概率低于阈值时判定为异常
- 半监督学习:生成模型可以利用未标注数据来改进分布估计
5.2 什么时候选择判别算法
- 充足数据:当数据量足够大时,判别算法通常表现更好,因为它不依赖于可能错误的数据分布假设
- 复杂特征关系:当特征关系复杂,难以用简单分布建模时
- 重点关注分类边界:如果目标是精确分类而非理解数据生成过程
5.3 经验法则
Andrew Ng 和 Michael Jordan 的研究表明:随着训练数据量的增加,判别算法的渐近性能通常优于生成算法。但在数据量较少的情况下,生成算法凭借其更强的假设往往表现更好。
5.4 文本分类实战建议
使用朴素贝叶斯进行文本分类时,以下技巧可以提升效果:
- n-gram 特征:不仅使用单个词作为特征,还考虑相邻词的组合(二元组、三元组)
- TF-IDF 加权:不仅考虑词是否出现,还考虑词频和逆文档频率
- 停用词移除:移除"的"、"是"、"在"等高频无意义词
- 词干提取/词形还原:将不同词形的词规约为统一形式
- 文本预处理:小写化、去标点、处理表情符号
朴素贝叶斯虽然假设简单,但在文本分类任务中,配合这些工程技巧,效果往往能媲美甚至超过更复杂的模型,而训练和推理速度却快得多。
文本分类中的实践考量
在文本分类中应用朴素贝叶斯时,有几个重要的实践要点。首先是特征选择——虽然朴素贝叶斯可以处理高维特征,但去除停用词(如"的"、"是"、"在"等高频但信息量低的词)可以显著降低噪声。其次是 N-gram 特征扩展——除了单个词(Unigram),我们还可以使用相邻词对(Bigram)作为特征,捕捉"不____好"这样的否定结构。
朴素贝叶斯的一个有趣变体是多项式朴素贝叶斯(Multinomial Naive Bayes),它直接对词频进行建模,而不是使用词是否出现的二元指示。在文本分类任务中,多项朴素贝叶斯通常比伯努利朴素贝叶斯表现更好,因为它利用了词频这一额外信息。另一个重要变体是互补朴素贝叶斯(Complement Naive Bayes),它通过使用互补集(非该类的数据)来估计参数,特别适合不平衡数据集。
朴素贝叶斯的优缺点总结
朴素贝叶斯的最大优势是简单、快速、在特征条件独立假设下是最优分类器。即使在假设不成立时,它往往仍然表现良好——因为分类决策通常对概率估计的精度不敏感。它的主要缺点包括:无法学习特征之间的交互关系(因为条件独立假设忽略了特征相关性);在特征高度相关的场景下(如图像数据)表现不佳;对于罕见词(没有在训练集中出现的词),零概率问题虽然可以通过拉普拉斯平滑缓解但无法完全消除。尽管如此,朴素贝叶斯仍然是文本分类、垃圾邮件过滤、情感分析等任务的基线算法——任何一个新的分类器首先要击败它。
延伸阅读
- 📺 B 站播放列表:Stanford CS229 — 斯坦福机器学习
- 📚 更多学习资源,请访问 deeplearning.ai 官网