译自 Ian Goodfellow, Yoshua Bengio, 以及 Aaron Courville 的书 Deep Learning


自动编码器 (autoencoder) 是用来把输入拷贝到输出的一种神经网络。其内部有个隐含层 \(h\),描述了用来表征输入的一种编码。这种网络可以看作由两部分组成:一个编码函数 \(h = f(x)\) 和一个生成重构的解码器 \(r = g(h)\)。图 14.1 描述了这个架构。如果自动编码器对每个输入 \(x\) 都给出 \(g(f(x)) = x\),那其实是没什么用的。换言之,自动编码器被设计得不会完美拷贝。通常限制它们只近似拷贝,并且只拷贝跟训练数据类似的输入。由于被强迫优先拷贝输入的某些方面,这种模型常常可以学到数据的有用性质。

现代自动编码器把作为决定性函数的编码器和解码器推广到随机映射 \(p_\text{编码}(h | x)\) 和 \(p_\text{解码}(x | h)\)。

自动编码器的想法一直是几十年来神经网络的历史图景的一部分 (LeCun, 1987; Bourlard and Kamp, 1988; Hinton and Zemel, 1994)。自动编码器的传统用途是维度约简或特征学习。近期,自动编码器和隐含变量模型之间理论上的联系将自动编码器提到了生成模型的前沿 (第 20 章)。自动编码器可以看成前馈网络的特殊情形,并且可以用相同的技术训练,比如通过逆向传播计算梯度,接着进行 minibatch 的梯度下降。与一般前馈网络不同饿的是,自动编码器也可用再流通 (recirculation; Hinton and McClelland, 1988) 算法训练,这种算法是基于对原始输入和重构输入对网络的激活度的比较。再流通比逆向传播更有生物意义,但很少用到机器学习应用中。

14.1 亚完备自动编码器

把输入拷贝到输出可能听起来没什么用,但一般我们对解码器的输出并不关心。相反,我们希望通过训练自动编码器执行输入拷贝任务会给出具备有用特性的 \(h\)。

一种从自动编码器获得有用特性的办法是限制 \(h\) 比 \(x\) 维度低,这样的被称为亚完备 (undercomplete)。亚完备表征学习强迫自动编码器抓住训练数据里最显著的特征。

训练过程可以简单地描述为最小化损失函数 \[ L(x, g(f(x))) \] 这里 \(L\) 是惩罚 \(g(f(x))\) 与 \(x\) 的差异度的损失函数,比如可以是误差的均方。

当解码器是线性而 \(L\) 是均方差,亚完备自动编码器会张成跟 PCA (主成分分析) 一样的子空间。这种情况下,被训练用来进行拷贝工作的自动编码器学到了训练数据的主子空间 (principle subspace)。

当 \(f\) 和 \(g\) 是非线性函数时,自动编码器可以学到比 PCA 更强大的非线性推广。可惜,如果给编码器和解码器太大的容量,则自动编码器可以学会执行拷贝任务而不提取出数据分布的有用信息。理论上,可以想象一种一维编码的自动编码器,其强大的非线性编码器可以把任何训练样例 \(x^{(i)}\) 表达为编码 \(i\)。解码器可以学会把这些整数指标映射回特定训练样例的值。这种情况实际中不会出现,但它清除地阐释了容量太大的自动编码器学不到关于数据集的任何有用信息这个现象。

14.2 规范化自动编码器

上一节讲了容量太大的亚完备自动编码器学不到有用东西的问题。

如果隐含编码的维度被允许等于输入数据的维度,或者在过完备 (overcomplete) 情形,隐含编码的维度超过输入维度,类似问题也会出现。这些情况下即便线性编码器和线性解码器也能学会拷贝输入到输出而学不到关于数据分布的有用信息。

理想情况下,基于要模拟的数据分布的复杂度选择编码维度和编码器和解码器的容量,可以成功训练任何自动编码器架构。规范化自动编码器提供了这种能力。与其通过限制编码器和解码器深度以及限制码长的方法限制容量,规范化自动编码器采用了一个鼓励模型在除了拷贝输入之外还拥有别的性质的损失函数。别的性质包括表征的稀疏度,表征的导数保持较小,以及在输入噪音和输入数据缺失时的强壮性。规范化自动编码器可以是非线性和过完备的,但仍能学到数据的有用信息,尽管模型容量已经大到足以学到平凡的恒等拷贝函数。

