机器学习中的无监督反向传播

machine learningpythondata science

机器学习的人工智能分支使计算机能够从数据中学习并做出判断。在监督学习中,标记数据集用于训练模型,而无监督学习中则使用无标记数据集。神经网络用于无监督反向传播(一种无监督学习),以发现无标记数据集中的模式。这篇博客文章将概述无监督反向传播,然后再介绍实际的 Python 代码。

什么是无监督反向传播?

反向传播是一种监督学习方法,它修改神经网络的权重以减少预测结果和观察结果之间的差异。另一方面,无监督反向传播使用未标记的输入训练网络以查找隐藏的结构和模式。在这种方法中,输入数据由自动编码器神经网络压缩成较小的表示,称为潜在空间,然后解码器网络使用潜在空间重建原始输入。最小化输入数据和解码器网络输出之间的重建误差是无监督反向传播的目的。

自动编码器神经网络

反向传播无监督学习最流行的神经网络架构是自动编码器。称为自动编码器的神经网络由两个神经网络组成:一个将输入数据转换为低维表示的编码器网络和一个将低维表示转换回原始输入空间的解码器网络。

生成对抗网络

GAN 是一种机器学习模型,由两个神经网络组成,一个用于生成,一个用于鉴别。鉴别器试图区分真实数据和虚假数据,而生成器则试图生成真实的合成数据。 GAN 可以在无监督反向传播的背景下使用,以创建没有标签的新数据样本。然后,神经网络可以从这些创建的样本中学习,以找到数据中隐藏的模式和结构。对于标记数据较差或不可用的问题,利用 GAN 的无监督学习策略可能很有用。

使用 Python 进行无监督反向传播

首先,我们将构建一个包含两个数据点集群的虚构数据集。使用编码器网络中的两个密集层和解码器网络中的两个密集层,然后使用 Keras 构建自动编码器神经网络。无监督反向传播用于在数据集上训练自动编码器。散点图用于显示数据集的潜在空间表示。使用散点图,最后显示自动编码器的重建输出,并将其与用作输入的数据进行对比。结果表明,自动编码器已经掌握了数据集的合适模型。

创建数据集

为了在无监督反向传播研究中使用,让我们开发一个特定的数据集。使用 scikit-learn 工具,将创建一个具有两个数据点集群的二维数据集。

from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=42)

使用上面显示的代码创建一个具有两个属性的 1000 个数据点的数据集。数据集中两个簇的中心分别为 (-5, 0) 和 (5, 0)。

可视化数据集

让我们使用散点图来可视化数据集,以识别两个数据点分组。

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1])
plt.title('Dataset')
plt.show()

输出

散点图显示数据集包含两个数据点簇。

定义自动编码器模型

使用 Keras 包,让我们定义自动编码器神经网络。解码器网络和编码器网络组成了自动编码器。解码器网络由两个密集层组成,激活函数为 sigmoid,而编码器网络由两个密集层组成,激活函数为 ReLU。

from keras.layers import Input, Dense
from keras.models import Model

input_layer = Input(shape=(2,))
encoded = Dense(32,activation='relu')(input_layer)
encoded = Dense(16,activation='relu')(encoded)
decoded = Dense(32,activation='relu')(encoded)
decoded = Dense(2,activation='sigmoid')(decoded)
autoencoder = Model(inputs=input_layer,outputs=decoded)
autoencoder.compile(optimizer='adam',loss='mse')

为了与我们的维度相对应数据集,我们在上面的代码中构建了一个具有两个维度的输入层。接下来,我们定义编码器网络,它由两个具有 ReLU 激活函数的密集层组成。潜在空间表示是编码器网络的输出。两个具有 sigmoid 激活函数的密集层被视为解码器网络。解码器网络产生与输入具有相同维度的重建输出。

训练自动编码器模型

定义自动编码器神经网络后,让我们使用无监督反向传播在我们的数据集上训练它。该模型将使用 fit() 技术进行训练。

autocoder.fit(X, X, epochs=50, batch_size=32)

我们使用 fit() 技术在上面的代码中训练自动编码器模型。由于目标是重新创建输入数据,我们将原始数据作为输入和目标输出。我们还定义了批量大小和训练模型的时期数。

可视化潜在空间

一旦自动编码器经过训练,我们就可以使用编码器网络来检索数据集的潜在空间表示。之后,可以使用散点图来查看潜在空间。

encoder = Model(inputs=input_layer, outputs=encoded)
latent_space = encoder.predict(X)

plt.scatter(latent_space[:, 0], latent_space[:, 1])
plt.title('Latent Space')
plt.show()

在上面的代码中,我们引入了一个称为编码器的全新模型,该模型接收输入层作为输入,并从编码器网络的第二个密集层输出潜在空间表示。然后使用编码器模型获得我们的数据集的潜在空间表示。散点图用于描绘潜在空间。

散点图显示,我们的数据集的潜在空间表示清楚地区分了两组数据点,表明自动编码器已经学习了数据集的可用表示。

可视化重建的输出

让我们最后使用输入数据来运行自动编码器,并将输出与原始输入数据进行比较,以查看输出是如何重建的。

reconstructed = autoencoder.predict(X)

fig,axes = plt.subplots(1,2,figsize=(10, 5))
axes[0].scatter(X[:, 0], X[:, 1])
axes[0].set_title('Original Data')
axes[1].scatter(reconstructed[:, 0], reconstructed[:, 1])
axes[1].set_title('Reconstructed Data')
plt.show()

在上面的代码中,输入数据通过自动编码器处理以产生重建的输出,然后使用散点图将其与原始数据一起可视化。

散点图显示自动编码器的重建输出与原始输入数据非常匹配,表明它已经学会了可靠的表示数据集。

结论

最后,无监督反向传播是一种有效的无监督学习神经网络方法。它不利用标记的训练数据,而是教神经网络如何表示传入的数据。聚类、异常检测和降维只是可以用这种方法处理的几个无监督学习问题。由于自动编码器可以在不需要标记训练数据的情况下获得高维数据的可用表示,因此它们是无监督学习中使用的一种常见神经网络形式。机器学习从业者可以将无监督反向传播和自动编码器应用于他们自己的数据集,并通过掌握这些方法从数据中获取有见地的知识。


相关文章