无监督学习
前面几章我们一直在"带着答案学习",但现实有个大麻烦:数据多、标注贵——网上图片海量,却没人有空一张张贴标签。这一章换个玩法:无监督学习(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(用预训练分类网络把生成图与真实图转成"语义特征"再比较距离)、流形精确度/召回率(把"逼真度"和"多样性"分开打分)。每个指标都有盲区,论文里往往要报好几个。