Create [V1-03]Transformers in Vision - #2
Open
boshallen wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stanford CS25 V1 | Transformers in Vision : Tackling problems in Computer Vision
本节我们主要学习的是视觉Transformer(Vision Transformer),但在深入transformer之前,我们先一起来温习下所需的背景知识吧!尤其是视觉方面的,因为大家熟知的例子或者之后很大概率会接触到的都是语言方面的。那我们开始吧!
有些科研工作者的目标是找到通用的视觉表征(General Vision Representation),大家很快就会明白这是什么意思。
如果我们想象有一个通用的视觉表征,我们希望能通过它可以真正启动所有需要视觉输入的任务,这意味着大多数时候你在睁开眼时候做的任务。基本上,如果你对你所看到的东西有一个好的理解,那么你可以更快地知道正在发生什么以及你应该做什么。
它也可以应用到机器人上,想象一下,它未必像电影中的那样好看和漂亮,可能只是一个手臂或任何东西,即使是没有编程能力的人类也可以教它做一些TA们真正不想做的枯燥任务。这其中的一个重要组成部分是一个良好的视觉表现,能够泛化到能在视觉方面理解世界。以上就是关于在通用视觉表现上工作过的背景和动机。
一个通用视觉表现的好例子就是人类,接下来我会告诉你这是什么意思。现在我们有一个任务,我们有三个类别---A类,B类,C类,每个类别有五张图片。
再给你一张新图片,相信你很容易就知道它属于哪个类别
没错,就是A类。或许我们在一生中已经看过数百万朵花了。
但还有其他类型的图片,比如卫星图片,这在我们的生活中并不常见。有些人可能从未见过,有些人可能在电视或者互联网上见过,不过这相当罕见。
还是同样的规则,ABC三类,每类有五张照片。可以看出后续给出的这张照片属于B类,均为篮球场。
接下来我们试着引入更抽象的例子,你在现实生活中几乎看不到这个,此时依旧给你A,B两类图像,和一张单独的图片。
到目前为止我希望大多数人的答案都是A,因为A类里每张图片有三个物体,B类中每张图片有五个物体,无论他们是什么形状,长什么样。现在你可能或多或少对良好的视觉表征或一般的视觉表征有了一定的理解。
那么如果我们有这方面的目标的话,我们该如何衡量这方面的进展呢?我们引入这篇论文The Visual Task Adaptation Benchmark(VTAB).
这篇论文带着所有可能的视觉任务的景观,从中抽取一些任务,这就是你刚刚看到的任务,它们实际上是从这个任务适应基准中取出的。这篇论文的作者已经迈出了第一步,做了19个这样的任务,他们试图涵盖广泛类型的视觉任务。不仅仅是自然图像的类别,比如上面这些图片中的猫、狗,还有很专业的图片,像卫星图像,以及像上述A、B两类3个物体和5个物体这样已知的分类任务,但这在逻辑上需要更多的思考。
在基础模型上,可以对每一个数据集做一些自适应步骤,结果我们会得到针对于每个数据集的模型,即使它只看到了每个类中的几个例子并对其表现良好,然后我们只取平均分跨越这些任务,这就是论文里提到的VTAB任务。也是判断一个生成的视觉表征对你的模型和自适应算法是否有好处的一个方法。
通常,上图左面Pre-training的部分也可以被叫做upstream,右面Transfer的部分也被叫做downstream。原则上适应(adaptation)是你想要的,但是对于此篇论文的工作,基本只需使用非常简单的微调而且效果还很好。
接下来我们将会按照下面的大纲来了解相关的知识
Overview
1. Self-supervised pre-training?("Revisiting SSL")
2. Semi-supervised pre-training?(S^4^L)
3. Large-scale supervised pre-training!(BiT)
4. "Let the data speak"(ViT, Mixer)
5. So are we done now?
a. What about more data? Larger models(Scaling ViT)
b. What about less data? "Practitioner-sized" datasets?(How to train your ViT)
c. So... DOne? Yes but no ...(Are we done with ImageNet?)
d. But huge models are clumsy to use!(A good teacher is consistent and patient)
1. Self-supervised pre-training?
我们可以先看右上角的图,蓝色的是few-shot VTAB的VTAB分数,和自监督的学习表现类似。
2. Semi-supervised pre-training?
然后我们进入到半监督训练--有一些带标签的例子,还有很多没有标签的例子(对应图片右上角的绿色框中的蓝条),比之前其他的蓝色条高了很多。这意味着,我们通过添加一些带有标记的数据,我们得到的通用视觉表示效果会好很多。
3. Large-scale supervised pre-training!(BigTransformer/BiT)
如果只是扩大完全监督的预训练,然后我们得到了比之前的方法更好的表示。在互联网上有大量的图像,这就是我们经常听到的自我监督或无监督学习的动机。但实际上,这些来自于网络的图像周围几乎总是有一些额外的信息。或者,如果你用其他方式连接,那么也会有一些额外信息。你可以将其当成一些弱信息来源或一些弱标签。
碰巧在谷歌中有一些实际上为生产而这样做的团队。他们已经收集了一个大型数据集,有来自周围信号的管道,自动但是非常嘈杂地注释图像。那么当扩大预训练的时候效果到底会有怎样的变化呢?在下图你可以清晰地看到。
之前没有提到的是,这项工作在ImageNet上是顶级的计算机视觉的基准。预训练、扩大一切的规模、利用数据,这些方法。

