Generative model(生成类模型):本质是一个probability distribution (这个分布会由很多高斯分布所构成,每个高斯分布都表示一个feature. eg.要描述一个人,他的age,height,weight... 就是他的feature),最后会根据这个distribution生成出这个distribution以外的feature信息。
x_0是没有noise的干净图,x_t是全是noise的噪声图
前向过程: 加噪, Forward process(q):(这是一项的公式,他的每一项是需要继承上一项的,所以要多次累乘和迭代,最后就会变成高斯函数N。)
多次后会变成:
是
到
的过程 ,
:
是从
所设的均值和方差所造出来的正态分布上取的一个数。
最后,因为加噪的过程具有继承性,所以就可以一步到位:
关键之处:在于这个,这样前向过程就是可以从任何位置(不一定的第一张图),加噪生成到达任何一张加噪图。
tips:这里的alpha = 1 - beta , 然后alpha主要决定的是noise的生成,只需要输入当前的时间步,ddpm采样器就会相应地生成对应的noise,而alpha相当于是model在生成过程中model自己需要调整的参数。
反向过程:去噪,Reverse process (p):
这里也是有继承性的,但是他是有目标的,需要将转为
,而加噪的时候没有过于明确的目标,所以这是不能一步到位的。
均值:,方差:
,二者与执行到哪一步有关(所以需要记录timestep),均值和方差通常都是需要训练和学习的(方差可以选择训练,也可以选择固定)。
问题:在训练一个参数(eg.,
)时,需要用到x1,x2,x3....xt 无限多个参数。(不合理)
所以需要设置一个下限(lower bound),Evidence Lower Bound(ELBO)[相当于是the lower bound for the likehood of data distributuin)来控制效果就可以了,也就是说只需要model效果达到此下界,就可以停止使用参数了。
tips:在Reverse process去噪的第一步,需要告诉model应该如何去训练,去噪的方式是什么(也就是通过输入一个prompt提示词)。
具体的算法公式逻辑:
Algorithm | Training
1: repeat
2:take a sample from our dataset
3:generate a random number, between 1 and T(T is Maxmum ELBO)
4:sample some noise
5: Take gradient desent step on
这个是根据当下的阶段的timestep和noise的多少来生成(预测)这一步应该生成多少noise用于消去。
后面的第二个是告诉model已经给图像加了多少noise了
最后的t就是模型执行到哪一步(timestep)
而这一整个|| ||是Minmun loss用于最梯度下降的。
6: until converged
CFG(classifier-free guidance)无分类器引导 [Combine output]
对于提示词(prompt)的处理:
可以训练出一个没有、不同prompt的模型(主要是在ddpm采样器预测noise的时候),基于UNET.
step1: 在input里面输入prompt,生成一个output1
step2: 不在input里输入prompt,生成一个output2
这两个step都是在相同的步数,相同的Nois训练的
目的:让模型生成出来的output2不断趋近于output1,以后就可以不需要prompt(相当于Model了解了你的风格)
最后融合output1和output2
这个output可以综合有prompt和没prompt来进行合并输出的
A weight that indicates how much we want the model to pay attention to the conditioning signal(prompt) w越高,说明使用者越想接近prompt生成出来的东西,越看重prompt.
重点:其实正向prompt和反向prompt也是这个道理(公式都一样),模型就需要通过这个w权重去知道用户是看重正向prompt还是看重反向prompt.
CLIP(Contrastive Language-Image pre_training) 对比语言和图像的预训练
最右边的箭头是---原理:只让对角线上的损失函数or相关系数最大,而其他地方的系数为0(因为无关)。 就是要让这个对角线的数大一点好,因为是两个矩阵的点乘,所以方便,且合理,尽可能让自己设定的prompt与自己所给的图片贴合起来,如果不够贴合,模型会不断去修改这张image。本质就是一个让prompt文本与Input图像相结合,生成出二者贴合的output图像。
下面的整个image2image的流程,在enc嵌入层encoder前面,如果是text2image,就只需要下面 的CLIP,是不需要上面的encoder的。
残差块 (512,126)表示 通道数下降(从512根到126根),通道就是许多跟管子,这些管子可以从一张image 或 latent space中提取feature。
如果 image 或 latent space太小,就要用更多的通道去提取其中的feature,否则模型会“看不清”image长什么样子。反之image足够大,则不需要太多通道就可以“看清楚”image长什么样。
当然,通道数提高,就会提高模型的计算量,所以,一般image变大,通道变小。
positional encoding: 位置编码
i是维度下标,
是向量维度
公式1对应的是PE(0,0),PE(0,2)....[偶数] , 公式2对应的是PE(0,1),PE(0,3).....[奇数]
这个位置编码只需要计算一次就可以了,然后直接在后面的句子中反复使用就ok了,因为每一个"块"就给一个位置序号就行,同一个位置的PE的相同的。