TF2 自编码器原理
相关文章导航
假设机器学习是一个蛋糕,强化学习是蛋糕上的樱桃,监督学习是外面的糖衣,无监督学习则是蛋糕本体。—Yann LeCun
前言
神经网络如何学习的算法,这类算法需要学习的是在给定样本𝒙下的条件概率𝑃(𝑦|𝒙)。在社交网络蓬勃发展的今天,获取海量的样本数据𝒙,如照片、语音、文本等,是相对容易的,但困难的是获取这些数据所对应的标签信息,例如机器翻译,除了收集源语言的对话文本外,还需要待翻译的目标语言文本数据。数据的标注工作目前主要还是依赖人的先验知识(Prior Knowledge)来完成,如亚马逊的Mechanical Turk 系统专门负责数据标注业务,从全世界招纳兼职人员完成客户的数据标注任务。深度学习所需要的数据规模一般非常大,这种强依赖人工完成数据标注的方式代价较高,而且不可避免地引入标注人员的主观先验偏差。面对海量的无标注数据,有没有办法能够从中学习到数据的分布𝑃(𝒙)的算法?这就是无监督学(Unsupervised Learning)算法。特别地,如果算法把𝒙作为监督信号来学习,这类算法称为自监督学习(Self-supervised Learning),接下来要介绍的自编码器算法就是属于自监督学习范畴。
自编码器原理
让我们先看一下有监督学习中的神经网络的功能:
这个过程可以看成是特征降维的过程,把原始的高维输入向量𝒙变换到低维的变量𝒐。特征降维(Dimensionality Reduction)在机器学习中有广泛的应用,比如文件压缩(Compression)、数据预处理(Preprocessing)等。最常见的降维算法有主成分分析法(Principal components analysis,简称PCA),通过对协方差矩阵进行特征分解而得到数据的主要成分,但是PCA 本质上是一种线性变换,提取特征的能力极为有限。
那么能不能利用神经网络的强大非线性表达能力去学习到低维的数据表示呢?问题的关键在于,训练神经网络一般需要一个显式的标签数据(或监督信号),但是无监督的数据没有额外的标注信息,只有数据𝒙本身。
于是,我们尝试着利用数据𝒙本身作为监督信号来指导网络的训练,即希望神经网络能够学习到映射𝑓𝜃: 𝒙 → 𝒙。我们把网络𝑓𝜃切分为两个部分,前面的子网络尝试学习映射关系:𝑔𝜃1 : 𝒙 → 𝒛,后面的子网络尝试学习映射关系ℎ𝜃2 : 𝒛 → 𝒙,如图 12.1 所示。我们把𝑔𝜃1看成一个数据编码(Encode)的过程,把高维度的输入𝒙编码成低维度的隐变量𝒛(Latent Variable,或隐藏变量),称为Encoder 网络(编码器);ℎ𝜃2看成数据解码(Decode)的过程,把编码过后的输入𝒛解码为高维度的𝒙,称为Decoder 网络(解码器)
编码器和解码器共同完成了输入数据𝒙的编码和解码过程,我们把整个网络模型𝑓𝜃叫做自动编码器(Auto-Encoder),简称自编码器。如果使用深层神经网络来参数化𝑔𝜃1和ℎ𝜃2函数,则称为深度自编码器(Deep Auto-encoder)
自编码器能够将输入变换到隐藏向量𝒛,并通过解码器重建(Reconstruct,或恢复)出𝒙 。我们希望解码器的输出能够完美地或者近似恢复出原来的输入,即𝒙 ≈ 𝒙,那么,自编码器的优化目标可以写成:
它和均方误差原理上是等价的。自编码器网络和普通的神经网络并没有本质的区别,只不过训练的监督信号由标签𝒚变成了自身𝒙。借助于深层神经网络的非线性特征提取能力,自编码器可以获得良好的数据表示,相对于PCA 等线性方法,自编码器性能更加优秀,甚至可以更加完美的恢复出输入𝒙。
它和均方误差原理上是等价的。自编码器网络和普通的神经网络并没有本质的区别,只不过训练的监督信号由标签𝒚变成了自身𝒙。借助于深层神经网络的非线性特征提取能力,自编码器可以获得良好的数据表示,相对于PCA 等线性方法,自编码器性能更加优秀,甚至可以更加完美的恢复出输入𝒙。
在下图中,第1 行是随机采样自测试集的真实MNIST 手写数字图片,第2、3、4 行分别是基于长度为30 的隐藏向量,使用自编码器、Logistic PCA 和标准PCA 算法恢复出的重建样本图片;在图 12.3(b)中,第1 行为真实的人像图片,第2、3 行分别是基于长度为30 的隐藏向量,使用自编码器和标准PCA 算法恢复出的重建样本。可以看到,使用深层神经网络的自编码器重建出图片相对清晰,还原度较高,而PCA 算法重建出的图片较模糊。
如何去训练?
-
对于二进制输入的损失函数
可以看到就是普通的交叉熵损失函数而已 -
对于实数输入的损失函数
这里也可以看到就是普通的均方差损失函数而已
几种自编码器变种
Dropout AutoEncoders
顾名思义,Dropout AutoEncoders采取的变化就断掉部分的连接层,这样可以减少过拟合的程度
Adversarial AutoEncoders(AAE)
想要完全的了解Adersarial AutoEncoders[1] 可以去阅读一下论文,这里我就大概的介绍一下具体的细节之后会在GAN的博客里面详细的写道
Adversarial AutoEncoders它是一种概率式自动编码器,利用最近提出的生成性对抗网络(GAN)将编码器隐藏向量的后验集合与任意先验分布相匹配,进行变分推理先验后确保,从先验空间的任何部分生成有意义的样本。结果,adversarial自动编码器的解码器学习了一个深度生成模型,该模型将所施加的优先级映射到数据分布。
在这个模型中自编码器的训练具有双重目标——传统的重建误差和对抗性训练准则
为了更好的了解AAE我想简单的介绍一下GAN的原理(这在AAE的论文里都有):
生成性对抗网络(GAN框架建立了两个神经网络之间的AMI最大对抗博弈-生成模型G和判别模型D。判别模型D(x),是一个神经网络,它计算的pointxin数据空间是我们试图建模的数据分布(正样本)的样本,而不是生成模型(负样本)的样本的概率。同时,生成器使用一个函数G(z),该函数将样本从priorp(z)映射到数据空间。G(z)被训练成最大程度地混淆鉴别器,使其相信其生成的样本来自数据分布。利用fd(x)w.r.t.x的梯度对生成器进行训练,并使用该梯度修改其参数。这个游戏的解决方案可以表示为:
生成器和鉴别器可以分两个阶段使用交替SGD找到:(a)训练鉴别器以区分由生成器生成的真实样本和假样本;(b)训练生成器以便用生成的样本愚弄鉴别器。
AAE
x作为输入,z作为隐藏的代码向量(隐藏单位)的自动编码器与深度编码器和解码器。p(z)是我们想要施加在代码上的先验分布,q(z | x)是一个编码分布,p(x | z)是解码分布。同时,pd(x)是数据分布,p(x)是模型分布。自动编码器q(z | x)的编码函数定义了q(z)在自动编码器的隐藏码向量上的后验分布
这就是AAE的基础理论
引用
[1] Alireza Makhzani, Jonathon Shlens, Navdeep Jaitly, Ian Goodfellow, Brendan Frey. Adversarial Autoencoders. arXiv preprint arXiv:1511.05644,2015 11