我们已经确定,编码器的主要作用是接收输入数据并将其压缩。这项压缩工作主要在编码器的隐藏层中进行。编码器中的隐藏层是什么?在神经网络中,层本质上是计算的阶段。输入层是我们数据的入口。瓶颈层(我们稍后会详细了解)存放着数据的最压缩版本。在输入层和瓶颈层之间,我们通常会找到一个或多个隐藏层。编码器中的“隐藏层”是中间处理步骤,其输出不是自动编码器最终、直接观察到的输出。在编码器内部,这些隐藏层专门用于逐步降低数据的维度。维度简单来说是指用于描述每个数据点的特征或值的数量。例如,一张由28x28像素组成的图像,如果我们将它展平,则有 $28 \times 28 = 784$ 维度。压缩过程:隐藏层如何压缩信息隐藏层实现压缩的主要方式是使其神经元(也称为单元)数量少于其前一层。你可以将其想象成数据通过一个变窄的通道或一系列漏斗,每个阶段的容量都小于前一个。这种结构迫使网络对传递的信息进行筛选。考虑一个具有784个特征的图像数据示例:输入层将有784个神经元,每个输入特征对应一个。编码器中的第一个隐藏层,例如,可能有256个神经元。随后的第二个隐藏层可以进一步将其减少到128个神经元。 这种逐渐变细的过程会持续,直到数据到达瓶颈层,该层具有最少的神经元,从而存储了输入最压缩的表示。这种架构使得网络能够学习如何保留输入最重要的部分。由于神经元数量的减少,它无法保留所有细节,因此必须识别并编码潜在模式或最有用的特征,以便后续重构。隐藏层中的每个神经元都接收来自前一层神经元的输入。然后,它计算一个值(通常是其输入的加权和,并通过一个激活函数处理),并将输出发送到下一层。由于后续层的神经元数量较少,信息必然地被组合和压缩。这是说明此流程的图示:digraph G { rankdir=TB; graph [fontname="sans-serif", fontsize=10]; node [shape=rect, style="filled", fontname="sans-serif", fontsize=10, width=3.2, height=0.8]; edge [fontname="sans-serif", fontsize=10]; input_layer [label="输入层\n(例如, 784 维度)", fillcolor="#74c0fc"]; hidden_layer_1 [label="编码器隐藏层 1\n(转换为 256 维度)", fillcolor="#a5d8ff"]; hidden_layer_2 [label="编码器隐藏层 2\n(转换为 128 维度)", fillcolor="#a5d8ff"]; bottleneck_preview [label="...到瓶颈层\n(例如, 64 维度)", style="filled,dashed", fillcolor="#ced4da", width=3.2, height=0.8]; input_layer -> hidden_layer_1 [label=" 信息被压缩"]; hidden_layer_1 -> hidden_layer_2 [label=" 进一步压缩"]; hidden_layer_2 -> bottleneck_preview [label=" 到最紧凑的形式"]; }数据流经编码器的隐藏层。每层通常会减少维度数量,在数据向瓶颈层移动时有效地压缩信息。神经元数量减少为何意味着压缩当一个隐藏层的神经元数量少于向其提供输入的层时,它根本没有能力以相同细节程度传递它接收到的所有信息。它被迫创建更紧凑的总结。通过训练过程(我们将在第3章中介绍),网络学习如何使这些总结尽可能丰富和有用,以便解码器之后可以尝试准确地重构原始输入。例如,如果一个早期隐藏层处理图像的像素数据,它可能会学习组合这些像素以识别边缘或简单纹理等基本元素。随后的、更小的隐藏层可能会将这些边缘和纹理特征作为输入,并学习表示物体的更复杂组成部分。每一步都涉及总结和抽象信息,这是在此情境下压缩工作方式的核心。激活函数的作用如前所述,这些隐藏层中的神经元也会对其计算的输出应用一个激活函数。我们将在本章后面更仔细地了解像 $ReLU$(修正线性单元)这样的特定激活函数。目前,需要知道这些函数向网络引入了非线性。这是一个重要的点。如果没有非线性,一个深层神经网络(具有多层的网络)实际上会表现得像一个单一、简单得多的线性层。这将严重限制其学习数据中复杂关系的能力,从而也限制了其有意义地压缩数据的能力。$ReLU$ 由于其在许多情况下的简单性和有效性,是编码器隐藏层的一个常用选择。通向瓶颈层数据通过逐渐变小的隐藏层继续向前,直到数据到达瓶颈层。编码器最后一个隐藏层的输出作为瓶颈层的直接输入。本质上,这些隐藏层完成了将初始高维输入数据转换为瓶颈层将存储的低维、压缩表示的繁重工作。理解这些编码器隐藏层如何系统地降低数据维度,是理解自动编码器如何实现压缩并从数据中学习有用的特征的重要组成部分。接下来,我们将了解瓶颈层本身,它是这种压缩表示的核心。