自编码器(基于Ian Goodfellow 等的Deeplearningbook)、变分自编码器详细解释

目录

一、编码器

二、自编码器

1、欠采样自编码器

2、稀疏自编码器

3、变分自编码器

参考文献


一、编码器

        编码器-解码器的结构在实际生活中并不陌生,如电话将声音信号编制成电信号,经过传输之后,在另一端将电信号恢复成声音信号。通过这种方式,声音就能够进行远距离的传播,这里电声信号的转换是物理上的变换,解码和编码是通过硬件来实现的。而在机器学习典型的例子便是主成分分析,它是一种经典的无监督数据降维算法,降维算法的主要目的是在给定候选中找到最佳的编码器/解码器对。它将一个高维的向量映射为一个低维的向量,而且保留了原向量的主要信息。而从低维向量映射为高维向量便是解码操作,最佳的编码器解码器对应具有尽可能小的重构误差。

二、自编码器

      自编码器是一种特殊的神经网络,经过训练,它能够还原输出到它的输入。其内部有一个隐藏层h描述了一种编码,能够表示输入。该网络可以看做两部分组成,一个编码器函数h=f(x),一个解码器能够进行r=g(h)的重构,如图1所示。如果一个自编码器仅仅简单地学到g(f(x))=x,那么它不算特别有用。相反,设计出来的自编码器应该不能够完美地学习这种还原。它们某些方面应会受到限制,这使得它们只能某种程度上进行这种还原,或者说仅还原训练数据相似的输出。因为模型被强制优先还原输入的某些方面,它通常学习数据有用的属性[3]。

图1. 自编码器的一般结构,将输入x映射到一个输出r通过内部表示或者编码h。自编码器有两部分组成:编码器f,将x映射到h;解码器g,将h映射到r

       现代自动编码器已经将编码器和解编码器的概念从确定性函数推广到随机映射Pencoder(h|x)和Pdecoder(x|h)。

         近几十年来,自编码器一直是神经网络的发展历史上的一重要部分,传统上自编码器用于特征提取和数据降维。特征提取是无监督学习中很重要且很基本的一项任务,一种较为常见的方式是通过训练一个编码器将原始数据集编码为一个固定长度的向量。这个固定长度的向量应当包含尽可能多的重要信息,即我们能够通过训练出一个解码器将该向量还原为原始数据,那么此时的loss就是原始图片和重构图片的mse。这就是标准的自编码器。这与PCA非常类似,不同的是,对于线性自编码器,我们最终获得的新特征不必是独立的。这种方式样本 x的标签值就是样本自身。训练完成之后,在预测时只使用编码器而不再需要解码器,编码器的输出结果被进一步使用,用于分类,去噪等任务。

        一般情况下降维的最终目的不仅是减少数据的维数,而是在减少维数的前提下将数据的主要信息保留下来。这时,必须根据降维的目的来调整隐空间的大小和自编码器的结构。

       自编码器有欠采样自编码器、正则化自动编码器(包括稀疏自动编码器,去噪自动编码器,通过惩罚项的自编码器等)[3]

1、欠采样自编码器

      将输入还原为输出听起来没有用处,通常我们对解码器的输出并不感兴趣,相反我们希望训练一个自编码器能够在还原任务上表现不错,因为这个过程能够提取输入的有用属性。一个从自编码器获得有用特征的方式是限制h的维度比x更小。学习过程可以简单描述为最小化损失函数

L(x, g(f(x)))

       该函数惩罚了g(f(x))和x的不相似程度,如使用均方差损失。这便是欠采样自编码器。当解码器是线性的,L是均方差损失,欠采样自编码器学习了像PCA一样的子空间。在这种情况下,被训练来执行还原任务的自动编码器已经学习了作为副作用的训练数据的主子空间。当自编码器的编码器不是线性函数时,非线性的解码器可以学到更加强大的非线性的PCA。自编码器可以学习到更好的还原任务,而不再提取有用的数据属性。理论上讲,一个自编码器可以是含有一维编码且非常强大的非线性编码器,它可以学到用编码i表达每个训练数据x^{(i)},解码器可以学习将这些编码映射会特定训练样本的值。实践中这些情况并不存在,但是这表明如果编码空间太大,它将学习不到关于数据集的有用的属性或者信息。就像神经网络中的flatten,或者具有相同维度的全连接一样,产生不出任何有用的信息。

2、稀疏自编码器

    稀疏自编码器就是在自编码器的基础上在训练时对编码h加入一个稀疏惩罚项Ω(h),公式如下所示L(x,g(f(x))) + Ω(h),其中g(h)是解码器的输出,编码器输出为h = f(x)。稀疏自编码器提取的特征通常用来其他任务,比如分类。一个自编码器被正则化为稀疏之后,必须响应它所训练的数据集的唯一统计特征,而不是简单地一个将输入还原的函数。这样,经训练后的带稀疏惩罚项的自编码器在完成还原任务同时能够学习有用的特征。

图2. 自编码器正则项对于映射的影响

    我们可以认为惩罚项Ω(h)仅仅作为正则项加入一个前馈网络,该网络的主要目标是还原输出为输入(无监督学习),并且可能在一些监督任务上通过正则项发挥作用。不同于其他的正则化,如权重衰减,它没有直接的贝叶斯解释。带有权重衰减和其他正则化惩罚的训练可以解释为贝叶斯推理的极大似然估计。

