快捷搜索:  汽车  科技

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)然而,自动编码器面临与大多数神经网络相同的几个问题。他们往往倾向于过度拟合,还遭受消失的梯度问题。那么有解决方案吗?这里为您推荐一个变分自动编码器。它本质上增加了随机性,但不完全准确。此外,很明显,我们可以应用它们来重现相同但有点不同甚至更好的数据。例子是:为了更好地理解自动编码器,我将提供一些代码和解释。在本文中,我们将使用Pytorch来构建和训练我们的模型。自动编码器是简单的神经网络,它们的输出就是输入,就是这么简单。他们的目标是学习如何重建输入数据。但它有什么用呢?关键是他们的结构。网络的第一部分就是我们所说的编码器,它接收输入并将其编码在较低维度的潜在空间中。第二部分(解码器)采用该向量并对其进行解码以生成原始输入。中间的潜在向量是我们想要的,因为它是输入的压缩表示,应用程序非常丰富,例如:

点击上方关注,All in AI中国

如果我们不需要标记数据来训练我们的模型,那将会是一个很酷的事情。我的意思是标记和分类数据会花费我们很多的时间,然而,事实是大多数从支持向量机到卷积神经网络的现有模型没有它们就无法进行训练。

无监督学习通过自己的无标签数据推断出一个函数。最著名的无监督算法是K-Means,它已被广泛用于将数据聚类成组,而主成成分分析(PCA)是降维的一个重要解决方案。 K-Means和PCA可能是有史以来最好的两种机器学习算法。让他们变得更好的原因是他们的简单性,当你掌握了它们时,你就会感叹:“我为什么不早点想到它?”

接下来我们想到的下一个问题可能是:“是否存在无监督的神经网络?”。

为了更好地理解自动编码器,我将提供一些代码和解释。在本文中,我们将使用Pytorch来构建和训练我们的模型。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(1)

自动编码器是简单的神经网络,它们的输出就是输入,就是这么简单。他们的目标是学习如何重建输入数据。但它有什么用呢?关键是他们的结构。网络的第一部分就是我们所说的编码器,它接收输入并将其编码在较低维度的潜在空间中。第二部分(解码器)采用该向量并对其进行解码以生成原始输入。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(2)

中间的潜在向量是我们想要的,因为它是输入的压缩表示,应用程序非常丰富,例如:

  • 压缩
  • 降维

此外,很明显,我们可以应用它们来重现相同但有点不同甚至更好的数据。例子是:

  • 数据去噪:给他们输入存在噪声的图像,并训练它们,会输出相同的图像但没有噪声。
  • 训练数据增加
  • 异常检测:在单个类上训练它们,以便每个异常都会产生很大的重构错误。

然而,自动编码器面临与大多数神经网络相同的几个问题。他们往往倾向于过度拟合,还遭受消失的梯度问题。那么有解决方案吗?这里为您推荐一个变分自动编码器。它本质上增加了随机性,但不完全准确。

让我们进一步解释一下,变分自动编码器经过训练,可以学习模拟输入数据的概率分布,而不是映射输入和输出的函数。然后,它从该分布中采样点并将它们馈送到解码器,以生成新的输入数据样本。但是等一下,当我听说概率分布时,只有一件事物浮现在脑海中:贝叶斯。是的,贝叶斯规则再次成为主要原则。顺便说一下,我并不是夸大其词,但贝叶斯公式可能是有史以来最好的方程式。而且我不是在开玩笑,它无处不在。

回到变分自动编码器。我认为以下图片足够使你清楚的了解它:

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(3)

在我们构建一个生成新图像的示例之前,我们需要讨论更多的细节。

VAE的一个关键方面是损失函数。最常见的是,它由两部分组成,重构损失衡量的是重建数据与原始数据的差异(例如二进制交叉熵)。KL-divergence方法尝试着将这个过程规范化,并且使得重构数据尽可能的多样化。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(4)

另一个重要方面是如何训练模型。困难在于变量是确定性的,但随机和梯度下降通常不起作用。为解决这个问题,我们使用重新参数化。潜在向量(z)将等于我们的分布的学习平均值(μ)加上学习的标准偏差(σ)乘以epsilon(ε),其中ε遵循正态分布。我们重新参数化样本,使随机性与参数无关。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(5)

在示例中,我们将尝试使用变量自动编码器生成新图像。同时使用MNIST数据集,重建的图像将是手写的数字。正如我已经告诉过你的那样,使用Pytorch作为框架,只是因为熟悉,除此之外,没有特别的原因。首先,我们应该定义我们的图层。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(6)

正如您所看到的,我们将使用一个非常简单的网络,只有Dense(在pytorch的情况下为Linear)层。下一步是构建运行编码器和解码器的功能。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(7)

它只是几行python代码。最后,我们训练模型并查看生成的图像。

提醒:与Tensorflow相比,Pytorch有一个动态图表,这意味着代码在运行中运行。 没有必要创建图形然后编译执行它,Tensorflow最近引入了上面的功能和它的即时执行模式。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(8)

训练完成后,我们执行测试功能以检查模型的工作情况。事实上,它做得非常好,构造的图像与原始图像几乎相同,我相信没有人能够在不知道整个故事的情况下将它们区分开来。

下图显示了第一行中的原始照片和第二行中生成的照片。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(9)

相当不错,不是吗?

在我们结束这篇文章之前,我想再介绍一个主题。如我们所见,变分自动编码器能够生成新图像。这是生成模型的经典行为。生成模型意味着正在生成新数据。另一方面,判别模型是对类或类别中的现有数据进行分类或区分。

用一些数学术语来解释:生成模型学习联合概率分布p(x,y),而判别模型学习条件概率分布p(y | x)。

在我看来,生成模型更有趣,因为它们为从数据增加到模拟未来可能状态的众多可能性打开了大门。但更多关于下一篇文章的内容,可能是关于一种称为生成对抗网络的相对较新的生成模型的帖子。

在那之前,继续学习AI。

深度自动编码器背后的数学原理(如何使用自动编码器生成图像)(10)

猜您喜欢: