嘉宾 | 黄鸿波
整理 | 徐杰承
本文整理自西山居人工智能技术专家黄鸿波在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取。
图片
本次分享主要围绕Stable Diffusion的技术原理和落地来展开。第一部分为Stable Diffusion的工作原理。第二部分是Stable Diffusion做稳定的训练的主要方法。第三部分则是如何在企业或团队里将Stable Diffusion落地。
1、Stable Diffusion的工作原理
Stable Diffusion实际上是扩散模型,在Latent的模型里专用于做文图生成的任务,是基于LDM来构建的。LDM是通过在一个潜在的表示空间中去迭代“去噪”,对数据进行降噪和还原来进行编解码。最后在GPU上进行图片生成,降低落地门槛,带来文生图的体验。
其实文生图技术早在几年前就已经有了,但那时候文生图还是一个拼算力的东西,需要大量的算力,一般使用4卡或8卡的P100组合进行训练,需要单独训练文本的部分、单独训练图像部分。
那时还会用到一些模型生成网络,加上文本的生成,生成一张图需要20秒、30秒甚至一分钟,并且无法保证图片质量。另外一点,生成内容效果比较单一,彼时的技术只能生成例如一只猫、一只狗等图像,无法理解太过复杂的语义。
而Stable Diffusion的出现或者说LDM的出现,解决了之前文生图方向的一些缺点。Stable Diffusion准确来说是基于Latent Diffusion Models的整体架构,也就是LDM的架构来完成的。
图片
其中主要分为三大部分。第一是Pixel部分的内容,编解码器,把图像进行编码,其次经过Latent Space,进行Diffusion传播,进行去噪,然后进行编辑,再进行解噪。
整体来说,Stable Diffusion在训练的过程中是通过文本和图像进行匹配,然后进入VAE和U-Net中进行训练,训练后就可以理解文本和图像的匹配的关系。之后再去加入新的文本,让其进行扩散学习,通过噪音的叠加部分,最后在潜在空间上进行多次迭代,回到原始图像。
图片
U-Net是从噪声中生成图像主要的模块,其原理是通过预测,在过程中反复调用U-Net模块,将U-Net输出噪声的Slice从原有噪声中进行去除,得到一个去除后的结果。所以它一共分成三部分,像ResnetBlock、Transformer结构、上采样和下采样的内容,加在一起就是U-Net的结构。
Diffusion的过程,其实就是扩散的原理,将一个图像通过各种各样的迭代噪声,产生最后的噪声。下面通过噪声,通过U-Net再还原成图像,其实就是一个Forward的正常扩散和逆向扩散的过程。
图片
正向扩散是逐步对图像加入高斯噪声,然后通过噪声的迭代逐步增加,使得在每一步的过程中,高斯程度越来越高,就会产生一系列的噪声图像,最后得到的就是x-T。x-T会经过U-Net的模型在x-T中进行Denoising的解码的工作,将所生成的噪声模型进行反向解码得到清晰的图。
与正向不同,逆向扩散不能进行反转噪声,直接进行噪声反转,是没有办法计算的。因为高斯程度增长是一个不可逆的过程,所以需要在Diffusion中训练神经网络,来近似进行q的还原,通过不断迭代,使其形成一个服从正态分布的整体的形象,从而定义反转。所以其逆向和正向的处理过程在这里是不同的。
2、如何利用Stable Diffusion训练出稳定效果
对于媒体、游戏领域的公司来说,美术的要求会比较严格。例如一款游戏分国内版、美版、日版,虽然从用户角度来看,角色设计大同小异,但实际上美版和日版的美术设计可能会更符合美国或日本的审美,国内则又是另一种审美,美术的实际细节并不一样。
除此之外,国内的许多武侠游戏,在大众看来,角色都是穿着长袍、汉服或唐装,外形看起来都一样。但深度玩家会知道游戏存在着什么样的特性,看到游戏的画风,就能凭经验知道是哪一款游戏。文生图最大的矛盾,其实就在这里,程序员和美术的关注点是不同的。
想要解决这个矛盾,让文生图能够生成符合美术要求的图像,首先要了解什么是DreamBooth。DreamBooth是一个特征词+类别标签。在做DreamBooth的训练或Stable Diffusion训练时,一般的训练方式都是基于SD1.5、SD1.4或2.0来进行的。
图片
但在原始模型中可能已经存在了一些形象的概念,再专门训练某形象,需要让模型知道这个形象要用符号代替。训练完成后,当输入特定符号,就会出现特定的形象,这是DreamBooth的优势,但同样也是弊端。
例如使用Hugging Face时,训练DreamBooth会让你提供Prompt,以输入“a abc dog”为例,增加类别为“a dog”,“abc”则是特定符号,加上类别的好处在于它既学会了特定符号特征,又同时不会忘记类别特征。它的目的在于让模型既学会新的知识,又不会去忘掉旧的内容。如果不加类别,新的知识学到了,但迭代的次增多,旧的知识可能反而会被忘记。
图片
LoRA则是一个比较常用的冻结式的微调模型。例如在原始的扩散模型中,通过输入,经过各种各样的模块到输出。这种模型的问题在于每次训练时,都要从头到尾去训练,相当于训练整个Stable Diffusion,这需要的显存会比较高、对算力的要求比较高、对于数据集也会有比较高的要求。
微软提出的LoRA方式,作用是把模型的大部分进行冻结,模型结构不变,在结构之上再加两个LoRA层,只有这两个LoRA层参与微调,实际上相当于整个模型不需要训练,只需要训练这两个LoRA层。它的参数量相比于训练整个模型要小得多。
在LoRA层加上所需要的各种特征、细节,从而进行训练,这也就是为什么在LoRA放上几个图,加一个prompt,就能生成相关的内容。LoRA的原理就是这样,在一个大模型的基础上将其冻结,只把数据集和prompt对应到两个LoRA层之中,它就能够得到我们想要的结果。
图片
但是这种结果其实也有一些弊端,它可能只适合简单风格的训练,或者单一的针对于某一个点的训练,超出这个点,可能就需要再用另外一种方法或者叠加LoRA。
所以很多做Stable Diffusion的人,会在网上找base模型,再去下载一堆LoRA,有微调眼睛的、微调鼻子的、微调手指的,把这些LoRA都叠加进去再进行图像生成,效果就会很好。所以LoRA的优势就在于训练成本低,可以针对某一方面单独进行训练。
3、Stable Diffusion在企业中落地
但是在落地方面,如果LoRA和DreamBooth的效果都不能满足企业需求,就需要Text-to-Image训练了。Text-to-Image训练也可以不是从头到尾训练,如果基于一个已经训练好的大模型,再对其进行Finetune,其实就是Text-to-Image。但这对于算力的要求比较高,要想较好的训练效果,建议用40G以上的显存。
Text-to-Image的处理分三部分,第一部分是数据集处理;第二部分是底模选择;第三部分则是各种各样的参数,对整个模型、整体效果的影响。
首先数据集的处理,在图片处理时,可以用AI模型将图片背景全都去掉了,并且贴一个白背景。去掉之后,就变成一个四通道,四通道训练并不好做,加上白背景,就变成一个三通道,再把大小处理成512×512。
图片
图像到文字可以根据图像一句一句挑描述,这样是最精准的。还有一种方法则是通过webUI的方式,webUI里一般都有clip等方式,可以生成描述,它生成的针对每一个文件是一个txt的文本,再把文本做一定的数据处理。生成之后可以直接使用描述,基本上不需要做太大的改变,除非需要增加一些比较特殊的词,比如增加一些项目的名字或者特定的一些内容的名字。
模型的选型方面,推荐用Hugging Face网站,其中有很多Stable Diffusion,有base模型,1.5、2.0、2.1、1.4都有,还有一些专用模型,可以根据需要搜索,把它作为base model进行训练。C站更多的是比较适用于webUI。
图片
最后关于模型训练过程的一些心得和需要避开的坑。当有时模型跑不起来的时候,可以看它提供的一些用低模型的低显存的方法,但是这里有一个坑,就是低显存的方法在Text-to-Image中没有,而在隔离的DreamBooth里说了,可以把里面的两行配置粘过来,会发现它是能用的。
此外关于调参,经常有一些非算法的同学问我,说这里面的学习率、这里面的loss到底是什么,怎么样才算把模型训练好?我会建议他去看loss,看它的变化曲线,它最后是否收敛。
很多时候非技术人员或初学者在用Stable Diffusion或者在网上拿过来的做训练的时候,他们最大的问题是不知道用多大的数据集,即便知道了用多大的训练集,也不知道再训练多少步,而知道该训练多少步后,又不知道该训练到什么时候停止。
这里可以提供一个参考,在做Stable Diffusion的大模型的训练的时候,最需要注意一点是,根据数据集的大小,根据图片的尺寸,最大的训练步数需要进行相应的调整。当然,数据集的描述也需要进行调整,最终才能够训练出比较好的效果。
嘉宾介绍:
黄鸿波,珠海金山网络游戏科技有限公司(西山居)AI技术专家,高级算法工程师,谷歌机器学习方向开发者专家,拥有多年软件开发经验,著有《TensorFlow进阶指南 基础、算法与应用》一书。曾在格力电器股份有限公司大数据中心担任人工智能领域专家,且在多家公司担任过高级工程师,技术经理,技术总监等职务。