TilmanKrokotsch,Ph.D.柏林工业大学深度学习专业的学生比较了8个自动编码器在多个任务中的性能。深度学习中的自动编码器。资料来源:https://debuggercafe.com/autoencoders-in-deep-learning/目前,许多研究人员仍在使用堆叠式自动编码器进行无监督预训练。柏林工业大学深度学习博士生TilmanKrokotsch想知道:在低计算能力的时代,堆叠自动编码器不是训练深度模型的一种变通方法吗?既然算力已经比较充足了,为什么还要用呢?因此,他决定在几个不同的任务中比较原始深度自动编码器(AE)和堆叠自动编码器。项目地址:https://github.com/tilman151/ae_bakeoffKrokotsch比较了原始深度自动编码器的所有变体,这些变体改变了潜在空间的行为或可能提高下游任务的性能,不包括特定于应用程序的损失(例如VGG19inthe图像场损失)和编码器与解码器类型(如LSTM与CNN)。最后,Krokotsch选择了以下八种自编码器进行比较:ShallowautoencoderDeepautoencoder(originalAE)StackedautoencoderSparseautoencoderDenoisingautoencoderVariationalautoencoder(VAE)BetavariablePartialAutoencoder(beta-VAE)VectorQuantizedVariationalAutoencoder(vq-VAE)Krokotsch不仅介绍了这些自动编码器的独特性,还比较了:重建质量与解码质量潜在空间插值质量潜在空间结构通过UMAP可视化使用重建误差进行异常检测ROC曲线拟合自动编码器特征线性层的分类精度连接编解码器,批量归一化和ReLU激活函数,并在输出层使用sigmoid激活函数。除了浅层自动编码器之外,所有自动编码器都具有三个编码器和解码器层。潜在空间的维度和网络参数的数量基本不变。这意味着变分自动编码器的参数比原始编码器多,因为编码器为n维的潜在空间产生2n个输出。在测试期间,每个自动编码器执行两次训练运行:一次具有20维的潜在空间,一次具有2维。第二次训练的模型用于异常检测,第一次训练的模型用于其他任务。对比测试使用的数据集是MNIST。Krokotsch从训练数据集中随机抽取5000个样本作为验证集,并将默认的train/testsplit进一步划分为train/validation/testsplit。接下来我们看看这些自动编码器变体以及它们的比较方式。“竞争对手”:8个自动编码器Krokotsch描述了这些自动编码器的工作原理、它们的独特之处,并尝试对它们的性能做出一些假设。浅层自动编码器浅层自动编码器并不是真正的竞争对手,因为它们的功能远远落后于其他变体。在这里它作为基线存在。上式是浅层自编码器的重构公式,从中可以看出自编码器是如何用半数学的方式重构样本x的。浅自动编码器的特点是编码器和解码器中只有一层。它与PCA不同,在编码器中使用ReLU激活函数,在解码器中使用sigmoid函数,因此它是非线性的。通常,自动编码器的默认重建损失是均方误差。相反,Krokotsch使用二元交叉熵(BCE),因为它在初步实验中产生了更美观的图像。所有自动编码器都使用以下版本的BCE:其中x^(i)_j是第i个输入图像的第j个像素,x^(i)_j是相应的重建。loss就是把每张图片聚合起来,然后根据batch进行平均。这个决定对于变分自动编码器非常重要。深度自动编码器深度自动编码器(原始自动编码器)是浅自动编码器的扩展版本。它们基本相同,除了深度自动编码器有更多层。它们的重构公式是一样的。深度自动编码器的潜在空间不受约束,因此它应该能够编码最多的信息。堆叠自动编码器堆叠自动编码器是通过仅训练浅自动编码器获得的深度自动编码器。只是训练方式不是end-to-end,而是逐层贪心训练:首先,由第一个encoder和最后一个decoder构成一个shallowautoencoder;训练完这些层后,使用编码层对整个数据集进行编码;然后基于第二个编码器和倒数第二个解码器层形成另一个浅层自编码器,并使用编码数据集训练第二个浅层自编码器;重复这个过程,直到最内层。由此产生的深度自动编码器由许多浅层自动编码器堆叠而成。stackedautoencoders和deepautoencoders之间的唯一区别在于训练过程,因此它们也具有相同的重建功能。堆叠自编码器的潜在空间不受约束,但由于贪婪训练,其编码能力略差。稀疏自动编码器稀疏自动编码器对潜在代码有稀疏性约束,潜在代码中的每个元素都有一个活动概率p。为此,需要在训练过程中向其添加辅助损失:其中zˉ(i)是潜在代码中第i个元素的基于批次的平均激活值。这个损失函数对应于KL散度的总和|z|p和zˉ(i)之间的二项分布。可能存在满足此稀疏性约束的其他实现。为了使这种稀疏损失成为可能,我们需要将潜在代码的范围缩放到[0,1],以便将其理解为概率。这是用sigmoid激活函数完成的,重构公式如下:设置为1。去噪自动编码器去噪自动编码器具有不受约束的潜在空间,旨在通过对输入数据应用噪声来学习更有效的编码。去噪自动编码器不会将输入数据直接馈入网络,而是添加高斯噪声:其中clip表示将输入裁剪到[0,1],标量β表示噪声的方差。因此,去噪自动编码器是通过基于噪声输入数据重建干净样本来训练的,如下所示:但是,噪声输入仅在训练期间使用。在评估此自动编码器时,将使用原始输入数据。去噪自动编码器使用与之前的自动编码器相同的损失函数。在所有实验中,β值设置为0.5。变分自动编码器理论上,变分自动编码器(VAE)与原始AE几乎没有关系。然而,在实践中,实施和培训是相似的。VAE将重建解释为随机过程,使其具有不确定性。编码器输出的不是潜在代码,而是代表潜在代码概率分布的参数;然后解码器从这个分布中接收样本。默认分布系列选择为高斯N(μ;diag?(Σ))。其重构公式如下:其中enc_μ(x)和enc_Σ(x)将x编码为μ和Σ,两个编码器共享大部分参数。实际上,单个编码器有两个输出层而不是一个。问题是从分布中采样需要梯度和从解码器到编码器的反向传播。解决办法叫做“重参数化”,将样本从标准高斯分布转化为由μ和Σ参数化的高斯分布样本:这个公式的梯度与μ和Σ有关,也可以实现反向传播。变分自动编码器需要类似于标准高斯的高斯分布,从而进一步限制了它们的潜在空间。它的分布参数受到KL散度的惩罚:KL散度基于批量平均。如上所述对重建损失进行平均,以保持重建损失和散度损失之间的正确比率。完整的训练损失如下:我们尝试使编码器输出标准高斯分布,以便可以直接解码来自标准高斯分布的样本。这种无条件采样是VAE的独特属性,使它们成为类似GAN的生成模型。无条件采样的公式如下:BetaVariationalAutoencoder(beta-VAE)beta-VAE是VAE的推广,只是改变reconstructionloss和divergenceloss的比例。散度损失的影响因子用标量β表示,因此损失函数如下所示:β<1放松对潜在空间的约束,而β>1收紧它。前者导致更好的重建结果,而后者导致更好的无条件采样。Krokotsc在严格版本中使用β=2,在宽松版本中使用β=0.5。矢量量化变分自动编码器(vq-VAE)vq-VAE使用均匀的类分布来生成潜在代码。编码器输出中的每个元素都被这个分布中的一个类值替换,这是它最近的邻居。这是一种量化,意味着潜在空间不再是连续的,而是离散的。类本身可以通过最小化编码器输出的误差平方和来学习:其中z表示编码器输出,?表示相应的量化潜在代码,sg表示停止梯度算子。此外,编码器输出一个类似于误差平方和得到的类的编码结果:这称为承诺损失。KL散度损失不是必需的,因为KL散度对于均匀类分布是恒定的。将此损失与重建损失相结合得出:在实验中,β的值设置为1。由于vq-VAE是一个生成模型,我们也可以进行无条件采样。AutoencoderSmashBros.重建质量首先,我们查看每个自动编码器在输入上的重建质量。以下是不同自动编码器在MNIST测试集的16张图像上的结果:浅层自动编码器无法准确重建一些测试样本。4和9几乎认不出来,有些数字完全看不见。其他自动编码器工作得更好,但并不完美:去噪自动编码器使一些细线消失;稀疏和堆叠的自动编码器正在重建具有不寻常笔划的数字(例如5和前9)。整体重建有点模糊,这对于自动编码器来说是正常的。vq-VAE的重建结果不那么模糊,作者将其归因于离散的潜在空间。不同自动编码器的重建质量几乎没有差异。下表列出了样本集的平均二进制交叉熵:正如预期的那样,表现最差的是浅层自动编码器,它缺乏捕获MNIST结构的能力。vanilla自动编码器表现良好,与稀疏自动编码器和vq-VAE一起名列前茅。但是稀疏自动编码器和vq-VAE似乎不受潜在空间约束的影响,而VAE和beta-VAE由于潜在空间约束而获得更高的错误。此外,VAE中的采样过程引入了会削弱重建误差的噪声。采样该实验仅包括四个可以执行无条件采样的自动编码器:VAE、宽松版和严格版的beta-VAE、vq-VAE。对于每个自动编码器,16个潜在代码被采样和解码。对于VAE和beta-VAE,从标准高斯分布中抽样。vq-VAE的潜在代码是从其学习类别中统一采样的。上图中最有意义的生成样本来自beta-VAE的严格版本。这是因为它的训练侧重于高斯先验,而编码器输出最接近标准高斯的样本,因此解码器成功解码了从真正的标准高斯采样的潜在代码。此外,它在图像中产生的变化更少,例如右边的数字看起来既像5又像6。轻松版本的beta-VAE产生了更多样的图像,尽管可识别的图像更少。标准VAE的性能介于两者之间。vq-VAE有点令人失望,它采样的图像看起来一点也不像MNIST数字。插值插值任务展示了潜在空间的密集区域。Krokotsch对测试集中的两幅图像2和7进行了编码,并进行了线性插值。然后对插值进行解码以接收新图像。如果来自内插潜在代码的图像可以显示有意义的数字,则自动编码器可以有效地利用类区域之间的潜在代码。对于所有VAE类型,Krokotsch在瓶颈操作之前执行插值。这意味着对于VAE和beta-VAE,高斯参数在采样之前被插值;对于vq-VAE,插值在量化之前执行。从上图可以看出VAE和beta-VAE都可以生成比较有意义的插值。其他自动编码器根本不起作用。潜在空间结构Krokotsch使用UMAP算法可视化潜在空间结构,该算法将潜在空间减少到二维并保留潜在邻居。下图是autoencoder每个autoencoder的latentspace的散点图,每个点代表测试集中一张图片的latentcode,颜色代表图片中的数字。这些图之间有一些明显的相似之处。首先,原始的、堆叠的、稀疏的、去噪的自动编码器和vq-VAE非常相似。0(蓝色)、1(橙色)、2(绿色)和6(粉色)的聚类总是被很好地分割,因此它们看起来与其他数字更加不同。还有4-7-9和3-5-8的簇,这表明这些数字之间存在联系,例如将两条直线与3相加得到8。这些自动编码器可以编码数字之间的结构相似性.但是浅层自动编码器很难将数字分类到簇中。VAE和beta-VAE与其他不同,我们可以从中看出散度损失的影响。分类潜在空间图显示许多自动编码器擅长聚类MNIST数字,即使它们没有收到任何标签。那么我们如何使用它来执行MNIST数字分类呢?Krokotsch使用20维潜在代码拟合密集分类层,该潜在代码仅在训练集中的550个标记示例上进行训练。也就是说,使用这些自动编码器进行半监督学习。从头开始训练普通编码器和分类层产生了0.4364的精度。下表显示了这些自动编码器的改进:除了稀疏自动编码器之外,几乎所有自动编码器都在基线上进行了改进。去噪自动编码器取得了最好的效果,其次是原始自动编码器和vq-VAE。去噪自动编码器添加的输入噪声似乎产生了最适合分类任务的特征。最有趣的一点是,即使是浅自动编码器也可以略微提高精度,即使它只有一层和更少的参数。这再次表明,智能数据的使用通常优于大型模型。VAE和beta-VAE再次表明发散损失对潜在空间施加了限制。稀疏自动编码器的结果比基线差,似乎是因为稀疏特征完全不适合对MNIST数字进行分类。对于它的效果,还需要在其他数据集上进行测试。异常检测使用自动编码器执行异常检测任务相对简单。使用训练好的模型,计算测试样本的重建损失,得到异常分数。如果样本的重建很好,很可能与训练数据相似;如果重建很差,则样本被认为是异常值。自动编码器可以利用训练数据之间的关联来学习有效的低维表示。只要存在这些关联,就可以很好地重建测试样本。相反,自动编码器不能很好地重建。这项任务的一个主要挑战是找到异常分数的最佳阈值。下图显示了ROC曲线图和曲线下的面积:浅自动编码器将其他自动编码器甩在后面,AUC为0.91,其次是堆叠自动编码器。并且不同自动编码器的排序对于不同的数字和潜在空间维度是不变的。为什么这两个在其他任务中落后的自动编码器在异常检测方面如此擅长?原因似乎是其他任务依赖于潜在空间的泛化能力。异常检测不需要泛化,至少不是很好的泛化能力。结论经过对比实验,Krokotsch并没有找出自编码器之王。他认为选择哪种自动编码器取决于任务本身。想根据噪音生成人脸?使用变分自动编码器。图片太模糊?试试vq-VAE。分类任务?选择去噪自动编码器。对于异常检测任务,或许可以尝试浅自动编码器或PCA。有时,少即是多。
