当前位置:首页|资讯|Stable Diffusion

「如何控制AI?」你需要的基本功&概念,零基础快速理解!

作者:你风哥WindBro发布时间:2024-02-12

本篇基于 2023/06/11,Leonardo.Ai 官方 DC 中文区的 MasterClass 大师课实况精华影片的内容来整理,目标对象是使用过 AI 绘图工具,但对其底层逻辑没有概念的朋友。用尽量简单的方式来讲述,深浅结合帮助你在使用上能获得更高的掌控度。

并逐一介绍在 Leo 上设置参数与使用功能的技巧,基于 Stable Diffusion 开发的各家 AI 绘图工具大同小异,即使平常不是使用 Leo 的朋友,相信这些基本概念多少也能帮助到你。

对完整版有兴趣的朋友也可以到 Leonardo.Ai 官方 YouTube 频道观看 VOD!

文章内容的排列顺序与精华会有些微不同,希望可以达成方便阅读的目的,欢迎在阅读后留下你的建议!

文章偏长可以先收藏慢慢看喔!


*本篇面向初学者——对机器学习、DDPM 的原理没有概念的朋友,因此在解释 denoising 时不考虑 latent vactor、decoder 等实际情况,只以最简单、最方便理解的方式来说明。



今天的主题是:

如何控制 AI?

实际上呢,这个问题更完整的句子应该是:

「如何找到更好的方式去控制 AI 达成我想要的结果?」


那么在 AI 生成图像的这个领域里,我会把这个原始问句置换成:

「如何干涉杂讯?」

因为我们现在用的所有类型的AI绘图工具,它们都是基于一类叫做 Diffusion Model 的生成模型,其中现在最广泛应用的技术是 Denoising Diffusion Probabilistic Models,简称 DDPM,通常还是直接叫 Diffusion Model,也就是扩散模型。


扩散概率模型 (DDPM) 是使用变分推理训练的参数化马可夫链。

马可夫链为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备「无记忆」的性质:下一状态的机率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的「无记忆性」称作马可夫性质。

