第十一部分 · 从一个神经元到现代 AI
从判别到生成:VAE、扩散与变分推断
到上一课的 Transformer 为止,我们已经能造出极其强大的「判别」模型:给一张图 x,它告诉你标签 y;给一段话,它预测下一个词。可这些模型只会回答关于 x 的问题,它们并不"知道 x 长什么样"。这一课我们换一个更野心勃勃的目标——不再学 p(y|x),而是直接对数据本身的分布 p(x) 建模,然后从中采样出一张前所未见的新图像。这,就是生成式 AI 的心脏。你会看到,它没有用任何新数学,全是前面几课工具的重新拼装。
留下的问题:判别模型只会"看图说标签",不会"凭空画图"。要生成全新样本,得掉转枪口去建模数据分布 p(x) 本身——可这件事一上来就撞墙:p(x) 是高维的,直接用最大似然(第 31 课)去拟合,会卡在一个算不出来的积分上。
本课新增:两条绕过这堵墙的路,它们撑起了今天所有的图像/视频生成模型。(1) VAE:用隐变量 + 变分推断,把"算不出的积分"换成"能优化的下界"(ELBO)。(2) 扩散模型:往数据里一步步加高斯噪声,再学着把它一步步去掉。两条路的砖块全是老朋友——KL 散度(第 33 课)、蒙特卡洛采样(第 34 课)、高斯(第 30 课)、梯度(第 25 课)。
判别 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 的先验加权后全部积起来")
兜了一圈,又是一个算不出来的积分——只不过这次积的是隐变量 z。z 动辄几十上百维,解码器又是个非线性网络,这个积分同样没有解析解。看起来我们只是把困难换了个位置。但正是这个"积分形式",为下一步的巧劲留出了缝隙。
变分推断与 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 项'"。这两项各有极清楚的含义:
- 重构项 𝔼[log p(x|z)]:把 x 编码成 z、再解码回去,要能尽量还原出原图。这个期望算不出闭式,就用第 34 课的蒙特卡洛——从 q(z|x) 里抽一两个 z 代进去求平均,即可估出。
- KL 项 KL(q(z|x)‖p(z)):逼迫编码器给出的 z 分布别离标准高斯太远(p(z) 就是那个先验高斯)。这是一根缰绳,保证隐空间规整、可采样。因为两边都是高斯,这一项有解析解,直接写出来即可。
把这套编码器 q(z|x) + 解码器 p(x|z) + 最大化 ELBO 合在一起,就是大名鼎鼎的 VAE(变分自编码器,Variational Auto-Encoder)。还剩最后一道工序:ELBO 里那个"从 q(z|x) 采样 z"的动作是随机的,梯度(第 25 课)没法穿过一次随机采样传回去。VAE 用一招重参数化技巧(reparameterization trick)拆解它:把 z = μ + σ·ε,其中 ε 是一份从固定标准高斯抽来的噪声——这样随机性被隔离进 ε,而 μ、σ 是网络的可导输出,梯度就能顺着它们流回去,用梯度下降(第 27 课)照常训练。
扩散模型:加噪 → 学去噪 → 从纯噪声里长出一张图
VAE 之外的另一条路,是今天图像生成的绝对主力——扩散模型(diffusion model)。它的想法朴素得近乎顽皮,却出奇地好用。它分两个方向:
前向过程(加噪,固定、无需学习):拿一张清晰的真图,一步步往里掺高斯噪声(第 30 课)——第一步图还认得出,只是有点糊;几十上百步之后,图像被噪声彻底淹没,变成一团纯粹的各向同性高斯噪声,什么信息都不剩。这个"由清晰逐步溶解成噪声"的过程完全是设计好的、可控的,没有任何要学的参数。
反向过程(去噪,这才是要训练的):训练一个神经网络,让它学会把前向的每一小步逆回来——给它一张"加了 t 步噪声的图",让它预测出"这一步到底加进去的是哪些噪声"(等价地说,学会每一步该往哪个方向去噪一点点)。训练它的损失,本质上就是"预测的噪声"和"真实加进去的噪声"之间的均方误差,再靠梯度下降(第 25–27 课)优化。
采样(生成新图):训练好之后,生成就成了倒放前向过程——从一团纯高斯噪声出发(这一步随手抽,因为标准高斯太好采样了,见第 34 课),让网络一步步去噪、去噪、再去噪,噪声里就会逐渐浮现出一张全新的、清晰的图像。你在下面的小实验里能亲眼看到这个"溶解 → 重现"的过程。
请注意扩散模型没有引入任何新数学:前向是高斯加噪(第 30 课),反向是学一个去噪网络、用梯度下降训练(第 25–27 课),采样是从高斯出发的一条随机链(第 34 课)。它只是把这几样老工具换了个拼法。这就是 Stable Diffusion、DALL·E、Sora 的引擎。(顺带一提:GAN(生成对抗网络)是另一条更早的路——让一个"造假者"和一个"鉴伪者"互相对抗着变强,一句带过即可,本课不展开。)
玩这个小实验时抓住三件事:第一,前向的溶解不是随意涂抹,而是精确的高斯加噪,每个点的位置由 t 唯一决定;第二,反向回放看着像魔法,但真实模型里它是网络学出的、逐步的条件期望("给定当前这团噪声,干净的图最可能是什么样");第三,t = 1 时那团东西是各向同性高斯——正因为它这么简单、这么好采样,生成才有一个干净的起点。
收束:同一套工具,识别世界,也创造世界
退后一步看这一整课,会发现一件很美的事:我们没有学任何新数学。VAE 和扩散,用的还是那几块砖——
- 最大似然(第 31 课)给出"该拟合 p(x)"这个目标;
- 高斯(第 30 课)既是隐变量 z 的先验,也是扩散里一步步加进去的噪声;
- KL 散度(第 33 课)在 VAE 里当"编码器离真后验有多远"的尺子,也是 ELBO 里那根缰绳;
- 蒙特卡洛(第 34 课)用采样估出那些算不出的期望,也是扩散采样那条随机链;
- 梯度与梯度下降(第 25–27 课)把这一切"训得动"。
换句话说:把识别世界的那套工具(MLE、KL、蒙特卡洛、高斯、梯度)换个拼法,就变成了创造世界的机器。判别模型问"这是什么",生成模型答"再造一个出来"——它们喝的是同一口井里的水。这正兑现了整门课程一开头就许下的那个承诺:从最朴素的计数与概率出发,我们真的能一路搭到今天会画画、会写诗、会生成视频的生成式 AI。
常见误解
- "生成模型'理解'了它画出来的东西。"不。它做的是对数据分布 p(x) 建模、再从中采样——这是极其强大的统计模式捕捉,能拟合出"猫脸的联合规律",但它没有关于"猫"的概念、意图或世界模型。会生成逼真的猫,不等于知道猫是什么。别把统计上的以假乱真,误当成理解。
- "扩散模型是和前面完全无关的一套新数学。"恰恰相反。它没有一块新零件:前向是高斯加噪(第 30 课),反向是学一个去噪网络、拿梯度下降训练(第 25–27 课),采样是从高斯出发的蒙特卡洛链(第 34 课)。扩散的全部新意在于"怎么拼",而不是"用了什么新数学"。
- "必须精确算出 p(x) 才能做生成。"不必——这正是本课的关键巧劲。那个归一化积分算不出来,但 VAE 用变分下界(ELBO)绕开它(去顶高一个能算的下界),扩散则压根不去显式写 p(x),只学"每一步怎么去噪"。绕开算不出的积分,是生成模型的核心手艺。
- "加噪去噪只是玄学,凭什么就能生成图?"它一点都不玄。前向是一个精确定义、完全可控的高斯加噪过程(没有参数);反向是一个被明确训练出来的网络,每一步预测的是逐步的条件期望(给定当前噪声图,干净图最可能是什么样)。两头都有清清楚楚的数学,不是碰运气。