除了这里描述的可以自然地解释为规范化自动编码器到方法之外,几乎所有包含隐含变量且拥有推测过程 (用来计算给定输入的隐含表示) 的生成模型都可被视为一种特殊的自动编码器。有两类强调这种联系的生成模型方法,一类是 Helmholtz machine (Hinton et al, 1995b) 的后来者,比如变分自动编码器 (20.10.3 节),一类是生成性的随机网络 (20.12 节)。这些模型自然习得输入的高容量过完备编码,而不需要规范化就能让这些编码有用。

14.2.1 稀疏自动编码器

稀疏自动编码器就是在训练标准上加了一个针对编码层 \(h\) 的稀疏度惩罚项 \(\Omega(h)\) \[ L(x, g(f(x))) + \Omega(h) \] 这里 \(g(h)\) 是解码器输出,而一般我们让 \(h = f(x)\)。

稀疏自动编码器一般用来替诸如分类这样的任务学习特征。稀疏编码器必须对数据集的独特统计特征作出响应,而不是简单地作为一个恒等函数。这样,稀疏度惩罚下训练出的模型可以学到有用特征。

我们可以把 \(\Omega(h)\) 简单地想象为添加到前馈网络的一个规范项,这个前馈网络的主要任务是把输入拷贝到输出 (非监督学习目标),同时还可能还进行其它依赖于那些稀疏特征的监督性任务 (监督性学习目标)。与其它诸如权重衰减这样的规范项不同,对这个规范项并没有一个直接的贝叶斯解释。正如第 5.6.1 节描述的那样,通过权重衰减和其它规范惩罚训练可以解释为贝叶斯推断的 MAP 近似,在这里作为惩罚的规范项对应模型参数的先验分布。这种观点下,规范化的最大似然对应于最大化 \(p(\theta | x)\),这等价于最大化 \(\log p(x | \theta) + \log p(\theta)\)。\(\log p(x | \theta)\) 这项是通常的数据对数似然项,而 \(\log p(\theta)\) 是参数的对数先验分布。这种观点在第 5.6 节讲了。规范化自动编码器不能这么解释,因为规范化依赖于数据,所以按定义不是先验的。我们仍然可以把这些规范化设想为对函数的隐含偏好。

与其把稀疏度惩罚设想为拷贝任务的规范项,我们可以把整个稀疏自动编码器框架想象为对包含隐含变量的生成模型的最大似然训练的近似。假设我们有一个模型,包含可见变量 \(x\) 和隐含变量 \(h\),它们之间有明确的联合分布 \(p_\text{模型}(x, h) = p_\text{模型}(h) p_\text{模型}(x | h)\)。我们把 \(p_\text{模型}(h)\) 称为模型关于隐含变量的先验分布,代表模型在看到 \(x\) 之前的信念。这里“先验”这个词跟之前的意义不同了,之前是用来表达我们在看到训练数据之前对模型参数的信念。似然函数可以分解为 \[ \log p_\text{模型}(x) = \log \sum_{h} p_\text{模型}(h, x)。 \] 我们可以把自动编码器想象为用 \(h\) 的一个极可能取值对这个求和的点估计近似。这类似于稀疏编码生成模型 (13.4 节),但这里 \(h\) 是参数化编码器的输出,而不是推断最可能 \(h\) 的优化过程的输出。按这个观点,对于给定的 \(h\),我们最大化 \[ \log p_\text{模型}(x) = \log p_\text{模型}(h) + \log p_\text{模型}(x | h)。 \] \(\log p_\text{模型}(h)\) 这项可以引入稀疏性。比如,Laplace 先验分布 \[ p_\text{模型}(h_i) = \frac{\lambda}{2} e^{-\lambda |h_i|}, \] 对应于绝对值稀疏度惩罚。通过把对数先验表达为绝对值惩罚,我们得到 \[ \Omega(h) = \lambda \sum_i |h_i| \] \[ -\log p_\text{模型}(h) = \sum_i \left(\lambda |h_i| - \log \frac{\lambda}{2}\right) = \Omega(h) + \text{const} \] 这里常数项只依赖于 \(\lambda\),不依赖 \(h\)。我们通常把 \(\lambda\) 处理为一个超级参数,并且去掉那个不影响结果的常数项。其它先验分布,比如 Student-\(t\) 分布也能引起稀疏性。按照这种将稀疏性视为来自 \(p_\text{模型}(x)\) 对最大似然学习近似的效应的观点,稀疏度惩罚根本不是一个规范项,而只是模型在其隐含变量上的分布的后果。这个观点提供了训练自动编码器的另一种动机:作为一种近似训练生成模型的方法。它也提供了自动编码器习得的结果为什么有用的解释:它们描述了可以解释输入的隐含变量。