3、变分自编码器

    上述讨论了编码解码结构在数据降维以及重建的部分,但是它们有一个缺点就是对解码的内容没有更多的控制力,无法产生新的内容。除非隐空间足够规则,即被编码器非常好地进行编码,那么我们可以从该空间中随机抽取数据并进行解码来获得新的内容。实际编码器的隐空间不仅取决于初始空间中数据的分布,而且隐空间的大小,编码器的结构都会对其产生影响。自编码器仅仅以尽可能减少损失为目标进行训练,而不管隐空间如何组织。在训练过程中,网络便会利用各种可能的过拟合来完成任务。

图3. 变分自编码器一般架构(来自科学空间)

    为了能将自编码器的解码器用于生成目的,我们需要确保隐空间足够规则,一种方案就是在训练过程引入显式的正则化。变分自编码器(如图3)可以看成其训练经过正规化避免过拟合,并确保隐空间具有能够进行数据生成过程的良好性质。为了引入隐空间的某些正则化,我们不是将输入编码为隐空间中的单个点,而是将其编码为隐空间中的概率分布。主要过程是,训练时将输入编码为隐空间的

     变分自编码器从变分和贝叶斯理论出发,希望编码向量的分布尽量能接近高斯分布,它本质上就是在我们常规的自编码器的基础上,对encoder的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果decoder能够对噪声有鲁棒性;而那个额外的KL loss(目的是让均值为0,方差为1),事实上就是相当于对encoder的一个正则项,希望encoder出来的东西均有零均值  

图4. 变分自编码器图模型和结构图

首先定义一个概率图模型描述我们的数据,用x表示代表我们的数据变量,并假定x是由直接观察到的潜在变量z生成的。因此,对于每个数据点,通过两步进行生成:1、从先验分布p(z)中采样一个隐空间表示z;2、按条件概率p(x|z)采样数据x。 在这种概率模型下,我们可以重新定义编码器和解码器:解码器由p(x|z)定义,描述由给定已编码变量到解码变量的分布,而概率解码器由p(z|x)定义,描述根据原始变量给出编码变量的分布。注意到,在简单的自编码器中所缺乏的对隐空间的正则化自然出现在数据生成的定义中:假设隐空间中的编码表示z遵循先验分布p(z)。

     贝叶斯定律在先验p(z),似然性p(x|z)和后验p(z|x)之间建立联系。如下。假设p(z)是标准的高斯分布,p(x|z)是高斯分布。理论上讲,由p(z),p(x|z)可通过贝叶斯定理来计算p(z|x),这是经典的贝叶斯推理问题。(一下为参考csdn上的一名博主)

然而,这个后验概率p(z|x)是不可解的,因为难以计算p(x),根据全概率公式:

如果z是一个维度很高的变量,那么结果将变为

此时可由

1、蒙特卡洛算法不断取样z,取样越多p(x)越接近真实的分布;

2、变分推理,p(z|x)不可解,那么就用一个可解的分布q(z|x)去近似p(z|x)。这时可以用KL散度。我们希望minKL(q(z|x)||p(z|x)),根据KL散度定义:

logp(x)不影响结果,并取反之后化为:

后一项意思即为我们假设的后验分布q(z|x)和先验分布p(z)尽量接近,即构造一个auto-encoder,前项为重构损失,

假设先验分布p(z)是一个标准高斯分布的好处是在d维的任何分布可以通过一个符合标准正态的集合d变量通过一个充分复杂的函数进行映射。

重参数化技巧[4]:

由于直接采样这个操作不可导,所以要运用重参数技巧。对比图如下所示。

图4. 不含重参数技巧的变分自编码器

图5. 含重参数技巧的变分自编码器

    假设编码器提取出的数据分布为N(μ,σ2),从中采样一个Z,相当于从N(0,1)中采样一个ε,然后令Z = μ+εσ。这样便获得了Z,而且μ和σ是可学习的参数。通过这种方式允许VAE进行端到端的训练,而且该操作可导。

设损失函数L定义为误差,参数θ={μ,σ2},则梯度为:

在无重参数技巧时的求导为:

但是采样的结果y和参数之间的映射关系无法显式地表达出来,也无法求得梯度。

有重参数技巧时的求导为:

重参数化技巧代码:

def sampling(args):

    z_mean, z_log_var = args

    epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim), mean=0.,

                              stddev=epsilon_std)

    return z_mean + K.exp(z_log_var / 2) * epsilon

总结

       变分自编码器首先将含有噪声的图像映射到隐空间,需要注意的是,变分自编码器的隐空间不是直接对输入进行编码而生成的,它的隐空间是通过编码器提取出数据的多元正态分布,然后通过分布进行采样而生成隐空间,即Z。但是直接通过对训练得到的分布进行采样梯度无法进行回传,所以便先从标准正态分布进行采样,然后再由标准正态分布和编码器提取出的分布之间的关系确定Z(重参数化技巧),而且可进行梯度回传。这样产生的z进行解码然后才生成结果数据。

参考文献

[1]《Auto-Encoding Variational Bayes》

[2]Tutorial on Variational Autoencoders

[3]https://www.deeplearningbook.org/contents/autoencoders.html#pf2

[4]https://www.youtube.com/watch?v=uaaqyVS9-rM

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值