all_lessons/数学的逻辑/42第 43 课 / 共 44 课

第十一部分 · 从一个神经元到现代 AI

从判别到生成:VAE、扩散与变分推断

到上一课的 Transformer 为止,我们已经能造出极其强大的「判别」模型:给一张图 x,它告诉你标签 y;给一段话,它预测下一个词。可这些模型只会回答关于 x 的问题,它们并不"知道 x 长什么样"。这一课我们换一个更野心勃勃的目标——不再学 p(y|x),而是直接对数据本身的分布 p(x) 建模,然后从中采样出一张前所未见的新图像。这,就是生成式 AI 的心脏。你会看到,它没有用任何新数学,全是前面几课工具的重新拼装。

线性回顾
上一课:注意力与 Transformer(第 41 课)给了我们一台能处理序列、抓住长程依赖的强大引擎,把"判别式"模型推到了极致——分类、预测下一个词,都是在算条件概率 p(y|x)(给定输入 x,标签/下一个词 y 的分布)。
留下的问题:判别模型只会"看图说标签",不会"凭空画图"。要生成全新样本,得掉转枪口去建模数据分布 p(x) 本身——可这件事一上来就撞墙:p(x) 是高维的,直接用最大似然(第 31 课)去拟合,会卡在一个算不出来的积分上。
本课新增:两条绕过这堵墙的路,它们撑起了今天所有的图像/视频生成模型。(1) VAE:用隐变量 + 变分推断,把"算不出的积分"换成"能优化的下界"(ELBO)。(2) 扩散模型:往数据里一步步加高斯噪声,再学着把它一步步去掉。两条路的砖块全是老朋友——KL 散度(第 33 课)、蒙特卡洛采样(第 34 课)、高斯(第 30 课)、梯度(第 25 课)。
本课路线
(1) 判别 vs 生成:学 p(y|x) 还是学 p(x),一字之差,天壤之别。(2) 隐变量模型:假设数据由一个简单的隐变量 z 生成,p(x) 变成一个积分。(3) 变分推断与 ELBO → VAE:算不出积分,就最大化它的下界;KL 散度在这里当尺子。(4) 扩散模型:加噪 → 学去噪 → 从纯噪声采样出新图,这是 Stable Diffusion / Sora 的引擎。(5) 收束:同一套工具,换个拼法,就从"识别世界"变成了"创造世界"。

判别 vs 生成:一字之差,天壤之别

先把两种模型的分工讲清楚。前面几十课里,我们训练的几乎都是判别式模型(discriminative):它学的是条件概率 p(y|x)——

判别式:给定输入 x,预测标签 y → p(y|x) (读作"在 x 已知的条件下,y 的概率分布")

分类器算"这张图是猫的概率",回归器算"这套房子的价格",语言模型算"下一个词是什么"——全都是给定 x、去猜 y。它们把 x 当成免费给定的前提,从不过问"x 自己是怎么来的、长什么样"。

生成式模型(generative)的野心完全不同:它要学的是数据本身的分布 p(x)——

生成式:对数据分布本身建模 → p(x) (读作"一个真实样本 x 出现的概率")

一旦你手里握着 p(x),一件魔法般的事就成为可能:从这个分布里采样,就能吐出一张训练集里从没出现过、但看起来无比真实的新图像。会算 p(x),就等于学会了"数据长什么样"这件事的全部——这正是 DALL·E 画画、Sora 生成视频的底层能力。

可这条路一迈步就踩空。回到第 31 课的最大似然(MLE):要拟合 p(x),最自然的办法就是让模型给训练数据分配的(对数)概率最大。问题是,一个能表达"猫脸长什么样"的概率分布,往往写成这个样子:

p(x) = (未归一化的打分) / Z, 其中 Z = ∫ (未归一化的打分) dx

那个分母 Z(叫归一化常数,保证所有概率加起来等于 1)是一个横跨整个高维图像空间的积分。这正是第 34 课反复敲打的困境:式子写得出,数却算不出——没有解析解,维度一高连数值积分都因"维度灾难"彻底失效。直接对高维 p(x) 做最大似然,第一步就卡死。生成模型的全部技巧,就是想尽办法绕开这个算不出的积分

隐变量模型:把 p(x) 写成一个积分

