让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer(ViT)。
首先介绍一些历史……
Vision Transformer 由 Alexey Dosovitskiy 等人 (Google Brain) 于 2021 年在论文《一张图片价值 16×16 个字》中提出。当时,Transformers 已被证明是实现 NLP 任务出色性能的关键,并于 2017 年在必读论文《注意力就是你所需要的一切》中提出。
2017 年至 2021 年间,曾有多次尝试将注意力机制集成到卷积神经网络 (CNN) 中。然而,这些尝试大多是混合模型(将 CNN 层与注意力层相结合),缺乏可扩展性。谷歌通过完全消除卷积并利用其计算能力来扩展模型来解决此问题。
Google Vision 团队遵循了 Google 内部另一个设计文本 Transformers 的团队提供的指导方针。他们解决的关键挑战是:
“注意力机制如何适应图像?”
在 NLP 中,标记(单词或子单词)是计算注意力的基础。然而,图像本身并不适合进行这样的标记化。单个像素应该被视为一个标记吗?还是应该将整个图像视为一个标记?
如果将每个像素视为一个单位,则需要计算所有像素的注意力机制。对于 224×224(包含 50,176 个像素)这样的低分辨率图像,这将需要大约25 亿次运算— 以目前的技术而言,这是一项不切实际的任务。
相反,将整个图像视为单个标记太过简单。解决方案介于两者之间:将图像转换为一系列补丁。在他们的论文中,作者使用了分辨率为16×16 像素的补丁。
Vision Transformer 架构:
关键符号:
- P = 16:补丁大小
- H, W:图像的高度和宽度,必须能被 P 整除
- C = 3:通道数(RGB)
- D:潜在向量大小,表示补丁标记展平后的维度。
从数学上来说:
这是需要理解的最重要的部分。一旦我们有了一系列标记,我们就可以应用 Transformer 编码器。我们只需要了解如何向这些标记添加位置编码,以及如何从所有标记中获取单个向量表示。
CLS(类)标记:整个图像的表示
如果您熟悉注意力机制,您就会认识到,从N 个标记开始并应用L层注意力会产生N 个标记 — 每个补丁一个。这形成了“特征图”,其中每个补丁被编码为维度为 D 的向量(标记)。
然而,要对图像进行分类,我们需要一个向量来表示它。虽然可以将所有N 个token 平均或“池化”为一个向量,但作者采用了一种类似于 BERT 的方法,即引入一个专门用于此用途的 token:CLS token。
此标记附加到图像中的其他N 个标记。因此输入序列由N+1 个标记组成。
位置编码
将 token 直接输入注意力机制会导致缺乏空间意识,因为该机制不知道每个块的位置。为了解决这个问题,我们为每个 token 添加了位置编码。
位置编码可以是硬编码的(例如,使用 sin/cos 函数,如在“Attention is All You Need ”论文中所述)或在训练期间学习。
我个人非常喜欢 Barton 和 Sutton 的“惨痛教训”,那就是每当我们试图将归纳偏差放入模型中时,我们都会发现,如果有足够的数据和缩放,让模型自己学习实际上会更好。
在 VIT 论文中,位置编码是可以学习的。从上一部分中,我们看到我们以维度(N+1, D) 的矩阵结束。因此,位置编码也是添加的维度(N+1, D)的矩阵。
很好!现在我们对 ViT 架构有了全面的了解。
更高分辨率下的微调
在现代深度学习中(例如 2017 年 Transformer 问世之后),解决问题的标准方法变成了:
步骤 1:在非常大的数据集上预训练一个非常大的神经网络
第 2 步:针对我们想要解决的任务进行微调。
在计算机视觉中,有一个很酷的技巧可以提高性能:以比预训练期间使用的分辨率(通常较低)更高的分辨率对 Vision Transformer (ViT) 进行微调。但“以更高的分辨率进行微调”到底是什么意思?这是否意味着我们在图像中使用更小的块,以便我们拥有更多的标记,还是我们只是拍摄更高分辨率的图像?它是如何工作的?
让我们开始吧!
这是我个人偶然遇到的一个问题,所以我将深入解释它。
当我们提到以更高的分辨率进行微调时,我们的意思是增加图像分辨率,同时保持补丁分辨率固定。
例如,将图像分辨率从 224×224 增加到 640×640 会导致补丁数量从 196 个增加到 1600 个。这带来了挑战,因为位置嵌入矩阵最初的大小为 196 个标记,不再与新的标记数量相匹配。
那么,解决办法是什么?
插值。我们通过使用双三次插值填充间隙来扩展原始位置嵌入,从而有效地调整嵌入的大小以匹配新的补丁数量。
ViT 的缩放定律
与卷积神经网络 (CNN) 不同,视觉变换器 (ViT) 缺乏内置归纳偏差,例如空间局部性和平移不变性。这意味着 ViT 必须完全从数据中学习这些模式,这使得它们成为高度数据密集型模型。
因此,我们可以想知道随着数据和参数的增多,VIT 的性能会如何发展。
ViT 的优点在于,它们的性能能够随着更多数据和更多参数而很好地扩展。
然而,有一个问题。在数据有限的情况下,传统的 CNN 往往占上风。CNN 采用归纳偏差设计,使其能够更有效地从较小的数据集中学习。它们利用空间层次和局部特征等模式,这使得它们在数据稀疏时表现更好。
因此,如果您要解决数据有限的问题,CNN 可能是更好的选择。但如果您的数据集很大,ViT 可能会提供更出色的性能。盈亏平衡点取决于您的数据的具体情况。
模型到底学到了什么?
让我们来分析一下一些关键见解:
1.嵌入过滤器是什么样的?
2.模型如何学习位置嵌入?
3.注意力机制是关注附近的标记还是远处的标记?
1.嵌入过滤器:
值得注意的是,ViT 学习到的 RGB 嵌入过滤器与 CNN 中的过滤器类似,可以捕捉垂直线和水平线等基本视觉纹理。从本质上讲,尽管 ViT 不使用卷积,但它们学习到的嵌入在识别和表示基本图像特征方面具有类似的用途。
2. 位置嵌入:
当谈到位置嵌入时,ViT 会形成网格状结构。学习到的嵌入通常表现出一种模式,即同一行或同一列中的值相似。
有趣的是,发现模型自己学习了这种位置编码,它能够理解图像的结构(虽然它只能看到一个标记列表)。
3.注意力机制:
ViT 中的注意力机制在整个网络层中不断发展。在早期阶段,它倾向于关注附近的标记,这类似于捕获局部特征的方式。随着您深入网络,注意力机制会转向更全局的视角,使模型能够整合来自远处标记的信息并理解整个图像的高级关系。
这种从局部到全局注意力的进展凸显了 ViT 在处理图像时如何构建越来越复杂的表示,从而使其能够捕捉复杂的模式。
总之,虽然 ViT 从学习基本的视觉模式和位置信息开始,但它们逐渐发展出推理图像中更大、更抽象特征的能力。
恭喜你,你成功了!
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/5563