自编码器AE,VAE
从直觉的角度来阐述
- 可以用于压缩数据,或从有
noisy
或者损坏的数据中重建原始数据。 - 允许我们线性的差值,比如让一个人的脸变成另外一个人的脸。
- 可以对
data
可以按照需求的进行操作,比如改变照片上人的头发的长度,或者不改变其他任何声音特性的情况下平滑的将一个男性的声音变为女性。 - 甚至可以发现大量未标记数据中隐藏的概念和关系,因此可以用于无监督学习中。
Autoencoder
- 用于压缩数据,但是没有泛化能力,因此不能作为生成模型。
-
A->B
(AB
是队友),A
有some kind of data
,而这个data
是B
没有见过的,A
必须要将data
描述给B
,以便B
明白A
的data
是什么样的(重建data
),有一个C
(教练)能确切的知道A
的data
是什么,然后能够给B
重建的data
打个分数,说明重建的好或者坏。问题在于A和B不能直接交流而是通过一串数字code
来传递信息的。 -
A
需要encoder data
,为了简便我们使用表示成坐标系的两维code(x,y)
- 假设要传递的信息是猫狗的图片,训练阶段有
1
百万的数据。
- 对于一张照片,
A
将这个图片输到自己的machine
中得到了(2.846, -5.049)
,然后将这个信息发给B
,但是B
对于图片是一无所知的,甚至对于猫和狗长什么样也是一无所知的,因此B画出来的图像可能是乱七八糟的,random paintings
,而C
拿到B
所画的图像和原始的图像来比较给出一个相似性分数(loss function)
,并且C
还告诉B
哪些decisions
是对score
有contribution
的以及How
(梯度下降). -
B
也可以告诉A
如何improve
A
的encoding
技术,以便能更好的表示信息 -
A
和B
仅有的联系方式就是back-propagation
,还要注意的一点就是不能一次调整图片过多,而是他们需要根据每个反馈对他们的过程进行小的更新,并希望随着时间的推移,这些小的调整将增加一个独特的过程,使他们在所有图像中获得良好的分数,而不仅仅是当前的图像(控制合适的学习率)。 - 因此开始的时候
B
总是乱画,直到他从众多猫狗的训练数据中有一次他画出了动物的轮廓的话发现得到的分数变高了,虽然此时他还没有使用A
的输入的code
,因此当能画出猫狗的图像就会关注A
输入,才不让自己的得分陷入停滞。
VAE
- 原始的
autoencoder
有一个问题就是有编码器和解码器都会记住训练数据,这样泛化能力就很差。 - 现在做的就是
B
不直接得到训练数据的编码,而是从A
将数据编码的分布中进行随机采样,这在论文里面叫做reparametrization trick
,就是为了更加的robust
。 - 比如原来的
autoencoder
是非常笨的把一个图片编码成一个数字,现在的VAE
将一个图像编码成一个分布(原来是一个点,现在是一坨),然后再从分布中采样出一个数值当成图像的编码,因此相当于提高的泛化能力。 - 这样的就是
autoencoder
编码的code
,数据之间有很大的gap
,几乎没有泛化能力。
- 是一个泛化能力比较强的编码结构
。
- 但是如果分布像上面一样还是有问题的,因为泛化能力还是不够高,因此我们要求隐变量的分布越和多元的正太分布相似我们给的奖励就越多,这样就增大了隐变量分布的不确定性,因此
A
就更有可能将数据编码成下面的情况,这样也要求了A
编码要有技巧性,比如157
和158
编码重叠的可能性很高,为了避免B
误会因此要求A
将长得像的图像放在一起(要求157
和158
),这样就提升了A
的编码能力。
- 比如下面的图像就是
VAE
将MNIST
数据集进行编码后的t-SNE
图像,各个数字聚类了。
- 这样的话就有了很好的特性,比如说得到的一个训练好的
VAE
我们,可以得到了两个图像的编码,如果取一个平均就是两个图像的特性各占一半。
- 还有一个有意思的特性就是,每一个维度都是可解释的,比如我们固定其他维度的信息,只是改变隐变量的一个维度,发现
decoder
时候图像的胡子变长了,那么这一维度就是用来控制胡子长度的
- 感觉
VAE
就是比AE
多了一个训练encoder
的机制,这种机制让encoder
的编码更加的可泛化。
VAE在NLP中的应用
- 现在的问题好比说是一个人有另外一种语言的词表但是却没有相关的解释(并不是说解释是一定有用的,毕竟解释也是一串这种语言的单词),需要明白这种语言句子的意思。
It is as if they were handed a dictionary, but without any explanations. Just a long list of all the words in the English language. (Not that the explanations would have helped, since those themselves are formed of the same words that have no meaning to our players yet.)
- 因为直接生成句子太过困难了,现在是单词级别的监督信息。
Now on thr other hand he does not wait for Bob to finish the entire sentence. Instead he gives Bob a score and feedback after every single word he predicts.
Even more crucially, Charlie tells Bob what would have been the correct word.
- 有一个很有意思的事情是,每个人都拥有不同的
language model
,只是因为他们所拥有的背景知识不同拥有不同的language model
而已,遇到句子狗在追逐...
大部分人会填猫
,但是如果提前告诉你这是一部怪诞小说中的一句话,很多人就会填写其他东西,同样的模型训练数据就相当于condition
(怪诞小说),得到了不同的语言模型。 - 鉴于有限的信息流,仅仅编码令解码器吃惊的信息,剩下的部分让解码器的语言模型来完成,这一概念和信息熵十分的相似。
The trick, given the limited information flow allowed, lies in Alice encoding exactly the kind of information she thinks is surprising to Bob and letting him rely on his own language model for the rest, and also hoping that he actually uses her information in the first place.
- 现在有个问题就是
decoder
可以学习到一个不错的语言模型仅仅通过对比生成的句子以及原始的句子(捕获了低阶的语法信息),这样encoder
就学习不到任何东西,encoder
几乎是随机的,这时候加入variational
那么基本上就是随机+随机,没有什么用,此时优化陷入停滞。
So now with Bob being pretty decent all by himself and Alice having learned absolutely nothing yet, we risk being stuck at what is called a local maximum.
- 主要的原因在于训练的时候是逐单词训练的,因此用不到
hidden state
,但是如果是逐句子训练的话对于decoder
来说又是太难了,训练不起来,因此诀窍就是在两者之间找到一个平衡。 - 一种比较成功的解决这个问题的方法就是给
decoder
增加学习障碍,这样就能让encoder
的学习速度赶上decoder
,一种方法是让decoder
变得健忘,在语言模型中只能得到前面两个词的信息,比如...追逐...
因此他必须使用encoder
给的信息才能很好的预测下一个词,这样尽管训练的速度回慢一些,但是不会陷入学习停滞阶段。 - 另外一种方法就叫
KL cost annealing
,就是仍然使用变分,但是在开始的时候判断的条件松一点,允许encoder
提供具体的信息,但是随着训练的进行(当decoder
的语言模型训练的比较好的时候),要求encoder
提供更加"不确定性"的信息,也就是从Autoencoder
慢慢的进化成Variational Autoencoder
-
VAE
可以只编码一些重要的信息比如语言是什么风格的,文本长度是多少,剩下的事情交给decoder
的language model
来做。
Even if they only figure out a simple code where certain code regions tell Bob that the text is a tweet, others a news article, and yet others restaurant reviews, can dramatically help Bob make better guesses about the next word.
Since Bob also doesn’t know when to actually stop his prediction, Alice might also learn to encode the length of the sentence.
- 因此有些维度就代表写作风格,我们可以控制这一维度来得到想要的文本,这也更加的
robust
因为加入了变分机制会是的“I went to his house”
和“I went to his flat”
的编码在隐空间上非常相近。
-
VAE
也可以用于翻译中,比如encoder
成hidden state
然后decoder
成目标语言。 - 也可以用于文本摘要任务中,将长句子解码成短句子。
Text summarisation is also a closely related discipline. Here Alice encodes a long text, and Bob has to decode it into a summary.
从模型的角度来理解(深度学习角度)
- 模型整体,可以看到
decoder
生成30
维的多元高斯分布,然后采样得到隐变量。
- 隐变量的每一维都是一个高斯分布,通过
reparametrization
技巧让采样的部分变得是课导的,因此可以端到端的训练。
- 我们需要的各个图像的隐变量的分布是图
1
的类型,因为很平滑可以随意差值来生成图像,而不是AE
中的一个点表示一个图像,为了达成这个目的相比于AE
的损失函数VAE
的损失函数变为,加了一个KL
项。
- 加入
kl
散度强迫每一维都是一个正太分布,这样的直观感觉就是让每一维所表示的信息尽可能的都在均值0
附近,也就是不能让hidden state
通过表示图像具体的一些信息(比如那些像素点的信息是多少)这样没有泛化能力的特征,而是应该保留单一的重要的特征,并且这样就强迫了每一维尽可能的表示单一的特征,因此完成了特征的解耦,所以在AE
的重构损失函数中加入了KL
散度那一项可以看成是正则项,就是为了让AE
中一个点表示一个数据,变成VAE
中的一个分布(上面一坨)的东西表示一个数据,因此泛化能力大大增强,下图是两项损失函数的物理解释。
- 第二项
KL
散度loss
的计算公式,当Q(z|x)
的均值为0
方差为1
的时候第二项损失函数取最小值。
- 最终趋向于聚集的重建损失和趋向于分散的
KL
散度达成了平衡,这是符合我们要求的,因为无论我们是从正太分布中随机采样来生成图像还是进行差值都是可以得到一个图像的(没有gap
,而是得到一个平滑的mix
的图像)。
def vae_loss(input_img, output):
# compute the average MSE error, then scale it up, ie. simply sum on all axes
reconstruction_loss = K.sum(K.square(output-input_img))
# compute the KL loss
kl_loss = - 0.5 * K.sum(1 + log_stddev - K.square(mean) - K.square(K.exp(log_stddev)), axis=-1)
# return the average loss over all images in batch
total_loss = K.mean(reconstruction_loss + kl_loss)
return total_loss
从数学的角度来理解(概率模型角度理解)
- 首先写出生成模型的联合概率分布
p(x,z)=p(x∣z)p(z)
,生成的过程可以看成是对于每一个数据点:
- 求数据的隐变量即求解
p(z∣x)
,其中的p(x)
被称为evidence
就是我们的数据分布,p(x)=∫p(x∣z)p(z)dz
可以通过边缘求积来得到,但是由于要枚举所有的z是不可求的,因此必须通过变分推断(variational inference)的方法近似这个后验分布,具体方法是通过
qλ(z∣x)
分布族来近似,λ 指示是哪一个族分布,比如如果q是一个高斯分布,
-
因为上面的后验分布是不可求的因此我们使用变分推断的方法来近似这个后验分布
-
使用KL散度来衡量这个近似的好不好,所以说用高斯近似后验和用强制每一维是正太分布是同样的粗粒度
- 由于近似推断中还有
X
,也是很难求的,因此还要做转换
- 根据
log p(x)
的公式我们知道最小化KL于最大化ELBO
是等价的,因此我们的优化目标变成了最大化ELBO
。
- 上面的
log p(x)
公式推导 - 对
ELBO
展开(其实花书里面对ELBO
的推导直接就是这个公式)。
- 得到了最终的目标函数,从数学角度我们明白了为什么要加入这样一个正则项(是为了尽可能逼近的使用一个合适的高斯分布近似原来的后验
p(z|x)
)
其他一些零零碎碎的东西
- 重建损失一般使用均方误差。
-
X
生成Z
的分布是使用高斯来进行近似的。
- 两项损失函数的物理意义
。
- 如果去掉第二项损失函数
KL
散度那么VAE
就退化成了AE
,因为编码就是一个点而不是一个分布。
引用,感谢!