如果你对大量数据进行预训练然后测试许多其他任务,你应该注意你没有来自其他任务的图像在你的预训练数据中,在数据量大的时候我们更应该当心这点,因为 ImageNet 图像完全可以在海量数据中。所以在这项任务中,实际使用了内部管道,这种方法很擅长查找重复项和新的副本,当它们被移动、旋转、挤压时,或者颜色改变了一点,依旧能被找到。使用这种方法来从稍后测试的测试数据集中完全删除所有图像,实际上发现视觉数据集中的很多程序在训练集和验证集之间、ImageNet 的训练集与 CIFAR-10 和 CIFAR-100 测试集之间都有明显的重复,所以新的重复在视觉上是一个相当普遍的问题。
现在回到这里,我们我们发现了大数据,和大模型,然后效果变得非常好,基本上那就是我们如何得到 Transformer 的。
在计算机视觉领域中,一切都是卷积网络好多年了,基本上没有别的了,CNN就是王者。但是在语言方面,最近出现了转变,过去一切都是 LSTM,LSTM 是王者,然后是 Transformer。在有大量可用数据的情况下,很多时候Transformer要比 LSTM 效果好得多。对于图像数据,情况依然并非如此。所以他们当时的想法是,好吧,我们处于这个拥有大量数据的体制中,并且我们从中受益。如果我们在视觉领域也试一下 Transformer 架构,效果会变得更好吗?
这就引出了这种简单且自然的应用视觉 Transformer 的方式,也就是把图像切成片,就像下图这个方式,像一块拼图一样,每一块都投射出来进入映射空间作为 Transformer 的输入。Embedding 空间只是一种抽象空间,比方说例如768张图像,你如何嵌入它,你只需要获取像素值并放一个线性投影层在上面。
所以取所有像素,将向量展平,矩阵相乘成你想要的任何大小,并对所有的图片使用相同的矩阵。在这里只是使用了最简单的方式与不重叠的图片。这几乎是一个卷积,让我们进行适当的卷积,让我们把它们堆成一堆,诸如此类。然后我们有这些嵌入的图片,我们按照字面意思对待它们,就像语言中的 token,然后把它们从语言中准确地交给 BERT transformer。就像在语言中一样,添加了这个类标记(class token),或者说语言就像是句尾标记或者其他的东西。
将位置嵌入(position embedding)添加到可以被学习的标记(tokens)中,然后再将所有这些输入到 transformer 编码器(Encoder)中,它有一个 MLP 头,可以读出这个 class token然后将其映射到 Softmax 层进行分类,这就是一个视觉 Transformer。
所以从字面上来看,你需要一个 BERT transformer,但是不是单词或者句子标记(words or sentence tokens),它以图像标记的形式提供补丁。然后就是和以前一样的操作,扩大一切--计算、数据集、模型大小、耐心。
从图中可以看出效果的变化(气泡代表模型的大小)
然后回到相同的基准(benchmark),这又是一个小小的跳跃。
还有一件有趣的事,实际上如何缩放(scale)这些 transformers 呢,在 transformer 的高级形状中,可以选择很多设置,首先从一个合理的中型 transformer 选起然后一一改变。

在 y 轴基本就是它的推理速度,在 x 轴上它改变了输入大小。

这是查看输入的接受域大小。在 x 轴上我们看到了网络中的层,在右边它更倾向于输出,the classes,左边更靠近输入,the patches。y 轴为平均距离,整个验证集进行self-attention look,并且看起来确实意味着 self-attention 的高峰或最大距离这样的的东西,也可以用多头注意力机制。

后面还有进一步扩大 ViT 和 transition tranformers 的实例。当没有特别大数据量时还能做到吗?
在实现这个目标的过程中必然要花费很多。

一方面是获取超大的数据集,另一方面是调整模型(层数、深度、架构以及 tricks 等等)。

基本上就是下图这个样子,我们把它的规模扩大了很多。

接下来是一些缩放损失在语言上很流行,可能在第一次判别图像时也会存在。

减少手工过程进入模型架构,然后使用 transformers(self-attention)。

效果:

关于模型大小的一些信息:
