如前所述,自编码器的主要任务是接收一些输入数据,让数据经过编码器管理的压缩阶段,然后尝试使用解码器重构原始输入。此过程最狭窄处是瓶颈层,也称潜在空间。此层并非仅仅是被动通道;它是特征学习真正发生之处。由于瓶颈层在设计上小于输入和输出层,自编码器被迫学习一个压缩但信息丰富的输入数据概要。这个概要就是我们所称的学习到的特征表示。这样来设想:想象你必须仅用极少量词语向某人描述一个复杂场景。为有效做到这一点,你必须选取场景中最重要的、有区分度的细节。你不会把词语浪费在琐碎的元素上。自编码器面临类似挑战。为成功从瓶颈层的高度压缩信息中重构输入,编码器必须学习识别并编码数据中最突出的特性,即特征。瓶颈层的输出:一个稠密特征向量瓶颈层的输出是数值集合,该层每个神经元输出一个值。这些值共同构成一个特征向量。此向量是原始(通常是高维)输入的稠密、低维度表示。处理MNIST数据集(手写数字)中的图像,每张图像可能是28x28像素,从而产生784个输入值。如果自编码器有一个瓶颈层,比如说32个神经元,那么对于每张输入图像,瓶颈层将产生一个32个数字的向量。这个32个数字的向量就是原始784像素图像学习到的特征表示。自编码器已学习到仅用这32个值来总结该数字的要点。digraph G { rankdir=TB; graph [pad="0.5", nodesep="0.5", ranksep="0.8", fontname="sans-serif"]; node [shape=record, style="filled", fontname="sans-serif", fillcolor="#e9ecef", color="#adb5bd"]; edge [fontname="sans-serif", color="#495057"]; Input [label="{输入数据 | 例如,图像(784像素)}", fillcolor="#a5d8ff"]; Encoder [label="{编码器 | 压缩信息}"]; Bottleneck [label="{瓶颈层 | 紧凑表示}", fillcolor="#fcc419", color="#f59f00", penwidth=2]; FeatureVector [label="学习到的特征向量\n(例如,32个值)", shape=note, fillcolor="#ffec99", style="filled,dashed", color="#f59f00"]; Decoder [label="{解码器 | 重构信息}"]; Output [label="{重构数据 | 例如,图像(784像素)}", fillcolor="#a5d8ff"]; Input -> Encoder; Encoder -> Bottleneck; Bottleneck -> FeatureVector [style=dashed, arrowhead=open, color="#f76707", constraint=false]; Bottleneck -> Decoder; Decoder -> Output; }瓶颈层处理来自编码器的输入,并输出一个紧凑的特征向量。此向量是原始输入数据的一个学习到的、低维度表示,解码器随后将其用于重构。为什么这些被视为“特征”?你可能想知道瓶颈层中这一组压缩的数字为何被称为“特征向量”。原因如下:捕获必要信息:为使解码器能相当好地重构原始输入,瓶颈向量必须保留该输入最重要的信息。它不能只是随机数;它必须编码底层结构或模式。自动学习:这些特征并非人工预定义。自编码器在训练过程中尝试最小化重构误差时,会自动学习它们。它会发现数据哪些方面最有助于创建高效、压缩的概要。抽象表示:自编码器学习到的特征通常是抽象的。对于图像数据,它们可能不直接简单地对应于“边缘检测器”或“颜色斑块”之类的直观人类想法,尤其是在更深的网络中。相反,它们是网络认为对其压缩和重构任务有效的模式组合。例如,对于人脸,瓶颈层中的一个神经元可能对眼睛间距和鼻子形状的某种组合强烈激活,而另一个可能捕获关于发际线或下颌线的信息。有助于重构:网络优化这些特征,使其尽可能对解码器有用。若特征良好,解码器就能很好地完成任务。若它们较差(例如,遗漏重要细节),重构效果也会差。因此,自编码器的编码器部分有效充当特征提取器。其主要作用是将输入数据转换为瓶颈层处这个有意义、紧凑的特征向量。解码器随后重构输入的能力,证明了这些学习特征的质量和相关性。瓶颈层中的神经元数量直接决定此特征向量的维度(即特征数量)。非常小的瓶颈迫使自编码器学习高度压缩且可能非常抽象的特征,因为它存储信息的“插槽”更少。这种在保留数据重要特性的同时降低数据维度的过程,是将瓶颈作为特征提取器的直接结果,这是我们将在维度降低的背景下进一步讨论的话题。