watch: ML - 白板 32 | VAE

Table of contents

Source videos: 【机器学习】白板推导系列(三十二) ~ 变分自编码器(VAE)】

1. 模型表示

P1

Variation 来自概率图模型; Auto Encoder 来自神经网络

VAE 也是一种 LVM (Latent Variable Model),最简单的隐变量模型是 GMM,它的概率图模型表示为:

flowchart TB latent((z)) --> observed((x))

小 x 是观测变量,小 z 是假想的服从某种分布的隐变量,先对 z 的分布 P(z) 中采样,再在 z 固定的情况下,从分布 P(x|z) 中采样 x。

GMM

K 个高斯分布的混合,样本数据 x 可能来自于这 K 个高斯分布的任一个,只是概率不同。 而 VAE 是无限个高斯分布的混合。

GMM 假设隐变量 z 是服从一维的离散型概率分布:z~Categorical dist,分布列:

z 1 2 K
p p₁ p₂ pₖ

z 代表不同的类别categories(不同的高斯分布),其中概率密度求和等于1:∑ₖ₌₁ᴷ pₖ = 1。x 在 z 选定的情况下,服从高斯分布:x|zₖ~N(x|μₖ,Σₖ)

GMM 顶多可以被用来做聚类任务,但无法解决复杂的任务,比如目标检测,因为它的 z 太简单了,只有 1 维还是离散型的变量,只能对 1 个属性划分 K 类别,

比如有一群人作为样本,想学习出一个z 用来表示一个样本。 GMM 假设了 z 只是一个 1 维K类的变量,就只能把这群人分成 K 类 (比如按“职业”属性分成:工人,农民,知识份子…),所以只能表达出一个人是来自于哪类。 也就是说,GMM 对样本的表达非常肤浅,因为一个人有多个属性,必须用用多个维度表达: 比如 “性别”z₁={男,女},“肤色”z₂={黄,白,黑},“年龄”z₃={ℤ},“身高”z₄连续的,这么多维度 GMM 无法表达出来。

隐变量 z 应该是高维的,连续的随机变量,假设 z 服从高斯分布: z~N(μ=0,Σ=I),满足高维连续。P(z) 是先验,它并不重要,只是辅助建模,我们最终关心的是 inference 过程:给一个 x 返回它的 z,也就是后验 P(z|x)

如果样本 x 本身是连续的,可以假设它的条件概率也服从高斯分布:x|z~N(μ(z),Σ(z))。若是离散的,则仍然用 categorical distribution。

条件概率 x|z 的均值和方差都是 z 的函数,也就是先给定了 z,然后求出 μ(z) 和 Σ(z),相当于得到了 x。所以实际上要学 μ,Σ 与 z 之间函数关系。 可以用神经网络逼近出来这个函数,所以 μ,Σ 是神经网络(参数θ)的函数,用 μ_θ, Σ_θ 表示。

而不直接通过算 Likelihood 求 x|z 的概率分布,是因为 z 的维度太高,不好把 z 积掉:P(x) = ∫_z P(x,z) dz =∫_z P(z) P(x|z) dz。 因为假设了 z 的维度很高,高到积分算不出来,则 P(x) 是 intractable 的, 又因为后验分布 P(z|x) = P(x|z)P(z) / P(x),所以z的后验也算不出来。也就无法从 x 到 z 做inference。 只能用重参数化技巧和神经网络逼近后验分布。

推断&学习

P2

flowchart TB latent((z)) -- "Pᶿ(x|z) \n Decode \n Generation" --> observed((x)) observed((x)) -. "Pᶿ(z|x) or qᶲ(z|x)\n Encode \n Inference" .-> latent((z))

z 是隐变量假定服从高斯分布 P(z)=N(0,I),x 是观测变量假定服从高斯分布 P_θ (x|z)=N(μ_θ (z), Σ_θ (z))。 假如参数 θ 已经训练好了,生成样本时,先从 z 的分布 P(z) 中采样一个 z⁽ⁱ⁾,然后就能从 P_θ( x|z⁽ⁱ⁾) 采样出一个 x⁽ⁱ⁾。

因为后验分布 P(z|x) 无法通过贝叶斯公式算出,所以用 q_ϕ(z|x) 不断逼近后验分布P_θ(z|x)。

用 EM 求解 GMM 时,是最大化似然,似然可以分成下界 ELBO 和 KL( q_ϕ(z|x) || P_θ(z|x))。

  • 最原始的 EM 的 E-step 要写出n个样本似然p(x)的(最大的)期望:当 q(z|x)=P(z|x) 时, KL=0, 似然的期望就是 ELBO。
  • M-step 就是解最大化问题:θ = arg max_θ ELBO = arg max_θ E_P(z|x,θ⁽ᵗ⁺¹⁾) [ log P(x,z|θ⁽ᵗ⁾) ].
  • E-M 即“最大的期望 与 期望的最大”

