AIGC下的CV多模态原理解析:从CLIP/BLIP到stable diffusion/Midjourney、GPT4

前言

终于开写本CV多模态系列的核心主题:stable diffusion相关的了,为何执着于想写这个stable diffusion呢,源于三点

  1. 去年stable diffusion和midjourney很火的时候,就想写,因为经常被刷屏,但那会时间错不开
  2. 去年11月底ChatGPT出来后,我今年1月初开始写ChatGPT背后的技术原理,而今年2月份的时候,一读者天之骄子呃”在我这篇ChatGPT原理文章下面留言:点赞,十年前看你的svm懂了,但感觉之后好多年没写了,还有最近的AI绘画 stable diffusion 相关也可以写一下以及相关的采样加速算法

    我当时回复到:哈,十年之前了啊,欢迎回来,感谢老读者、老朋友
    确实非常非常多的朋友都看过我那篇SVM笔记,影响力巨大,但SVM笔记之后,也还是写了很多新的博客/文章滴,包括但不限于:xgboost、CNN、RNN、LSTM、BERT等

    今后基本每季度都有更新的计划,欢迎常来
    关于Stable Diffusion,可以先看下这篇图解Stable Diffusion的文章
    (此篇文章也是本文的重要参考之一)
  3. 今年3月中旬,当OpenAI宣称GPT4具备了CV多模态的能力之后,让我对AI绘画和CV多模态有了更强的动力去研究探索,并把背后的技术细节写出来
    其实当时就想写了,但当时因为写各种开源平替模型的原理、部署、微调去了,所以一直没来得及写,包括之前计划的100篇论文也因此耽搁

4.23,我所讲的ChatGPT原理课开课之后,终于有时间开写这篇多模态博客,然想写清楚stable diffusion和midjourney背后的技术细节,不得不先从扩散模型开始,于此便有了上一篇《AI绘画能力的起源:从VAE、扩散模型DDPM、DETR到ViT/MAE/Swin transformer

援引上一篇文章的这段话“AI绘画随着去年stable diffusion和Midjourney的推出,使得文生图火爆异常,各种游戏的角色设计、网上店铺的商品/页面设计都用上了AI绘画这样的工具,更有不少朋友利用AI绘画取得了不少的创收,省时省力还能赚钱,真香”

沿着上文之后,本文将写清楚下面表格中带下划线的模型

1月 3月 4月 5月 6月 8月 10月 11月
2020 DETR DDPM

DDIM

VisionTransformer 

2021

CLIP

DALL·E

SwinTransformer

MAE

SwinTransformerV2

2022 BLIP DALL·E 2

StableDiffusion 

BEiT-3

Midjourney V3

2023 BLIP2

VisualChatGPT 

GPT4

Midjourney V5

SAM(Segment Anything Model)

且过程中会顺带介绍MiniGPT-4、VisualGPT到HuggingGPT、AutoGPT这几个模型

第一部分 从CLIP到BLIP1/BLIP2、DALLE/DALLE 2

1.1 CLIP:基于对比文本-图像对的预训练方法

我第一次见识到CLIP这个论文的时候,当时的第一反应是,特么也太强悍了.. ​

CLIP由OpenAI在2021年1月发布

  1. 通过超大规模模型预训练提取视觉特征,进行图片和文本之间的对比学习(简单粗暴理解就是发微博/朋友圈时,人喜欢发一段文字然后再配一张或几张图,CLIP便是学习这种对应关系)
  2. 且预训练好之后不微调直接推理(即zero-shot,用见过的图片特征去判断没见过的图片的类别,而不用下游任务训练集进行微调),使得在ImageNet数据集上,CLIP模型在不使用ImageNet数据集的任何一张图片进行训练的的情况下,最终模型精度能跟一个有监督的训练好的ResNet-50打成平手(在ImageNet上zero-shot精度为76.2%,这在之前一度被认为是不可能的)  

