来源:Kingma, Welling 2013 · arXiv:1312.6114 §2.3(SGVB 估计器与 AEVB 算法,论文式(6)(7)(8)、Algorithm 1)。零件到齐:可算的下界(§2)加可导的抽样(§3),这一节把两者拼成能直接跑的估计器和训练算法。
读法:§4.1 通用版估计器 A(论文式(6))。§4.2 低方差版估计器 B(论文式(7))。§4.3 小批量换算,$N$、$M$、$L$ 各管一层(论文式(8))。§4.4 AEVB 算法逐行(论文 Algorithm 1)。§4.5 「自编码」的样子从哪来。
---
结构先行,本节三样东西是两层关系。SGVB(Stochastic Gradient Variational Bayes,随机梯度变分贝叶斯)是估计器的总名:**一条估算「单个数据点的下界 $\mathcal L$ 的数值」的公式,本节只干这一件事,不含任何优化。** 名字里的「随机梯度」是设计用途:公式可导、读数带抽样随机,对它求梯度即可喂随机梯度法,那是 §4.4 的事。它有 A、B 两个版本,二选一:A 通用、整个期望全抽样。B 把 KL 项换成精确值(有闭式时直接算)、方差更小。式(8) 不是第三个估计器,是上一层的规模汇总:把 $M$ 个单点估计值平均、乘 $N$ 冒充全数据集,内部套用 A 或 B。§4.4 的 AEVB 训练算法是拿这套读数跑起来的流程,另属一层。工程标配是「B 版 + 式(8) + 每点一条样本($L=1$)」。
## §4.1 估计器 A:重参数化直接套进下界
把 §3 的式(5) 用在下界身上:式(2) 的 $\mathcal L$ 是一个在 $q_\varphi$ 下的期望,按式(5) 改成抽样平均,就得到第一版估计器(过程见本节末折叠,上标 A 只是版本记号):
> [!danger] 论文式(6) · SGVB 估计器 A(通用版)
> $\widetilde{\mathcal L}^A(\theta,\varphi;x^{(i)})=\frac{1}{L}\sum_{l=1}^{L}\Big[\log p_\theta\big(x^{(i)},z^{(i,l)}\big)-\log q_\varphi\big(z^{(i,l)}\mid x^{(i)}\big)\Big]$
> $\text{where}\quad z^{(i,l)}=g_\varphi\big(\epsilon^{(i,l)},x^{(i)}\big)\quad\text{and}\quad \epsilon^{(l)}\sim p(\epsilon)$
逐项读。上标 $(i,l)$ 是双重编号:第 $i$ 个数据点抽的第 $l$ 条样本,每个数据点抽 $L$ 条。第一行是被平均的函数,两项:$\log p_\theta(x^{(i)},z^{(i,l)})$ 是先验和解码器(似然)给「这条隐码配这个数据」合打的分,$\log q_\varphi(z^{(i,l)}\mid x^{(i)})$ 是编码器(近似后验)给同一条隐码打的分,前者减后者。内容与式(2) 方括号完全相同,只是两项的书写先后对调了(加法换序,值不变)。第二行是样本的来路:抽噪声 $\epsilon$、过 $g_\varphi$ 得 $z$,正是重参数化流水线。行内 $\epsilon^{(i,l)}$ 与 $\epsilon^{(l)}$ 是论文的上标混用,指同一批噪声样本。波浪号 $\widetilde{\mathcal L}$ 标记「$\mathcal L$ 的抽样估计值」,$\widetilde{\mathcal L}^A\simeq\mathcal L$。
**这条式子每个符号都写得出、每一步都可导,下界从「一个抽象的期望」变成了「一个端到端可导的样本平均」,喂给任何梯度优化器都能跑。** 这就是 SGVB 估计器的通用版:不挑分布,只要 $q_\varphi$ 能重参数化、各密度能算 log,就能用。
> [!note]- 论文式(6) 的来历:式(2) 套式(5)
> 起点是论文式(2) 的下界:
>
> $\mathcal L(\theta,\varphi;x^{(i)})=\mathbb E_{q_\varphi(z\mid x)}\big[-\log q_\varphi(z\mid x)+\log p_\theta(x,z)\big]$
>
> 第二步,方括号内两项交换先后(加法换序、值不变),让顺序与式(6) 对齐:
>
> $\mathcal L(\theta,\varphi;x^{(i)})=\mathbb E_{q_\varphi(z\mid x)}\big[\log p_\theta(x,z)-\log q_\varphi(z\mid x)\big]$
>
> 第三步,方括号整体就是式(5) 里的 $f(z)$,按式(5) 把期望换到 $\epsilon$ 名下(每处 $z$ 换写成 $g_\varphi(\epsilon,x^{(i)})$):
>
> $\mathcal L(\theta,\varphi;x^{(i)})=\mathbb E_{p(\epsilon)}\Big[\log p_\theta\big(x^{(i)},g_\varphi(\epsilon,x^{(i)})\big)-\log q_\varphi\big(g_\varphi(\epsilon,x^{(i)})\mid x^{(i)}\big)\Big]$
>
> 第四步,抽 $L$ 条样本做平均,并把 $g_\varphi(\epsilon^{(i,l)},x^{(i)})$ 记回简写 $z^{(i,l)}$:
>
> $\mathcal L(\theta,\varphi;x^{(i)})\simeq\frac{1}{L}\sum_{l=1}^{L}\Big[\log p_\theta\big(x^{(i)},z^{(i,l)}\big)-\log q_\varphi\big(z^{(i,l)}\mid x^{(i)}\big)\Big]$
>
> $\simeq$ 右侧与式(6) 第一行逐字相同,$\widetilde{\mathcal L}^A$ 就是论文给这个样本平均起的名字。配上样本来路那行($z^{(i,l)}=g_\varphi(\epsilon^{(i,l)},x^{(i)})$),即红框整条。
## §4.2 估计器 B:KL 有闭式就精确算,方差更小
式(3) 已经把 $\mathcal L$ 整理成「负 KL(对先验)+ 期望重构」。KL 这一项常常可以解析积出来(论文附录 B 给了高斯情形的闭式),此时只有重构那一项还需要抽样,得到第二版估计器:
> [!danger] 论文式(7) · SGVB 估计器 B(KL 解析版)
> $\widetilde{\mathcal L}^B(\theta,\varphi;x^{(i)})=-D_{KL}\big(q_\varphi(z\mid x^{(i)})\,\|\,p_\theta(z)\big)+\frac{1}{L}\sum_{l=1}^{L}\log p_\theta\big(x^{(i)}\mid z^{(i,l)}\big)$
> $\text{where}\quad z^{(i,l)}=g_\varphi\big(\epsilon^{(i,l)},x^{(i)}\big)\quad\text{and}\quad \epsilon^{(l)}\sim p(\epsilon)$
对照 A 版看差别:A 版整个括号都靠抽样,B 版把其中「KL 那一份」抽出来用精确值顶替,抽样只负责剩下的重构项。**同一个量,一半精确一半抽样,随机性少了一个来源,所以 B 版的方差通常比 A 版小**,论文实验用的就是 B 版。KL 项此时的身份也更好读:KL 项不依赖抽样、直接是 $\varphi$ 的函数,作用就是正则化 $\varphi$,把近似后验往先验上拉(式(3) 读过的那层意思,在估计器里原样保留)。
> [!note]- 论文式(7) 的来历:式(3) 的 KL 半边保留、重构半边套式(5)
> 起点是论文式(3):
>
> $\mathcal L(\theta,\varphi;x^{(i)})=-D_{KL}\big(q_\varphi(z\mid x^{(i)})\,\|\,p_\theta(z)\big)+\mathbb E_{q_\varphi(z\mid x^{(i)})}\big[\log p_\theta(x^{(i)}\mid z)\big]$
>
> 第二步,KL 项原样不动(它是两个写得出密度的分布之间的 KL,自身是个确定的量、不需要抽样,能否积出闭式取决于分布形状,取高斯后 §5.3 推)。重构项按式(5) 把期望换到 $\epsilon$ 名下($z$ 换写成 $g_\varphi(\epsilon,x^{(i)})$):
>
> $\mathcal L(\theta,\varphi;x^{(i)})=-D_{KL}\big(q_\varphi(z\mid x^{(i)})\,\|\,p_\theta(z)\big)+\mathbb E_{p(\epsilon)}\Big[\log p_\theta\big(x^{(i)}\mid g_\varphi(\epsilon,x^{(i)})\big)\Big]$
>
> 第三步,期望抽 $L$ 条样本平均,并把 $g_\varphi(\epsilon^{(i,l)},x^{(i)})$ 记回简写 $z^{(i,l)}$:
>
> $\mathcal L(\theta,\varphi;x^{(i)})\simeq-D_{KL}\big(q_\varphi(z\mid x^{(i)})\,\|\,p_\theta(z)\big)+\frac{1}{L}\sum_{l=1}^{L}\log p_\theta\big(x^{(i)}\mid z^{(i,l)}\big)$
>
> $\simeq$ 右侧与式(7) 第一行逐字相同,$\widetilde{\mathcal L}^B$ 就是论文给它起的名字。配上样本来路那行,即红框整条。
## §4.3 小批量换算:$N$、$M$、$L$ 各管一层
三个规模数先各就各位:
- $N$:训练集总共多少个数据点(如 MNIST 的 60000)。全数据集的下界是 $N$ 项之和,想最大化的就是它,但每步算全 $N$ 项太贵。
- $M$:batch size,每步从全集随机抽 $M$ 个点实际参与计算(论文取 100)。
- $L$:batch 里每个数据点各抽几份噪声 $\epsilon$,即每个点用几个 $z$ 样本去估它的单点下界(论文取 1,一图一噪声)。
嵌套关系一句话:**每个点抽 $L$ 条隐码,每步抽 $M$ 个点,全集共 $N$ 个点。** $N$ 与 $M$ 之间靠式(8) 换算:
> [!danger] 论文式(8) · 小批量估计器
> $\mathcal L(\theta,\varphi;X)\simeq\widetilde{\mathcal L}^M(\theta,\varphi;X^M)=\frac{N}{M}\sum_{i=1}^{M}\widetilde{\mathcal L}(\theta,\varphi;x^{(i)})$
> 其中小批量 $X^M=\{x^{(i)}\}_{i=1}^M$ 是从全集 $X$(共 $N$ 个点)随机抽的 $M$ 个数据点。
系数 $\dfrac{N}{M}$ 的来历:小批量能直接给出的是人均水平 $\dfrac{1}{M}\sum$,要估的是 $N$ 个点的总和,人均乘总数即得 $\dfrac{N}{M}$(逐步推导见本节末折叠)。求和里的单点 $\widetilde{\mathcal L}$ 用 A 版或 B 版都行。
$L$ 为什么取 1:论文的实验结论是**只要 $M$ 够大(如 100),每个数据点抽一条就够($L=1$)**。直觉:每步都在换新的小批量、新的噪声,单点的抽样噪声在一步步更新中自然被平均掉。同样的算力,加大 $M$(多看几张图)比加大 $L$(一张图反复抽)划算,所以实现里连 $L$ 的循环都不写,一图一噪声。
> [!note]- 论文式(8) 的来历:小批量均值冒充全集均值
> 起点:全数据集的下界是各点之和(02 §2.2 开头「对数似然逐点相加」的下界版):
>
> $\mathcal L(\theta,\varphi;X)=\sum_{i=1}^{N}\mathcal L(\theta,\varphi;x^{(i)})$
>
> 第二步,和改写成「$N$ 乘全体均值」(乘除同一个 $N$,值不变):
>
> $\mathcal L(\theta,\varphi;X)=N\cdot\frac{1}{N}\sum_{i=1}^{N}\mathcal L(\theta,\varphi;x^{(i)})$
>
> 第三步,全体均值用随机小批量($M$ 个点)的均值近似:
>
> $\mathcal L(\theta,\varphi;X)\simeq N\cdot\frac{1}{M}\sum_{i=1}^{M}\mathcal L(\theta,\varphi;x^{(i)})$
>
> 第四步,$N$ 并进分数成 $\dfrac{N}{M}$,再把和式里的单点 $\mathcal L$ 换成它的估计值 $\widetilde{\mathcal L}$(A 或 B 版):
>
> $\mathcal L(\theta,\varphi;X)\simeq\frac{N}{M}\sum_{i=1}^{M}\widetilde{\mathcal L}(\theta,\varphi;x^{(i)})$
>
> $\simeq$ 右侧与式(8) 逐字相同,红框中间那个 $\widetilde{\mathcal L}^M$ 就是论文给这个小批量估计值起的名字。
## §4.4 AEVB 算法:整个训练循环
拼装完毕,这就是 AEVB(Auto-Encoding Variational Bayes,自编码变分贝叶斯)训练算法:拿 SGVB 估计器的读数求梯度、反复更新参数的完整流程,论文 Algorithm 1 逐行如下:
> [!danger] 论文 Algorithm 1 · AEVB 小批量训练
> $\theta,\varphi\leftarrow$ 初始化参数
> `repeat`
> $\quad X^M\leftarrow$ 从全数据集随机抽一个 $M$ 个点的小批量
> $\quad \epsilon\leftarrow$ 从噪声分布 $p(\epsilon)$ 抽随机样本
> $\quad g\leftarrow\nabla_{\theta,\varphi}\,\widetilde{\mathcal L}^M(\theta,\varphi;X^M,\epsilon)$(论文式(8) 小批量估计器的梯度)
> $\quad \theta,\varphi\leftarrow$ 用梯度 $g$ 更新参数(如 SGD 或 Adagrad)
> `until` 参数 $(\theta,\varphi)$ 收敛
> `return` $\theta,\varphi$
> (论文实验设 $M=100$、$L=1$,两版估计器均可用。)
逐行读:第 3 行抽数据、第 4 行抽噪声,两种随机性各归各。第 5 行对小批量估计器求梯度,$\theta$ 与 $\varphi$ 一起求(联合训练)。第 6 行交给任意随机梯度优化器,SGD(stochastic gradient descent,随机梯度下降)即最普通的一款,Adagrad 是当年常用的一种自适应步长变体(每个参数按自己历史梯度的大小自动调步长)。**整个训练循环就是一个普通的随机梯度上升:抽小批量、抽噪声、算梯度、更新,再无别的机关**,这正是「能在大数据集上跑」的全部秘密。
## §4.5 「自编码」的样子从哪来
论文 §2.3 末段专门停下来指认:看 B 版估计器(式(7)),整套东西就是一个自编码器的训练目标。
数据流按顺序走一遍:数据点 $x^{(i)}$ 和噪声 $\epsilon^{(l)}$ 一起进 $g_\varphi$,产出这条数据自己的后验样本 $z^{(i,l)}$(编码,带随机)。$z^{(i,l)}$ 再进 $\log p_\theta(x^{(i)}\mid z^{(i,l)})$,读出「这条隐码把原数据解回来的对数密度」(解码并打分)。于是式(7) 两项各就各位:第一项(负 KL)是正则器,第二项在自编码器语言里就是期望的负重构误差。
和普通自编码器摆在一起看差别:普通自编码器把 $x$ 编成一个定点、解码、只压重构误差。VAE 把 $x$ 编成一团分布(抽样出场),解码打分,再加一个由变分推导自动带出来的 KL 正则。这个「自动带出来」还有一层意味:普通自编码器要学出有用的表示,得靠手工外加正则(去噪、稀疏之类),而 VAE 的正则项是下界推导白送的,不带额外超参数。
## 本节一条线
把重参数化套进下界,就是 SGVB 估计器:A 版(论文式(6))对整个期望抽样平均,通用、端到端可导。B 版(论文式(7))把 KL 项换成解析值、抽样只管重构项,随机源少一半、方差更小。单点量换全集量乘 $\dfrac{N}{M}$(论文式(8)),且 $M$ 够大时每点抽一条就够($L=1$)。AEVB 算法(论文 Algorithm 1)把这一切装进普通的随机梯度循环:抽小批量、抽噪声、对 $\theta,\varphi$ 联合求梯度、更新。按数据流看,$g_\varphi$ 编码、$\log p_\theta(x\mid z)$ 解码打分,式(7) 就是「重构误差加自带正则」的自编码器目标。下一节把分布全部取成高斯、网络取成 MLP,就是 VAE 本体。