自编码器AE,VAE

从直觉的角度来阐述

  • 可以用于压缩数据,或从有noisy或者损坏的数据中重建原始数据。
  • 允许我们线性的差值,比如让一个人的脸变成另外一个人的脸。
  • 可以对data可以按照需求的进行操作,比如改变照片上人的头发的长度,或者不改变其他任何声音特性的情况下平滑的将一个男性的声音变为女性。
  • 甚至可以发现大量未标记数据中隐藏的概念和关系,因此可以用于无监督学习中。

Autoencoder

  • 用于压缩数据,但是没有泛化能力,因此不能作为生成模型。
  • A->BAB是队友),Asome kind of data,而这个dataB没有见过的,A必须要将data描述给B,以便B明白Adata是什么样的(重建data),有一个C(教练)能确切的知道Adata是什么,然后能够给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是对scorecontribution的以及How(梯度下降).
  • B也可以告诉A如何improve Aencoding技术,以便能更好的表示信息
  • AB仅有的联系方式就是back-propagation,还要注意的一点就是不能一次调整图片过多,而是他们需要根据每个反馈对他们的过程进行小的更新,并希望随着时间的推移,这些小的调整将增加一个独特的过程,使他们在所有图像中获得良好的分数,而不仅仅是当前的图像(控制合适的学习率)。
  • 因此开始的时候B总是乱画,直到他从众多猫狗的训练数据中有一次他画出了动物的轮廓的话发现得到的分数变高了,虽然此时他还没有使用A的输入的code,因此当能画出猫狗的图像就会关注A输入,才不让自己的得分陷入停滞。

VAE

  • 原始的autoencoder有一个问题就是有编码器和解码器都会记住训练数据,这样泛化能力就很差。
  • 现在做的就是B不直接得到训练数据的编码,而是从A将数据编码的分布中进行随机采样,这在论文里面叫做reparametrization trick,就是为了更加的robust
  • 比如原来的autoencoder是非常笨的把一个图片编码成一个数字,现在的VAE将一个图像编码成一个分布(原来是一个点,现在是一坨),然后再从分布中采样出一个数值当成图像的编码,因此相当于提高的泛化能力。
  • 这样的就是autoencoder编码的code,数据之间有很大的gap,几乎没有泛化能力。
  • 是一个泛化能力比较强的编码结构
  • 但是如果分布像上面一样还是有问题的,因为泛化能力还是不够高,因此我们要求隐变量的分布越和多元的正太分布相似我们给的奖励就越多,这样就增大了隐变量分布的不确定性,因此A就更有可能将数据编码成下面的情况,这样也要求了A编码要有技巧性,比如157158编码重叠的可能性很高,为了避免B误会因此要求A将长得像的图像放在一起(要求157158),这样就提升了A的编码能力。
  • 比如下面的图像就是VAEMNIST数据集进行编码后的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可以只编码一些重要的信息比如语言是什么风格的,文本长度是多少,剩下的事情交给decoderlanguage 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也可以用于翻译中,比如encoderhidden 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,因为编码就是一个点而不是一个分布。

    引用,感谢!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容