分享
(4)多模态的大一统之路
输入“/”快速插入内容
(4)多模态的大一统之路
作者:小A,aaronxic,
知乎个人主页
发表时间:2023年7月8日
原文地址:
https://zhuanlan.zhihu.com/p/643969218
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实现,也可以用
且
的卷积实现,同时引入了可学习的映射过程
代码块
Python
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如下所示