解码器在自编码器中的作用是重建数据。它接收通常由编码器的瓶颈层生成的压缩表示 $z$,并将其转换回类似于原始输入 $X$ 的形式。解码器的最后一层,即输出层,在这一重建过程中扮演着重要角色。此输出层使用的激活函数直接决定了重建值 $X'$ 的性质和范围。因此,其选择受您希望重建数据特征的直接影响。输出层的激活函数输出层的激活函数需要确保重建数据 $X'$ 与原始输入数据 $X$ 具有相同的格式和范围。如果您的输入数据由介于 0 和 1 之间归一化的像素值组成,则解码器的输出也应落在此范围内。Sigmoid 函数自动编码器输出层最常用的激活函数之一,特别是在处理归一化到 [0, 1] 范围的输入数据时(例如灰度图像像素强度),是 Sigmoid 函数。Sigmoid 函数定义如下: $$ \sigma(x) = \frac{1}{1 + e^{-x}} $$ 它将任何实值输入 $x$ 压缩到 0 到 1 之间的输出。这种“S”形非常实用,因为它与在此范围内有界的数据自然吻合。例如,如果一个输入像素是 0(黑色)或 1(白色),或介于两者之间,Sigmoid 函数可以确保重建的像素值符合这些边界。Tanh (双曲正切) 函数输出层的另一个选择是 双曲正切 函数,通常缩写为 tanh。它与 Sigmoid 类似,但将值压缩到 [-1, 1] 的范围。tanh 函数定义如下: $$ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$ 如果您的输入数据 $X$ 已归一化到 -1 和 1 之间,通常会使用 tanh。下图展示了 Sigmoid 和 tanh 函数,显示它们如何将输入值映射到各自的输出范围:{"data":[{"x":[-5,-4,-3,-2,-1,0,1,2,3,4,5],"y":[0.00669,0.01798,0.04742,0.11920,0.26894,0.5,0.73105,0.88079,0.95257,0.98201,0.99330],"type":"scatter","mode":"lines","name":"Sigmoid", "line":{"color":"#228be6"}}, {"x":[-5,-4,-3,-2,-1,0,1,2,3,4,5],"y":[-0.9999092,-0.9993292,-0.9950547,-0.9640275,-0.7615941,0,0.7615941,0.9640275,0.9950547,0.9993292,0.9999092],"type":"scatter","mode":"lines","name":"Tanh", "line":{"color":"#12b886"}}],"layout":{"title":"常用输出层激活函数","xaxis":{"title":"输入值 (激活前)"},"yaxis":{"title":"激活后的输出值","range":[-1.05,1.05]}, "height": 350, "width": 500, "margin": {"l": 50, "r": 50, "b": 50, "t": 50, "pad": 4}, "legend": {"yanchor":"bottom", "y":0.01, "xanchor":"right", "x":0.99}}}Sigmoid 输出介于 0 和 1 之间的值,适用于归一化到此范围的数据。Tanh 输出介于 -1 和 1 之间的值,用于数据按此方式归一化时。线性函数如果您的输入数据没有方便地限定在 [0, 1] 或 [-1, 1] 之间怎么办?例如,您可能正在处理可以取任何实数的原始传感器读数。在这种情况下,为输出层使用 线性 激活函数(或者等效地,不使用激活函数)是合适的。线性激活函数很简单: $$ f(x) = x $$ 这意味着神经元的输出只是其输入的加权和,没有任何“压缩”。这使得重建值 $X'$ 可以取任何实数,与原始数据 $X$ 的潜在范围相符。解码器中隐藏层的激活函数尽管解码器的输出层对输入数据范围有特定要求,解码器中的隐藏层有不同的作用。这些层逐步进行上采样并把压缩表示 $z$ 转换回原始数据的结构。对于解码器中的这些中间(隐藏)层,通常使用与编码器隐藏层相同的激活函数。修正线性单元(ReLU) 是一个很受欢迎的选择。回忆一下,ReLU 的定义是: $$ \text{ReLU}(x) = \max(0, x) $$ ReLU 在隐藏层中受到青睐(包括编码器和解码器),因为它有助于更有效地训练更深的网络(通过缓解梯度消失等问题),并且计算效率高。在解码器中,ReLU 使网络能够学习从压缩形式重建数据所需的复杂非线性转换。尽管 Sigmoid 或 tanh 也可以用于隐藏层,但 ReLU 通常是一个可靠的默认选择。总结来说,在设计解码器时:输出层的激活函数 根据原始数据 $X$ 的范围选择(例如,Sigmoid 用于 [0,1],tanh 用于 [-1,1],线性函数用于无界数据)。隐藏层的激活函数 通常使用 ReLU 来帮助学习从瓶颈 $z$ 到 $X'$ 的复杂映射。理解这些激活函数及其位置是理解自动编码器如何有效地学习重建和表示数据的又一步。