搜索
写经验 领红包

如何理解AI绘画创作的变分自编码器(VAE)?

导语:如何理解AI绘画创作的变分自编码器(VAE)?变分编码器vae的应用场合

在AI创作工具中,离不开的一个概念是:变分自编码器(Variational Autoencoder,简称VAE),它是一种神经网络模型,可以实现数据降维和生成。它结合了自编码器和概率图模型的思想,通过对输入数据进行编码和解码,实现对数据的表征和生成。今天我们从几个方面介绍变分自编码器和AI创作的关系。

自编码器是一种无监督学习的神经网络模型,它可以将输入数据压缩成低维向量,再将向量还原为与原始数据相似的输出。自编码器的训练过程可以通过最小化重构误差来实现。概率模型是一种描述数据分布的模型,可以计算给定数据概率的似然函数。概率模型可以用于生成数据或对数据进行采样。

下面就是Stable Diffusion使用VAE技术创建的图片:

如何理解AI绘画创作的变分自编码器(VAE)?

如何理解AI绘画创作的变分自编码器(VAE)?

如何理解AI绘画创作的变分自编码器(VAE)?

变分自编码器将自编码器的编码器和解码器看作两个随机变量,分别表示输入数据和隐藏表示的分布。它通过最大化编码器和解码器之间的变分下界来训练模型。变分下界是一个概率上界,可以用来近似似然函数。变分自编码器的训练过程可以分为两个阶段:编码阶段和解码阶段。在编码阶段,模型通过编码器将输入数据转化为隐藏表示,同时估计隐藏表示的概率分布。在解码阶段,模型从隐藏表示的概率分布中采样,然后通过解码器将采样得到的向量还原为输出数据。这个过程相当于从模型的先验分布中采样得到随机向量,然后通过解码器将随机向量转化为输出数据。由于模型的先验分布是可控的,可以通过调整先验分布来生成不同的数据。

简而言之,变分自编码器可以类比为一个画家,他会将一张图片分解为若干种颜色和线条的组合,然后按照这些组合重新绘制出原始图片。不同于其他的自编码器,变分自编码器不仅考虑了重构误差,还考虑了隐藏表示的概率分布,从而能够生成具有多样性的图片。这相当于画家不仅能够复制原始图片,还能够通过一些随机性的操作生成新的图片。

如何理解AI绘画创作的变分自编码器(VAE)?

如何理解AI绘画创作的变分自编码器(VAE)?

变分自编码器可以用于数据压缩、图像生成、图像插值等多个领域。例如,在图像生成中,我们可以将变分自编码器作为生成模型,从随机噪声中生成高质量的图片。在语音识别领域,变分自编码器可以用于语音生成和声音合成等任务。还可以用于异常检测和数据去噪等应用。

下面演示一个简单的变分自编码器的例子。假设我们要生成一个二维高斯分布,首先我们需要定义一个先验分布和一个解码器。我们假设先验分布是一个二维标准正态分布,即 $p(z) = N(z|0, I)$,其中 $z$ 是二维向量。解码器是一个由两个全连接层构成的神经网络,用于将隐藏向量 $z$ 转化为输出向量 $x$。我们可以使用PyTorch实现如下代码:

import torch

import torch.nn as nn

import torch.nn.functional as F

class VAE(nn.Module):

def __init__(self):

super(VAE, self).__init__()

self.fc1 = nn.Linear(2, 16)

self.fc21 = nn.Linear(16, 2)

self.fc22 = nn.Linear(16, 2)

self.fc3 = nn.Linear(2, 16)

self.fc4 = nn.Linear(16, 2)

def encode(self, x):

h1 = F.relu(self.fc1(x))

return self.fc21(h1), self.fc22(h1)

def reparameterize(self, mu, logvar):

std = torch.exp(0.5*logvar)

eps = torch.randn_like(std)

return mu + eps*std

def decode(self, z):

h3 = F.relu(self.fc3(z))

return self.fc4(h3)

def forward(self, x):

mu, logvar = self.encode(x)

z = self.reparameterize(mu, logvar)

return self.decode(z), mu, logvar

这里我们使用了两个全连接层来分别实现编码器和解码器。在编码器中,我们首先通过一个全连接层将输入向量 $x$ 映射到一个中间向量 $h_1$,然后再分别使用两个全连接层将 $h_1$ 映射到均值向量 $\mu$ 和方差向量 $\log\sigma^2$。在解码器中,我们首先通过一个全连接层将隐向量 $z$ 映射到一个中间向量 $h_3$,然后再通过一个全连接层将 $h_3$ 映射到输出向量 $x$。

我们可以使用如下代码来生成样本:

model = VAE()

with torch.no_grad():

z = torch.randn(100, 2)

x = model.decode(z)

这里我们首先定义了一个VAE模型,然后使用torch.randn生成了一个大小为100x2的随机噪声矩阵 $z$,最后使用解码器将 $z$ 转化为大小为100x2的输出矩阵 $x$。这里我们生成了100个样本,每个样本都是一个二维向量。我们可以将生成的样本可视化出来。

import matplotlib.pyplot as plt

plt.scatter(x[:, 0], x[:, 1])

plt.show()

欢迎点赞、关注,持续分享更多精彩图文。

如何理解AI绘画创作的变分自编码器(VAE)?