VIT (Vision Transformer)深度讲解
深度解析Vision Transformer (VIT) 模型原理,涵盖图像切片、线性投射及在计算机视觉中的应用优势。
UP主: RethinkFun · 时长: 14:52 · 🔗 B站原视频
发布: 2024-11-05 · 收录: 2024-11-19
标签: Vision Transformer · 计算机视觉 · 深度学习 · AI模型 · Transformer
系列视频与本期主题:Vision Transformer(ViT)
接下来我会出一系列视频来讲多模态模型。今天先来学习 Vision Transformer,也就是 ViT 模型。ViT 可以说是确立了把 Transformer 引入计算机视觉领域的模型。在它之前确实也有人做过尝试,但要么规模太小效果不好,要么对 Transformer 做了一定修改。
ViT 作者的目标是验证:在不对 Transformer 做任何修改的前提下,是否可以将 Transformer 引入计算机视觉领域;并且在不同规模的数据集训练下,和卷积神经网络相比,Transformer 有什么优势。
论文结论:ViT 和 CNN 的对比结论
作者通过图像分类任务实验发现:
- Transformer 模型可以不做任何改动就解决计算机视觉问题。
- 在小规模数据集上,表现略输于卷积神经网络;在中等或者大规模数据集上训练,表现和卷积神经网络相当或者略高于卷积神经网络。
- 在同等精度下,Transformer 模型比卷积神经网络在计算效率上更具优势。
ViT 的意义:Transformer 架构的通用性
ViT 的意义在于证明了 Transformer 架构的通用性。Transformer 架构可以说是目前人类发现的最佳模型架构:训练效率高,可以通过注意力提取复杂语义,支持多种模态,并且结构简单、可以自由扩展模型大小,即使使用千亿级别参数规模的模型依然没有出现性能饱和。
ViT 为多模态大模型铺平了道路。Transformer 架构的统一也让基于 Transformer 的工程优化(比如 Flash Attention、vLLM 等)可以直接应用于计算机视觉和多模态领域。
核心思路:不改模型,就把图片变成“文本序列”
下面具体讲解 ViT 模型。如果你了解 Transformer,那么理解 ViT 没问题;如果还不了解,请先看我之前介绍 Transformer 的视频。
因为作者希望尽量不修改 Transformer 来完成图像分类任务,既然模型不能改变,那就要让图片数据变得像文本。所以这篇论文的题目就是:一张图像等于 16×16 个词。
图像切片(Patch):为什么不用像素当 token
ViT 如何将图片转化成和文本一样的序列?做法是先将图片按固定大小分成一个个 patch。
比如论文中输入图片为 224×224,如果 patch 大小为 14×14,则可以分为 16×16 的序列。不按单个像素划分的原因是:会导致序列过长,计算复杂度太高。
我自己认为还有一个原因:一个像素只有 RGB 三个值,语义信息太少,用几百上千维的向量去表示一个像素的 embedding 也很浪费。所以这里选择用一个 patch 作为一个语义单元,对应文本里的一个 token。
Patch 到 Embedding:线性投射等价于词嵌入层
一个图像 patch 怎么转化成对应的 embedding 向量?
可以把 patch 的(长×宽×通道数)多维矩阵表示拉平,然后通过一个共享的线性层投射到 Transformer 的特征维度(比如 1024)。这样就完成了把图片转换成向量序列。
这里的对应关系是:图像切片相当于文本里的分词,线性投射层相当于 embedding 层。
位置编码与分类 Token([CLS]):借鉴 BERT 的做法
接下来需要考虑位置编码。ViT 的做法是为每个位置加上一个可学习的位置编码。
因为 ViT 做的是图像分类,参考了 NLP 里 BERT 的做法:在最前面加一个可学习的分类 Token,并且有自己可学习的位置编码。
后面采用 Transformer Encoder 架构,每个 token 不论在序列里什么位置都可以看到其他所有 token。即使分类 token 固定在第一个位置,也可以汇集所有图像 patch 的信息。最后通过第一个位置的分类 token 的输出,加一个简单的 MLP 头进行分类,类似 BERT。
模型规模:Base / Large / Huge 与 ViT-L-16 的含义
ViT 也训练了不同大小的模型,分为 Base、Large、Huge,对应不同的层数、Hidden Size、MLP Size 和注意力头数。
ViT 的表示一般用类似 ViT-L-16:表示这是一个 ViT-Large 模型,其中 patch 大小为 16×16。patch 越小,一张图像分出来的 patch 越多,输入序列越长,计算复杂度越高,但一般效果也越好。
实验结果:精度与训练代价(计算效率优势)
作者选了当时在不同数据集上表现最好的分类模型 ResNet 和 EfficientNet 进行比较。可以看到在 JFT 数据集上进行预训练,然后在不同数据集上测试,ViT-H-14 模型几乎都取得了最好的成绩。
特别需要注意的是最后一行,用 TPUv3 的核数×训练天数表示的计算代价上,ViT 模型有非常大的优势。所以在大规模图像数据集上训练 ViT 更有优势。
实现细节:两种“图像转 Embedding 序列”的等价实现
训练图片大小为 224×224,patch 大小为 16×16,patch 数量为 14×14。Transformer 的特征维度(Hidden Size)为 1024。
把图像转换为 embedding 序列有两种方法:
- 先把图片拆成多个 patch。每个 patch 的 shape 是 16×16×3,把它展开为长度 768 的向量,再通过一个共享的线性层(输入 768,输出 1024)编码成 embedding 序列。
- 实际实现中更简单的方法:不用显式切 patch,直接对原始图片定义 1024 个卷积核,每个卷积核大小就是 patch 大小 16×16,stride 为 16,padding 为 valid。两个操作完全等价。
位置编码的尝试:一维、二维、相对位置编码
论文中对位置编码做了多种尝试:不加位置编码、一维位置编码、二维位置编码、相对位置编码。
例如将图片切成 9 个 patch:
- 一维位置编码:生成 9 个可学习的位置编码,每个长度等于特征维度 1024。
- 二维位置编码:生成 3 个表示行的位置编码、3 个表示列的位置编码,它们长度都为 512,通过行列拼接构成二维位置编码。比如第二行第一列的 patch,就取第二个行位置编码拼接第一个列位置编码。
实验发现:不加位置编码效果最差;一维、二维、相对位置编码效果都差不多。
你可能会觉得不加位置编码为什么效果也还行、没差多少?因为图片被切成 patch,patch 内部本身含有位置信息。比如一个建筑的 patch 即使打乱,你也大概能知道它属于建筑图。
作者还进一步研究了位置编码:通过学习,位置编码也能学到二维信息。比如位置编码相关性图可以看到,和每个 patch 最相关的还是自己附近的,以及自己所在行列的 patch。
注意力的全局性:随着层数加深关注更远距离
作者还发现:随着 Encoder 层数增加,每个注意力头关注的平均像素距离会变大。不同于卷积神经网络只偏向局部,ViT 在浅层有的头关注近距离像素,但也有很多头已经关注到了远距离像素。随着层数加深,模型越来越关注远距离的全局信息。
结构对比:CNN、纯 ViT、CNN+Transformer 混合
作者比较了三种结构:
- 纯卷积神经网络(如 ResNet)
- 只用 Transformer 的 ViT
- 卷积神经网络 + Transformer 的混合模型
混合模型的架构是:先用卷积神经网络提取特征,再在特征图上把每个空间位置当作一个图像 patch,然后线性映射进入 Transformer Encoder。
在相同预训练代价下,开始混合模型有优势,但随着计算代价增大(模型变大),最终 ViT 效果略好于混合模型,说明 Transformer 架构在视觉领域完全可以取代卷积神经网络。
分类头的两种做法:[CLS] token vs 全局平均池化
图像分类通常有两种做法:
- 在序列第一个位置增加分类 token,提取全局信息。
- 不额外增加 token,用所有图像 patch 最后一层输出做全局平均池化来表示全局信息。
作者比较后发现,两者效果类似。
数据规模影响:小数据 ResNet 强,大数据 ViT 强
图中方块是不同大小 ResNet 在不同规模数据集的表现,圆形是不同大小 ViT 的表现。可以看到:小规模数据集上 ResNet 好于 ViT;随着数据规模增大,ViT 好于 ResNet。
大致可以理解为:百万级数据集 ResNet 更好;千万级差不多;更大规模时 ResNet 不如 ViT。
原因:归纳偏置(Inductive Bias)
为什么小数据集上 ViT 不如 ResNet?是归纳偏置导致的。
归纳偏置就是训练模型时人为引入的一些先验知识,这些知识是人给的,不是模型从数据中学来的。比如卷积操作每一层都有两个归纳偏置:
- 局部性:卷积核只作用在图片局部,因为我们知道图片相关信息多集中在局部。
- 平移不变性:卷积核在图片上平移,因为我们知道物体不论在图片什么位置,特征是不变的。
这些先验知识让 CNN 学起来更简单,并且在每一层都起作用。
ViT 用 Transformer 架构,引入的归纳偏置比较少:切分 patch 时引入局部性;对所有 patch 用同一个线性层编码引入平移不变性。但后面的注意力计算几乎没有归纳偏置,所以 ViT 在小规模数据上学习比 ResNet 慢一些。
自监督学习:借鉴 BERT 的 Mask 机制
作者还尝试让图片进行自监督学习,因为有标记的数据总是少数。想让模型在大规模数据上取得突破,必须依靠自监督学习,就像 BERT 和 GPT 的成功。
自监督做法借鉴 BERT:把 50% 的图像 patch 进行标记。在这些标记的 patch 里:
- 80% 的 embedding 替换成可学习的 mask 标签
- 10% 替换为其他 patch 的 embedding
- 10% 保持不变
最终利用这些标记 patch 的输出预测原始图片的像素值。为简化问题,将原来 RGB 255×255×255 的 1658 万多种颜色简化为 RGB 各 8 个值,总共 8×8×8 = 256 种颜色。最终效果也非常不错。
总结与结尾
ViT 打开了 Transformer 架构处理计算机视觉和多模态数据的大门,让多模态通用人工智能成为可能。今天就讲到这里,如果这个视频对你有帮助,记得点赞支持,我们下期见。