深度学习入门站 · 理解深度学习
首页 › 第 14 章

无监督学习

没有标准答案怎么学?认识生成模型和潜变量的基本思想。
图 14-1:无监督学习:聚类、降维与自编码器
图 14-1:无监督学习:聚类、降维与自编码器

前面几章我们一直在"带着答案学习",但现实有个大麻烦:数据多、标注贵——网上图片海量,却没人有空一张张贴标签。这一章换个玩法:无监督学习(Unsupervised Learning)。只有一堆数据、没有标准答案,机器还能学到什么?答案是:它能从数据本身摸出结构,甚至学会"生产"数据。学完这章,你会明白生成模型和潜变量是怎么回事,也知道 GAN、VAE、流、扩散模型为什么是"同一棵树上的果子"。

没有"标准答案"的学习

监督学习是喂给模型"题目 + 答案"($x_i, y_i$),学会从输入预测输出;无监督学习却只有题目、没有答案,模型必须自己去发现数据里隐藏的规律。

没有标签能干什么?能干不少事:生成新样本、压缩高维数据、聚类(自动分成几个有内在联系的群体)、异常检测(判断样本正常还是可疑)。

为什么无监督学习越来越重要?因为数据多、标注贵。互联网数据取之不尽,贴标签却要大量人工,而无监督学习能"白嫖"这些免费数据——这也是许多大模型"预训练"的底层思想。

潜变量:看不见的"隐藏因子"

看一张人脸照片,决定它"长什么样"的其实是几个看不见的因素:表情、角度、光照、发型。这类看不见、却决定数据长相的因素,就叫潜变量(latent variable),记作 $z$。

🍳
生活类比
把数据 $x$ 想成端上桌的一道菜,潜变量 $z$ 就是后厨的配方——盐放多少、火开多大。你只看得见菜,看不见配方,但配方决定了菜的味道;反过来,拿到配方就能重做一道味道相近的菜——这正是生成模型的思路。

潜变量有个重要特点:维度通常比数据低。一张 $64\times64$ 的图有 4096 个像素,决定它的却可能只是十几个数字,所以 $z$ 是 $x$ 的"压缩版"。

$x$ 和 $z$ 之间的映射有两个方向:从 $x$ 到 $z$ 是"读懂"数据——例如 k-means 就把每个点映射到聚类编号 $z \in \{1, 2, \dots, K\}$;从 $z$ 到 $x$ 是"制造"数据——先按分布抽一个 $z$,再变回数据空间。走第二个方向的模型就是生成模型。

生成模型:学会数据的"生产配方"

生成模型的思想很简单:学会数据的分布,然后从分布里采样。先在潜变量 $z$ 上定义分布 $\Pr(z)$,抽一个样本,再映射回数据空间 $x$,一个新数据就"生产"出来了。

更进一步,有些是概率生成模型:不仅会生成,还给每个数据点分配一个概率 $\Pr(x | \phi)$($\phi$ 是模型参数)。训练目标很自然——让观测数据 $x_i$ 的概率尽量大,于是损失函数写成负对数似然:

$$L(\phi) = -\sum_{i=1}^{I} \log \Pr(x_i | \phi)$$

这个式子的意思是:把每个样本的概率取对数再求和,加负号后,"损失越小"等价于"数据越可能"。为什么取对数?概率连乘会小到下溢,取对数变连加,数值才安稳。而且所有概率加起来必须等于 1,模型抬高常见样本的概率,就不得不压低不常见样本——于是它学会的是整个分布,而不是背下训练样本。

从分布的角度看,生成模型干两件互补的事:采样(sampling)——从分布里抽新样本,也就是"生成";密度估计(density estimation)——算某个点概率多高,判断样本正常还是异常。

动手试试:从混合高斯"生成"数据

真实数据常常"一坨一坨"的:比如身高大致是"男生群 + 女生群"两个高斯叠在一起,可用混合高斯分布描述——由 $K$ 个高斯成分按权重 $\pi_k$ 混合而成:

$$\Pr(x) = \sum_{k=1}^{K} \pi_k \, \mathcal{N}(x | \mu_k, \sigma_k^2)$$

下面的代码演示生成模型的核心动作:先决定"属于哪个群",再从这个群里抽一个数。参数学对了,产出的新样本和真实数据在统计上几乎分不出来:

import numpy as np

# 混合高斯:数据由两个"群"组成(比如男生身高、女生身高)
means   = [165.0, 178.0]   # 两个群的均值(cm)
stds    = [6.0, 7.0]       # 两个群的标准差
weights = [0.45, 0.55]     # 每个群占的比例

np.random.seed(42)
n = 2000
samples = []
for _ in range(n):
    k = np.random.choice([0, 1], p=weights)  # 先抽"属于哪个群"
    x = np.random.normal(means[k], stds[k])  # 再从这个群里抽一个数
    samples.append(x)

samples = np.array(samples)
print(f"均值 {samples.mean():.2f}, 标准差 {samples.std():.2f}")
# 画成直方图会看到两个"驼峰",和真实身高数据的形状几乎一样

把结果画成直方图,你会看到两个驼峰——和真实数据长得一模一样,这就是"学会配方、量产数据"的最朴素演示。后面能画逼真人脸的模型,只是把"简单配方"换成深度神经网络这个大厨房。

什么样的生成模型算"好"?

理想中的生成模型应该:抽样快、样本逼真(和真实数据难分真假)、覆盖全面(不能只会生成训练样本的"复读机")、潜空间好用($z$ 平滑变化对应 $x$ 平滑变化,维度最好对应可解释特征,如"微笑程度")、概率算得快。

但没有哪个模型能同时满足全部条件——这正是后面四章各有精彩的原因:生成对抗网络(GAN)生成快、画质高,但给不出概率;变分自编码器(VAE)潜空间规整、能算概率下界,但样本偏模糊;归一化流(Flows)能精确算概率,但网络结构受限;扩散模型(Diffusion)画质顶尖,但要慢慢"去噪"。它们都是"学会分布"的不同思路。

怎么客观评价它们?常用招数有:测试似然度(在没见过的数据上算概率,看泛化能力)、Inception 分数(IS)和 FID(用预训练分类网络把生成图与真实图转成"语义特征"再比较距离)、流形精确度/召回率(把"逼真度"和"多样性"分开打分)。每个指标都有盲区,论文里往往要报好几个。

💡
**核心思想**:无监督学习 = 没有标签,从数据本身学结构;生成模型 = 学会数据的分布,能采样出新样本;潜变量 = 数据背后看不见的隐藏因子;概率生成模型的训练 = 最小化负对数似然。后面四章的 **GAN、VAE、流、扩散模型**,都是这棵大树上的不同分支。

🎯 小测验

1. 无监督学习和监督学习最根本的区别是什么?
2. 关于潜变量 $z$,正确的是?
3. 概率生成模型的训练目标是什么?