赞
踩
终于开写本CV多模态系列的核心主题:stable diffusion相关的了,为何执着于想写这个stable diffusion呢,源于三点
4.23,我所讲的ChatGPT原理课开课之后,终于有时间开写这篇多模态博客,然想写清楚stable diffusion和midjourney背后的技术细节,不得不先从扩散模型开始,于此便有了上一篇《图像生成发展起源:从VAE、扩散模型DDPM、DETR到ViT、Swin transformer》「且如果你此前不了解何谓扩散模型、何谓DDPM,务必先看该文,不然没法看懂本文」
援引上一篇文章的这段话“AI绘画随着去年stable diffusion和Midjourney的推出,使得文生图火爆异常,各种游戏的角色设计、网上店铺的商品/页面设计都用上了AI绘画这样的工具,更有不少朋友利用AI绘画取得了不少的创收,省时省力还能赚钱,真香”,此外,包括我司LLM项目团队开发的AIGC模特生成系统也用到了这方面的技术:基于SD二次开发
沿着上文之后,本文将写清楚下面表格中带下划线的模型
1月 | 3月 | 4月 | 5月 | 6月 | 8月 | 9月 | 10月 | 11月 | |
20年 | DETR | DDPM | DDIM VisionTransf.. | ||||||
21年 | CLIP DALL·E | SwinTransformer | MAE SwinTransf..V2 | ||||||
22年 | BLIP | DALL·E 2 | StableDiffusion BEiT-3 Midjourney V3 | ||||||
23年 | BLIP2 | VisualChatGPT GPT4 Midjourney V5 | SAM(Segment Anything Model) | FastSAM (中科院版SAM) MobileSAM | DALLE3 |
且过程中会顺带介绍MiniGPT-4、VisualGPT到HuggingGPT、AutoGPT这几个模型
我第一次见识到CLIP这个论文的时候(对应论文为:Learning Transferable Visual Models From Natural Language Supervision),当时的第一反应是,特么也太强悍了..
CLIP由OpenAI在2021年1月发布
为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WIT(Web Image Text,WIT质量很高,而且清理的非常好,其规模相当于JFT-300M,这也是CLIP如此强大的原因之一,后续在WIT上还孕育出了DALL-E模型)
其训练过程如下图所示:
以下是对应的伪代码
- # image_encoder - ResNet or Vision Transformer
- # text_encoder - CBOW or Text Transformer
- # I[n, h, w, c] - 输入图片维度
- # T[n, l] - 输入文本维度,l表示序列长度
-
- # W_i[d_i, d_e] - learned proj of image to embed
- # W_t[d_t, d_e] - learned proj of text to embed
- # t - learned temperature parameter
-
- # 分别提取图像特征和文本特征
- I_f = image_encoder(I) #[n, d_i]
- T_f = text_encoder(T) #[n, d_t]
-
- # 对两个特征进行线性投射,得到相同维度的特征d_e,并进行l2归一化,保持数据尺度的一致性
- # 多模态embedding [n, d_e]
- I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
- T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
-
- # 计算缩放的余弦相似度:[n, n]
- logits = np.dot(I_e, T_e.T) * np.exp(t)
-
- # symmetric loss function
- labels = np.arange(n) # 对角线元素的labels
- loss_i = cross_entropy_loss(logits, labels, axis=0) # image loss
- loss_t = cross_entropy_loss(logits, labels, axis=1) # text loss
- loss = (loss_i + loss_t)/2 # 对称式的目标函数
2021年10月,Accomplice发布的disco diffusion,便是第一个结合CLIP模型和diffusion模型的AI开源绘画工具,其内核便是采用的CLIP引导扩散模型(CLIP-Guided diffusion model)
且后续有很多基于CLIP的一系列改进模型,比如Lseg、GroupViT、ViLD、GLIP
随着AI的迅速发展,多模态日渐成为一种趋势,而「Vision-Language Pre-training (VLP) + Fine-tuning => Zero Shot / Few Shot」的模式是快速解决多下游任务的一个好的模式,VLP 是这个模式的开端,所以对于 VLP 的相关研究也很多。BLIP 是一个新的 VLP 架构,可以灵活、快速的应用到下游任务,如:图像-文本检索、图像翻译、以及 VQA 等
简单来讲,BLIP的主要特点是结合了encoder和decoder,形成了统一的理解和生成多模态模型。再利用BLIP进行后续工作的时候,既可以使用其理解的能力(encoder),又可以利用其生成的能力(decoder),拓展了多模态模型的应用
CLIP 采用了 image-encoder (ViT / ResNet) & text-encoder (transformer),然后直接拿 图片特征 和 文本特征 做余弦相似度对比,得到结果,而BLIP 的做法要复杂挺多
如下图所示,为了预训练一个同时具有理解和生成能力的统一模型,BLIP模型主要由4个部分组成,从左至右分别是
在这个过程中会训练一个对比学习目标函数 (Image-Text Contrastive Loss, ITC)
ITC 作用于第1部分的视觉编码器(ViT)和第2部分的文本编码器(BERT),目标是对齐视觉和文本的特征空间,方法是使得正样本图文对的相似性更大,负样本图文对的相似性更低,在 ALBEF 里面也有使用到。作者在这里依然使用了 ALBEF 中的动量编码器,它的目的是产生一些伪标签,辅助模型的训练
为方便对比,把BLIP的模型结构图再贴一遍
在这个过程中则训练一个图文匹配目标函数 (Image-Text Matching Loss, ITM)
ITM 作用于第1部分的视觉编码器和第3部分的视觉文本编码器,是一个二分类任务,目标是学习图像文本的联合表征,使用一个分类头来预测 image-text pair 的 正匹配 还是 负匹配,目的是学习 image-text 的多模态表示,调整视觉和语言之间的细粒度对齐,作者在这里依然使用了 ALBEF 中的 hard negative mining 技术
过程中训练一个语言模型目标函数 (Language Modeling Loss, LM)
毕竟由于BLIP 包含解码器,用于生成任务。既然有这个任务需求,那就意味着需要一个针对于生成任务的语言模型目标函数,LM 作用于第1部分的视觉编码器和第4部分的视觉文本解码器,目标是根据给定的图像以自回归方式来生成关于文本的描述。与 VLP 中广泛使用的 MLM 损失(完形填空)相比,LM 使模型能够将视觉信息转换为连贯的字幕
上述整个过程中,有一个不可忽略的问题,即高质量的人工注释图像-文本对(例如,COCO) 因为成本高昂所以数量不多
如下图所示
CapFilt 方法包含两个模块:
最后,将过滤后的图像-文本对与人工注释对相结合,形成一个新的数据集,作者用它来预训练一个新的模型
下图展示了被过滤器接受和拒绝的文本可视化(绿色 文本是被 filter 认可的,而 红色 文本是被 filter 拒绝的)
下图是BLIP-2的模型结构 (论文地址:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models),其中视觉侧和文本侧分别使用预训练的CLIP ViT-G/14模型和FLAN-T5模型,仅中间的起桥接作用的Q-Former参与训练,训练需要的成本和数据量进一步降低,BLIP-2的训练数据量仅129M,16卡A100训练9天
MiniGPT-4具有许多类似于GPT-4所展示的功能,如详细的图像描述生成和从手写草稿创建网站,以及根据给定图像编写灵感的故事和诗歌,为图像中显示的问题提供解决方案,比如教用户如何根据食物照片烹饪等
miniGPT4的模型架构由一个语言模型拼接一个视觉模型,最后加一个线性投影层来对齐,具体而言
它先是使用基于LLaMA微调的小羊驼Vicuna,作为语言解码器
在视觉感知方面,采用了与BLIP-2相同的预训练视觉组件(该组件由EVA-CLIP[13]的ViT- G/14和Q-Former组成)
再之后,增加了一个单一的投影层,将编码的视觉特征与语言模型小羊驼对齐,并冻结所有其他视觉和语言组件
模型训练:预训练(500万图像文本对)-微调
训练上,还是经典的预训练-微调模式
有趣的是,DALL-E和CLIP一样,也是21年年初发布的,对应论文为《Zero-Shot Text-to-Image Generation》,其参数大小有着12B,其数据集是2.5 亿个图像文本对
DALL·E和VQ-VAE-2一样,也是一个两阶段模型:
推理时,输入文本经过编码得到文本特征,再将文本通过GPT利用自回归的方式生成图片,生成的多张图片会通过CLIP模型和输入的文本进行相似度计算,然后调出最相似(描述最贴切)的图像
对于DALL·E2而言,基本就是整合了CLIP和基于扩散模型的GLIDE,而后者则采用了两阶段的训练方式:文本 → 文本特征 → 图片特征 → 图片
我司LLM项目团队于23年11月份在给一些B端客户做文生图的应用时,对比了各种同类工具,发现DALLE 3确实强,加之也要在论文100课上讲DALLE三代的三篇论文,故接下来,咱们结合DALLE 3和相关paper好好看下DALLE 3的训练细节
目前文生图模型的一个很大的问题是模型的文本理解能力,这个文本理解能力指的是生成的图像是否能和文本保持一致,也就是论文里面所说的prompt following能力
如论文中所说
总之,对于稍微复杂的文本,目前的文生图模型生成的图像往往会容易忽略部分文本描述,甚至无法生成文本所描述的图像。这个问题主要还是由于训练数据集本身所造成的,更具体的是说是图像caption不够准确
OpenAI最终基于谷歌的CoCa来训练这个image captioner来合成图像的caption,CoCa构建在encoder-decoder的基础上,其中Image Encoder和Text Decoder均采用Transformer模型,其中Image Encoder的参数量为1B,而Text Decoder的参数量达到1.1B,这样整个CoCa模型的参数量为2.1B(对于图像,其输入大小为288×288,而patch size为18x18,这样总共有256个image tokens。同时,这里也设计了两个更小模型:CoCa-Base和CoCa-Large)
不过这里将text decoder均分成两个部分:一个单模态解码器unimodal text decoder和一个多模态解码器multimodal text decoder,然后增加一个cls token在文本的最后(CoCa相比CLIP额外增加了一个Multimodel Text Encoder来生成caption,如此,它训练的损失包含了CLIP的对比损失和captioing的交叉熵损失,所以CoCa不仅可以像CLIP那样进行多模态检索,也可以用于caption生成)
具体而言,如下图的左半部分所示
顺带说一句,这个CoCa和如下图所示的ALBEF(这是其论文)还挺像的,所以有人评论它两的关系就像BERT和RoBERTa(可以简单理解为是对BERT的精调)
为了提升模型生成caption的质量,OpenAI对预训练好的image captioner进行了进一步微调,这个微调包括两个不同的方案,两个方案构建的微调数据集不同
相应地,两个微调模型分别可以生成:短caption(short synthetic captions,简称SSC)、长caption(descriptive synthetic captions,简称DSC)
下图展示了三个样例图像各自的原始caption(ground-truth),以及生成的短caption、长caption
接下来要解决两个问题
首先是合成caption对模型性能的影响,这里共训练了三个模型,它们的差异是采用不同类型的caption,分别是
通过上一节对DALLE 2的分析,我们得知最后的文生图decoder模型是基于扩散模型的
而DALLE 3的论文中训练的文生图是latent diffusion模型
这里只是想验证模型的prompt following能力,所以采用了CLIP score来评价模型,这里的CLIP score是基于以下两者的相似度,即
下图展示了采用三种caption训练的模型在CLIP score上的差异:
总之,从上面的实验来看,采用合成的长caption对模型的prompt following能力是有比较大的提升的。
接下来的问题就是通过实验来找到最佳的数据混合比例。所以又增加了混合比例为65%、80%、90%的实验,下图展示了不同混合比例训练出来的模型其CLIP score的差异,可以看到采用95%的合成caption训练的模型在效果上要明显高于采用更低比例的caption训练的模型。
所以最终的结论是采用合成的caption对模型提升帮助比较大,而且要采用描述详细的长caption,训练的混合比例高达95%,这也是后面DALL-E 3的数据训练策略。
不过采用95%的合成长caption来训练,得到的模型也会“过拟合”到长caption上,如果采用常规的短caption来生成图像,效果可能就会变差
为了解决这个问题,OpenAI采用GPT-4来“upsample”用户的caption,下面展示了如何用GPT-4来进行这个优化,不论用户输入什么样的caption,经过GPT-4优化后就得到了长caption:
下图展示了三个具体的例子,可以看到使用优化后的长caption(图中第二排)其生成图像效果要优于原来的短caption(图中第一排):
所以,DALL-E 3接入ChatGPT其实是不得已而为之的事情,因为这样才能保证DALL-E 3的输入不偏离训练的分布
DALLE 3的论文提到,DALL-E 3的具体实现有两个关键点:
目前DALL-E 3生成的图像的分辨率都是在1024x1024以上,所以DALL-E 3的模型应该类似于SDXL,采用递进式的训练策略(256 -> 512 -> 1024),而且最后也是采用了多尺度训练策略来使模型能够输出各种长宽比的图像
另外如小小将所说,附录里面给出了一个细节是
- DALL-E 3额外训练了一个latent decoder来提升图像的细节,特别是文字和人脸方面,这个应该是为了解决VAE所产生的图像畸变。这里采用的扩散模型是基于DDPM中的架构,所以是pixel diffusion
从直观上来看,这个latent decoder就是替换原始的VAE decoder,因此这个扩散模型的condition是VAE的latent
但是具体是怎么嵌入到扩散模型的UNet中,这里没有说明,最简单的方式应该是通过上采样或者一个可学习的网络将latent转变为和噪音图像一样的维度,然后与噪音图像拼接在一起- 同时为了加速,基于Consistency Models中提出的蒸馏策略将去噪步数降低为2步,所以推理是相当高效的
This diffusion decoder is a convolutional U-Net identical to the one described in Ho et al. (2020). Once trained, we used the consistency distillation process described in Song et al. (2023) to bring it down to two denoising steps
对于DALL-E 3的评测,论文是选取了DALL-E 2和SDXL(加上refiner模块)来进行对比。模型评测包括自动评测和人工评测。
自动评测主要有3个指标
下表给出了DALL-E 3与其它模型的对比结果,可以看到DALL-E 3还是明显优于DALL-E 2和SDXL。不过自动评测所选择的三个指标都是评测模型的prompt following能力,并不涉及到图像质量
人工评测主要包括三个方面
可以看到后面的两个方面其实就是评测模型生成图像的质量,对于prompt following和style,这里使用的评测集是DALL-E 3 Eval,它共包含170个captions,是从用户应用场景收集得到的。而coherence方面的评测集是从COCO数据集抽样的250个captions,因为coherence是评测真实性,所以采用更偏真实场景的COCO数据集
另外,之前DrawBench评测集是采用GPT-4V来自动评测的,但是GPT-4V也会犯错,比如在计数方面,所以这里也额外增加了DrawBench评测集的人工评测。
所有人工评测的对比结果如表所示,可以看到DALL-E 3具有明显优势:
这里的ELO score是GLIDE中所提出的来计算胜率的指标:
尽管DALL-E 3在prompt following方面有很大的提升,但是它依然有一定的局限性
// 待更
我们在上篇博客《AI绘画能力的起源:从VAE、扩散模型DDPM、DETR到ViT/MAE/Swin transformer》中,已经详细介绍了扩散模型DDPM,为方便对后续内容的理解,特再回顾下DDPM相关的内容(至于详细的请看上篇博客):
前向过程加噪
逆向过程去噪,由于反向扩散过程不可直接计算,因此训练神经网络来近似它,训练目标(损失函数)如下
所以,DDPM的关键是训练噪声估计模型,使其预测的噪声 与真实用于破坏的噪声 相近,具体怎么个训练过程呢?
而如果用一句话介绍stable diffusion,可以理解为:改进版的DDPM,Stable Diffusion原来的名字叫“Latent Diffusion Model”(LDM),很明显就是扩散过程发生隐空间中(即latent space,下文或其他地方也有说潜在空间或压缩空间之类的,都一个意思),其实就是对图片做了压缩
总之,Stable Diffusion会先训练一个自编码器,来学习将图像压缩成低维表示
在将图像压缩成latent data后,便可以在latent space中完成扩散过程,对比下和Diffusion扩散过程的区别,如下图所示:
可以看到Diffusion扩散模型就是在原图 上进行的操作,而Stale Diffusion是在压缩后的图像 上进行操作
stable diffusion和上面DALL E2的原理其实差不多,具体而言,会先后经历以下几个步骤「左边红色是像素空间 pixel space(含编码器和解码器)、中间绿色区域是潜在空间latent space、右边灰色的是条件condition」
如何理解 “潜在空间” 呢?
如果让你把左侧三张图和右侧三句话配对,你可以轻松完成这个连线。但对 AI 来说,图片就是一系列像素点,文本就是一串字符,要完成这个工作可不简单。
原因在于
还是看这个图
下图亦可辅助理解
// 待更
详见七月官网右上角的体验入口,或七月的SD课程或AIGC模特生成课程
为避免本文太长,故特把SDXL Turbo、LCM、SD3相关的内容放到新一篇文章中,详见《文生图的最新进展:从LCM、SDXL到与sora同架构的Stable Diffusion3》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。