read: Blog - 苏剑林 | VAE-3

变分自编码器(三):这样做为什么能成?

采样一次就够

先推断学习 z 的后验分布 p(z|x) 的参数,再从分布中采样一个 z,用它计算 x 的后验分布 p(x|z) 的参数,再算从x的后验分布中采样得到 x‘的概率,

在 VAE 的损失函数:𝓛 = 𝔼_pᐢ(x) [ KL( p(z|x)||q(z) ) + 𝔼_p(z|x) [ -ln q(x|z) ] ]中,

KL散度的计算是使用神经网络拟合出的z的后验分布(正态分布)的期望和方差, 而第 2 项只采了一个样本 x 做近似,所以这一项变为:-ln q(x|z), z~p(z|x)

因为 KL 散度也可写成期望:E_p(z|x) [ ln (p(z|x)/q(z)) ],所以它也可以只采样一个点来近似。所以损失函数就可写为:

𝓛 = 𝔼_pᐢ(x) [ ln p(z|x) - ln q(z) - ln q(x|z) ], z~p(z|x) (5)

苏神说,以上的损失函数也能收敛到相似的结果。

似然不能只用一个采样点估计

极大似然的公式可以写成期望: q(x|z)
= arg max_q(x|z) ∫ pᐢ(x) ln (∫ q(x|z) q(z) dz) dx ,数值计算,要乘x的概率
= arg max_q(x|z) 𝔼_pᐢ(x) [ ln ( ∫ q(x|z) q(z) dz) ] ,采样近似求积分
= arg max_q(x|z) 𝔼_pᐢ(x) [ ln (1/K ∑_ₖ₌₁ᴷ q(x|zₖ) ], z1,z2,…,2ₖ~q(z)

对这个期望近似:先从先验 q(z) 中采 k 个 z,算积分(求和),再采 1 个 x,求它的概率的对数就行了。

shuhuai 说是因为 log 的方差大,所以采样太少会失效。 苏神说,因为z 和 x 是一一对应的,如果没有采到 zₖ,那它对应的 xₖ 也就采不出来,概率就算不出来,因为采样是随机的,不能保证每次采的 k 个 z,包含了本 batch 中所有 x 对应的 z,所以容易失效。

VAE采一个点确实够了

根据对数据集的了解,数据集X本身带有很强的约束,真正独立的维度很少,所以数据集可以被投影到低维空间的一个隐变量上。 这和普通的自编码器一样,也就是 z 与 x 一一对应,也就意味这 p(z|x) 和 q(x|z) 的方差为0。 在引入标准正态形式的先验分布 q(z) 后,粗略地看,只是对隐变量空间做了平移和缩放,所以方差也可以不大。

因为 x 的后验分布的方差很小,每次采的结果都一样,都是均值 μ(z)。 因为 z 与 x 是一一对应的,所以 z 的后验分布的方差也很小,所以每次从中采的 z 都相同。 所以采样一次,与采样多次没什么差别,期望都是一样的。

后验之妙

直接从先验 q(z) 中采样不可行,但在后验分布 p(z|x) 中采样一个点就够了, 因为自编码器里的方差为0,引入 z 的先验(标准正态分布),方差也不会太大。

耿直的IWAE

重要性加权自编码器 Importance Weighted AutoEncoders arxiv

对 p(x) 做了等价变换:乘一个p(z|x),除一个 p(z|x)

p(x) = ∫ q(x|z) q(z) dz
= ∫ p(z|x) ⋅ [q(x|z) ⋅ q(z)] / p(z|x) dz
= 𝔼_p(z|x) [ q(x|z) ⋅ q(z) / p(z|x) ]

这样,从 q(z) 中采样就变成了从 p(z|x) 中采样,此前已论述了后验分布 p(z|x) 方差较小,所以采样几个点就够了:

∫ q(x|z) q(z) dz = 1/k ∑ₖ₌₁ᴷ [ q(x|zₖ)q(zₖ)/p(zₖ|x) ], z1,z2,..,zₖ~p(z|x)

代入似然函数:

q(x|z) = arg max_q(x|z) 𝔼_pᐢ(x) [ ln ( ∫ q(x|z) q(z) dz) ]
= arg max_q(x|z) 𝔼_pᐢ(x) [ ln ( 1/k ∑ₖ₌₁ᴷ [ q(x|zₖ)q(zₖ)/p(zₖ|x) ] ) ]
= arg min_{q(x|z),p(z|x)} 𝔼_pᐢ(x) [ -ln ( 1/k ∑ₖ₌₁ᴷ [ q(x|zₖ)q(zₖ)/p(zₖ|x) ] ) ], z1,z2,..,zₖ~p(z|x) ,加个负号,求极小值。

当 k=1 时,与 (5) 式一样,从这个角度看,IWAE 是VAE的升级版。

其实,等价变换可以使用 z 的任意分布(只要能采出z就行),

“选择 p(z|x) 只是因为它有聚焦性,便于采样。而当 k 足够大时,p(z|x) 的具体形式就不重要了”

IWAE 中削弱了推断模型 p(z|x) 的作用,不去近似后验分布