前言
在【课程总结】day31:多模态大模型初步了解一文中,我们对多模态大模型的基本原理有了初步了解,本章内容将通过论文阅读理解,更进一步理解多模态大模型中所涉及的 Vit 架构、Transformer在视觉应用的理念以及 Clip图像与文本匹配的应用。
ViT
模型论文阅读理解
多模态大模型中所涉及的最为经典的模型就是 ViT
,所以我们先了解该论文的核心要点。
论文标题:An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale
论文地址:https://arxiv.org/abs/2010.11929
ABSTRACT部分
论文原文
论文翻译
论文理解
- 该论文提出了一个解决问题思想,使用
Transformer
结构来处理图像。
INTRODUCTION部分
论文原文
论文翻译
论文理解
Transformer
是一个非常强大的模型,可以处理时序信息并且在NLP
自然语言任务中表现优秀。- 计算机视觉方面目前仍然是 卷积网络 主导的,而 Transformer 有非常强大的并行计算性能。
- 如何使用Transformer 来替代卷积呢,论文中给出了一种思想:
- 将图像分割成小块,然后对每个小块进行
embedding
,然后将这些embedding
序列(图像变为了时序的序列)作为输入提供给Transformer
,以此发挥 Transformer 的并行计算优势。
- 将图像分割成小块,然后对每个小块进行
模型结构
论文原文
论文翻译
论文理解
- 为了让Transformer 能够处理图像,我们将图像分割成小块,其中H,W 为图像的分辨率,C 为通道数,P 为小块的分辨率。
- 为了满足图片后续的分类能力,采用了 BERT 的 [CLS] 标记,在Embedding层的第一个位置添加了一个 [CLS] 标记。
- 为了保留图片的时序信息,采用了可学习的 1D position embedding,最后将生成的嵌入序列作为编码器的输入。
- Transformer 只使用了encoder部分,相比原始的 Transformer,将Layer Normalization 和 Residual Connection 添加到了encoder部分。
回顾 BERT
由于 Vit
架构中提到了图像分类采用了 Bert
模型,所以我们回顾与此相关的部分。
论文地址:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
模型结构
论文原文
论文翻译
论文原文
论文翻译
论文理解
通过对论文的回顾,我们可以发现,Vit
架构中采用了与 BERT
相似的架构,并且也使用了 BERT
的 CLS
标记。
CLIP
模型论文阅读理解
多模态大模型的训练过程中,需要将文本和图像进行匹配,所以 CLIP
即承担此项任务。
论文标题:CLIP: Learning Transferable Visual Models From Natural Language Supervision
论文地址:https://arxiv.org/abs/2103.00020
论文原文
论文翻译
模型结构
论文原文
论文翻译
论文理解
- CLIP的模型包括两个部分,即文本编码器(Text Encoder)和图像编码器(Image Encoder)。Text Encoder选择的是
Text Transformer
模型;Image Encoder选择了两种模型,一是基于CNN的ResNet
(对比了不同层数的ResNet),二是基于Transformer的ViT
。 - CLIP将图片-文本pair对进行对比学习输入到同一个神经网络,将它们映射到同一个嵌入空间,从而实现了图像和文本跨模态的语义对齐。
- 用图片预测对应的文本,结果会非常多样,训练起来会非常慢。而使用对比学习,判断图片文本是否是一对,就简化了任务。
对比学习
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# 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]
# 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化
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)
# 对称的对比学习损失:等价于N个类别的cross_entropy_loss
labels = np.arange(n) # 对角线元素的labels
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
CLIP 在文本-图像对数据集上的对比学习训练过程如下:
- 对于一个包含 N 个 <文本-图像> 对的训练
batch
,使用Text Encoder
和Image Encoder
提取N
个文本特征和N
个图像特征。
- 将
N
个文本特征和N
个图像特征两两组合,CLIP
模型会预测出 (N^2) 个可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity)
,即上图所示的矩阵。 - 那么
CLIP
的训练目标就是最大化N
个正样本的相似度,同时最小化 (N^2 - N) 个负样本的相似度,即最大化对角线中蓝色的数值,最小化其它非对角线的数值:
\text{min}\left(\sum_{i=1}^{N}\sum_{j=1}^{N}(I_i \cdot T_j)_{i \neq j} - \sum_{i=1}^{N}(I_i \cdot T_j)\right)
迁移预训练模型实现zero-shot
论文原文
论文翻译
论文理解
- 训练后的CLIP其实是两个模型:视觉模型+文本模型,与CV中常用的先预训练然后微调不同,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练数据,就能在某个具体下游任务上实现分类。
- 经过在文本-图像对数据上训练的模型,CLIP有能力判断给定的文本和图像是否匹配,即可以直接做图像分类。
- CLIP的zero-shot分类过程如下:
- 根据任务的分类标签构建每个类别的描述文本(以Imagenet有N=1000类为例):A photo of {label},然后将这些文本送入Text Encoder得到对应的文本特征,如果类别数目为N,那么将得到N个文本特征;
- 将要预测的图像送入Image Encoder得到图像特征,然后与N个文本特征计算缩放的余弦相似度(和训练过程一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果,进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率。
内容小结
关于 Vit
模型
- 多模态大模型中所涉及的
ViT
架构,提出了一个使用Transformer
结构来处理图像的思想。 - Vit架构的处理过程:将图像分割成小块,然后对每个小块进行
embedding
并作为输入提供给Transformer
,以此发挥 Transformer 的并行计算优势。 - 为了满足图片后续的分类能力,采用了 BERT 的 [CLS] 标记,在Embedding层的第一个位置添加了一个 [CLS] 标记。
关于 CLIP
模型
- CLIP的模型包括两个部分,即文本编码器(Text Encoder)和图像编码器(Image Encoder)。
- CLIP模型通过
图片-文本pair对
进行对比学习,将它们映射到同一个嵌入空间,从而实现了图像和文本跨模态的语义对齐。 - CLIP模型的最大亮点是:不需要任何训练数据,直接在图像和文本的pair对上进行训练,从而实现了
zero-shot
的图像分类。