基本介绍

1986 年,Rumelhart、Hinton 和 Williams 首次提出了自编码器(Autoencoder,AE),旨在学习以尽可能低的误差重建输入观测值xi\boldsymbol x_i

Rumelhart D E , Hinton G E , Williams R J .Learning Internal Representation by Error Propagation[M]. 1986.

定义与架构

Definition: An autoencoder is a type of algorithm with the primary purpose of learning an “informative” representation of the data that can be used for different applicationsa by learning to reconstruct a set of input observations well enough.

上述定义是 Bank, D., Koenigstein, N., and Giryes, R. 在他们的文章 Autoencoders, https://arxiv.org/abs/2003.05991 中给出的自编码器的定义。

我们需要明确的是,自编码器是一种无监督学习/自监督学习方法,而它学习到的潜在表示蕴含有输入数据的大量丰富的信息,可以用于各种其他下游任务。所以具体来说自编码器还属于一类表示学习方法,生成式自监督学习方法 ,还可以说,它实现了一种降维的作用。

一个自编码器的经典架构如下图所示:

通用自编码器架构

我们将输入的数据x\bf x 通过编码器E()E(·) 进行编码,从而得到该数据的潜在特征1h\bf h,而该特征又可以通过解码器D()D(·) 还原或者说重建出之前的输入数据,记为x~\tilde{\bf x}
显然有x~=D(h)=D(E(x))\tilde{\bf x}=D(\mathbf h)=D(E(\mathbf x))

为了使得重建的数据与原输入数据尽可能地相似,自动编码器最常用的损失函数就是均方误差 (MSE:mean squared error) 或二进制交叉熵 (BCE:binary cross-entropy),具体取决于输入数据的性质。

在大多数经典架构中,Encoder 和 Decoder 都是神经网络,可以用成熟的梯度下降法进行训练。自然,这些可以很容易地用现有的深度学习框架(TensorFlow 或 PyTorch)实现。

注1:这里的潜在特征(Latent Feature) 亦可以叫做潜在编码(Latent Code)、潜在向量(Latent Vector),或是潜在表示(Latent Represetation) 也可直接叫做表示(Represetation),甚至嵌入(Embedding)。

深度学习中对经过神经网络处理后得来的、蕴含了输入数据的丰富信息的“变量”进行了许多不同的命名,但是它们的本质是一样的。

类比PCA

我们知道PCA是机器学习中最常见的数据降维算法,也属于无监督学习范畴。
在PCA中,我们将数据x\bf x 乘以一个矩阵WW 然后得到低维的表示z\bf z,而我们可以通过WTzW^T\bf z 还原出数据x~\tilde{\bf x}。通过极小化x\bf xx~\tilde{\bf x}之间的距离求解PCA。

事实上,机器学习中PCA可以通过对协方差矩阵进行特征值分解求得解析解(即 变换矩阵WW)。关于PCA的问题详见本站文章:

其实,PCA还可以从深度学习的角度来理解——可以将PCA理解为一类特殊的自编码器的训练过程,编码器和解码器由互为转置的权重矩阵W,WTW,W^T 给定,这是一个无偏置无激活函数的单层神经网络。中间的隐层输出就是自编码器学习到的低维向量表示,这一层也叫做瓶颈层(Bottleneck Layer),训练的方式就是利用梯度下降来极小化x\bf xx~\tilde{\bf x}之间的距离。

前馈自编码器

前馈自编码器(Feed-Forward Autoencoder,FFA)也可以称为普通自编码器(Vanilla Autoencoder)或深度自编码器(网络层堆叠较多的话)。它由具有特定结构的密集神经网络层组成。

下图展现的是由全连接层构成的前馈自编码器,图源: Amor, “Comprehensive introduction to Autoencoders,” ML Cheat Sheet, 2021
全连接层AE

经典的 FFA 架构层的数量为奇数(尽管不是强制性要求),并且与中间层对称

具体地,每经过一层网络,新一层网络的神经元数量都会有所下降。中间层有着最少的神经元,这就是前面提到的「瓶颈」,我们也是在这一层得到其潜在表示的。随后对称地,每一层的神经元数量开始上升。在几乎所有的实际应用中,中间层之后的网络层都是中间层之前的镜像版本。中间层在及之前的所有层就构成了所谓的编码器

降噪自编码器

降噪自编码器(Denoising Autoencoder2)可以使学习到的低维表示具备更高的鲁棒性,因为该方法让模型在学习重构数据的同时也学习到了如何去除数据中的噪声。

De-noising AE

具体原理是先在原始数据中添加噪声,然后将加噪的数据输入到自编码器中,要求输出的重构数据要尽可能与原来未加噪的数据接近。

注2:Vincent,Pascal, et al. “Extracting and composing robust features with denoising autoencoders.” ICML,2008.

卷积自编码器

卷积自编码器(Convolutional Autoencoder,CAE)在编码器和解码器中利用卷积层,使其适用于处理图像数据。通过利用图像中的空间信息,CAE可以比普通自动编码器更有效地捕获复杂的模式和结构,并完成图像分割等任务。

CNN自编码器