(进阶阅读:DDPM原论文 https://arxiv.org/abs/2006.11239)


Diffusion Model 的基本概念中,「Noise 杂讯」有着重要的影响力。所以首先要来讲的,就是杂讯。



Diffusion Model 是如何生成图片的?

它是从一张完全的杂讯里面,然后以像素为单位逐步去剔除杂讯,然后留下 AI 认为它应该要留下来的东西在画面上,最终它就会生成出来的这个图片。

在这个过程中,AI 要怎么去判断哪些是要被踢掉的杂讯,哪一些是要留下来变成是我们图片的,就是基于它受到的训练。

它在训练中学习到的资料,跟它接受到的那些干涉,去判断它到底要剔哪些跟留哪些。

我们现在使用者方面能够做到的,是去理解我们要如何去干涉这个杂讯,因为它最开始就是一张杂讯,它中间剔除的东西也是杂讯。只要我们可以干涉这些东西的话,那出来的成品就会尽可能的接近我们的要求。


那么 diffusion model 它的生成过程,其实就是它训练过程的反向运作。

参考来源:李宏毅老师原上课影片

在训练的时候是,一步一步地去增加杂讯,从我们原本的乾淨清晰的图片,到最后会变成一张完全无法看出内容的杂讯。

逐步增加杂讯的过程中,会先从细节开始消失,然后到最后连轮廓都会消失。

当在生成的时候,就是反过来一步一步从这样子全然的杂讯,开始剔除,细节开始看得出来,衣服跟头发的颜色、眼睛的颜色,直到设定好的步数走完,我们得到生成结果。


它的思考方式,可以想像为以像素为单位,像素为单位就是大概像这样:

这是一种示意、概念。 现在普遍的做法是在解码 (decode) 前都呈现人类无法解读辨认的向量 (vector)。

全然杂讯的情况,放大来看就是这样子的东西,AI逐步剔除杂讯时,就是去思考在每个像素里面,要留下来的是什么东西?要留下甚么颜色才是对的?


我们使用者所使用的干涉手段,就是在告诉AI说,现在你学会了吸收资料,也学会了反推成品,那现在我要你在生成的时候,按照我的要求来。最终整张图会趋近 prompt、i2i、controlnet 等干涉指令所要求的结果。


0+1+1+1+....+1=100

再简单一点举例来说的话:

把AI当成是一个什么都不知道的小孩,然后教他从 0+1……

那个杂讯就是 +1+1 一直加,加到 100。

然后希望 AI 学会了 0 加到 100 之后呢,可以自己做到反过来,

从 100-1-1 减到最后是 0。

我们不希望它减到最后是 -1 或是 -100,我们希望它最后还可以减到 0,那就表示说它学会了这个实际上计算的过程。

基本上 AI 生成图像它的底层就是这个原理,没了,就这样

如果你把 AI 生图当成是一个卡池的话,你的干涉手段不够,或者是你对基本原理不够理解的时候,它就比较像是你在一个 N 卡池里面,想要捞出一张甚至都没有保底的 SSR。

但是当你可以去运用这些干涉手段的时候呢,就相当于是在 SSR 几率提升的限定卡池里面去抽卡,既省钱,又省时间,你还会比较快乐,也比较知道自己在干嘛。何乐而不为呢。


题内话,李宏毅老师的机器学习课程录影系列真的超棒,强烈推荐大家灌爆老师的订阅跟点赞。↓

https://youtu.be/azBugJzmz-o?si=-DHydE8IGP6dUhIN


所以话说回来,那……

干涉手段是什么?

前面有提到,干涉手段其实就是我们现在平常在使用的这些指令跟功能,包含从……不是从 prompt 开始,是从你的 dimension 开始,就是你画布的大小(尺寸)。

Dimension 画布尺寸、Guidance Scale 引导权重(引导量表)、Prompt 提示词、image to image (i2i) 图生图、Controlnet 控制网、Seed 种子、Scheduler 调度器、Sampler 採样器。

*影片内容勘误:scheduler 跟 sampler 其实是两个东西,当时不知道。

这些东西都属于干涉手段。知道原理之后,再使用干涉手段,才是实际上真的有在指向性的去做这件事情。

接下来我会稍微分享一下我平常对这些东西的使用方式。


本次实况篇幅只讲了其中四种,往后会接着讲其他的,感兴趣的朋友可以点赞订阅收藏。希望影片与文章内容能对你有帮助。



画布尺寸/Image Dimensions

在生成图片的时候输入的全然杂讯,什么都还没有加入的,最开始的第0步骤的那个杂讯(我称其为初始杂讯),它就已经有长宽尺寸了,这个尺寸就是你设的 Dimensions 画布尺寸。

在设定完按下去 generate 之后,它是不会在生成过程中改变的,会有变化的都是这个图面上的内容。

所以这个尺寸大小其实是非常非常非常重要的一个东西。

以前刚开始摸 Leo,还不太懂的时候呢,我会尽量的去把它的大小设成一币最大,就一个代币可以设多大我就把它设多大,但我现在已经不会这样用了。

为甚么要这样?其实道理挺简单的,因为它训练的素材都是这个尺寸,那么对它来说一张图片完整的架构就是基于这个尺寸内来分布的,那它在反推的时候,可以说,它就比较擅长这个尺寸。


训练尺寸会是一个相对稳定的尺寸,不是说一定不会崩,不过它崩掉的可能性会相对比较低。

你坚持要直接开大尺寸画布的话也没有问题,崩掉的可能性就会变高而已。www


崩掉的是怎么崩呢?

对 AI 来说,你把它训练的这个大小,比如说 640x832 吧。

当你把画布拉大并且没有提供其他额外的控制项时,假设拉到 1024x768,对它来说它并不会知道要去把他训练的内容(学习到的内容)放大成 1024x768,而是基于他训练的这个尺寸大小,然后额外多出来的部分放开他的想象,类似像这种感觉。可以说 AI 是靠猜,猜得准不准、好不好,取决于这个模型训练得好不好,以及资料量够不够大。


Midjourney 之所以表现得如此好,很大一部分确实归功于它的资料量庞大,在 SDXL 推出之前,应该没有几家模型的资料库品质与数量可以和 MJ 匹敌。


如果你画布尺寸开到太过大,比如说你已经开到了 1538x1538,几乎可以说必然会出现:

  • 你要"一个人",它给你两三个人。

  • 你要一个"人",它给你三四隻手。

对人类而言扭曲不正常的人体。

等等情况,就是因为尺寸设定大过某个程度之后,AI 不知道怎么办,就会开始把它学到东西全部在画面上做重复。

终究你必须要理解一件事情:AI 它看不到画面

它实际上不理解它生成出来的东西,对人类来说合不合逻辑。但是其实对 AI 来说,是有逻辑的!因为它尽量都把它认为应该要接在一起的地方都接起来了。

如果你生成图片的时候,发现你的画面构成开始相当的不稳定,我会比较建议你把它调回去它的训练大小。

如果你今天是在测试一些新的 Prompt 的内容,也比较建议你就是回到它的训练大小,比较能确实知道这个模型到底能不能反映出你想要的结果,而不是在很多不稳定的错误中,只能用感受的,好像它懂,好像又不懂。



引导权重、提示词/Guidance Scale, Prompt

然后再来,我们同时讲一下 Prompt 提示词跟引导权重,就是下面那个 Guidance Scale,在 SD 中写作 CFG Scale。


Prompt 的基本权重规则,就是越放前面越重,Leo 现在有多一个控制 prompt 权重的手段。在你是免费仔的情况下,Leo 是不能使用括号增加单个提示词权重的(后有 alchemy 能够支援权重指令),除了套用基本规则外别无他法,但括号框起来的词可以些微加强关联性。

范例:(bottle of moon) seashore night cosmo

(bottle of moon) 会些微加强作为一个词组的关联性,但无法增强权重。


还有一个需要注意的点是,prompt 的长度其实是有一个有效范围的,如果没有通过额外的方式来加长文字编码器可以接受的字数,太过长的 prompt 在后面其实是会被AI自动截断的。

即便加长了,超长 prompt 也容易使 AI 混乱——并不是无法生成的意思,当然可以这样写,也可以顺利生成,只是结果可能相对不可控及不如预期——后段的权重也会非常之低。

更别说还有新手时常会犯的错误:四处複製来的 prompt 中包含了无作用的、互相冲突的、重複的 prompt,通常在整理过后会发现,其实可以不用写得那么长。

我个人是比较偏向短 prompt 派的,因此我对新手的建议是,尽量不要把 prompt 写得太长,等到掌握熟练后再依需要来加长 prompt 吧!


关于如何写 prompt,可以参考一下专栏中的咒语概论两篇喔!


那 guidance scale 是什么?

它可以视为 prompt 整体的权重,告诉 AI 说,我的 prompt 在这次生成中有多重要,要不要完全照着我指示的方式来做。

在 Leo 我目前只要能设定 guidance scale,我都是设定 20 拉满。但 SDwebui 和 Comfyui 等介面我通常会使用预设的 7,最多也只会拉到 9。

因为实测后已知 Leo 的 GS 在 7 以后的变化微乎其微,暂时还没有被修復,原因不明,所以可以放心拉到 20 没问题。

实测 XYplot 网址:https://i.imgur.com/rLYGKv1.jpg



图生图/Image to image

先给你看一张图,这个是我觉得相当好理解的图了。

图片来源:InvokeAI Documentation-Image-to-Image

左边这张是他丢进去的图,右边这两列就是我们在 Leo 调的那个 init strength,设定不同值的不同结果,而对 SDwebui(A1111) 来说是 denoising strength。

放入的参考图会取代初始杂讯,把图片权重拉的越高的时候,去除杂讯的步骤就会从越后面才开始,假设说我调到 0.5 左右,它会从中间开始,那留给它的剔除杂讯的步数没那么多情况下,它的生成结果就会跟我的图越接近。

这边要注意的是当你在使用 Leo 时 init strength,调整的是你丢进去的参考图片,被保留的参考程度,但大部分可以查到的资料,以及 SDwebui、Comfyui 等介面上的 denoising strength,调整的则是重绘程度。


简单来说:除了 Leo 是参数设定越高,成品变化越小,其他的大部分是参数设定越高,成品变化越大。

除了用作底图参考,你还可以透过 i2i 这样的特性,来做一个颜色风格的控制。

i2i 工作流程,一张一张套过去

做法是我丢进去的图,跟我要的东西其实完全不一样,但因为我把权重调的很低,它会变成一个有点像是底色的东西,帮助我控制整体颜色氛围。



ControlNet

虽然可以翻成控制网或控制网路,不过大家一般还是会直接叫它 controlnet,如果要搜寻教学用英文名称也比较好找到。

Leo 现在 controlnet 的话,有三个可以选嘛。

  • Pose 姿势

  • Edge 边缘

  • Depth 深度

它这个功能呢,基本上是源自于一个插件,就叫做 ControlNet,它包含有十几种不同的控制方式,并且持续都在做更新改善。

ControlNet is a neural network structure to control diffusion models by adding extra conditions.

ControlNet 是一个透过增加额外的条件来控制扩散模型的神经网路结构。

有兴趣的朋友可以前往它的原 GitHub 页面看它的技术原理跟各种控制方式的应用说明。

网址:https://github.com/lllyasviel/ControlNet


这边就只看一下 Leo 现在有的这三个 controlnet,实际上到底是怎么去参考你丢进去的图片的。名字其实已经蛮明显的了。

你上传的图片 AI 是无法直接使用的,他有一个预处理器,把你的图片在经过处理之后,转换成针对这三种参考方式的一个图面讯息,我们来看看它转换之后会长甚么样子。

左:参考图 右:预处理后

基本上我会建议画布尺寸不要跟你丢进去的图差太多,你要先确定你接下来要算的东西,你的 prompt 写的内容跟你这张参考图之间的关系。

如果说你想要尽量照着你丢进去的图来参考绘製的话,直接照着参考图的尺寸设定,或者是用同样比例的去缩放尺寸,它才不容易爆炸。



关于prompt的扩充知识

之前其实也蛮多人有疑问的,为什么我们使用的平台不能直接公布一个完整的词典,让我直接去查那些词可以写?

以 stable diffusion v1.5 为例,就是市面上大部分模型它的训练基底,它本身训练的时候,它的图库的数据来自一个叫 LAION 的数据库,它的文本编码器 CLIP 来自 open AI。

因为你直接给 AI 一张图片,AI 没办法辨认那是甚么东西嘛,所以他们最开始训练的时候是把图片跟文字一起丢进去,告诉它说……比如说一隻狗,给它一个狗的图片,告诉它,长这样子的叫作一隻狗。所以它需要的是图文成对的训练资料。


然后这个 text encoder 文本编码器基本上是 AI 用来理解你的 prompt 的,把人类使用的「文字」转换成一个机器可以看得懂的「语言」,这些语言将指引模型去寻找它学习过的内容中,与文本相符合的影像特徵。

因此文本编码器在训练的时候,一样是文字配图片这样成对的训练资料。


那 LAION 的图库数据量是 58.5 亿组,其中英文数据量占 23.2 亿组。

CLIP 的数据库,有 4 亿多的图文成对的数据。

想一想,58.5 亿再加 4 亿,这只是所谓的「基模」。

SDXL 的基础模型数据量是 35 亿,细化模型数据量是 66 亿,并使用两个文字编码器来生成。总之就是,资料量大到爆。

而我们现在生成时并不是直接去使用 1.5 跟 2.1 嘛,我们使用的是比如说像 Dreamshaper 啊、RPG 啊这些基于基模再去训练的模型,他们在训练中一样会放进很多图片与文字 (tag) 的资料。

这所有这一些的数据库的量,不要说平台没有办法公布了,任何一个模型的作者他都没有办法去公布,告诉你完整有效的 prompt 是什么。


并且一定要明白一件事情,同一个 prompt 它在不同的模型里面,(因为不同的训练设置等原因,)它的权重是不一样的,对应到的图像特称可能也是不一样的。这件事要先理解到,才不会感到莫名其妙,为什么这个 prompt 在 A 模型生成得很好,换一个模型就爆炸或是出不了想要效果。


没有万用 prompt 这回事。


当你发现换了个模型后,有一些你想要的特别关键的效果不见了,就把 prompt 的位置往前拉来调整。

例如下面这张图我写的是:desert apple bubble-pop in the style of moebius and dune, vivid color by John Berkey deepsea Call of Cthulhu (surface ripple)

我在 Leo 写 prompt 不喜欢放逗号,这是个坏习惯请不要理我。

但我现在希望它必须要带有 deepsea 深海的元素,可以推测沙漠地形应该是受到 desert 跟 dune 影响,那就可以试着调整为:

deepsea Call of Cthulhu underwater, apple bubble-pop in the style of moebius and landscape, vivid color by John Berkey (surface ripple)


如果我希望它那个 vivid color 的程度再低一点,但没有说不要这个效果了,那我可能会把它往后挪一挪。像是:

deepsea Call of Cthulhu underwater, apple bubble-pop in the style of moebius and landscape, by John Berkey (surface ripple) vivid color


其实你不用太去在乎说,语句有没有通顺,没有差,因为他终究要经过 CLIP 去转成机器懂的语言,那对 AI 而言,其实你放前放后,它不是很在乎那整个句子读起来通不通顺,只要字没有把它切断就好了。


最基础的概念是,AI 听不懂你在讲什么的,你讲出来的要求 AI 能不能忠诚去实现,很大程度取决于这个文字编码器,那你要知道文字编码器是怎么训练,以 1.5 使用的 CLIP 为例,它的训练方式都是比较单词片语类型,所以你跟它用叙述性的句子去讲,它是没有办法理解整句话的意思的。

它还是会给你拆成单词片语,可以这么说。


你跟它说"那个东西",它不知道你在说什么东西;你跟他说"这个人"跟"另外一个人"它其实不能理解这样的叙述内容的区别性。


但,大会报告,SDXL 的文本编码器对于叙述句型的支援度好很多,未来应该也会逐渐朝这个方向演变,让人类可以用更自然的语言驱使 AI。因此我所谓的不应该这样去写,也仅止于现阶段这样的写法还未发展成熟。



今天讲的全部的东西,都希望各位能有几个重要的概念。

影响的是结果,干涉的是杂讯。

你想要影响的是生成的结果,但是你干涉的时候实际上是在干涉杂讯。

AI 看不见画面、认不得东西、也听不懂你在说甚么。

用于图像生成的扩散模型,在文字处理上的逻辑与 ChatGPT 这类语言模型是不同的。


小明在家旁边的水沟,用他阿骂的几件内衣接起来绑在他妈打他用的竹竿上,末端绑上他姊藏在柜子里的巧克力,想钓石斑鱼当晚餐。钓了一个下午发现钓不上石斑鱼,并开始骂这水真烂、这竿真烂、这巧克力真烂。

请问,晚上第一个揍小明的会是谁? σ ゚∀ ゚) ಠ౪ಠ)σ


以我自己的经验来说,有这些底层概念帮助蛮大的,在测试一些东西的时候,会比较快开始知道我正在做的事有没有成效,我所写的 prompt 好不好。

使用工具一直是人在这个世界上与其他物种有所区分的重要能力,AI 也只是一种新的工具,而非新的物种,让我们一起成为学习使用工具的人吧!


希望这篇文章有帮助到你,有任何问题欢迎底下留言。




Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1