第一个绕法,是引入一个巧妙的假设:真实数据看起来复杂,但它背后其实由一个简单的隐变量(latent variable) z 控制。你可以把 z 想成"这张脸的一串隐藏配方"——比如朝向、光照、胖瘦、表情。我们假设这串配方本身服从一个最简单的分布:标准高斯第 30 课那个各向同性的正态钟形),然后用一个解码器 p(x|z)(一个神经网络)把配方"翻译"成一张具体的图:

z ~ 高斯(0, I) → 解码器 p(x|z) → x (读作"先从标准高斯抽一个隐变量 z,再由 z 生成图像 x")

这个视角很动人:生成一张新图,就是"随手抽一份配方 z,交给解码器画出来"。可要算某张真实图 x 的概率 p(x),就得把所有可能的配方都考虑一遍——每种配方 z 生成这张图的可能性 p(x|z),按配方本身的概率 p(z) 加权,全部积起来:

p(x) = ∫ p(x|z)·p(z) dz (读作"把每个隐变量 z 生成 x 的概率,按 z 的先验加权后全部积起来")

兜了一圈,又是一个算不出来的积分——只不过这次积的是隐变量 zz 动辄几十上百维,解码器又是个非线性网络,这个积分同样没有解析解。看起来我们只是把困难换了个位置。但正是这个"积分形式",为下一步的巧劲留出了缝隙。

变分推断与 ELBO:把"算不出的积分"换成"能优化的下界"

既然 p(x) = ∫ p(x|z)p(z)dz 直接算不出来,变分推断(variational inference)给出一记漂亮的偷换:与其硬算这个积分,不如去最大化它的一个下界。只要下界被顶得足够高,被夹在上面的真 log p(x) 也就跟着高了。这个下界,叫 ELBO(证据下界,Evidence Lower BOund)

推导的钥匙需要再引入一个网络:编码器 q(z|x)——给定一张图 x,它猜"这张图最可能由哪些配方 z 生成"。它是解码器的逆向近似。有了它,可以证明(用第 33 课的 KL 散度做工具,推导略)对数似然恰好能拆成两块:

log p(x) = ELBO + KL( q(z|x) ‖ 真后验 p(z|x) )

读作"数据的对数似然,等于 ELBO,再加上'编码器 q 离真正的后验分布有多远'"。这里的 KL 散度正是第 33 课的老朋友:它度量两个分布的差距,且永远 ≥ 0(吉布斯不等式)。既然那一项 KL 减不到负数,就意味着:

log p(x) ≥ ELBO (因为 KL ≥ 0,所以 ELBO 永远压在 log p(x) 下面——这就是"下界")

而 ELBO 本身,拆开来是两项都能算的东西:

ELBO = 𝔼q(z|x)[ log p(x|z) ] − KL( q(z|x) ‖ p(z) ) = 重构项 − KL 项

读作"ELBO 等于'重构项'减去'KL 项'"。这两项各有极清楚的含义:

把这套编码器 q(z|x) + 解码器 p(x|z) + 最大化 ELBO 合在一起,就是大名鼎鼎的 VAE(变分自编码器,Variational Auto-Encoder)。还剩最后一道工序:ELBO 里那个"从 q(z|x) 采样 z"的动作是随机的,梯度(第 25 课)没法穿过一次随机采样传回去。VAE 用一招重参数化技巧(reparameterization trick)拆解它:把 z = μ + σ·ε,其中 ε 是一份从固定标准高斯抽来的噪声——这样随机性被隔离进 ε,而 μ、σ 是网络的可导输出,梯度就能顺着它们流回去,用梯度下降第 27 课)照常训练。

一句话记住变分
变分 = 把"算不出的积分"换成"能优化的下界"。真目标 log p(x) 算不出,就退而求其次,去顶高一个永远压在它下面的 ELBO(下界,由 KL ≥ 0 担保);ELBO 的两项——重构 + KL——一个用蒙特卡洛估、一个有解析解,全都能算、能求梯度。第 33 课的 KL、第 34 课的采样、第 25–27 课的梯度,在这里第一次合体成一台完整的生成机器。

扩散模型:加噪 → 学去噪 → 从纯噪声里长出一张图

VAE 之外的另一条路,是今天图像生成的绝对主力——扩散模型(diffusion model)。它的想法朴素得近乎顽皮,却出奇地好用。它分两个方向:

