VAE - variational autoencoder

VAE - variational autoencoder

记录一下对VAE的初步理解,还有很多问题,后续有时间再深入了解。

VAE是一种深度生成模型

Q: 什么叫变量的distribution(分布)?

降维以及PCA与Autoencoder的关系

降维可以表示为原始数据经过encoder获得隐藏空间(latent space)中的编码数据,编码数据也可以通过decoder变回原数据(但该过程可能有信息损失(lossy))
选择encoder和decoder的目标是最小化重建误差(reconstruction error)

PCA中encoder是特征向量组成的线性变换,而decoder是特征矩阵的转置

Autoencoder用神经网络作为encoder和decoder,目的不仅是降低重建误差,而且要获得合适的隐藏空间编码

用Autoencoder做生成任务的问题

可以考虑从隐藏空间中sample隐藏向量,然后用decoder做生成器生成样本

但隐藏空间并不规范,随机sample的点通过decoder可能并不能生成有意义的样本

因为训练过程中并未对隐藏空间性质做任何规范,模型倾向于overfitting以获得更小的重建误差

Q: 什么算是规范(regular)的隐藏空间呢?

VAE做生成

variational autoencoder在训练过程中加入限制,防止overfitting,使得隐藏空间更适合于生成任务

Q: 怎样评估一个隐藏空间/编码是不是overfitting,是不是适合生成任务呢?
连续性:隐藏空间中接近的点decode出的内容也应该类似
完整性:隐藏空间中的点应该decode出有意义的内容

训练限制:
将输入编码为一个隐藏空间的分布而不是点

Q: how?怎样编码为一个分布?

训练过程
输入-encoder-隐藏空间分布-从该分布sample一个点-decoder-输出-计算重建误差

Q: 为啥不直接用分布去decode,而要再sample呢?

encoder输出的分布被强制接近正态分布(用KL散度作为loss)

为了避免encoder直接输出远离而狭窄的分布以把分布当点用,我们需要限制encoder输出分布的mean&covariance,使分布尽量overlap

总损失 = 重建误差+KL散度

总之,要尽量使插值sampling的decode合理

Math

x: 数据
z: 编码表示/隐变量
x由z生成
从先验分布p(z)中sample z -> 从条件概率分布p(x|z)中sample x
p(z)为什么是先验分布?(就假设它已经存在?)
条件概率分布 p ( x ∣ z ) {p(x|z)} p(xz)怎么算呢?

p ( x ∣ z ) {p(x|z)} p(xz) 概率版decoder(给定隐变量得到原数据分布)
p ( z ∣ x ) {p(z|x)} p(zx) 概率版encoder

贝叶斯定理:
p ( z ∣ x ) = p ( x ∣ z ) ∗ p ( z ) / p ( x ) {p(z|x) = p(x|z)*p(z)/p(x)} p(zx)=p(xz)p(z)/p(x)

假设:
p(z)是标准高斯分布
p(x|z)也是高斯分布,其中心为f(z), 协方差矩阵为cI, f为固定方程,c为正数
因此已知p(z)和p(x|z)求p(z|x),是贝叶斯推断(bayesian inference)问题
但是,分母p(x)需要积分,不好计算。需要使用近似技巧,如变分推断

变分推断是一种近似复杂分布的技术
设置参数化分布族近似目标分布,最小化KL散度差异,用梯度下降优化参数

用高斯分布q_x(z)近似p(z|x)
q_x(z)中心为g(x),协方差为h(x),g和h为参数化的函数
优化g和h来最小化q_x(z)与p(z|x)的KL散度

g ∗ , h ∗ = a r g m i n K L ( q x ( z ) , p ( z ∣ x ) ) = a r g m a x ( E ( l o g p ( x ∣ z ) ) − K L ( q x ( z ) , p ( z ) ) ) g*,h* = argmin KL(q_x(z),p(z|x)) \\ = argmax(E(log p(x|z)) - KL(q_x(z),p(z))) g,h=argminKL(qx(z),p(zx))=argmax(E(logp(xz))KL(qx(z),p(z)))

f ∗ , g ∗ , h ∗ = a r g m a x ( E ( − ∣ ∣ x − f ( z ) ∣ ∣ 2 / 2 c ) − K L ( q x ( z ) , p ( z ) ) ) f*,g*,h* = argmax(E(-||x-f(z)||^2/2c) - KL(q_x(z),p(z))) f,g,h=argmax(E(xf(z)2/2c)KL(qx(z),p(z)))

第一项最大化decoder概率(decoder的重建误差),第二项最小化encoder到先验的KL散度
两项需要tradeoff

g和h用神经网络,并且有共享权重的部分:
$g(x) = g_2(g_1(x)) $–> mean
$h(x) = h_2(h_1(x)) $–> covariance(diagonal)
g 1 ( x ) = h 1 ( x ) g1(x)= h1(x) g1(x)=h1(x)

从encoder输出中sample z:
reparametrisation trick
z = h ( x ) ∗ k + g ( x ) , k   N ( 0 , I ) z = h(x)*k + g(x), k~N(0,I) z=h(x)k+g(x),k N(0,I)

L O S S = ∣ ∣ x − f ( z ) ∣ ∣ 2 / 2 c + K L ( N ( g ( x ) , h ( x ) ) − N ( 0 , I ) ) LOSS = ||x-f(z)||^2/2c+KL(N(g(x),h(x))-N(0,I)) LOSS=xf(z)2/2c+KL(N(g(x),h(x))N(0,I))

总结

autoencoder结构由encoder-decoder组成,通过最小化重建损失来优化
但是,由于overfitting,autoencoder的隐藏向量空间非常不regular,即语义不连续,有些点decoder出来没意义
因此需要对隐藏空间做限制
VAE的encoder分为两部分,分别输出隐藏表示的mean和covariance;然后从隐藏表示分布中通过reparametrisation trick采样出z,这个trick是为了保证采样过程可导可以梯度下降优化;然后z经过decoder得到生成的样本;损失的计算包括两项,第一项最小化decoder生成样本与输入样本的重建误差,第二项限制encoder的输出分布接近标准正态分布;

想法

PLM的表示空间不连续的问题是不是也可以这样解决呢?通过在隐藏空间加个概率分布?
应该有这种模型的,搜一下文本VAE

参考资料

https://towardsdatascience.com/understanding-variational-autoencoders-vaes-f70510919f73

你可能感兴趣的:(机器学习,人工智能,深度学习)