深度学习架构完整指南:自动编码器
2023年06月12日 由 Alex 发表
506143
0
自动编码器:基本思想
自编码器是一种从输出重建输入的神经网络。这里的基本思想是,我们有输入,我们压缩这些输入,这样我们就有了最重要的特征来重建它。
作为人类,当我们被要求用最少的次数画一棵树时(考虑到我们一生中见过这么多树),我们会为树画一条线,并在树的顶部画几个分支,以提供树的抽象外观,这就是自动编码器所做的。
一个普通的自动编码器如下所示:
让我们以图像重建为例。
我们的输入层有784个单位(假设我们给出28x28的图像),我们可以简单地在上面堆叠一个有28个单位的层,我们的输出层将再次拥有784个单位。
第一部分被称为“编码器”,它将我们的输入编码为潜在变量,第二部分被称为“解码器”,它将从潜在变量重构我们的输入。
拥有较少单元的隐藏层将足以进行压缩并获得潜在变量。这被称为“不完全自动编码器”(我们也有其他类型的自动编码器,但这给出了主要思想,我们也会讨论它们)。简而言之,它只是另一个前馈神经网络,并具有以下特征:
1. 输入层,单位数较少的隐藏层和输出层
2. 它是无监督的:我们传递输入,得到输出,并再次与输入进行比较
3. 我们的损失函数将比较输入和压缩后的重建版本的输入,看看模型是否成功。
4. 具有线性层解码器的自编码器本质上与主成分分析做同样的事情(即使训练目标是复制输入)。
5. 自动编码器的另一个核心概念是权重绑定。解码器的权重与编码器的权重相关联。对编码器的权值矩阵进行转置,就得到了解码器的权值。将解码器权重与编码器权重绑定是一种常见的做法。这样可以节省内存(使用更少的参数),并减少过度拟合。我试图在下面用多个图形来解释我的直觉。让我们来看一看。
对于下面的自动编码器:
编码器和解码器的权重矩阵如下所示(如果你知道转置意味着什么,你可以跳过这个):
Keras实现
让我们使用 Keras Subclassing API 实现上述网络。我为每个图层都留下了注释,以便指导您如何创建它。
自动编码器类(模型):
class Autoencoder(Model):
def __init__(self, latent_dim):
super(Autoencoder, self).__init__()
self.latent_dim = latent_dim
# define our encoder and decoder with Sequential API
# flatten the image and pass to latent layer to encode
self.encoder = tf.keras.Sequential([
layers.Flatten(),
layers.Dense(latent_dim, activation=’relu’),
])
# reconstruct latent outputs with another dense layer
# reshape back to image size
self.decoder = tf.keras.Sequential([
layers.Dense(784, activation=’sigmoid’),
layers.Reshape((28, 28))
])
# give input to encoder and pass encoder outputs (latents) to decoder
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
# initialize model with latent dimension of 128
autoencoder = Autoencoder(128)
# we can use simple MSE loss to compare input with reconstruction
autoencoder.compile(optimizer=’adam’, loss=losses.MeanSquaredError())
# we don’t have a y_train given we want output to be same as input :)
autoencoder.fit(x_train, x_train,
epochs=10,
shuffle=True,
validation_data=(x_test, x_test))
与欠完备自编码器相比,完备自动编码器具有相等的单元,而过完备自编码器的潜在维数单位比编码器和解码器多。这导致模型没有学到任何东西,而是过度拟合。另一方面,在欠完备自编码器中,如果隐藏层过小,则可能导致编码器和解码器的信息容量过大。为了避免过度设计并为自编码器添加更多功能,引入了正则化自编码器。这些模型具有不同的损失函数,不仅将输入复制到输出,而且使模型对有噪声、稀疏或缺失的数据更加稳定。正则化自编码器有两种类型:去噪自编码器和稀疏自编码器。我们不会在这篇文章中深入讨论它们,因为实现与普通的自编码器没有太大的不同。
稀疏自动编辑器
稀疏自动编码器是一种具有损失函数的自动编码器,其潜在维数(添加到编码器输出)在重构损失之上受到惩罚。这些稀疏特征可用于使问题受到监督,其中的输出依赖于这些特征。这样,自动编码器可以用于分类等问题。
降噪自动编辑器
降噪自编码器是一种从给定输入中去除噪声的自编码器。要做到这一点,我们只需用带有噪声的损坏版本的输入训练自编码器,并要求模型输出没有噪声的原始版本的输入。你可以在下面看到损失函数的比较。它的实现与普通的自动编码器相同,除了输入。
堆叠编辑器
在ReLU出现之前,消失的梯度将使训练深度神经网络变得不可能。为此,堆叠的自动编码器被创建为一个hack的解决方案。首先训练一个自编码器来学习训练数据的特征,然后切断解码器层,在其上添加另一个编码器,训练新的网络。最后加入softmax层,利用这些特征进行分类。这可能是迁移学习的早期技术之一。
来源:https://medium.com/@merveenoyan/complete-guide-on-deep-learning-architectures-part-2-autoencoders-293351bbe027