VAE 不能用基础的 EM 解决,因为需要 q(z|x) 能取到 P(z|x),但是这里的后验 P(z|x) 是 intractable 的,所以只能让 KL 散度足够小,找出最好的 q,也就是找出它最好的参数ϕ,让 q_ϕ(z|x) 足够接近 P_θ(z|x)。

在EM中,通过引入隐变量 z 和 Z 的分布 q(Z),对数似然 logP(X) 被拆分成 ELBO + KL散度(q(Z)||P(Z|X))。 对应到这里的情况,KL 散度中的 q(Z) 应该是后验 qᵩ(z|x),也就是对似然 P(x|z) 引入的是 qᵩ(z|x),同样 ELBO 中也是按 q(z|x) 求期望。 ELBO 把里面的 log 展开,即可写成联合概率P(z,x) + 熵H[q(z|x)];再把联合概率拆开,其中 z 的先验 P(z) 可与后验的熵 H[q(z|x)] 结合成一个KL散度:z的后验与z的先验要靠近。

$<\\^θ,\\^ϕ>$ = arg min KL( q_ϕ(z|x) || P_θ(z|x) )
= arg max ELBO ,等价于最大化似然P(x|z)的下界
= arg max E_qᵩ(z|x) [ log (P_θ (z,x)/qᵩ(z|x)) ] ,以 z 的后验加权
= arg max E_qᵩ(z|x) [ log P_θ (z,x) - log qᵩ(z|x)) ]
= arg max E_qᵩ(z|x) [ log P_θ(z,x) ] - E_qᵩ(z|x) [ log q(z|x) ] ,第2项是 q(z|x) 的熵
= arg max E_qᵩ(z|x) [ log P_θ(z,x) ] + H[qᵩ(z|x)] ,log里面的联合概率拆开
= arg max E_qᵩ(z|x) [ log P_θ(x|z) ] + E_qᵩ(z|x) [ log P(z) ] + H[qᵩ] ,P(z) 是先验分布不带参数
= arg max E_qᵩ(z|x) [ log P_θ(x|z) ] + E_qᵩ(z|x) [ log P(z)-log q(z|x)]
= arg max E_qᵩ(z|x) [ log (P_θ(x|z) ] + E_qᵩ(z|x) [ log (P(z) / q(z|x))]
= arg max E_qᵩ(z|x) [ log P_θ(x|z) ] + ∫_z qᵩ(z|x)⋅log ( P(z) / q(z|x)) dz
= arg max E_qᵩ(z|x) [ log P_θ(x|z) ] - KL( qᵩ(z|x) || P(z) )

目标函数是一个期望减 KL 散度,期望要最大,而KL散度要最小。

变分推断用梯度上升求最大化问题,首先求目标函数对 θ,ϕ 的梯度,然后更新

采用 SGVI / SGVB / SVI / Armotized Inference (重参数化技巧+神经网络)求后验,解决 Inference 问题。

SGVI 假设 z|x 服从高斯分布 z|x~N(μ_ϕ(x),Σ_ϕ(x)),并且与随机高斯噪声 ε~N(0,I) 之间有函数关系 z= μ_ϕ(x) + Σ_ϕ¹ᐟ²(x)⋅ε,协方差矩阵的指数是½,因为 Σ 里面是σ²。

flowchart LR x("Input x") --> net("NN-ϕ") --> a("μ(x)") --> o(("+")) --> z("latent z") net --> b("Σ(x)") --> m(("×")) --> o ε --> m

对于目标函数中的 E_qᵩ(z|x) [ log P_θ(x|z) ],中括号里面是给定 z 生成 x,而期望的权重 q(z|x) 是给定 x 时,z 的后验概率。 整个训练过程就是,先给了样本 x 得到了后验 q_ϕ(z|x),从中采样得一个 z⁽ⁱ⁾,然后用它算似然 logP(x|z⁽ⁱ⁾),是一个环路。 所以在训练过程中,log 里的 z 不是先验 P(z),而是后验 P(z|x)。 在训练好之后,得到了θ,生成样本时,就直接从 P(z) 中采样,再代入 P_θ(x|z) 得到 x。

flowchart LR x --> Decoder --> z --> Encoder --> x'

目标函数后面的 KL 散度相当于 正则化项。在训练时,要让 q_ϕ(z|x) 尽量与先验 P(z) 靠近,避免坍缩到一个点上,否则第 1 项似然的期望很可能就过拟合了。 或者说让 q_ϕ 的熵 H[q_ϕ] 倾向于大。 熵意味着信息量,信息量大意味着有广泛的可能性,分布更平均,高斯分布越扁方差越大熵越大,钟形曲线越瘦高,说明只在期望那一个点上可能性最大,基本上是确定的,熵就很小,

sumNote

Built with Hugo
Theme Stack designed by Jimmy