堆叠自编码器,如我们所介绍的,旨在通过构建具有多个隐藏层的深度网络来学习分层特征表示。其设想是每个后续层基于前一层的输出,学习更复杂和抽象的特征。然而,直接从随机初始化开始训练这类深度神经网络可能存在难度。梯度消失或梯度爆炸等问题,或者优化过程陷入不佳的局部最优解,曾是重要的障碍,特别是在深度学习早期。
为解决这些挑战并有效初始化深度堆叠自编码器的权重,发展出一种称为贪婪分层预训练的技术。这种方法将训练深度网络的复杂问题分解为一系列更简单、更易于处理的步骤,一次训练一层。
贪婪分层预训练过程
核心设想是单独训练堆叠自编码器的每一层,将其作为一个浅层自编码器。一旦一层训练完毕,其学习到的权重即被固定,其输出(编码表示)随后用作训练下一层的输入。我们来回顾一下这些步骤:
-
训练第一个自编码器 (AE1):
- 使用原始输入数据,我们称之为 X。
- 训练一个简单的自编码器,包含一个隐藏层(编码器1,解码器1)以重建 X。目标是最小化重建误差,例如,L(X,解码器1(编码器1(X)))。
- AE1 训练完毕后,保存其编码器(编码器1)和解码器(解码器1)的权重。编码器1 将 X 转换为低维表示 H1=编码器1(X)。
-
训练第二个自编码器 (AE2):
- 使用输出 H1(来自 AE1 隐藏层的激活),并将其作为 新的 简单自编码器(AE2,包含编码器2和解码器2)的输入数据。
- 训练 AE2 以重建 H1。即,最小化 L(H1,解码器2(编码器2(H1)))。
- AE2 训练完毕后,保存编码器2和解码器2的权重。编码器2 将 H1 转换为新的、可能更紧凑的表示 H2=编码器2(H1)。
-
重复以增加层数:
- 如果想在堆叠自编码器中增加更多层,可继续此过程。对于第 k 个自编码器 (AE_k),其输入将是 Hk−1(来自编码器_{k-1}的激活),并会训练它以重建 Hk−1。
-
组装堆叠自编码器:
- 所有单独的层预训练完毕后,组装完整的堆叠自编码器。
- 堆叠自编码器的编码器部分通过按顺序堆叠所有预训练的编码器来形成:堆叠编码器=编码器N∘⋯∘编码器2∘编码器1。
- 堆叠自编码器的解码器部分通过按相反顺序堆叠所有预训练的解码器来形成:堆叠解码器=解码器1∘解码器2∘⋯∘解码器N。
- 因此,输入 X 依次经过编码器1、编码器2等,生成最终的潜在表示。这个潜在表示随后依次经过解码器N、解码器(N-1)等,回到解码器1,以重建原始输入 X。
-
微调整个堆叠:
- 通过贪婪分层预训练获得的权重为深度网络提供了良好的初始化。
- 最后一步是将整个堆叠自编码器视为一个单一模型并进行端到端训练。这意味着您将原始输入 X 馈送给堆叠编码器,将结果通过堆叠解码器得到 X^,然后使用反向传播同时更新所有层(包括编码器和解码器)中的所有权重,以最小化全局重建误差 L(X,X^)。
- 这一微调步骤使得所有层中的权重能够进行微调,以便为整体重建任务更紧密配合,通常会提升表现。
使用“贪婪”一词是因为每一层都旨在优化其局部任务(重建其自身输入),最初并未考虑整个深度堆叠的总体全局目标。
下方是一张图表,说明了针对具有两个隐藏层的堆叠自编码器的贪婪分层预训练过程,随后是组装和微调。
贪婪分层预训练的步骤。每个自编码器层按顺序训练。然后,编码器和解码器被组装成一个深度堆叠,随后进行端到端微调。
为何分层训练有效?
此策略特别有益,因为:
- 良好的初始化:与随机初始化相比,它为深度网络的权重提供了一个更好的起始点。每一层都已准备好从其输入中提取有用的特征。
- 分层特征学习:通过逐层训练,网络自然地学习到特征的分层结构。第一层从原始数据中学习基础特征,第二层从第一层的特征中学习更复杂的特征,以此类推。
- 减轻优化问题:一次训练一个较浅的网络通常更容易,并且不太容易出现梯度消失等问题,这些问题会困扰从头开始的超深度网络的端到端训练。每一层的训练都引导参数进入搜索空间的一个合理区域。
在现代深度学习中的意义
尽管更好的激活函数(如 ReLU)、先进的优化算法(例如 Adam、RMSprop)、归一化技术(如批量归一化)以及新的架构设计(如残差连接)的出现使得深度网络的直接端到端训练更具可行性,但贪婪分层预训练并未过时。
- 在处理超深度自编码器时,或当进行端到端训练所需的广泛超参数搜索的计算资源有限时,它仍然是一种有价值的技术。
- 它提供了一种直观的方法来构建和理解分层特征提取器。
- 在某些情形下,特别是在数据有限时,预训练可以帮助正则化模型并带来更好的泛化能力。
理解分层预训练使您能够了解深度表示如何逐步构建,并为您的工具箱增添了另一项工具,用于构建和训练有效的堆叠自编码器以进行特征提取。