和CNN一样,前期的编码过程自编码器需要对原始图像进行卷积和池化等操作。而后续的解码过程,相应地需要实现 反池化“Unpooling” 和 反卷积“Deconvolution” 操作。

UnPooling

我们知道做池化操作时,比如利用2×22\times2 大小、步幅(stride)为22 的配置对16×1616\times16 的特征图(矩阵)进行最大池化max pooling 。那么特征图将被分成44 组,然后从每组里面挑一个最大的部分出来,最终组成4×44\times4 的新特征图。如下图所示:

Unpooling

以右下角的特征图为例,它被分成44 组,其中蓝色这一组最大的是右上角的部分(白色柱形越高代表值越大),然后新图就变成原来的四分之一(上图右上方)。

在卷积自编码器中,一种常见的 Unpooling 方法是 在编码时记录下选取元素的位置,然后在重建时扩大特征图并在对应位置填上最大值,其余位置置零。
当然还有另一种方法是扩大后每组每个位置都填充最大值。

Deconvolution

为了理解反卷积,我们以一维数据的卷积为例探讨其本质行为。

ConvolutionDeconvolution

如上图所示,以大小是55 的1D特征图为例,假设卷积核的大小是33 ,步幅是11 ,那么一个 convolution 相当于每33 个元素做一次加权求和得到输出特征图的其中一个元素,然后滑动一个单位,下一组33 元素共享权重(图中的红蓝绿三条线)地再一次加权求和,以此类推。

最终我们得到大小是33 的输出特征图。分析每个元素值的来源,1号元素的值来源于输入特征图的前3个元素(1~3);2号元素的值来源于输入特征图的 2~4 元素;以此类推。
要想 deconvolution 出大小为55 的特征图,我们就需要反过来按照这个逻辑分配这5个元素的来源了。也就是上图中 deconvolution 的左图。而这个过程等价于上下填充了两个0值元素之后的卷积操作!

也就是说,Deconvolution某种程度上也是一种Convolution

稀疏自编码器

稀疏自编码器(Sparse Autoencoders)通过向损失函数添加稀疏性惩罚项约束强迫潜在表示具备稀疏性,从而实现更高效、更稳健的特征提取。

具体来说,常使用的惩罚项由 KL散度 给出。

待更:稀疏自编码器-CSDN博客
[自编码器] [稀疏自编码器] Auto Encoder原理详解 - virter - 博客园 (cnblogs.com)
Introduction to autoencoders. - jeremyjordan.me
Machine Learning|稀疏编码和矩阵分解_华北小龙虾的博客-CSDN博客
『ML笔记』深入浅出字典学习1(Dictionary Learning)-CSDN博客

事实上,从它的名字——稀疏自编码器 就能得出,其渊源是机器学习中的稀疏编码和字典学习领域。详见本站文章:

变分自编码器

当我们欲将训练的解码器看作是某种”生成器“,使得潜在表示空间中随机生成的向量也能解码出某种图像或与原数据相同类型的数据时,原始的自编码器算法就很难有效、可控地完成该任务。

变分自编码器(Variational Auto-Encoders,VAE)作为深度生成模型的一种形式,是由 Kingma 等人于 2014 年提出的基于变分贝叶斯(Variational Bayes,VB)推断的生成式网络结构。与传统的自编码器通过数值的方式描述潜在空间不同,它以概率的方式描述对潜在空间的观察,在数据生成方面表现出了巨大的应用价值。

VAE一经提出就迅速获得了深度生成模型领域广泛的关注,并和生成对抗网络(Generative Adversarial Networks,GAN)被视为无监督式学习领域最具研究价值的方法之一,在深度生成模型领域得到越来越多的应用。

待更:从自编码器到变分自编码器(其二) | ATYUN.COM 官网-人工智能教程资讯全方位服务平台

VAE

👾【GitHub】VAE的更多变种与PyTorch实现:AntixK/PyTorch-VAE: A Collection of Variational Autoencoders (VAE) in PyTorch.

序列间自编码器

序列间的自编码器,其实就是 Sequence-to-Sequence Autoencoder,也称为循环自动编码器。这部分内容在本站讲解序列到序列模型以及 Transformer 模型的文章中已经介绍。

预训练与微调

其他代价函数设计

待更:李宏毅深度学习笔记-无监督学习-深度自动编码器 - yueqiudian - 博客园

特征分离技术

待更:李宏毅深度学习笔记-无监督学习-深度自动编码器 - yueqiudian - 博客园

参考

  1. Introduction to Autoencoders - PyImageSearch
  2. An introduction to AutoEncoder - 2201.03898.pdf (arxiv.org)
  3. 自动编码器(AutoEncoder)简介 - 知乎
  4. 李宏毅深度学习笔记-无监督学习-深度自动编码器 - yueqiudian - 博客园
  5. 稀疏自编码器-CSDN博客
  6. [自编码器] [稀疏自编码器] Auto Encoder原理详解 - virter - 博客园
  7. Introduction to autoencoders. - jeremyjordan.me
  8. 从自编码器到变分自编码器(其二) | ATYUN.COM 官网