从Transformer到不同多模态工作
Transformer
Attention
Attention的结构如下:
现在我们拥有Query、Key、Value三个向量矩阵。
注意力的作用可以看做对查询和键来计算余弦相似性。假设每行代表一个单词,其对于Q、K矩阵的一行Q1·K1 = |Q1|·|K1|·cosθ为一个数。Q1和K1的方向相同时(即它们的夹角接近0),cosθ 接近1,所以Q1·K1较大。这表明Q1和K1很相似。反之,当 Q1和K1的方向相反时(即它们的夹角接近180度),cos(θ) 接近 -1,所以Q1·K1较小,甚至为负。这表明Q1和K1不相似。
根据每行得出的相似度来计算得分,赋予权重,就完成了一次注意力计算。
具体来说,其公式为:
$$
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
$$
也就是计算相似度得分后除以键向量维度的平方根,防止内积过大,使梯度更稳定。然后再进行softmax归一化后输出结果。输出的结果再去乘以V作为最后注意力输出的Z矩阵。
Self-Attention
自注意力,顾名思义就是自己对自己做注意力机制。把我们仅有的初始矩阵X投影成Query、Key、Value三个向量矩阵(实际上是与可学习的矩阵做乘法),之后再做刚才的注意力机制操作。
自注意力是可以并行计算的,这与RNN逐个重复处理词元相比较,缺少了顺序信息。所以输入中要添加位置编码来注入绝对或相对位置信息。位置编码可以通过学习得到,也可以直接固定得到。例如在Transformer模型里,采用的正余弦位置编码就属于绝对位置编码。它利用正弦和余弦函数对不同位置进行编码,公式如下:
$$
PE_{t}^{(i)} =
\begin{cases}
\sin(w_{k}t), & \text{if } i = 2k\newline
\cos(w_{k}t), & \text{if } i = 2k + 1
\end{cases}
$$
这里:
$$
\begin{cases}
w_{k} = \frac{1}{10000^{\frac{2k}{d_{model}}}} \newline
\dot{t} = 0, 1, 2, 3, \ldots, \frac{d_{model}}{2} - 1
\end{cases}
$$
把频率设为非常小的参数可以使最后和起始的位置不会靠得太近,sin、cos交替编码可以使其很容易转换成相对位置编码,k是维度。
假设有个512维度的Embedding,编码可视化就会像下面这样。越往后的位置,频率越小,波长越长,所以不同的t对最终的结果影响不大。
Multihead Self-Attention
实际上多头注意力就是多个Self-Attention的连结,拼接起来再去乘以权重矩阵W0,每个头可能会关注输入不同的部分。
在Transformer Decoder部分你还能看到Maked Multihead Attention,相较于多头注意力增加了一个掩码。包括:
- padding mask:由于输入序列长度不一样,给交短序列后填0,截取较长序列。mask做的就是把这些位置值加上非常大负数,使其softmax后几乎为0,Attention无法注意到。
- causal(sequence) mask:由于Decoder时生成需要是因果的,t时刻后的输出不应该出现在输入内,所以用一个上三角矩阵作用在序列上。
Add & Normalize
经过多头注意力的输出Z还要进行Add和Norm两个操作。Add就是加上一个残差块,防止发生退化,而Layer Normalization则负责归一化加快收敛速度。
LN层针对同一样本的不同神经元进行归一化,在NLP中有用,而BN针对同一个batch不同样本同一位置神经元归一化,对NLP的词向量来说没有意义。
Feed Forward Network
全连接层FFN公式如下:
$$
F F N(x)=\ ReLU (0, x W 1+b 1) W 2+b 2
$$
假设输入维度 [512,512],通过W1[512,2048]拓展维度,能够稀疏特征分布,更易被ReLU非线性组合。W2[2048,512]再去还原维度。
整体结构
Transformer整体结构就如下图所示,其中原文由6层Encoder和6层Decoder组成。
整个工作流程大概是
输入Input Embedding(machine learing (eos))经过6个Encoder生成Z矩阵。
输入OutputEmbedding在掩码多头注意力后,QK用Encoder生成的矩阵(第二个Decoder没有做Self-attention而只是Attention),输出所推理的掩码下一个单词。((begin) -> (begin) 机)
Vision Transformer
Transformer在NLP任务上的成功引起了广泛注意,其在视觉上的应用Vision Transformer很快便推出了,该模型由三个模块组成:
- Linear Projection of Flattened Patches
- Transformer Encoder
- MLP Head(最后用于分类)
标准的Transformer模块,要求输入的是token序列[num_token, token_dim],而图像是[H, W, C]。假如我输入的是一个[224,224 ,3]的图像,我可以通过大小为16x16,步长为16,卷积核个数为768的卷积提取特征为[14,14,768],然后把它平铺成[196,768]大小的二维矩阵,实现Transformer输入格式。
Linear Projection的操作可以表示为:
$$
Z0 =\ X·W + b
$$
W 是可学习的权重矩阵,形状为 [768, d_model],b 是可学习的偏置向量,Z0 是线性投影后的输出矩阵,形状为 [196, d_model]。
和图片上展示的一样,实际上16 x 16,步长为16的卷积就相当于把这个图片分为196块这个大小的块分别提取特征,这样后面加上位置信息就更有道理。在进入Encoder前,注意要把Position Embedding加入。
$$
Z0’ =\ Z0 + P
$$
P 是位置编码矩阵,**Z0**是添加位置编码后的矩阵,形状仍为 [196, d_model]。
原论文中向量处还加入了大小为[1,d_model]的[class]token,这个可训练参数和其他数据拼接在一起。
$$
\mathbf{Z}_0^{\prime\prime} = \left[ \begin{array}{c} \mathbf{C} \newline
\mathbf{Z}_0^{\prime} \end{array} \right]
$$
C 是 [class] token,Z0′′ 是拼接后的矩阵,形状为 [197, d_model]。
Transformer Encoder部分不再介绍,MLP层其实接近FFN。
经过Encoder后输出的仍是[197,d_model]大小的矩阵,我们把首位的[class]token对应的[1,768]调出来,然后通过MLP Head得到最后的分类结果,以免你不知道用哪个位置的token进行后面的MLP分类操作。
CLIP及其改进
CLIP简介
CLIP(Contrastive Language-Image Pre-Training)模型是OPENAI在2021年发布的多模态预训练神经网络,核心是用大量的图像和文本配对数据来预训练对齐。
CLIP包含的主要部分为:
- Text Encoder:文本->低维向量
- Image Encoder:图像->低维向量
CLIP学习
- 优势:出色的zero-shot效果
- 劣势:需要大量数据,难以完成复杂任务。
- 可学习之处:文本-图像构建正负样本对及点积相似性分类,对下面文章的指导。
Encoder
CLIP使用的Encoder可以是修改后的ResNet50(注意力池化机制替代全局平均池化层),通过单层的多头QKV注意力,Q基于图像的全局平均池化;也可以是修改后的ViT,在Transformer前对Patch+Possition Embedding进行了归一化处理。使用的Test Encoder则是经典的Transformer。
训练过程
由下图,CLIP实际上通过生成文本、图像的相似度来生成预测 $| I1 |·|T1|·cosθ$,一个文本和对应图片生成n个正样本和其他的负样本。
为了达到更好的效果,不能直接把单个词语与图片输入,而是先做一个Prompt template之后输入。
Prompt template是指生成提示的可重复的方式,包含一个模板,例如图中的a photo of a {object}。Prompt把下游任务重构为模型熟悉的完形填空模式,可以激活预训练语言模型中的记忆,在few-shot上效果显著。
推理时把图片特征和文本特征计算相似性,输出分类结果。
由于把文字和图像特征结合学习到了结构化的部分知识,CLIP一定程度上摆脱了categorical label的限制,可以跳出训练时给出的label,例如做物体检测时,你在训练时给出的蓝色玩具、绿色玩具可以被检测为大象玩具、鸭子玩具等等。
CLIP分割应用
LSeg
N个需要分割类别:N x C Text矩阵
图片:H x W x C 在C维度上相乘
结果:H x W x N
由于分割数据集一般较小,会把CLIP改为有监督训练,计算交叉熵,和CLIP实际上有区别。
GroupViT
Image通过ViT的Transformer layer后进行Grouping。(重复此模块并且Group的类别逐渐减少)
由于是分类任务,最后还是有不同的类别,做Avg Pooling后MLP,和CLIP一样与Text的MLP结果做余弦相似得到Loss。推理分类时再把每个Group的特征和Text的特征做余弦相似,可以知道每个Group对应哪一类。
由于CLIP特性,很可能分离的Mask正确而类别错误,没有正确学习语义,且最多只能检测到最后一层Group数量的类。
多模态经典论文
以ViLT论文里展示的四种语言-视觉融合模型来说,CLIP处在B类。A、B两类的参数量更大,计算相似性部分则较轻,复杂情况可能难以得到好的结果。而C、D两种的训练时间长,要求高。
在多模态任务里,视觉特征是要大于文本特征的,所以Visual Embed应该不是很小,而Modality Interaction如果想处理更复杂的模型,应该也要较大,类似图中C类。
关于多模态任务使用的Loss,大概有Image Text Contrastive(CLIP中最大化NxN图像-文本对余弦相似度)、Mask Language Modeling(BERT中遮住一个词进行完形填空)、Image Text Matching(二分类判断生成的图像-文本对联合表示是否匹配)
ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation
方法总结
- 优势:动量蒸馏处理噪声数据,标准化三个loss,训练成本相对亲民。
- 劣势:无法做多模态深度融合、难以完成复杂下游任务。
- 可学习之处:处理噪声数据、处理负样本太多导致ITM训练困难问题。
具体内容
CLIP模型并没有学习更丰富的多模态交互,很多工作也容易对噪声文本进行过拟合。ALBEF旨在解决这些问题。
- Image Encoder:ViT
- Text Encoder:BERT前六层
- Multimodal Encoder:BERT后六层
相对于CLIP,它的Text Encoder较轻而Modality Encoder较重,有点类似C类。
Loss:ITC(在多模态融合前先对齐) + ITM(负样本太多直接训练难,选择最接近正样本的负样本) + MLM
用动量蒸馏模型给图像-文本对比学习和掩码语言建模生成伪标签,不采用影响训练噪声数据(可能符合但不与Ground Truth相符),扩大有用数据集,one-hot to multi-hot。
动量蒸馏实际上就是先训练出一个版本的ALBEF,把它作为动量模型,用动量模型输出的伪目标作为额外的监督标准,在原本Loss的基础上和伪目标的Loss进行KL-发散加权组合。同时动量模型作为教师模型也随着ALBEF的训练动态EMA更新参数权重。
VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts
方法总结
- 优势:Encoder使用灵活;可以使用单模态数据。
- 劣势:训练速度非常慢。
- 可学习之处:单模态训练流程优化、单塔模型及MoME。
具体内容
CLIP、ALIGN等双塔模型,Image、Text单独抽取特征互不影响,但在一部分下游任务不如使用Fusion Encoder的单塔模型。但是单塔模型在检索任务上又不适合大数据集,推理时间非常慢。
VLMo在Transformer中做了一部分改动:MoME Transformer。在Feed Forward Network中有区分Vision、Language和Vision-Language,在不同模态使用,self-attention可以共享参数。在使用中很灵活,但是由于要存储不同情况下的数据,要forward多次,速度非常慢,自己训练不现实。
训练时分阶段,使用单模态数据集单独预训练Vision、Language,大大减轻需要的多模态数据集。
使用的Loss也是ITC、ITM、MLM。
BLIP:Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
方法总结
- 优势:能处理噪声数据,扩大数据集;可以完成生成任务。
- 劣势:训练还是很慢,存在误分类问题(实际上还是CLIP带来的)。
- 可学习之处:对训练流程的优化。
具体内容
视觉语言预训练(VLP)模型过去只可以单独做好理解任务或者是生成任务。而且,性能的提高大部分来自于从web上收集的大量的有噪声的数据。
BLIP提出了多模态混合编码-解码器,可以在三个功能中选择一个运行:
- 单模态编码器
- 基于图像的文本编码器
- 基于图像的文本解码器
以此来解决原来的模型无法生成任务的问题。
Image Encoder:VIT
Text Encoder/Decoder:3种不同的用来算ITC、ITM(前两块比起ALBEF只是共享了self-attention参数)、Language Modeling(Decoder用的是Causal Self-Att做因果推理来完成生成任务)
文本端要做3次Forward,训练效率也偏慢。
由于BLIP和ALBEF是同一个团队提出的,实际上训练细节差不多。而BLIP也致力于解决网络数据集噪声太多影响训练的情况,提出了Captioner Filter Model。
把训练好的BLIP模型前两部分拿出来,在无噪声数据集上微调后为Filter,再用微调后的Decoder生成的文本做Captioner补充新的数据集,过滤掉相对不匹配的提高图像文本对的质量。得到的图像文本对再返回去训练第二个BLIP模型。
CoCa: Contrastive Captioners are Image-Text Foundation Models
方法总结
优势:训练较快,效果非常好,能适应不同任务。
劣势:规模史无前例,个人想训练几乎不可能。
可学习之处:对速度的优化,Pooling的更改。
具体内容
顾名思义,用Contrastive loss 和 Captioning loss训练的模型。CoCa基本上是ALBEF直接的后续工作,跟ALBEF的区别是用了attentional pooling来学习不同任务的特征,以及放弃了ITM Loss。
另外文本特征端用的都是Decoder,这样一开始就是mask的,可以只做一次forward减少计算量,但是代价是用了巨大的数据集,非常多的参数量,scale远超之前所有的工作。
Image Encoder和Text Encoder用Contrastive Loss来训练,类似之前的ITC loss,而最后的多模态用的是Captioning Loss,也就是GPT用的Loss,基于交叉熵,用于预测被遮蔽的文本标记。

效果和效果图都非常的好,这种类型的成果展示图被很多后来者用上。
BEiT-3:Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks
方法总结
- 优势:没有像CoCa一样使用过多数据且均为Public,应用广泛。
- 可学习之处:损失函数设计优化
具体内容
BieT的核心就是把所有图片化成Imagelish(和Text形式一样),和Text一起做Mask Modeling(完形填空)当做唯一的损失。而Pre-training部分和他们之前的工作VLMo是完全一致的MOE,可以根据任务来切换FFN。
BEiT-3展示了它的不同模块可以完成不同任务,可以单独使用Vision Encoder、Language Encoder、模态融合做推理、分类、生成等,取决你哪种FFN的Encoder以及用不用Decoder。