输入“/”快速插入内容

(4)多模态的大一统之路

作者:小A,aaronxic,知乎个人主页
发表时间:2023年7月8日
50%
50%
开篇
大家好,我是小A。前面几篇我们已经了解了transformer是如何应用在LLM领域中,从这一篇开始我们进入多模态的领域,看看多模态是如何通过transformer架构逐渐走向大一统的。
提纲如下,共5个章节
首先介绍了Vision Transformer的入门知识和相关的应用。包括了ViT(2020.10)ViT-22B(2023.02)Swin Transformer(2021.08)MAE(2021.11)BEiT(2021.06)BEiTv2(2022.08)TimeSFormer(2021.02)BEVFormer(2022.03)
接着介绍了多模态任务、训练评测数据集和评测方法。包括了Video Action Recognition任务,Image Text Retrival任务,Image Caption任务,Visual QA任务,Visual Reasoning任务,Visual Entailment任务。
开始介绍多模态大一统的Stage1,模块独立。从TE,VE和MI三个模块的复杂度关系入手,列举了4种类型的网络结构,包括了SCAN(2018.03)CLIP(2021.02)FLIP(2022.12)ViLT(2021.02)ALBEF(2021.07)CoCa(2022.08)
继续介绍多模态大一统的Stage2,模块共享。VLMO(2021.11)开启了TE,VE和MI三个模块共享transformer block的先例,启发了后续BLIP(2022.01)BEiTv3(2022.08)BLIP2(2023.01)等工作
最后介绍了多模态大一统的Stage3,范式统一。这是一个仍然蓬勃发展的方向,以个人见解列举了Pixel2seq(2021.09)Unified-IO(2022.06)的范式统一方法。
Vision Transformer入门
多模态统一的第一步是架构统一,因此如何将transformer应用在传统的CV任务里面变得尤为重要,下面就介绍transformer是如何替代CNN充当视觉任务的骨干网络。
ViT
回想在NLP里面,text通过tokenization的过程变成了token序列,那么对应vision里面的tokenization过程是什么呢?有一种简单直观的想法,切分patch,过程如下
输入
的图片,切分成
像素patch,因此变成了
grid,由于原始输入是通道为3的RGB图片,因此每个格点是
维度的feature
数学化表达上述过程,就是假设图片
,沿着长和宽切分成
patch,其中
,则最终得到的输入为
这样
就类比于NLP中的序列长度了
这里切分既可以通过对原始像素reshape和transpose实现,也可以用
的卷积实现,同时引入了可学习的映射过程
代码块
Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16))
CLS token: 此外为了方便下游做全局任务(例如图像分类),添加可学习的 CLS token ,放在网络最前面,因此序列长度为
。用 CLS token 对应的输出做全局信息获取做下游分类任务即可。
PE: 由于transformer本身对位置无感,因此需要把位置信息encode进行,ViT引入了可学习的绝对位置编码(learnable absolute PE)。如上图示例中划分成了9个patch,再加上 CLS token,因此可学的位置编码有10个
网络结构:所有patch token之间信息相互可见,因此使用了标准的pre-norm的encoder结构
ViT-22B
NLP那边网络可以scale到175B的大小,那么ViT是否也能轻松scale呢?貌似看起来也不是那么容易。[ViT-22B](https://arxiv.org/abs/2302.05442) 中做了3个改动才成功把网络放大到22B,如下所示
query和key做了额外的前置LayerNorm,否则导致训练不稳定。下图绿色就加了前置LayerNorm的,红色就是没有加前置LayerNorm的
对MHA和FFN做了并行化改造,这样并行度更高,减少训练耗时
移除了input projection和LayerNorm后面的bias
改进后的transformer block如下所示