生成式学习算法
判别式模型 vs. 生成式模型
在分类问题中,我们的最终目标是确定样本 $x$ 属于类别 $y$ 的概率。
判别式模型 (Discriminative Learning Algorithms)
- 目标: 直接学习 $p(y|x)$ 或从输入空间 $X$ 到标签 ${0, 1}$ 的映射。
- 直觉: 寻找不同类别之间的 决策边界(Decision Boundary) 。
- 例子: “我不需要知道大象长什么样,我只需要知道大象和狗之间那条区分的线在哪里。”
- 代表算法: 逻辑回归 (Logistic Regression)、感知机 (Perceptron)、SVM。
生成式模型 (Generative Learning Algorithms)
- 目标: 学习 $p(x|y)$(给定类别下特征的分布)和 $p(y)$(类别的先验概率)。
- 直觉: 学习每一个类别 具体的特征模型 。
- 例子: “我先学习大象长什么样,再学习狗长什么样。新来一个动物时,看它更像谁。”
- 代表算法: 朴素贝叶斯 (Naive Bayes)、高斯判别分析 (GDA)、HMM。
Q: 为什么有了判别式模型我们却还需要生成式模型呢?
A:
- 更高的数据效率
- 收敛快: 当模型假设(如高斯分布)与实际数据吻合时,生成式模型通常比判别式模型需要更少的训练数据就能达到较好的效果。
- 半监督学习: 它们能更好地利用无标注数据来建模特征分布 $p(x)$。
- 更强的鲁棒性与灵活性
- 处理缺失值: 如果某些特征 $x$ 缺失,生成式模型可以通过联合分布 $p(x, y)$ 进行推断,而判别式模型往往直接失效。
- 应对先验变化: 如果目标类别的比例(如患病率)发生改变,生成式模型只需调整 $p(y)$,无需重新训练整个模型。
- 异常检测(知其所以然)
- 识别“异类”: 通过计算 $p(x)$,模型可以判断某个样本是否属于训练分布。如果 $p(x)$ 极低,系统可以报警“我不认识这个东西”,而判别式模型只会强行将其划线归类。
- 具备“生成”能力
- 采样与创作: 判别式模型只能做“判卷人”,而生成式模型可以做“创作者”,生成符合分布的新样本(如现在的生成式 AI、GAN 等)。
生成式模型本身不直接给出 $p(y|x)$,它需要通过贝叶斯定理(Bayes’ Rule)进行转化:
$$
p(y|x) = \frac{p(x|y)p(y)}{p(x)}
$$
根据全概率公式,分母 $p(x)$ 可以表示为所有可能类别的概率之和:
$$
p(x) = p(x|y=1)p(y=1) + p(x|y=0)p(y=0)
$$
在实际进行预测(Prediction)时,我们只需要求出使 $p(y|x)$ 最大的 $y$:
$$
\arg \max_y p(y|x) = \arg \max_y \frac{p(x|y)p(y)}{p(x)}
$$
关键结论:
由于分母 $p(x)$ 与 $y$ 的取值无关(对于固定的 $x$,分母是一个常数),因此在比较大小时可以忽略:
$$
\arg \max_y p(y|x) = \arg \max_y p(x|y)p(y)
$$
注意: 这一步大大减少了计算量,也是生成式分类器的核心决策逻辑。
多元高斯分布 GDA
对于一个 $d$ 维的随机向量 $x \in \mathbb{R}^d$,如果它服从多元高斯分布,其概率密度函数(PDF)为:
$$
p(x; \mu, \Sigma) = \frac{1}{(2\pi)^{d/2} |\Sigma|^{1/2}} \exp \left( -\frac{1}{2}(x - \mu)^T \Sigma^{-1} (x - \mu) \right)
$$
参数解析:
- 均值向量 $\mu \in \mathbb{R}^d$: 决定了分布的 中心位置 ,即 $E[x] = \mu$。
- 协方差矩阵 $\Sigma \in \mathbb{R}^{d \times d}$: 决定了分布的 形状和方向 。
- $\Sigma$ 必须是对称正定的(Symmetric Positive Definite)。
- 对角线元素 $\Sigma_{ii}$ 是第 $i$ 个维度的方差。
- 非对角线元素 $\Sigma_{ij}$ 是维度 $i$ 和 $j$ 之间的协方差。
多元高斯分布的等高线(Contour Lines)是一个个 超椭圆 。椭圆的形状完全由 $\Sigma$ 决定:
- 对角阵(Diagonal $\Sigma$): 椭圆的轴与坐标轴平行。如果对角线元素相等,则等高线是正圆。
- 非对角阵(Full $\Sigma$): 椭圆发生了旋转,表示不同维度之间存在相关性。
核心直觉:特征值与特征向量
- $\Sigma$ 的特征向量决定了椭圆轴的方向。
- $\Sigma$ 的特征值决定了椭圆在对应轴方向上的“长度”(即伸缩程度)。
GDA与逻辑回归
GDA 模型与逻辑回归有着有趣的关系。如果我们把后验概率 $p(y=1|x)$ 看作关于 $x$ 的函数,你会发现它可以表达为:
$$
p(y = 1|x; \phi, \Sigma, \mu_0, \mu_1) = \frac{1}{1 + \exp(-\theta^T x)}
$$
这正是逻辑回归——一种判别式算法——用来建模的形式。
我们该如何选择?
当在同一数据集上训练时,GDA 和逻辑回归通常会给出不同的决策边界。谁更好?
- 前提: 如果 $p(x|y)$ 确实服从多元高斯分布(且协方差矩阵 $\Sigma$ 共享),那么 $p(y|x)$ 必然符合逻辑回归函数的形式。
- 反之不然: 即使 $p(y|x)$ 是逻辑回归函数,也不能说明 $p(x|y)$ 是高斯分布。
- GDA 的特点: 做了更强的模型假设。如果假设正确(数据确实是高斯分布),GDA 拟合更好且 数据效率更高 (需要更少的训练数据)。在数据量极大时,没有算法能比 GDA 更精准。
- 逻辑回归的特点: 假设较弱,因此更 鲁棒 (Robust) 。许多不同的假设(如 Poisson 分布)都能推导出逻辑回归形式。在数据非高斯分布且数据量较大时,逻辑回归通常表现更好。
证明:
从贝叶斯定理出发
根据贝叶斯定理,后验概率 $p(y=1|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)}
$$
为了凑出 Sigmoid 函数 $1 / (1 + e^{-z})$ 的形式,我们将分子分母同时除以分子:
$$
p(y=1|x) = \frac{1}{1 + \frac{p(x|y=0)p(y=0)}{p(x|y=1)p(y=1)}} = \frac{1}{1 + \exp\left( - \ln \frac{p(x|y=1)p(y=1)}{p(x|y=0)p(y=0)} \right)}
$$
此时,我们只需要证明括号里的对数项 $\ln \frac{p(x|y=1)p(y=1)}{p(x|y=0)p(y=0)}$ 是关于 $x$ 的线性函数 $\theta^T x$ 即可。
带入高斯分布假设
在 GDA 中,我们假设 $p(x|y)$ 服从多元高斯分布,且 协方差矩阵 $\Sigma$ 相同 :
$$
p(x|y=k) = \frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}} \exp \left( -\frac{1}{2}(x-\mu_k)^T \Sigma^{-1} (x-\mu_k) \right)
$$
将此公式带入对数项中:
$$
\ln \frac{p(x|y=1)p(y=1)}{p(x|y=0)p(y=0)} = \ln \frac{p(x|y=1)}{p(x|y=0)} + \ln \frac{p(y=1)}{p(y=0)}
$$
重点看第一项(似然比的对数):
$$
\ln \frac{p(x|y=1)}{p(x|y=0)} = \left[ -\frac{1}{2}(x-\mu_1)^T \Sigma^{-1} (x-\mu_1) \right] - \left[ -\frac{1}{2}(x-\mu_0)^T \Sigma^{-1} (x-\mu_0) \right]
$$
(注:系数 $\frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}}$ 在分子分母中完全抵消了。)
展开并合并同类项
展开二次型 $(x-\mu)^T \Sigma^{-1} (x-\mu) = x^T \Sigma^{-1} x - 2\mu^T \Sigma^{-1} x + \mu^T \Sigma^{-1} \mu$:
- 二次项消去: 注意到两个括号里都有 $-\frac{1}{2}x^T \Sigma^{-1} x$,它们会 相互抵消 。这就是为什么决策边界是线性的关键——因为 $\Sigma$ 相同。
- 线性项与常数项:
剩余部分为:$(\mu_1 - \mu_0)^T \Sigma^{-1} x - \frac{1}{2}\mu_1^T \Sigma^{-1} \mu_1 + \frac{1}{2}\mu_0^T \Sigma^{-1} \mu_0$。
结论:构造 $\theta$
将上述结果连同先验概率的对数项 $\ln \frac{\phi}{1-\phi}$ 合并,你会发现它确实呈现 $\theta^T x + \theta_0$ 的形式:
- 权重向量: $\theta = \Sigma^{-1}(\mu_1 - \mu_0)$
- 偏置项: $\theta_0 = -\frac{1}{2}\mu_1^T \Sigma^{-1} \mu_1 + \frac{1}{2}\mu_0^T \Sigma^{-1} \mu_0 + \ln \frac{\phi}{1-\phi}$
最终得到:
$$
p(y=1|x) = \frac{1}{1 + \exp(-(\theta^T x + \theta_0))}
$$
朴素贝叶斯
基本实现
在GDA中,特征x是连续的实数向量,下面讨论离散的x。
以垃圾邮件过滤为例:
- 特征向量 $x$: 其长度等于词汇表(Dictionary)的大小。如果邮件包含词汇表中第 $j$ 个词,则 $x_j=1$,否则 $x_j=0$。
- 维度灾难: 假设词汇表有 50,000 个词,则 $x$ 有 $2^{50000}$ 种可能的组合。如果直接建模,参数量多到无法计算。
例如,向量:
$$
x= \begin{bmatrix} 1 \ 0 \ 0 \ \vdots \ 1 \ \vdots \ 0 \end{bmatrix} \begin{matrix} \text{a} \ \text{aardvark} \ \text{aardwolf} \ \vdots \ \text{buy} \ \vdots \ \text{zygmurgy} \end{matrix}
$$
被用来表示一封包含单词“a”和“buy”,但不包含“aardvark”、“aardwolf”或“zygmurgy”的邮件。编码进特征向量的单词集合被称为 词汇表(Vocabulary) ,因此 $x$ 的维度等于词汇表的大小。
“朴素”假设(Naive Bayes Assumption):
为了解决参数过多的问题,我们做一个极强的假设:在给定类别 $y$ 的情况下,特征 $x_i$ 之间是条件独立的。
这意味着:如果你已经知道这封邮件是垃圾邮件($y=1$),那么“邮件里出现‘购买’”这一信息,不会改变你对“邮件里出现‘价格’”概率的判断。
数学表达为:
$$
\begin{aligned} p(x_1, \dots, x_{50000}|y) &= p(x_1|y)p(x_2|y, x_1)p(x_3|y, x_1, x_2) \dots p(x_{50000}|y, x_1, \dots, x_{49999}) \ &= p(x_1|y)p(x_2|y)p(x_3|y) \dots p(x_{50000}|y) \ &= \prod_{j=1}^d p(x_j|y) \end{aligned}
$$
我们的模型由参数 $\phi_{j|y=1} = p(x_j = 1|y = 1)$(在垃圾邮件中,单词j出现的频率),$\phi_{j|y=0} = p(x_j = 1|y = 0)$ **(在正常邮件中,单词j出现的频率)**以及 $\phi_y = p(y = 1)$ (**训练集中垃圾邮件占总邮件的比例)**参数化。像往常一样,给定训练集 ${(x^{(i)}, y^{(i)}); i = 1, \dots, n}$,我们可以写出数据的联合似然函数:
$$
\mathcal{L}(\phi_y, \phi_{j|y=0}, \phi_{j|y=1}) = \prod_{i=1}^n p(x^{(i)}, y^{(i)})
$$
对 $\phi_y, \phi_{j|y=0}$ 和 $\phi_{j|y=1}$ 最大化该似然函数,得到极大似然估计值:
$$
\phi_{j|y=1} = \frac{\sum_{i=1}^n \mathbb{1}{x_j^{(i)} = 1 \wedge y^{(i)} = 1}}{\sum_{i=1}^n \mathbb{1}{y^{(i)} = 1}}
$$
本质上就是单词 $j$ 在垃圾邮件中出现的频率
$$
\phi_{j|y=0} = \frac{\sum_{i=1}^n \mathbb{1}{x_j^{(i)} = 1 \wedge y^{(i)} = 0}}{\sum_{i=1}^n \mathbb{1}{y^{(i)} = 0}}
$$
单词 $j$ 在正常邮件中出现的频率
$$
\phi_y = \frac{\sum_{i=1}^n \mathbb{1}{y^{(i)} = 1}}{n}
$$
在上面的方程中,“$\wedge$”符号表示“且”。这些参数具有非常自然的解释。例如,$\phi_{j|y=1}$ 仅仅是单词 $j$ 在垃圾邮件($y=1$)中出现的比例。
拟合好所有这些参数后,为了对具有特征 $x$ 的新样本进行预测,我们只需计算:
$$
\begin{aligned} p(y=1|x) &= \frac{p(x|y=1)p(y=1)}{p(x)} \ &= \frac{(\prod_{j=1}^d p(x_j|y=1))p(y=1)}{(\prod_{j=1}^d p(x_j|y=1))p(y=1) + (\prod_{j=1}^d p(x_j|y=0))p(y=0)} \end{aligned}
$$
然后选择后验概率较高的那个类别。
最后,我们注意到,虽然我们主要针对特征 $x_j$ 为二进制值的情况开发了朴素贝叶斯算法,但将其推广到 $x_j$ 可以取值 ${1, 2, \dots, k_j}$ 的情况是很简单的。在这里,我们将 $p(x_j|y)$ 建模为多项分布而不是伯努利分布。事实上,即使某些原始输入属性(例如之前示例中房屋的居住面积)是连续值的,通常的做法也是将其 离散化 ——即将其转化为一小组离散值——并应用朴素贝叶斯。例如,如果我们使用某个特征 $x_j$ 来表示居住面积,我们可以如下离散化连续值:
| 居住面积(平方英尺) | < 400 | 400-800 | 800-1200 | 1200-1600 | > 1600 |
|---|---|---|---|---|---|
| $x_i$ | 1 | 2 | 3 | 4 | 5 |
因此,对于居住面积为 890 平方英尺的房屋,我们将相应特征 $x_j$ 的值设为 3。然后我们可以应用朴素贝叶斯算法,并按前所述用多项分布对 $p(x_j|y)$ 进行建模。当原始连续值属性不能很好地被多元正态分布建模时,离散化特征并使用朴素贝叶斯(而不是 GDA)通常会产生更好的分类器。
拉普拉斯平滑
在上面过程中,如果某个单词在训练集里从来没出现过,会导致概率乘积直接变成 0,
假设你在训练一个垃圾邮件过滤器。你的词汇表里有“保研”这个词,但在你的垃圾邮件训练集里,“保研”这个词 一次都没有出现过 。
当你计算参数时:
$$
\phi_{\text{保研}|y=1} = \frac{\text{垃圾邮件中出现“保研”的次数}}{\text{垃圾邮件总数}} = \frac{0}{1000} = 0
$$
后果是什么?
当你收到一封包含“保研”的垃圾邮件时,模型会计算:
$$
\begin{aligned} p(y=1|x) &= \frac{\prod_{j=1}^d p(x_j|y=1)p(y=1)}{\prod_{j=1}^d p(x_j|y=1)p(y=1) + \prod_{j=1}^d p(x_j|y=0)p(y=0)} \ &= \frac{0}{0} \end{aligned}
$$
这显然是不合理的,仅仅是因为我们的训练数据还不够全面。
为了避免这种情况,我们可以使用 拉普拉斯平滑(Laplace smoothing) ,它将上述估计替换为:
$$
\phi_j = \frac{1 + \sum_{i=1}^n \mathbb{1}{z^{(i)} = j}}{k + n}
$$
这里,我们在分子上加了 1,在分母上加了 $k$。请注意,$\sum_{j=1}^k \phi_j = 1$ 仍然成立,这是一个理想的性质,因为 $\phi_j$ 是概率的估计值,而我们知道概率之和必须为 1。此外,对于所有的 $j$ 值,$\phi_j \neq 0$,从而解决了概率被估计为零的问题。在某些(可以说相当强的)条件下,可以证明拉普拉斯平滑实际上给出了 $\phi_j$ 的最优估计量。
$k$ :随机变量 $z$ 可能取到的 不同离散值的总数 。如邮件系统中,单词$j$只有选或不选两种情况,就是2。
回到我们的朴素贝叶斯分类器,通过拉普拉斯平滑,我们得到了以下参数估计值:
$$
\phi_{j|y=1} = \frac{1 + \sum_{i=1}^n \mathbb{1}{x_j^{(i)} = 1 \wedge y^{(i)} = 1}}{2 + \sum_{i=1}^n \mathbb{1}{y^{(i)} = 1}}
$$
$$
\phi_{j|y=0} = \frac{1 + \sum_{i=1}^n \mathbb{1}{x_j^{(i)} = 1 \wedge y^{(i)} = 0}}{2 + \sum_{i=1}^n \mathbb{1}{y^{(i)} = 0}}
$$
面向文本分类的多项式事件模型
我们让 $x_j$ 表示邮件中 第 $j$ 个单词的身份 。因此,$x_j$ 现在是一个取值为 ${1, \dots, |V|}$ 的整数,其中 $|V|$ 是我们的词汇表(词典)的大小。一封含有 $d$ 个单词的邮件现在由一个长度为 $d$ 的向量 $(x_1, x_2, \dots, x_d)$ 表示;注意,不同的文档其 $d$ 值(长度)可以不同。例如,如果一封邮件以“A NeurIPS …”开头,那么 $x_1 = 1$(假设“a”是词典中的第一个词),而 $x_2 = 35000$(假设“neurips”是词典中的第 35000 个词)。
在文本分类中,单纯记录“单词是否出现”(伯努利模型)会丢失大量频率信息。
- 伯努利模型(Bernoulli): 关注单词的“出没”。就像填表,有这个词就打个钩。
- 多项式模型(Multinomial): 关注单词的“频率”。就像摸球,统计每个词出现了几次。
多项式模型假设一封邮件的产生遵循以下随机过程:
- 确定类别: 发件人根据先验概率 $p(y)$ 决定发送垃圾邮件($y=1$)或正常邮件($y=0$)。
- 生成词序列: * 发件人从对应类别的“单词库(多项分布)”中随机抽取一个词作为第一个词 $x_1$。
- 接着,独立地从同一个分布中抽取第二个词 $x_2$,直到生成整封信的 $d$ 个单词。
- 关键假设: 单词出现的概率与它在信中的位置($j$)无关。
数学表示与似然函数
符号定义
- $|V|$:词汇表大小(词典里单词的总数)。
- $d_i$:第 $i$ 封邮件的总单词数。
- $x_j^{(i)} \in {1, \dots, |V|}$:第 $i$ 封邮件中第 $j$ 个位置上的单词编号。
似然函数 (Likelihood)
$$
L(\phi_y, \phi_{k|y=0}, \phi_{k|y=1}) = \prod_{i=1}^n \left( \prod_{j=1}^{d_i} p(x_j^{(i)} | y; \phi) \right) p(y^{(i)}; \phi_y)
$$
- 内层乘积: 描述一封信内部单词序列的概率。
- 外层乘积: 描述整个训练集($n$ 封信)的联合概率。
参数估计 (MLE) 与平滑
通过极大似然估计,我们得到的参数实质上是 相对频率 。
极大似然估计 (MLE) 公式
- $\phi_{k|y=1}$ (单词 $k$ 在垃圾邮件类中的概率):
$$
\frac{\text{所有垃圾邮件中单词 } k \text{ 出现的总次数}}{\text{所有垃圾邮件的单词总长度之和}}
$$
拉普拉斯平滑 (Laplace Smoothing)
为了避免未见词导致概率为 0(零概率问题),在实际计算中必须进行平滑:
$$
\phi_{k|y=1} = \frac{\sum \text{次数} + 1}{\text{总词数} + |V|}
$$
- 注意分母: 这里加的是 $|V|$(词典大小),因为每个位置有 $|V|$ 种可能的取值。
