目录
写在前面
论文地址:https://arxiv.org/abs/1312.6114
大模型已经有了突破性的进展,图文的生成质量都越来越高,可控性也越来越强。很多阅读大模型源码的小伙伴会发现,大部分大模型,尤其是CV模型都会用到一个子模型:变分自编码器(VAE),这篇文章就以图像生成为例介绍一下VAE,并且解释它问什么天生适用于图像生成。配合代码尽量做到通俗易懂。
变分自编码器(VAE)是一种生成模型,旨在通过学习数据的潜在表示(Latent)来生成新样本。VAE 的训练目标是最大化变分下界,这意味着在学习潜在空间时,保持生成样本与真实数据的相似性,并尽量让潜在变量的分布接近标准正态分布。这样一来,模型就能有效地生成多样化的新图像。
上面那段话似乎不容易理解,我用白话解释一遍。VAE 的最大作用是尽量简单的生成“能看的”图片。现在达到的效果是输入一段标准高斯分布的Latent,就能生成自然连贯的图像。而且生成的图像有如下三个特点:
1.这个图像是全新的(也许跟某些训练数据相似);
2.通过编辑Latent可以一定程度上控制生成图像中的内容;
3.Latent空间中的结构化使得生成的图像自然且连贯,也就是说输入虽然是随机的,但输出是“能看的”,不是无意义的图像。
一、VAE结构
VAE由如下三块组成:
1.编码器(Encoder):输入数据通过编码器转换为潜在空间的分布。编码器通常由几层神经网络组成,输出潜在变量的均值和方差(其实是对数方差)。
2.重参数化层(Reparameterize):从编码器输出的均值和方差中进行重参数化采样,生成潜在变量。这一过程使得模型能够在训练时进行反向传播。
3.解码器(Decoder):解码器接收潜在变量并将其转换回原始数据的分布。解码器同样由神经网络组成,目的是重构输入数据。
可以看到和AE相比,VAE的结构差别主要集中在编码器和潜在空间的处理。编码器有两个输出均值和方差(其实是对数方差);中间的重参数化层根据均值和方差重采样得到Latent,我们一般管他叫做z。
下面我们使用MNIST数据集模拟一个VAE的结构,编码器和解码器使用最简单的全连接,Hidden维度400,Latent维度20,batch_size=128。
可以看到,编码器的输出是两个128x20的特征图,用于重参数化;重参数化的输出是128x20,也就是每一个点都根据对应的均值和方差采样得来。
二、损失函数
(VAE)的损失函数主要由两部分组成:
1.重构损失(Reconstruction Loss):衡量模型生成的样本与原始输入之间的差异,通常使用均方误差(MSE)或二元交叉熵(Binary Cross-Entropy)作为度量。这部分确保生成的样本尽量忠实于输入数据。
2.KL散度(Kullback-Leibler Divergence):衡量编码器输出的潜在分布与先验分布(通常是标准正态分布)之间的差异。目标是使得 逼近标准正态分布
,使得采样变得更加合理。
重构损失没什么可说的,下面给出KL散度的公式:
KL散度代码实现:在代码实现的时候编码器的输出其实是均值mu和对数方差log_var,这一点在上图也能看出来:
K