想象一下图片是怎么从人的脑子中呈现出来的,一般的想象是大脑先生成一股模糊的印象,然后这种模糊的印象逐渐变得清晰,从而让人有了具体的细节记忆。
diffusion模型的灵感也是如此。先看一些模糊的图,就像是对焦没对准一样。然后通过运算想象出清晰的样子。最极端的例子,甚至是通过一堆马赛克,电视雪花图片,去计算出想象中清晰的样子。这样,图片就被生成出来了。
但要做到这些并不简单,因为所有的数据,都需要通过数学公式的加工。要知道,这种所谓的逆运算是存在信息损失的,你总是没有办法完美的用数学公式弥补本就缺失的信息,这就需要ai来猜测丢失了多少信息,并把这些信息补充上。
在整个过程中我们只需要保证两点。1让模型能够从雪花图生成图像。2用人类语言约束模型生成的方向。
1encoder:首先人输入文本信息,电脑把文本信息转换成机器容易处理的向量信息。 2diffusion:第二步,计算机得到向量信息,并且用ai模型弥补缺少的信息。这是一个熵减的过程。在计算完毕后输出一个向量信息。
3decoder:第三步,计算机再把向量信息翻译成人能看懂的图片信息。
在forward diffusion过程中,就好比人忘记的过程。原本清晰的图片,被一次次加噪点,重复这个步骤,直到图片变为雪花图片。在这个过程中,原本有确定分布规律的清晰图片,最终变成没有分布规律的电视雪花图片。
我们需要记录这个步骤,用来参照如何把模糊图片,还原成清晰图片的答案。用这个来训练ai模型的参数。
在reverse diffusion过程中,就好比人看到了一个没对好焦的模糊图片,但这时候你需要用计算机去计算出清晰的图片。如何计算呢?这就需要反着推导。
我们需要信息:
1t:这个照片经过了多少次迭代。
2每次加了多少噪点数量。(每一次加的噪点数量是不同的,因为模糊图片如果只加一开始的计量,就跟上一步区分程度不大)
3每次加噪点的位置。
对于t我们可以手动指定反向减少噪点的次数。
对于每次加了多少噪点,我们利用正向扩散的forward diffusion时候的数据,用UNet模型来预估出每一次需要减少的噪点数量。(之所以用ai去预测,是因为没有数学公式能够反推,本质上是在加噪音的过程中信息丢失了)
forward diffusion过程正是为了训练出UNet模型。
对于每次加噪点的位置,这就是diffusion模型本身所需要学习的参数了。
reverse diffusion过程则是为了训练diffusion模型。
等待模型训练好。我们就可以根据一个模糊图片,去生成一个清晰图片了。
还有最后一个问题,我们需要让人的语言,能够影响ai的作图方向。如何实现这个过程呢?我们需要让人的语言生成一张模糊的图片,ai再让这张模糊的图片生成清晰图片。
如何让人的自然语言生成一张模糊图片呢?
如图。首先就是准备答案。让图片通过encoder的方式生成图片编码。这方面计算机运算。这个过程是等价的,不会造成信息损失,只不过是存储的形式不一样。
第二步,训练一个nlp处理模型,处理人的自然语言,让人的自然语言生成的编码,尽量和图片编码一样。这样就可以把人的语言尽可能转换成图片的编码了。
我们再来看一次总流程。
1我们输入的文本数据被转换成文本embeddings编码数据。
2把噪点图,和随机图叠加,加上迭代步数作为输入,模型计算出如何减少噪点。输出生成图embeddings数据。
3再把embeddings数据解码成正常图片,就可以观看了。