基本编码器-解码器架构

数据挖掘 喀拉斯 rnn 美国有线电视新闻网 自动编码器
2022-02-13 15:21:12

我阅读了几篇关于编码器-解码器架构及其实现的文章(比如这篇文章)。但我仍然不明白一些事情。

  1. 基本的 CNN 或 RNN 和编码器解码器有什么区别?编码器和解码器是否需要满足一些属性?据我了解,编码器在另一个维度上对输入进行编码并创建一个上下文向量。稍后这个上下文向量被解码器解码。

  2. 我知道它们是不同类型的编码器和解码器,最简单的架构是什么?

  3. 我应该在编码器中使用预定义的词嵌入,比如 word2vect(如果我有文本作为输入)?

2个回答

使用卷积层的自动编码器本质上是 CNN 架构的一个子集。

编码器的想法正是你所说的你想从一个空间去RnRm在哪里m<n. 有很多方法可以以这种方式压缩信息,这些技术曾经被称为压缩感知。当时的想法是找到自动生成从 n 维到 m 维的映射的方法。顾名思义,它是一个自动编码器。最近最流行的方法是使用 CNN,为了简单起见,我们将这种特定类型的自动编码器称为自动编码器,但请记住还有其他方法可以做到这一点。

自编码器有一个特殊的结构,我们将限制中心层的参数数量。编码器是将信息压缩到 m 维空间的网络部分。然后我们使用解码器从压缩数据中重建输入。通过提供相同的输入和输出来训练自动编码器。我们希望网络尽可能地重新创建输入。如果输出等于输入,那么我们就有了完美的重构,并且包含了输入中包含的所有信息。当我们限制维度时,总会有一些信息丢失。我们希望尽量减少这种损失。

这是一个香草自动编码器的示例

input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is compressed

x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

如果网络只学习恒等函数会发生什么!

针对这个问题,设计了去噪自动编码器。在输入中添加高斯白噪声,并在输出端使用原始图像进行训练。这迫使网络学习图像的下划线分布,而不仅仅是将它们复制到输出。您可以使用与上述相同的网络。噪声可以添加如下

noise_factor = 0.5 
x_train_noisy = x_train_reshaped + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train_reshaped.shape) 
x_test_noisy = x_test_reshaped + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test_reshaped.shape) 
x_train_noisy = np.clip(x_train_noisy, 0., 1.) 
x_test_noisy = np.clip(x_test_noisy, 0., 1.)

编码器和解码器是高度重载的术语。作为一般定义,编码器-解码器神经架构有一部分称为“编码器”的网络接收输入并生成代码(即在不同的表示空间中表达输入)和另一部分称为“解码器”,它接受一个给定代码并将其转换为输出表示空间。通常,代码的维数远小于输入/输出表示空间的维数。

原则上,编码器和解码器的架构是任意的,即它们可以是 CNN、RNN、多层感知器或其他任何东西。这在很大程度上取决于任务。这应该回答问题(1)。

编码器-解码器网络组织通常有两种情况:

  • 图像自动编码器:通常,编码器是 CNN,解码器是类似的反卷积。
  • 序列到序列任务:通常,编码器和解码器都是 GRU 或 LSTM。

当您提到词嵌入和有关文本摘要的博客文章时,我猜您的问题与 NLP 有关,因此您可以从Keras 博客 seq2seq 教程开始。这应该回答问题(2)。

使用预训练词嵌入的适当性取决于任务和您拥有的训练数据量。当您没有大量数据时,使用预训练嵌入是一种数据增强形式,以获得更好的结果。对于翻译,预训练的词嵌入并不常见。这应该回答问题(3)。