VAE(变分自编码器)
论文《Auto-Encoding Variational Bayes》
Variational Auto-Encoder
-
我们平常的编码器可以对数据进行压缩,降噪之类的一些处理,但是实际上不能来生成任意数据。
- 而VAE就可以,它可以直接通过模型生成隐变量z,并且z是及含有数据信息又含有噪声的,所以可以无穷无尽的生成数据
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
-
这是一个重要的生成模型(功能和GAN相似),不过VAE采用的是概率的思想(我们知道密度分布函数),GAN直接用神经网络训练一个判别器
- 如上是VAE的简单结构(下面的式子忽略的上面的
ϕ
、
θ
\phi、\theta
ϕ、θ参数)
- 我们能观测到的数据是 x x x
- z → x , q ( x ∣ z ) z\rightarrow x,q(x|z) z→x,q(x∣z)是生成模型,z是隐变量,类似一个解码器
- x → z , p ( z ∣ x ) x\rightarrow z,p(z|x) x→z,p(z∣x)是识别模型,类似一个编码器
对识别模型
-
因为后验分布 p ( z ∣ x ) p(z|x) p(z∣x)难以计算,所以不采用EM算法
-
借助z描述x的分布 p ^ ( x ) \hat p(x) p^(x)
- p ^ ( x ) \hat p(x) p^(x)是根据样本确定的x的先验分布
-
q
(
x
)
=
∫
q
(
x
∣
z
)
q
(
z
)
d
z
q(x)=\int q(x|z)q(z)dz
q(x)=∫q(x∣z)q(z)dz
- q ( z ) q(z) q(z)是先验分布(如标准正态分布)
-
我们要在p和q之间建立联系, q ( x ) 逼 近 p ^ ( x ) q(x)逼近\hat p(x) q(x)逼近p^(x),逼近之后就相当于一次求出了两个模型
-
这个逼近我们利用KL散度进行近似 p ( x , z ) 与 q ( x , z ) p(x,z)与q(x,z) p(x,z)与q(x,z),让它小(即,相当于用KL散度惩罚的方法在隐藏层编码向量上强加一个先验分布)
-
K L ( p ( x , z ) ∣ ∣ q ( x , z ) ) = ∬ p ( x , z ) l n p ( x , z ) q ( x , z ) d z d x = ∫ p ^ ( x ) [ ∫ p ( z ∣ x ) l n p ^ ( x ) p ( z ∣ x ) q ( x , z ) d z ] d x = E x ∼ p ^ ( x ) [ ∫ p ( z ∣ x ) l n p ^ ( x ) p ( z ∣ x ) q ( x , z ) d z ] = E x ∼ p ^ ( x ) [ ∫ p ( z ∣ x ) ( l n p ^ ( x ) + l n p ( z ∣ x ) q ( x , z ) ) d z ] ( 带 p ^ ( x ) 那 项 是 常 数 提 出 常 数 = E x ∼ p ^ ( x ) [ l n p ^ ( x ) ∫ p ( z ∣ x ) d z ] = E x ∼ p ^ ( x ) [ l n p ^ ( x ) ] ) 最 后 有 l o s s L L = K L ( p ( x , z ) ∣ ∣ q ( x , z ) ) − 常 数 = E x ∼ p ^ ( x ) [ ∫ p ( z ∣ x ) l n p ( z ∣ x ) q ( x , z ) d z ] KL(p(x,z)||q(x,z))=\iint p(x,z)ln{p(x,z)\over q(x,z)}dzdx\\=\int \hat p(x)[\int p(z|x)ln\frac{\hat p(x)p(z|x)}{q(x,z)}dz]dx\\= E_{x\sim \hat p(x)}[\int p(z|x)ln\frac{\hat p(x)p(z|x)}{q(x,z)}dz]\\= E_{x\sim \hat p(x)}[\int p(z|x)(ln\hat p(x)+ln \frac{p(z|x)}{q(x,z)})dz]\\ (带\hat p(x)那项是常数提出\\ 常数=E_{x\sim \hat p(x)}[ln\hat p(x)\int p(z|x)dz]=\\ E_{x\sim \hat p(x)}[ln\hat p(x)])\\ 最后有loss ~\mathcal{L}\\ \mathcal{L}=KL(p(x,z)||q(x,z))-常数\\= E_{x\sim \hat p(x)}[\int p(z|x)ln \frac{p(z|x)}{q(x,z)}dz] KL(p(x,z)∣∣q(x,z))=∬p(x,z)lnq(x,z)p(x,z)dzdx=∫p^(x)[∫p(z∣x)lnq(x,z)p^(x)p(z∣x)dz]dx=Ex∼p^(x)[∫p(z∣x)lnq(x,z)p^(x)p(z∣x)dz]=Ex∼p^(x)[∫p(z∣x)(lnp^(x)+lnq(x,z)p(z∣x))dz](带p^(x)那项是常数提出常数=Ex∼p^(x)[lnp^(x)∫p(z∣x)dz]=Ex∼p^(x)[lnp^(x)])最后有loss LL=KL(p(x,z)∣∣q(x,z))−常数=Ex∼p^(x)[∫p(z∣x)lnq(x,z)p(z∣x)dz]
-
注意,上面的损失函数的下界是
-常数
,所以可能是负数 -
注: K L ( p ( x ) ∣ ∣ q ( x ) ) KL(p(x)||q(x)) KL(p(x)∣∣q(x))是一个泛函问题,泛函问题求极值用变分法,这也是“变分”的来源,这里的变分就用在 K L ( p ( x ) ∣ ∣ q ( x ) ) ≥ 0 , 且 只 有 在 p ( x ) = q ( x ) 是 最 小 KL(p(x)||q(x))\ge 0,且只有在p(x)=q(x)是最小 KL(p(x)∣∣q(x))≥0,且只有在p(x)=q(x)是最小和求变分下界上面,这个KL散度的结论我们在这里直接套用
-
对生成模型
- 为了得到生成模型,把联合概率q拆开
L = E x ∼ p ^ ( x ) [ ∫ p ( z ∣ x ) l n p ( z ∣ x ) q ( x ∣ z ) q ( z ) d z ] = E x ∼ p ^ ( x ) [ − ∫ p ( z ∣ x ) l n q ( x ∣ z ) d z + ∫ p ( z ∣ x ) l n p ( z ∣ x ) q ( z ) d z ] = E x ∼ p ^ ( x ) [ E z ∼ p ( z ∣ x ) [ − l n q ( x ∣ z ) ] + K L ( p ( z ∣ x ) ∣ ∣ q ( z ) ) ] ( K L ( p ( z ∣ x ) ∣ ∣ q ( z ) ) 还 能 表 示 成 E z ∼ p ( z ∣ x ) [ l n p ( z ∣ x ) q ( z ) ] ) \mathcal{L}=\\E_{x\sim \hat p(x)}[\int p(z|x)ln \frac{p(z|x)}{q(x|z)q(z)}dz]\\= E_{x\sim \hat p(x)}[-\int p(z|x)ln~q(x|z)dz+\int p(z|x)ln \frac{p(z|x)}{q(z)}dz]\\= E_{x\sim \hat p(x)}[E_{z\sim p(z|x)}[-ln~q(x|z)]+KL(p(z|x)||q(z))]\\ (KL(p(z|x)||q(z))还能表示成E_{z\sim p(z|x)}[ln~\frac{p(z|x)}{q(z)}]) L=Ex∼p^(x)[∫p(z∣x)lnq(x∣z)q(z)p(z∣x)dz]=Ex∼p^(x)[−∫p(z∣x)ln q(x∣z)dz+∫p(z∣x)lnq(z)p(z∣x)dz]=Ex∼p^(x)[Ez∼p(z∣x)[−ln q(x∣z)]+KL(p(z∣x)∣∣q(z))](KL(p(z∣x)∣∣q(z))还能表示成Ez∼p(z∣x)[ln q(z)p(z∣x)])
- 然后我们只要找到适当的 q ( x ∣ z ) 和 q ( z ) q(x|z)和q(z) q(x∣z)和q(z)最小化Loss
- 这里就相当于最小化变分上界
近似
- 现在 q ( z ) , q ( x ∣ z ) , p ( z ∣ x ) q(z),q(x|z),p(z|x) q(z),q(x∣z),p(z∣x)都没确定
- 首先为了采样,我们假设 z ∼ N ( 0 , I ) z\sim N(0,I) z∼N(0,I)这就解决了 q ( z ) q(z) q(z)
然后其余两个的不知道怎么求,那就使用神经网络拟合。
p(z|x)后验分布的近似
论文中的公式 log p ( z ∣ x ( i ) ) = log N ( z ; μ ( i ) , σ ( i ) 2 , I ) \log p(z|x_{(i)})=\log N(z;\mu_{(i)},\sigma^2_{(i)},I) logp(z∣x(i))=logN(z;μ(i),σ(i)2,I)
- 我们给每一个
x
(
i
)
x^{(i)}
x(i)都配上一个正态分布,总体就是各分量独立的混合高斯分布(多元高斯分布)
- 如果是只有一个正态分布的话,就不知道得出来的Z和原来的X是不是对应的,而我们现在这里可以一一对应
我们假设
p
(
z
∣
x
)
p(z|x)
p(z∣x)是各分量独立的正态分布,均值、方差由x决定
p
(
z
∣
x
)
=
1
∏
k
=
1
d
2
π
σ
(
k
)
2
(
x
)
e
x
p
(
−
1
2
∣
∣
z
−
μ
(
x
)
σ
(
x
)
2
∣
∣
2
)
p(z|x)={1\over{\prod_{k=1}^d}\sqrt{2\pi\sigma_{(k)}^2(x)}}exp(-{1\over 2}||\frac{z-\mu(x)}{\sigma(x)^2}||^2)
p(z∣x)=∏k=1d2πσ(k)2(x)1exp(−21∣∣σ(x)2z−μ(x)∣∣2)
- d是隐变量z的维度(也可以说是分量独立的数目)
这里神经网络输入是x,输出就是 μ ( x ) , σ ( x ) 2 \mu(x),\sigma(x)^2 μ(x),σ(x)2
那么Loss(这里的损失叫KL Loss)中KL散度这一项就是
K
L
L
o
s
s
=
K
L
(
p
(
z
∣
x
)
∣
∣
q
(
z
)
)
=
K
L
(
N
(
μ
,
σ
2
)
∣
∣
N
(
0
,
1
)
)
=
∫
1
2
π
σ
2
e
x
p
(
−
(
x
−
μ
)
2
/
2
σ
2
)
(
l
o
g
e
x
p
(
−
(
x
−
μ
)
2
/
2
σ
2
)
/
2
π
σ
2
e
x
p
(
−
x
2
/
2
)
/
2
π
)
=
.
.
.
=
1
2
∑
k
=
1
d
(
μ
(
k
)
2
(
x
)
+
σ
(
k
)
2
(
x
)
−
l
n
σ
(
k
)
2
(
x
)
−
1
)
KL~~Loss=KL(p(z|x)||q(z))\\=KL(N(\mu,\sigma^2)||N(0,1))\\ =\int \frac{1}{\sqrt{2\pi\sigma^2}}exp(-(x-\mu)^2/2\sigma^2)(log\frac{exp(-(x-\mu)^2/2\sigma^2)/{\sqrt{2\pi\sigma^2}}}{exp(-x^2/2)/{\sqrt{2\pi}}})\\ =...=\\ {1\over 2}\sum_{k=1}^d(\mu^2_{(k)}(x)+\sigma^2_{(k)}(x)-ln\sigma^2_{(k)}(x)-1)
KL Loss=KL(p(z∣x)∣∣q(z))=KL(N(μ,σ2)∣∣N(0,1))=∫2πσ21exp(−(x−μ)2/2σ2)(logexp(−x2/2)/2πexp(−(x−μ)2/2σ2)/2πσ2)=...=21k=1∑d(μ(k)2(x)+σ(k)2(x)−lnσ(k)2(x)−1)
- μ ( x ) 、 σ ( x ) \mu(x)、\sigma(x) μ(x)、σ(x)起到类似encoder的作用
q(x|z)生成模型的近似
文中给出了两种分布:伯努利分布和正态分布(当然都是各分量独立)
这里的损失叫重构损失
伯努利(二值数据)
- l利用神经网络 ρ ( z ) \rho(z) ρ(z)来计算参数 ρ \rho ρ
− l n q ( x ∣ z ) = ∑ k = 1 d [ − x ( k ) l n ρ ( k ) ( z ) − ( 1 − x ( k ) ) l n ( 1 − ρ ( k ) ( z ) ) ] -ln~q(x|z)=\sum_{k=1}^d[-x_{(k)}ln\rho_{(k)}(z)-(1-x_{(k)})ln(1-\rho_{(k)}(z))] −ln q(x∣z)=k=1∑d[−x(k)lnρ(k)(z)−(1−x(k))ln(1−ρ(k)(z))]
- 这表明 ρ ( z ) \rho(z) ρ(z)要压缩到0~1之间(如sigmoid激活),然后用交叉熵作为损失函数。 ρ ( z ) \rho(z) ρ(z)在此起到类似decoder的作用
正态分布
这里
μ
^
(
z
)
,
σ
^
(
z
)
\hat\mu(z),\hat\sigma(z)
μ^(z),σ^(z)是输入为z、输出为均值和方差的神经网络
−
l
n
q
(
x
∣
z
)
=
1
2
∣
∣
x
−
μ
^
(
z
)
σ
^
(
z
)
∣
∣
+
d
2
l
n
2
π
+
1
2
∑
k
=
1
d
l
n
σ
^
(
k
)
(
z
)
2
经
常
把
方
差
固
定
为
一
个
常
数
σ
^
−
l
n
q
(
x
∣
z
)
∼
1
2
σ
^
2
∣
∣
x
−
μ
^
(
z
)
∣
∣
2
-ln~q(x|z)={1\over 2}||\frac{x-\hat\mu(z)}{\hat\sigma(z)}||+{d\over 2}ln~ 2\pi+{1\over 2}\sum_{k=1}^dln~\hat\sigma^2_{(k)(z)}\\ 经常把方差固定为一个常数\hat\sigma\\ -ln~q(x|z) \sim {1\over {2\hat\sigma^2}}||x-\hat\mu(z)||^2
−ln q(x∣z)=21∣∣σ^(z)x−μ^(z)∣∣+2dln 2π+21k=1∑dln σ^(k)(z)2经常把方差固定为一个常数σ^−ln q(x∣z)∼2σ^21∣∣x−μ^(z)∣∣2
- 这里就有了MSE损失函数
采样
E z ∼ p ( z ∣ x ) [ − l n q ( x ∣ z ) ] E_{z\sim p(z|x)}[-ln~q(x|z)] Ez∼p(z∣x)[−ln q(x∣z)]
- 生成模型的模型建立完了,我们还差对它的数据采样 z ∼ p ( z ∣ x ) z\sim p(z|x) z∼p(z∣x)
重参数技巧
-
我们要从正态分布 p ( z ∣ x ( k ) ) p(z|x_{(k)}) p(z∣x(k))采样出 z ( k ) z_{(k)} z(k),不过这个是由后验概率对应的神经网络产生的均值和方差来计算并采样的。就是说,这个均值和方差理论上还要受“采样过程的求导”来优化。也就是对随机变量的参数求导
-
但是“采样”过程是不可导的,但是结果是可导的。
-
1 2 π σ 2 e x p ( − 1 2 ∣ ∣ z − μ σ 2 ∣ ∣ 2 ) d z = 1 2 π e x p ( − 1 2 ( z − μ σ ) 2 ) d ( z − μ σ ) {1\over\sqrt{2\pi\sigma^2}}exp(-{1\over 2}||\frac{z-\mu}{\sigma^2}||^2)dz\\= {1\over\sqrt{2\pi}}exp(-{1\over 2}(\frac{z-\mu}{\sigma})^2)d{({z-\mu\over\sigma})} 2πσ21exp(−21∣∣σ2z−μ∣∣2)dz=2π1exp(−21(σz−μ)2)d(σz−μ)
-
上式转化成 z − μ σ = ε \frac{z-\mu}{\sigma}=\varepsilon σz−μ=ε满足分布 N ( 0 , I ) N(0,I) N(0,I)
-
那么我们从分布 N ( 0 , I ) N(0,I) N(0,I)采样 ε \varepsilon ε,这个就是从已知分布采样了,不需要反向传播来优化。
- 所以我们先从分布 N ( 0 , I ) N(0,I) N(0,I)采样 ε \varepsilon ε
- 然后把 ε \varepsilon ε变化到z,即 z = ε ⋅ σ + μ z=\varepsilon \cdot \sigma+\mu z=ε⋅σ+μ
- 计算图的形式就变成了下面这个
- 这就是加了个高斯noise进去
然后VAE中,我们在这里对于每个数据都只用采样一个。
- 因为每个epoch所计算的隐变量都不相同,这样能保证采样充分
为什么采样一个就行
- 我们先看一下不用KL散度来把p和q逼近,从边缘概率来求解模型
q ( x ∣ z ) = a r g m a x q ( x ∣ z ) ∫ p ^ ( x ) l n ( ∫ q ( x ∣ z ) q ( z ) d z ) d x = a r g m a x q ( x ∣ z ) E x ∼ p ^ ( x ) [ l n ( ∫ q ( x ∣ z ) q ( z ) d z ) ] = a r g m a x q ( x ∣ z ) E x ∼ p ^ ( x ) [ l n ( 1 k ∑ i = 1 k q ( x ∣ z i ) ) ] z 1 , . . . , z k ∼ q ( z ) q(x|z)=\\ argmax_{q(x|z)}\int \hat p(x)ln(\int q(x|z)q(z)dz)dx \\=argmax_{q(x|z)}E_{x\sim \hat p(x)}[ln(\int q(x|z)q(z)dz)] \\=argmax_{q(x|z)}E_{x\sim \hat p(x)}[ln({1\over k}\sum_{i=1}^kq(x|z_i))]\qquad z_1,...,z_k\sim q(z) q(x∣z)=argmaxq(x∣z)∫p^(x)ln(∫q(x∣z)q(z)dz)dx=argmaxq(x∣z)Ex∼p^(x)[ln(∫q(x∣z)q(z)dz)]=argmaxq(x∣z)Ex∼p^(x)[ln(k1i=1∑kq(x∣zi))]z1,...,zk∼q(z)
- 如果采样的时候,k=1或很小肯定不行的,因为对于一个batch的x我们不够分
所以在先验分布的采样训练不好
因为上面的中括号的内容不能显示的求出,所以我们用KL散度,并有了VAE
对于生成模型
q
(
x
∣
z
)
q(x|z)
q(x∣z),现在假设这是高斯分布
−
l
n
q
(
x
∣
z
)
∼
1
2
σ
^
2
∣
∣
x
−
μ
^
(
z
)
∣
∣
2
-ln~q(x|z) \sim {1\over {2\hat\sigma^2}}||x-\hat\mu(z)||^2
−ln q(x∣z)∼2σ^21∣∣x−μ^(z)∣∣2
- 1、我们从q(z)中采样出z,然后带入q(x|z)的得到分布的形式,理论上要在采样一次才能得到x,但这里不那么做
- 2、我们直接把神经网络的结果
μ
^
(
z
)
\hat \mu(z)
μ^(z)的结果当成x(这表明q(x|z)的方差或固定的方差很小),所以每次采样的结果几乎都是相同的(
μ
(
z
)
\mu(z)
μ(z))
-
- (标准正态分布(蓝)和小方差正态分布(橙))
-
- 3、所以采样一次和采样多次就没多大差别了
所以用后验分布采样训练好且一个点就行了
实现
- 网上的一个流程图
- 先解决 p ( z ∣ x ) p(z|x) p(z∣x)部分,计算KL Loss并得到均值和方差
- 将上面的均值、方差加上高斯noise对z进行采样
- 解决 q ( x ∣ z ) q(x|z) q(x∣z)部分,计算重构Loss
总结
实现encoder和decoder就平常的方法来,CV的CNN,NLP的LSTM等等,只是VAE在中间转化的时候多加了点东西。
-
encoder有两个:计算均值和计算方差
-
计算均值的网络
- 本质上就是对encode的结果加上高斯噪声,使得decoder对噪声更有鲁棒性。
- KL Loss相当于正则(对零均值的正态逼近),使得encoder的结果具有零均值
-
计算方差的网络
-
相当于动态调节噪声的强度(和方差对应)
-
刚开始训练时(重构误差>>KL Loss),适当降低噪声强度(KL Loss增加),使得拟合更容易;反之,训练久后,噪声强度增加(重构误差<KL Loss),这是噪声增加(KL Loss减少),拟合又更困难了。
-
也就是KL Loss和重构误差的优化是一个对抗的过程,与GAN不同的是,这两个混在一起共同优化的
-
-
-
decoder类似
-
文章的亮点就是:1、文章利用KL散度惩罚的方法在隐藏层编码向量上强加一个先验分布;2、文章用贝叶斯的方式来阐释了这个网络结构