为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WIT(Web Image Text。WIT质量很高,而且清理的非常好,其规模相当于JFT-300M,这也是CLIP如此强大的原因之一(后续在WIT上还孕育出了DALL-E模型)

其训练过程为:

  1. 如下图的第一步所示,CLIP的输入是一对对配对好的的图片-文本对(比如输入是一张狗的图片,对应文本也表示这是一只狗),这些文本和图片分别通过Text Encoder和Image Encoder输出对应的特征。然后在这些输出的文字特征和图片特征上进行对比学习

    假如模型输入的是n对图片-文本对,那么这n对互相配对的图像–文本对是正样本(下图输出特征矩阵对角线上标识蓝色的部位),其它n^2-n对样本都是负样本,这样模型的训练过程就是最大化n个正样本的相似度,同时最小化n^2-n个负样本的相似度
    Text Encoder可以采用NLP中常用的text transformer模型
    而Image Encoder可以采用常用CNN模型或者vision transformer等模型
    相似度是计算文本特征和图像特征的余弦相似性cosine similarity

    之后,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练和微调,其实现zero-shot分类只需要简单的两步,如下第2、3点所示
  2. 根据任务的分类标签构建每个类别的描述文本:A photo of {label},然后将这些文本送入Text Encoder得到对应的文本特征,如果类别数目为n,那么将得到n个文本特征
  3. 将要预测的图像送入Image Encoder得到图像特征,然后与n个文本特征计算缩放的余弦相似度(和训练过程保持一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果
    进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率

以下是对应的伪代码

# 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

1.2 从BLIP1、BLIP2到miniGPT4

1.2.1 BLIP1:ViT + BERT ——通过encoder-decoder统一理解与生成任务

随着AI的迅速发展,多模态日渐成为一种趋势,而Vision-Language Pre-training (VLP) + Fine-tuning => Zero Shot / Few Shot 的模式是 快速 解决 多下游任务 的一个好的模式,VLP 是这个模式的开端,所以对于 VLP 的相关研究也很多。BLIP 是一个新的 VLP 架构,可以灵活、快速的应用到下游任务,如:图像-文本检索、图像翻译、以及 VQA 等

简单来讲,BLIP的主要特点是结合了encoder和decoder,形成了统一的理解和生成多模态模型。再利用BLIP进行后续工作的时候,既可以使用其理解的能力(encoder),又可以利用其生成的能力(decoder),拓展了多模态模型的应用

1.2.1.1 BLIP的模型结构

CLIP 采用了 image-encoder (ViT / ResNet) & text-encoder (transformer),然后直接拿 图片特征 和 文本特征 做余弦相似度对比,得到结果,而BLIP 的做法要复杂挺多

如下图所示,为了预训练一个同时具有理解和生成能力的统一模型,BLIP模型主要由4个部分组成,从左至右分别是

  • 上图第1部分:视觉编码器Image Encoder(ViT)——提取图片特征
    视觉编码器本质就是 ViT 的架构:将输入图像分割成一个个的 Patch 并将它们编码为一系列 Image Embedding,并使用额外的 [CLS] token 来表示全局的图像特征
  • 上图第2部分:文本编码器Text Encoder(BERT)——提取文本特征
    文本编码器就是 BERT 的架构,其中 [CLS] token 附加到文本输入的开头以总结句子,作用是提取文本特征与第1部分的图像特征做对比学习

在这个过程中会训练一个对比学习目标函数 (Image-Text Contrastive Loss, ITC)
ITC 作用于第1部分的视觉编码器(ViT)和第2部分的文本编码器(BERT),目标是对齐视觉和文本的特征空间,方法是使得正样本图文对的相似性更大,负样本图文对的相似性更低,在 ALBEF 里面也有使用到。作者在这里依然使用了 ALBEF 中的动量编码器,它的目的是产生一些伪标签,辅助模型的训练

为方便对比,把BLIP的模型结构图再贴一遍

  • 上图第3部分:视觉文本编码器Image-grounded Text Encoder(变种 BERT)——BERT中插入交叉注意层,从而针对图片特征和文本特征做二分类
    视觉文本编码器的具体做法是在文本编码器比如BERT的每个transformer  block的自注意(Bi Self-Att)层和前馈网络(Feed Forward)之间额外插入一个交叉注意(Cross-Attention),以引入视觉特征,作用是根据 ViT 给的图片特征和文本输入做二分类,所以使用的是编码器,且注意力部分是双向的 Self-Attention,且添加一个额外的 [Encode] token,作为图像文本的联合表征

在这个过程中则训练一个图文匹配目标函数 (Image-Text Matching Loss, ITM)
ITM 作用于第1部分的视觉编码器和第3部分的视觉文本编码器,是一个二分类任务,目标是学习图像文本的联合表征,使用一个分类头来预测 image-text pair 的 正匹配 还是 负匹配,目的是学习 image-text 的多模态表示,调整视觉和语言之间的细粒度对齐,作者在这里依然使用了 ALBEF 中的 hard negative mining 技术

  • 上图第4部分:视觉文本解码器Image-grounded Text Decoder(变种 BERT)——根据图片特征和文本特征做文本生成
    视觉文本解码器使用 Cross-Attention,作用是根据 ViT 给的图片特征和文本输入做文本生成的任务,所以使用的是解码器,且将 上图第3部分的 Image-grounded Text Encoder 结构中的 Bi Self-Att 替换为 Causal Self-Att,目标是预测下一个 token,且添加一个额外的 [Decode] token 和结束 token,作为生成结果的起点和终点
    一个需要注意的点是:相同颜色的部分是参数共享的,即视觉文本编码器和视觉文本解码器共享除 Self-Attention 层之外的所有参数。每个 image-text 在输入时,image 部分只需要过一个 ViT 模型,text 部分需要过3次文本模型

过程中训练一个语言模型目标函数 (Language Modeling Loss, LM)
毕竟由于BLIP 包含解码器,用于生成任务。既然有这个任务需求,那就意味着需要一个针对于生成任务的语言模型目标函数,LM 作用于第1部分的视觉编码器和第4部分的视觉文本解码器,目标是根据给定的图像以自回归方式来生成关于文本的描述。与 VLP 中广泛使用的 MLM 损失(完形填空)相比,LM 使模型能够将视觉信息转换为连贯的字幕

1.2.1.2 BLIP的字幕与过滤器方法CapFiltg

上述整个过程中,有一个不可忽略的问题,即高质量的人工注释图像-文本对{(I_h,T_h)}(例如,COCO) 因为成本高昂所以数量不多

  • CLIP 的数据来源于 Web 上爬来的 图像-文本对{(I_w,T_w)},所以数据集很容易扩充的很大,而且采用 对比学习的方式,基本属于自监督了,不太需要做数据标注;
  • BLIP 改进了 CLIP 直接从 Web 取数据 噪声大 的缺点,提出了 Captioning and Filtering (CapFilt) 模块,这个模块就是用来 减小噪声、丰富数据的,主要包括两个模块:即字幕与过滤器方法CapFilt (Captioning and Filtering)

如下图所示

CapFilt 方法包含两个模块:

  1. 字幕器 Captioner:相当于给一张网络图片,生成字幕。它是一个视觉文本解码器(对应于上述BLIP模型结构的第4部分),在 COCO数据集上使用 LM 目标函数微调,对给定图像的文本进行解码,从而实现给定网络图片I_w,Captioner 生成字幕T_s的效果
  2. 过滤器 Filter:过滤掉噪声图文对image-text pair,它是一个视觉文本编码器(对应于上述BLIP模型结构的第3部分),看文本是否与图像匹配,在 COCO 数据集上使用 ITC 和 ITM 目标函数微调
    Filter 删除原始 Web 文本T_w和合成文本 T_s中的嘈杂文本,如果 ITM 头将其预测为与图像不匹配,则认为文本有噪声

最后,将过滤后的图像-文本对与人工注释对相结合,形成一个新的数据集,作者用它来预训练一个新的模型

下图展示了被过滤器接受和拒绝的文本可视化(绿色 文本是被 filter 认可的,而 红色 文本是被 filter 拒绝的)

// 待更

1.2.2 BLIP2

// 待更

1.2.3 MiniGPT4

模型架构:基于LLaMA微调的Vicuna + BLIP2 + 线性投影层

MiniGPT-4具有许多类似于GPT-4所展示的功能,如详细的图像描述生成和从手写草稿创建网站,以及根据给定图像编写灵感的故事和诗歌,为图像中显示的问题提供解决方案,比如教用户如何根据食物照片烹饪等

miniGPT4的模型架构由一个语言模型拼接一个视觉模型,最后加一个线性投影层来对齐,具体而言

  • 它先是使用基于LLaMA微调的小羊驼Vicuna,作为语言解码器

  • 在视觉感知方面,采用了与BLIP-2相同的预训练视觉组件(该组件由EVA-CLIP[13]的ViT- G/14和Q-Former组成)

  • 再之后,增加了一个单一的投影层,将编码的视觉特征与语言模型小羊驼对齐,并冻结所有其他视觉和语言组件

模型训练:预训练(500万图像文本对)-微调

训练上,还是经典的预训练-微调模式

  1. 在整个预训练过程中,无论是预训练的视觉编码器还是LLM都保持冻结状态,只有线性投影层被预训练。具体是使用Conceptual Caption、SBU和LAION的组合数据集来训练我们的模型,历经2万个训练步骤,批大小为256,覆盖了大约500万对图像-文本,整个过程花费大约10小时,且使用的4个A100 (80GB) gpu
  2. 然而,简单地将视觉特征与LLM对齐不足以训练出像聊天机器人那样具有视觉会话能力的高性能模型,并且原始图像-文本对背后的噪声可能导致语言输出不连贯。因此,我们收集了另外3500个高质量对齐的图像-文本对,用设计好的会话模板进一步微调模型(只需要400个训练步骤,批量大小为12,使用单个A100 GPU最终7分钟即可完成),以提高生成语言的自然度及其可用性

1.3 从DALLE到DALLE 2

1.3.1 DALL-E:Zero-Shot Text-to-Image Generation

有趣的是,DALL-E​​​​​​​和CLIP一样,也是21年年初发布的,对应论文为《Zero-Shot Text-to-Image Generation

数据集:2.5 亿个图像文本对 + 120 亿参数

// 待更

1.3.2 DALL-E 2

DALL-E 2主要由两部分组成

  1. 第一部分是Prior:将用户输入转换为图像的表示,接受文本标签并创建CLIP图像嵌入
    其中使用到的文本和图像嵌入来自此前介绍过的CLIP(对比语言-图像预训练)的网络,为输入的图像返回最佳的标题。它所做的事情与DALL-E 2所做的相反——它是将图像转换为文本,而DALL-E 2是将文本转换为图像。引入CLIP的目的是为了学习物体的视觉和文字表示之间的联系
  2. 第二部分是将这种表示转换为实际的照片(称为Decoder):其接受CLIP图像嵌入并生成图像

模型训练完成之后,推理的流程如下:

  1. 输入的文本被转化为使用神经网络的CLIP文本嵌入。
  2. 使用主成分分析(Principal Component Analysis)降低文本嵌入的维度。
  3. 使用文本嵌入创建图像嵌入。
  4. 进入Decoder步骤后,扩散模型被用来将图像嵌入转化为图像。
  5. 图像被从64×64放大到256×256,最后使用卷积神经网络放大到1024×1024

// 待更..

第二部分 通俗理解stable diffusion

// 待更

第三部分 从Visual ChatGPT、GPT4到Midjourney V5、SAM(Segment Anything Model)

// 待更

参考文献与推荐阅读

  1. Learning Transferable Visual Models From Natural Language Supervision
    CLIP原始论文
  2. ​​​​​CLIP 论文逐段精读,这是针对该视频解读的笔记之一:CLIP和改进工作串讲
  3. BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
    BLIP原始论文
  4. 多模态超详细解读 (六):BLIP:统一理解和生成的自举多模态模型
    极智AI | 多模态新姿势 详解 BLIP 算法实现
  5. 理解DALL·E 2, Stable Diffusion和 Midjourney工作原理
  6. 读完 DALL-E 论文,我们发现大型数据集也有平替版​​​​​​​

首发之后的创作、修改、新增记录

  1. 端午假期三天,持续完善BLIP/BLIP2、DALLE/DALLE 2等相关的内容

猜你喜欢

转载自blog.csdn.net/v_JULY_v/article/details/131205615