stable diffusion 基本概念
stable diffusion 基本概念
这篇是fastai第九讲视频资源的笔记, 笔者认为从一个很好理解的角度解释了stable diffusion
the rest of the class is a shit
从一个神奇的函数开始
首先我们想象有函数f, 对于每一张图片, 他能返回"可能是数字"的概率, 比如下图中的x1为数字的概率为0.98, x2为数字的概率为0.4, x3为数字的概率为0.02
现在我们来尝试将x3变得"更像数字", 我们是这样做的, 从x3的(0,0)像素点开始, 尝试增加"一点点"像素值, 查看p`(x3)的变化, 我们可以求每个像素点相对f(x)的梯度!接着对原图片每个像素点减去一个合适的常数c和梯度的乘积.
如果我们把得到的新的图片给函数f检测, 就会发现新图片"更像数字", 和随机梯度下降的思想类似.
为了贴近我们即将阐述的概念, 我需要这样表述上面的做法, 我通过递归计算梯度得到了"合适的常数c和梯度的乘积", 它的形状和原图片是一样的28x28, 我们把他称为x3的噪声图, x3减去噪声图使x3更接近数字图片.
构造训练数据
在上一节中, 我们有一个神奇的函数f去预测噪声图, 但是引入一个函数告诉我们这张图片有"多么"像手写数字, 然后再计算梯度这很奇怪, 我们永远无法知道! 参考GAN里的辩别器.
在这一节我们通过一个神经网络直接预测噪声图, 数据集是大量的手写图片, 通过添加大量均值为0方差不同的噪声分布得到"不那么像手写图片"的样本, 训练这个神经网络使它尽可能准确的预测输入图片的噪声图, 输入图片减去噪声图得到"更接近数字图片"的样本.
在最后我们可以从纯噪声开始, 得到"很像手写数字的图片".
VAE
参考下图, 我们的任务是训练一个神经网络, 使输入图片和输出图片完全一致, 上采样和下采样一般通过卷积实现.
当谈论这样做的意义时, 请关注图中红线部分, 我们从64x64x4的特征还原出了原始图像, 那么我们只需要在服务器中保存这个压缩后的特征(latent), 在客户端就可以根据模型共享参数还原出原始图片.
在模型训练完成后, 我们把图中绿色部分称为VAE(Variational autoencoders), 严格意义上来说VAE是一种压缩算法, 帮助我们节省大量的时间和金钱.
CLIP
接下来我们将理解怎么增加文本嵌入.
对于手写数字任务, 我们在模型中嵌入onehot编码版本的数字.
对于复杂精美的现实世界图片, 我们可以使用CLIP
每张图片都有一个text标签, 我们对image和text分别编码, 得到固定长度的一维向量, 我们希望:
- 标签和图片匹配的嵌入向量尽可能相似, 标签和图片不匹配的嵌入向量尽可能不同.
- 相似的标签得到相似的文本嵌入, 相似的图片得到相似的图片嵌入.
我们定义的损失函数如上图右表所示, 运用点积, 它们每个嵌入组合都能得到一个分数, 损失函数为蓝色部分减去红色部分(contrastive loss).
重复表述一下我们期待的结果, "a graceful swan", "some beautiful swan", "such a lovely swan", [一张天鹅的照片]得到相似的嵌入向量. 可以理解为在一个高维空间中, 它们的位置非常接近.
补充观点
- 记录timestep, 不同时间步添加不同程度(方差, c决定)的噪声, 通过diffusion sampler控制
- 新的观点认为在"从一个神奇的函数开始"中提到的c -> LR, diffusion sampler -> optimiser, 是否需要t存疑
- perceptual loss代替MSE