前向过程(加噪,固定、无需学习):拿一张清晰的真图,一步步往里掺高斯噪声第 30 课)——第一步图还认得出,只是有点糊;几十上百步之后,图像被噪声彻底淹没,变成一团纯粹的各向同性高斯噪声,什么信息都不剩。这个"由清晰逐步溶解成噪声"的过程完全是设计好的、可控的,没有任何要学的参数。

反向过程(去噪,这才是要训练的):训练一个神经网络,让它学会把前向的每一小步逆回来——给它一张"加了 t 步噪声的图",让它预测出"这一步到底加进去的是哪些噪声"(等价地说,学会每一步该往哪个方向去噪一点点)。训练它的损失,本质上就是"预测的噪声"和"真实加进去的噪声"之间的均方误差,再靠梯度下降第 25–27 课)优化。

采样(生成新图):训练好之后,生成就成了倒放前向过程——从一团纯高斯噪声出发(这一步随手抽,因为标准高斯太好采样了,见第 34 课),让网络一步步去噪、去噪、再去噪,噪声里就会逐渐浮现出一张全新的、清晰的图像。你在下面的小实验里能亲眼看到这个"溶解 → 重现"的过程。

请注意扩散模型没有引入任何新数学:前向是高斯加噪(第 30 课),反向是学一个去噪网络、用梯度下降训练(第 25–27 课),采样是从高斯出发的一条随机链(第 34 课)。它只是把这几样老工具换了个拼法。这就是 Stable Diffusion、DALL·E、Sora 的引擎。(顺带一提:GAN(生成对抗网络)是另一条更早的路——让一个"造假者"和一个"鉴伪者"互相对抗着变强,一句带过即可,本课不展开。)

扩散:加噪 → 去噪(示意)
画布里 160 个点摆成两道交错的月牙(两个颜色标出它们各自属于哪一簇)。拖动噪声水平 tt = 0 时你看到清晰的形状,随着 t → 1,每个点按 xt = √(1−t)·x + √t·噪声 逐步溶进一团高斯噪声。点「去噪回放 ▶」,看它从纯噪声反向重现成月牙——真实模型用神经网络学这一步,这里只是示意回放。
噪声水平 t
0.00
阶段
数据(t=0)
说明
反向为示意

玩这个小实验时抓住三件事:第一,前向的溶解不是随意涂抹,而是精确的高斯加噪,每个点的位置由 t 唯一决定;第二,反向回放看着像魔法,但真实模型里它是网络学出的、逐步的条件期望("给定当前这团噪声,干净的图最可能是什么样");第三,t = 1 时那团东西是各向同性高斯——正因为它这么简单、这么好采样,生成才有一个干净的起点。

收束:同一套工具,识别世界,也创造世界

退后一步看这一整课,会发现一件很美的事:我们没有学任何新数学。VAE 和扩散,用的还是那几块砖——

换句话说:把识别世界的那套工具(MLE、KL、蒙特卡洛、高斯、梯度)换个拼法,就变成了创造世界的机器。判别模型问"这是什么",生成模型答"再造一个出来"——它们喝的是同一口井里的水。这正兑现了整门课程一开头就许下的那个承诺:从最朴素的计数与概率出发,我们真的能一路搭到今天会画画、会写诗、会生成视频的生成式 AI。

常见误解

一句话带走
判别模型学 p(y|x)(识别),生成模型学 p(x)(创造)。直接对高维 p(x) 做最大似然,会卡在一个算不出的积分上。VAE 用隐变量 + 变分推断,把它换成能优化的下界 ELBO = 重构 − KL;扩散用"高斯加噪 → 学去噪 → 从纯噪声采样"绕过它。两者的砖块全是老朋友:MLE(31)、高斯(30)、KL(33)、蒙特卡洛(34)、梯度(25–27)。同一套工具换个拼法,就从识别世界变成了创造世界——这就是生成式 AI。
下一步
一个神经元第 38 课)出发,我们一路堆叠、加注意力、装上生成能力,走到了会凭空创造图像的扩散模型。这一部分(乃至整门课)的目的地已经到了。是时候回头看整条链了:44 课如何从最朴素的"计数"一步步长成现代人工智能?→ 第 43 课《收官:从计数到现代人工智能》。