你从未测量的那个变量
到现在为止,你已经见过那些学习「从输入到输出」映射的模型,也熟悉了贝叶斯式的习惯——让先验、似然、后验贯穿每一次预测。本篇要加进一个看似不起眼、却能重新组织一大片机器学习的想法:有时候,最能解释你数据的那个变量,恰恰是你从未真正记录下来的。顾客身上有一个你从没问过的「细分群体」;一封邮件有一个没人标注过的「主题」;一段语音录音里,藏着一串隐藏在波形之下的音素。我们把这样一个未被观测到的成因,叫做潜变量。
潜变量不是某种花招或近似——它是我们用来编码「对看不见的结构的一种信念」的方式。我们假设数据是分两步生成的:先由「自然」抽出一个隐藏的取值,然后它再产出我们真正测量到的那个观测。这一阶里大部分的机器装置,都是为了回答随之而来的一个难题:如果我们永远只能看见第二步,又该如何去推断第一步?
混合模型:一群隐藏的源头
最干净利落的例子是混合模型。想象一千个人的身高,你从没按任何标准给他们分过组。这张直方图上有两个柔和的隆起。用单独一条钟形曲线去拟合它,效果很差;但用两条钟形曲线——一条中心偏低、一条偏高——拟合起来却漂亮极了。这里的潜变量很简单,就是「每个人属于哪一个隆起」。当这些成分曲线是高斯分布时,这就是高斯混合模型,简称 GMM:每个数据点都被假设来自 K 个簇之一,但「它来自哪一个」的标签是隐藏的。
这里有一个先有鸡还是先有蛋的死结。如果有人把隐藏标签直接交给你,那拟合每个高斯分布就是小事一桩——把每组里的点求个平均就行。反过来,如果有人把高斯分布交给你,那猜每个点的标签也很容易——把它分给「让它最可能出现」的那条曲线。可你两样都没有。你想仅凭这些没有标签的身高,同时找出簇的形状和软分配。直接做极大似然没法一步干净地解出来,因为那个似然要对每一种可能的隐藏分配求和。
期望最大化:先猜,再精修,重复
走出这个鸡生蛋死结的办法,是别再强求一次性同时得到两个答案,而是用自举的方式一点点拉起来。这就是期望最大化算法,简称 EM。先给簇的形状随便来个粗糙的初猜。然后交替做两步。在 E 步里,把形状固定住,为每个点算出它来自每个簇的概率——这些软「责任度」就是你当前对隐藏标签的最佳信念。在 M 步里,把这些软标签固定住,重新估计每个簇的中心和散布,并按每个点「归属程度」的大小给它加权。
- 初始化:为 K 个簇的均值、散布和混合权重选一组粗略的起始值——哪怕是随机的也行。
- E 步:固定当前的簇,算出每个点的软责任度——也就是它属于每个簇的概率。
- M 步:固定责任度,把每个簇的均值、散布和权重,重新估计为各点的「按责任度加权的平均」。
- 反复执行 E 步和 M 步,直到拟合不再改善——可以保证数据的似然永远不会下降。
每一轮都把簇推向一个更能解释数据的配置,而一条漂亮的定理保证了数据的似然在相邻两轮之间绝不下降。但要诚实地看清这换来的是什么:EM 爬到的是一个*局部*最优,不一定是全局最好的那个。一个糟糕的初始化可能让它卡在一个平庸的解上,这也是为什么实践者会从不同的起点跑好几遍,再留下最好的那个。EM 不是什么能找出隐藏真相的魔法;它是在一片你本来无从搜索的地形上,做的一次有纪律、单调上升的爬山。
当隐藏的那一面太大:变分推断
EM 的 E 步需要潜变量的精确后验——也就是给定数据后,每个隐藏取值的确切概率。对 GMM 来说,这个后验只是一张关于 K 个簇的小巧表格,所以 E 步很便宜。可假设隐藏的那一面是一个高维的连续向量,而观测是由一个盘根错节的神经网络产出的。这时精确后验就成了一个无法求解的积分——没有干净的公式,而对所有可能性求和又毫无指望。EM 那个干净的 E 步,悄无声息地就崩了。
变分推断就是这场救援。我们不去计算那个不可能算出的真后验,而是挑一族我们*能*驾驭的更简单的分布——比方说普通的高斯分布——然后在这一族里头寻找那个能尽可能紧贴真后验的成员。我们就这样把「推断」变成了「优化」:调节我们这个替身分布的参数,让它与真相之间的距离最小。我们要最小化的这个「距离」,就是 KL 散度——衡量一个分布离另一个分布有多远的标准尺子。
VAE:潜变量遇上深度学习
把变分推断和神经网络拼到一起,你就得到了变分自编码器,简称 VAE——它是这一阶的概率思想与你早已熟悉的深度学习之间,最干净利落的桥梁之一。它的图景是两个面对面的网络。一个编码器读入一张图像,但它输出的不是单独一个编码,而是潜向量上的一个*分布*——一个均值加一份散布。一个解码器从那个分布里采一个点,再试着从这个点重建出原始图像。
x --[encoder]--> q(z|x) = mean, spread
| sample z
v
z --[decoder]--> reconstruction of x
loss = reconstruction error + KL( q(z|x) || prior )训练目标,就是上一节那个 ELBO 换上了工作服。它含有两个互相拉扯的项。重建项奖励解码器忠实地重建出输入。KL 项则把每一个编码出的分布往一个简单的共享先验——通常是标准高斯——上拉,好让潜空间不至于碎裂成一座座互不相连的孤岛。正是这第二股拉力,让 VAE 具有了*生成*能力:因为潜空间平滑而有条理,你可以把编码器扔掉,从先验里抽一个全新的随机 z,让它穿过解码器,就得到一个训练集里从未存在过的全新样本。
把整条脉络看成「同一个想法穿了三套戏服」会很有帮助。GMM 是一个潜变量模型,它的隐藏变量是一个离散的簇标签。VAE 也是一个潜变量模型,它的隐藏变量是一个连续向量,它的解码器是一个深度网络。而 EM 和变分推断,是干同一件活——对隐藏的那一面做推断——的两种办法,一种精确而小巧,一种近似而能扩展。同一副骨架,不同的肌肉。
它给了你什么——又没给你什么
有一种诚实的说法值得记牢:潜变量是一种*建模假设*,而不是一个被发现的事实。当一个 GMM 把你的顾客分成三个簇时,它之所以找到三个簇,是因为你要的就是三个、又因为高斯分布是个方便的说法——而不是因为大自然恰好就盖了「三种人」的章。潜在结构是不是真实的,全看你的假设与世界相符到什么程度;换一个 K、换一族分布,讲出来的会是另一个故事。把找出来的那些簇当成一面有用的透镜,而不是一条定律。
另外,要留意用词。一个会生成人脸的 VAE 并不在「想象」或「理解」任何东西——它只是在从一个被塑造得「能让重建看起来合理」的平滑潜空间里采样。它那些模糊、略显过分平滑的输出,正是我们所做近似的直接指纹:一个简单的先验、一族选定的分布、一个下界而非精确的似然。不过,这一整套机器装置带来的回报,是真切而具体的。你得到了一种办法:能从无标签的数据里学习、能把观测压缩成一段有意义的潜编码、能生成新样本,而且——对这一整阶来说至关重要——能给你对隐藏那一面的信念附上诚实的不确定性,而不是假装你对它了如指掌。