— order: 5 —1 Stable DiffusionStable Diffusion 是什么?基于扩散模型文生图模型时间线2021.12 早期由 Stability AI 资助,Comp Vis Runway ML 联合研究,发布 paper LDM2022.08 Comp Vis 发布 SD1.1SD1.42022.10 Runway ML 发布 SD1.52022.11 Stability Al 发布 SD2.0至今      此后发布便一直以 Stability AI 名义发布模型1.1 LDMLDM (latent diffusion mofel) DDPM 的关系1.LDM = VAE + DDPM2.LDM 在语义空间做 Diffusion3.LDM 有更多模态的融入(类别、文本……classifier guidance给定𝑦的条件下,𝑝(𝒙𝑡1|𝒙𝑡)的分布是多少?𝑝(𝒙𝑡1|𝒙𝑡,𝑦)=𝑝(𝒙𝑡|𝒙𝑡1,𝑦)𝑝(𝒙𝑡1|𝑦)𝑝(𝒙𝑡|𝑦)=𝑝(𝒙𝑡|𝒙𝑡1)𝑝(𝒙𝑡1|𝑦)𝑝(𝒙𝑡|𝑦)=𝑝(𝒙𝑡|𝒙𝑡1)𝑝(𝒙𝑡1|𝑦)𝑝(𝑦)𝑝(𝒙𝑡|𝑦)𝑝(𝑦)=𝑝(𝒙𝑡|𝒙𝑡1)𝑝(𝒙𝑡1)𝑝(𝑦|𝒙𝑡1)𝑝(𝒙𝑡)𝑝(𝑦|𝒙𝑡)=𝑝(𝒙𝑡1|𝒙𝑡)𝑝(𝑦|𝒙𝑡1)𝑝(𝑦|𝒙𝑡)=𝑝(𝒙𝑡1|𝒙𝑡)exp(log𝑝(𝑦|𝒙𝑡1)log𝑝(𝑦|𝒙𝑡))𝑝(𝒙𝑡1|𝒙𝑡)exp((𝒙𝑡1𝒙𝑡)𝒙𝑡log(𝑝(𝑦|𝒙𝑡)))log𝑥𝑝(𝑦|𝒙𝑡)处泰勒展开 DDPM 𝑝(𝒙𝑡1|𝒙𝑡)𝒩(𝒙𝑡1;𝜇𝜃(𝒙𝑡,𝑡);̃𝜎2𝑡𝑰)带入并整理得到𝑝(𝒙𝑡1|𝒙𝑡,𝑦)=𝒩(𝒙𝑡1;𝜇𝜃(𝒙𝑡,𝑡)+̃𝜎2𝑡𝒙𝑡log(𝑝(𝑦|𝒙𝑡)),̃𝜎2𝑡𝑰) classifier guidance 相当于 unconditioned + 分类对抗梯度。也就是说,在原本 DDPM 的基础上,加入𝑦相对𝒙𝑡的梯度信息,驱使它往我们希望的方向走(均值漂移)在以上基于数学的推导基础上,由实验发现加入超参𝛾可以更好地调节生成效果𝑝(𝒙𝑡1|𝒙𝑡,𝑦)=𝒩(𝒙𝑡1;𝜇𝜃(𝒙𝑡,𝑡)+𝛾̃𝜎2𝑡𝒙𝑡log(𝑝(𝑦|𝒙𝑡)),̃𝜎2𝑡𝑰)训练采用两阶段,另外训练一个分类器𝑝(𝑦|𝒙𝑡)输入是𝒙𝑡,是加了噪声的图片,由 DDPM 的超参可以得到,据此预测不同类别的概率即可(因此并非任何图像分类器均可)classifier guidance 的另一个好处就在于,因为 DDPM 一般比较大训练很慢,这个时候我们只需要调整相对小的分类器,就能让其有分类指导的能力推理时,只需要每一步算分类器相对𝒙𝑡的梯度,加到高斯分布的均值里即可classifier free为什么要有这玩意儿?首先一方面 classifier 的引入让 pipeline 变得复杂,大家学术上互相卷起来;另一方面就是这个分类器的输入是带噪声的𝒙𝑡,其效果可以想见不会太好classifier free 是以另一种玄学方式求解上述梯度。试想,同一个模型给它两个输入,一个带𝑦一个不带,那么减一下就成为我们想要的那个梯度𝑝(𝒙𝑡1|𝒙𝑡)𝒩(𝒙𝑡1;𝜇𝜃(𝒙𝑡,𝑡),̃𝜎2𝑡𝑰)𝑝(𝒙𝑡1|𝒙𝑡,𝑦)𝒩(𝒙𝑡1;𝜇𝜃(𝒙𝑡,𝑡,𝑦),̃𝜎2𝑡𝑰)𝜇𝜃(𝒙𝑡,𝑡,)=1𝛼𝑡(𝒙𝑡1𝛼𝑡1𝛼𝑡𝜀𝜃(𝒙𝑡,𝑡))𝜇𝜃(𝒙𝑡,𝑡,𝑦)=1𝛼𝑡(𝒙𝑡1𝛼𝑡1𝛼𝑡𝜀𝜃(𝒙𝑡,𝑡,𝑦))𝒙𝑡1=𝜇𝜃(𝒙𝑡,𝑡,𝑦)+̃𝜎𝑡𝜀=𝜇𝜃(𝒙𝑡,𝑡)+̃𝜎2𝑡𝒙𝑡log(𝑝(𝑦|𝒙𝑡))+̃𝜎𝑡𝜀𝒙𝑡1=𝜇𝜃(𝒙𝑡,𝑡)+𝛾(𝜇𝜃(𝒙𝑡,𝑡,𝑦)𝜇𝜃(𝒙𝑡,𝑡))+̃𝜎𝑡𝜀实现上,把𝑦做成一个 embedding𝑡一起加入网络即可classifier free 也是一种财大气粗的表现(因为整个网络要重训)text guidance classifier free 一样,不管你是什么,反正就是个条件,做成输入融进网络即可(大道至简)其实还是有一些数学原理在的不过 text 的融合方式跟 class 有所不同(因为信息表现形式不同:长文本序列和单个类别),所以前面 class 通过跟 time 想加,而text 通过在网络中加入 cross-attention网络结构上,把 text CLIp 拿到 embedding 后,把原本 resblock 内的 self-attention 变成 cross-attention 即可(𝐾𝑉 text1.2 SDXL相比 SD 1.51.更大的模型结构a.删除 UNet 最后一次下采样 (1/81/4)b.深层更多 Tranformer Blockc.使用一大一小两个 clip text encoder力大砖飞……),进而有更大的 context dimd.增加 pooled text embedding2.更多的条件控制且更多的图片a.利用原先没有使用的小图片,增加图片原始尺寸的 condition(ori,𝑤ori)b.增加 crop 参数的 condition(𝑐top,𝑐left)c.多分辨率(将不太分辨率图片放入不同 bucket训练时保证 batch 来自同一 bucket),加入 bucket size condition𝑐ar=(tgt,𝑤tgt)融入方式就是做 embedding concat 起来,过一个 MLP 融合模态,跟 time embedding 加到一起3.更强的 VAE4.SDXL-base + SDXL-refinerSDXL-base 的训练范式三阶段训练,不同阶段的输入尺寸和模态不同Stage 3 加了0.05的偏移噪声为什么?因为我们前向加噪到最后,虽然已经很接近高斯噪声,但毕竟不是纯高斯分布;但反向生成的时候用的是纯高斯分布这会导致无法生成全黑或全白的图片。而更为严重的影响是,模型蒸馏的时候(SDXL turbo让模型反向一步就能生成图片),这一点点的 gap 会带来巨大的影响这个偏移噪声就是其中一种解决方案,还有一些解决方案可以参考这篇论文 Common Diffusion Noise Schedules and SampleSteps are FlawedSDXL-Refiner是一个独立的图生图的去噪模型增加了美学得分的 condition总之它的作用是优化 base 的结果,使一些细节变得更好总结1.SDXL 使用了更大的模型结构 (0.8𝐵2.6𝐵)2.SDXL 更高效地利用了以前被丢弃的数据3.SDXL 使 condition 更模块化4.SDXL 是重新训练的版本模型(诚意满满)5.SDXL 尝试解决了一些实际问题,比如多分辨率,生成目标完整性等6.SDXL 对分辨率敏感1.3 SD 的发展与插件输入模态与方式的革新,主要分为三种方式1.基于训练,直接重训新模态的网络,比较少见2.基于微调,比如 ControlNet3.非训练也非微调 (tuning-free) InstantIDControlNet后面介绍2 Fine-Tuning of Diffusion Models参考 【详解】LoRA, ControlNetStable Diffusion微调方法原理详解!Textual Inversion —— 简易 CLIP 的字典中新增一个伪词的 embeddingfinetune 这个 embedding其它参数都冻结训练量极小,只需一张图;但完全不改神经网络参数效果有限Dream Booth —— 完整找一个罕用词代表 subject embedding 继承自原类型的词的 embedding调整了模型的所有可调参数,彻底让模型学会 subject灾难性遗忘问题,通过 loss 项防止学会新的忘记旧的 LoRA 出现前,训练 Dream Booth 是主流,但代价较大Custom Diffusion —— 精简Custom Diffusion 基本建立在 DreamBooth 的基础上,通过消融实验证明了即使只训练交叉注意力层中的部分矩阵,也有非常好的finetune 效果(不需要像 DreamBooth 那样全部参数调整)这种思路也引领了后续的一系列研究,但 DreamBooth 仍然是当时的范式LoRA —— 灵巧LORA 的网络是一种 additional network训练不改变基础模型的任何参数,只对附加网络内部参数进行调整。在生成图像时,附加网络输出与原网络输出融合,从而改变生成效果由于 LORA 是将矩阵压缩到低秩后训练,所以 LORA 网络的参数量很小,训练速度快实验发现,低维矩阵对高维矩阵的替代损失不大。所以即便训练的矩阵小,训练效果仍然很好,已经成为一种 customizationimage generation 范式LORA 后来在结构上改进出不同的版本,例如 LoHaLyCORIS 典型修改方案 LyCORIS这个以二次元人物命名的方法把 LORA 的思想应用在卷积层做改进,并且结合了一些其他算法进行了参数调整ControlNet —— 彻底一种高效微调 text-to-image diffusion models 的方法,可以 diffusion model 学习空间条件注入信息ControlNet 冻结 stable diffusion 的参数,复用它的 encoding layers 来训练,其中复用的 encoding layers 的参数为零初始化 (“zeroconvolutions” , zero-initialized convolution layers)确保没有有害的噪声影响微调属于比较工程性的工作