趋近智
编码器是自动编码器学习有用特征的核心组成部分。它的作用是接收输入数据,并将其转换为紧凑的、低维度的表示,通常称为潜在空间或瓶颈层。这个网络的设计——它有多少层、每层有多少个神经元以及使用什么激活函数——直接影响自动编码器将学习到的特征的质量和性质。调整好编码器架构,是有效提取特征的重要一步。
接下来,我们来审视在构建编码器网络时将做出的主要设计考量。
编码器的深度,即它包含的层数,决定了它学习复杂模式和数据中层级结构的能力。
浅层编码器(少量层):仅包含一到两个隐藏层的编码器更简单,训练速度更快。对于底层结构不过于复杂、相对简单的数据集,浅层编码器可能就足够了。它能学习到良好的压缩表示,且不会像更复杂的模型那样面临过拟合的风险。
深层编码器(多层):随着层数的增加,编码器可以学习更抽象的表示。每一层都可以在前一层学习到的特征基础上进行构建,形成特征的层级结构。例如,在图像数据中,初始层可能学习边缘,随后的层可能组合边缘以形成简单形状,而更深层则可以表示更复杂的物体部分。然而,深层网络计算成本更高,需要更多数据才能有效训练,并且如果不进行正则化,更容易过拟合。它们还存在梯度消失等问题,尽管现代激活函数和初始化技术有助于缓解这些。
一般建议:通常的做法是,从一个更简单、更浅层的编码器开始(例如,1-3个隐藏层),如果模型未能充分捕捉数据的复杂性,则逐渐增加深度。监控你的重建损失:如果它仍然很高,并且你怀疑模型能力不足,增加层数可能会有帮助。
对于许多表格数据集,一个具有2到4层的编码器(包括从输入到第一个隐藏层以及从最后一个隐藏层到瓶颈层的变换)是一个常见的起始配置。对于图像等高维数据,更深的编码器,特别是那些使用卷积层(我们将在第5章讨论)的编码器,是标准做法。
编码器每层的神经元(或单元)数量决定了该层的“宽度”以及能通过多少信息。对于旨在进行降维的自动编码器,编码器层通常神经元数量逐渐减少,形成一个向瓶颈层收窄的漏斗形状。
一张图表显示了编码器网络的典型锥形结构,神经元数量会随着每个后续层向瓶颈层逐渐减少。
缩减率:你减少神经元数量的速度是一个重要的设计考量。
信息流:每层的宽度对能够流经网络的信息量起到约束作用。编码器学习保留解码器重建输入所需的最重要信息。
起始点:常见做法是使第一个隐藏层小于输入维度,但足够大以捕捉初始模式(例如,输入维度的一半或四分之一,但这很大程度上是经验性的)。随后的层则继续降低这个维度。例如,如果你的输入有784个特征,你的编码器可能看起来像这样:
具体数字取决于具体问题,通常通过实验得出。目标是有效地压缩数据,而不丢失对重建很重要的过多信息,更重要的是,使特征在后续任务中保持有用。
激活函数根据一个或一组输入确定神经元的输出。它们向网络引入非线性,使自动编码器能够学习比简单线性变换(如PCA)更复杂的映射。
对于编码器内的隐藏层,常见的选择包括:
ReLU(修正线性单元):
ReLU目前是最受欢迎的激活函数之一。它计算效率高,有助于缓解梯度消失问题,这会减慢深层网络的训练速度。它的非饱和性(对于正输入)意味着它学习速度更快。一个潜在问题是“死亡ReLU”问题,即神经元如果持续接收负输入可能变得不活跃,但Leaky ReLU或PReLU等变体解决了这个问题。对于大多数编码器隐藏层,ReLU是一个可靠的默认选择。
Leaky ReLU:
其中是一个小常数(例如0.01)。这使得当单元不活跃时,仍存在一个小的非零梯度,从而防止神经元“死亡”。
Sigmoid:
Sigmoid函数将其输入压缩到(0, 1)的范围。它在历史上很受欢迎,但如今在深层网络的隐藏层中较少被采用,原因在于梯度消失问题,特别是当输入非常大或非常小时。如果你的输入数据被归一化到0和1之间,并且你希望潜在特征也能反映概率或处于相似范围,那么sigmoid可以被考虑用于瓶颈层之前的最后一个编码器层,但对于中间层,通常更推荐ReLU。
Tanh(双曲正切):
Tanh将其输入压缩到(-1, 1)的范围。它是零中心的,这比sigmoid有优势。然而,和sigmoid一样,它可能遭受梯度消失问题。如果你的输入数据被归一化到-1和1之间,tanh可能是一个合适的选择。
瓶颈层输出的激活函数? “瓶颈层”本身就是表示。编码器的最终变换会生成这个瓶颈向量。通常,如果你将瓶颈层视为编码器中最后一个全连接层的直接输出,这一层可能使用线性激活(即没有非线性激活,)或根据潜在空间的预期属性使用特定的激活。对于旨在学习连续、压缩表示的标准自动编码器,瓶颈层使用线性激活很常见,允许潜在特征取任意实数值。如果你需要潜在特征有界(例如在0和1之间),那么编码器最后一层的输出可以应用sigmoid激活。然而,更常见的情况是,在所有通向瓶颈层的隐藏层中都应用非线性。
一般建议:对于编码器中的大多数隐藏层,从ReLU或Leaky ReLU开始。它们通常能提供良好的性能和训练稳定性。
理解这些设计考量——层数、每层神经元数量和激活函数——不是相互独立的,这一点很重要。
例如,如果你正在处理高度结构化的图像数据,你最终会转向卷积自动编码器(第5章),它们具有专门的层(卷积层、池化层),在捕捉空间层级方面非常有效。然而,深度、宽度缩减和非线性激活的原理仍然适用。
尽管本节侧重于编码器,但它的设计通常会影响解码器的架构。一个常见的做法,特别是对于更简单的自动编码器,是使解码器大致与编码器对称。如果你的编码器层的神经元数量为[输入维度, 128, 64, 潜在维度],一个对称的解码器层可能为[潜在维度, 64, 128, 输入维度]。这种对称性是一种启发式方法,通常效果不错,但它并非严格要求。解码器的任务是从潜在表示中重建原始数据,因此其设计应有助于这一上采样或解压缩过程。
此处提供的指导原则提供了一个起点。构建有效的自动编码器,就像其他神经网络一样,涉及一个迭代过程。你将提出一个初始架构,训练模型,评估其性能(包括重建质量和提取特征的实用性),然后完善设计。
监控训练、可视化重建结果以及评估提取的特征(如本章稍后和第7章所讨论的)将为调整编码器网络设计提供有价值的反馈。随着经验的积累,你将对这些选择如何影响自动编码器的行为及其学习强大特征的能力有更好的直觉。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造