赞
踩
目录
5.2.3 Vision Transformer (ViT)
CV(计算机视觉)领域一直是引领机器学习的弄潮儿。近年来更是因为 Transformer 模型的横空出世而掀起了一阵腥风血雨。本文主要介绍 Transformers 背后的技术思想、在计算机视觉领域的应用情况、最新动态以及该架构相对于 CNN 的优势。读完这篇文章之后,你将能知道:
- 为什么 Transformers 模型在 NLP 任务中能够力压群雄,变成 SOTA 模型的必备组件之一。
- Transformers 模型的计算原理。
- 为什么说 Transformers 是对 CNN 的当头棒喝,Transformers 是怎么针对 CNN 的各种局限性进行补全的。
- CV 领域的最新模型是如何应用 Transformers 提升自己的。
在 NLP 领域中,一个重要的技术基础就是 创建合理的 Embedding。Embedding 是 NLP 系统的根基,一个好的 Embedding 需要能够将原始文本中尽可能多的语义片段进行有效编码。这些语义信息其实并不只是代表一个词的定义跟含义,很多时候是需要结合上下文进行联系的。
例如,当孤零零地得到一个词 “快” 时,我们不知道它是指 Fast 还是 Almost。基于这样没有上下文的孤词的 Embedding,通常是盲目且无意义的。
又比如,给出一句话:“Transformers 特别牛,因为它在很多项目中都能大幅提高模型的性能”。由此可知,文中的 “它” 是指 Transformers,但若无这一整句话的承载,而是孤零零地给出一个词 “它”,估计谁都不明白指代的是什么,那如此 Embedding 出来的结果也将毫无意义。
因此,一个好的机器学习模型应该能够准确表达单词之间的依赖关系。不论是在超大型的文本中,还是在比较简短的文字片段中都是如此。
这就像是一个伏笔,仿佛作者在第一章中埋下了一个伏笔,隔了四五十页后再次提及起它时,读者会觉得这是神来之笔,因为能够联系起它和当前文字之间的关系。机器学习模型也应该具备这种记忆能力,以及超远文字之间的记录和依赖表达能力。或者换句话说,好的模型应该具有“长期依赖性的编码能力”。
在详细介绍 Transformers 前,先来梳理一下 NLP 领域在 Transformers 技术诞生之前所面临的问题,尤其是在挖掘数据之间的长期依赖性时所面临的问题。
在 NLP 领域中,以 LSTM 和 GRU 为代表的循环神经网络曾风光无限,它们的结构内部有极其巧妙的 长期状态输入和输出,能够让模型从文本中提取丰富的上下文语义。它们的工作方式都是 串行 的,一次处理一个单词或输入单元,并且设计了 记忆结构 来存储已经看到的内容的抽象特征,这些长时的抽象信息能够在之后的数据处理中帮助模型理解当前输入,或者处理长期的数据依赖,从而将前文中的语义信息添加到当前的结果输出之中。
而 RNN 结构则能够将前文的信息写入到记忆模块之中,因其内部有各种 门结构。其中 输入门 能够让神经网络有选择性的记录一些长时的有效信息,遗忘门 会有针对性地抛弃一些无关的冗余信息,更新门 还可以让网络对自身当前的状态根据输入进行实时更新。
相对于普通 RNNs 来说,加入了各种门结构的 LSTM 和 GRU 更受世人的喜爱,这是因为它们能够解决 梯度爆炸和梯度消失 的问题,模型的鲁棒性得到了明显提升。梯度爆炸和梯度消失是长久以来困扰 RNNs 的一大问题。LSTM 和 GRU 能够利用自身模型结构给梯度 “续命”,有效追踪序列数据中相当长时间数据之间的依赖关系。
然而,这种 序列式 的网络,以及将有效信息存储到各个零散的神经元的方式,并 不能有效地保存那些超长的数据依赖。
此外,序列式的网络结构也 难以让 LSTM 和 GRU 网络有效地进行扩展和并行化计算。因为每一个前向的传递都是依赖于前一个时间步的处理结果,每得到一个输入,模型只能给出一步的输出。也就是每一步的计算都只能顾及当前输出,得到一个 Embedding 结果。
CNN 也是 NLP 系统中的常客,尤其是对于那些使用 GPU 训练的模型任务来说更是如此。这是因为 CNN 和 GPU 的组合能够天然耦合两者在计算伸缩性和高效性上的特点,所以二者逐渐成为形影不离的好基友。
CNN 常被用在图像特征提取上。类似地,NLP 网络也会利用 CNN 的一维滤波器从文本中提取有效信息,此时的文本就对应地以一维时间序列的形式进行表示了。所以图像处理中使用 2D CNN,NLP 中就使用 1D CNN ~
CNN 的 感受野(就是 CNN 能够 “看到” 的局部信息大小)是由 kernel 的尺寸和通道数所决定的。增加 kernel 的尺寸或通道数会增加模型的大小,也会让模型的复杂度大幅增加。这可能导致 梯度消失 的问题,从而引发让整个网络 无法训练收敛 的严重后果。
为解决该问题,残差连接 (Residual connections) 和 空洞卷积 (Dilated Convolutions) 等应运而生。它们能够在一定程度上增强梯度的传播深度,从而在一定程度上扩大模型的感受野(后面的层就能看到更多的局部信息了嘛)。
但是,卷积神经网络毕竟只是关注局部信息的网络结构,它的这种计算机制导致了它在文本信息处理上难以捕捉和存储长距离的依赖信息。人们一方面想扩大卷积核、增加通道数来捕捉长期依赖,一方面还害怕由于扩大模型所导致的维度灾难。
终于到了今天的主角 —— Transformer。2017 年Transformer 横空出世,当时的它被定位成一种 简单并且可扩展的自然语言翻译方法,并且很快被应用到各类 NLP 任务中,逐渐成为 SOTA 模型中的必备成员(比如 GLUE 、SQuAD 或 sWAG )。
但并非所有任务都是有能够喂饱深度网络的数据资本的,所以很多任务都会基于上述 SOTA 模型公开版本的半成品进行 微调 (finetuning),从而适配自己的任务。这种做法十分常见且有效,因为它大幅的节省了训练所需的数据量。
这些模型有的已经有着数十亿个参数量了,但似乎还没有达到性能的天花板。随着模型参数量的增加,模型的结果还会持续上升,模型由此而表现的一些新特性和学习到的新知识也会越来越丰富,具体可以看 GPT3 的文章。
当给定了一个包含 N 个单词的文本输入时,对于每个单词 W,Transformers 会为文本中的每个单词 Wn 创建 N 个权重,每个权重的值取决于单词在上下文中的依赖关系 (Wn),以此来表示正在处理的单词的语义信息 W。下图表述了这个想法,其中,蓝色线条的颜色深度表示分配给某个单词的注意力 Attention 的权重。
在这里,上一行表示 正在处理的单词,下一行表示 用作上下文的单词(注意,有些单词是相同的,但如果它们正在被处理或被用于处理另一个单词时,它们的地位和处理方式将会有所差异)。请注意,上一行的 “They ”、“Cool” 或 “Efficient” 有很高的权重指向 “Transformer”,因为 “Transformer” 确实是它们所引用的目标单词。
然后,这些权重被用于加权组合来自每对单词的值,并为每个单词 (W) 生成一个更新的嵌入,该单词 (W) 现在包含关于这些重要单词 (Wn) 在特定单词 (W) 上下文中的信息。
其实,在这些现象的背后,Transformers 使用了 自注意力 (self-attention) 技术来计算这些更新的 Embedding 。Self-attention 是一种计算效率很高的模型技术,可以并行地更新输入文本中每个单词的嵌入结果。
假设得到了一段输入文本,并且从文本中的单词嵌入 W 开始。我们需要找到一种 Embedding 方法,来度量同一文本中其他单词嵌入相对于 W 的重要度,并合并它们的信息来创建更新的嵌入W'。
自注意力 (self-attention) 机制会将 Embedding 输入文本中的每个单词线性投影到三个不同的空间中,从而产生三种新的表示形式:即 查询 (Query)、键 (Key) 和 值 (Value)。
这些新的嵌入将用于获得一个得分,该得分将代表 W 和每个 Wn 之间的依赖性(如果 W 强依赖 于 W',则结果为 绝对值很高的正数;若 W 与 W' 不相关,则结果为 绝对值很高的负值)。这个分数将被用来组合来自不同 Wn 单词嵌入的信息,为单词 W 创建更新的嵌入W'。
下面这张图展示了如何计算两个单词之间的 Attention 得分:
图中,蓝色线段表示来自第一个单词 W 的信息流,棕色线代表来自第二个单词 Wn 的信息流。
每个单词的嵌入将乘以一个 Key 和一个 Query 矩阵,从而得到每个单词的 Query 值和 Key 值。为计算 W 和 Wn 之间的分数,将 W(W_q) 的查询嵌入发送到 Wn(Wn_k) 的密钥嵌入,并为两个张量使用点积相乘。点积的结果值是它与自身之间的得分,表示 W 相对于 Wn 的依赖程度。
需要注意的是,我们还可以将第二个单词作为 W,以及将第一个单词作为 Wn 。这样的话,我们就可以另外计算出一个分数,表示第二个单词对第一个单词的依赖性。我们甚至可以用同一个词 W 和 Wn 来计算这个词本身对它的定义有多重要~很巧妙吧。
自注意力机制能够计算文本中每对单词之间的注意力得分。该得分将被软最大化处理 (Softmax),也就是将其转换为 0 到 1 之间的权重。
下图展示了如何使用这些权重获得每个单词的最终词嵌入:
请注意,每个单词的 Embedding 现在需要乘以第三个矩阵来生成它们的值表示。这个结果将用于计算每个单词的最终嵌入。对于每个单词 W,文本 Wn 中每个单词的计算权重将乘以其相应的值表示(Wn_v),然后将它们相加。这个加权和的结果将用于更新嵌入单词 W (图中用 e1 和 e2 表示)。这里我们只是简单的对计算过程进行介绍,如果对其中的具体过程感兴趣可以看看 Jay Alamar 的文章:https://jalammar.github.io/illustrated-transformer/。
卷积网络模型多年来在 CV 领域是绝对的大哥大,获得了无数的成功,收获了无数的好评。GPU 作为 CNN 的好基友,由于可以进行有效的并行卷积计算而身价疯长。此外,CNN 也会在图像特征提取的过程中提供适当的 归纳偏差 (Inductive Biases)。
CNN 中的卷积运算由于使用了两个重要的空间约束,从而有助于视觉特征的学习和提取:
- 由于 CNN 共享权重 的机制,卷积层所提取的特征具有 平移不变性,它们 对特征的全局位置不敏感,而 只在乎这些决定性的特征是否存在。
- 由于 CNN 卷积算子 的性质,卷积特征图具有 局部敏感性,即每次卷积操作 只会考虑原始数据的一小部分的局部信息。
因此,CNN 的归纳偏差缺乏对输入数据本身的整体把握。它很 擅长提取局部的有效信息,但是 没能提取全局数据之间的长距离特征。
例如,当用 CNN 去训练一个人脸识别模型时,卷积层可以有效地提取出眼睛大小、鼻子翘的程度、嘴巴颜色等小器官的特征,但无法将它们联系起来,无法形成 "眼镜在鼻子上"、"嘴巴在眼睛下面" 的这种长距离的特征。因为每个卷积核都很局部,无法同时处理这么多个特征。
为 提取和跟踪原始数据中的长距离相关特征,模型需 扩大自己的感受野,这就需要使用一些 更大的卷积核 及 更深的卷积。但由此会带来 计算效率的大幅下降,让 模型复杂度剧烈上升,甚至会让模型产生 维度灾难 从而无法收敛训练。
这种顾此失彼的权衡是不是听起来很耳熟?
受到 Transformer 论文中使用自注意力机制来挖掘文本中的长距离相关依赖的启发,很多 CV 领域的任务提出 使用自注意力机制来有效克服卷积归纳偏差所带来的局限性。希望能够将这种 NLP 领域中的技术思想借鉴到视觉领域中,从而提取长时依赖关系。
功夫不负有心人,Transformer 为视觉领域带来了革新性的变化,它让视觉领域中目标检测、视频分类、图像分类和图像生成等多个领域有了长足的进步。这些应用了 Transformer 技术的模型有的能达到甚至超越该领域 SOTA 解决方案的效果。更让人兴奋的是,这些技术有的甚至干脆抛弃了 CNN,直接单单使用自注意力机制来构建网络。
这些使用了自注意力机制所生成的视觉特征图不会像卷积计算一样具有空间限制。相反,它们能够根据任务目标和网络中该层的位置来学习最合适的归纳偏差。研究表明,在模型的前几层中使用自注意力机制可以学习到类似于卷积计算的结果。
如果想具体了解这一领域最近的动态,可以查看这篇由 Gbriel | lharco 撰写的推文:
CV 领域中的自注意力层,其输入是特征图,旨在计算每对特征间的注意力权重,从而得到一个更新的特征映射。其中每个位置都包含关于同一图像中任何其他特征的信息。这些层可以直接代替卷积或与卷积层相结合,它们也能够处理比常规卷积更大的感受野。因此,这些模型能够获取空间上具有长距离间隔的特征之间的依赖关系。
比如 Non-local Netorks 和 Attention Augmented Convolutional Networks 文章中所述,自注意力层最基本的实现方法是:将输入特征图的空间维度展开成为一系列的 HWxF 的特征序列,其中 HW 表示二维空间维度, F 表示特征图的深度。自注意力层可以直接作用在序列数据上来获取更新后的特征图表示。
想具体了解这两篇论文的戳这里
但实际上,对高分辨率的输入而言,自注意力机制层的计算量很大,因此它只适用于较小的空间维度输入的数据场景。
很多工作也注意到这个问题,并且提出了一些解决方案,比如 Axial DeepLab,它们沿着两个空间轴顺序计算 Attention,而不是像普通自注意力机制一样直接处理整个图像数据,这使得计算更加高效。还有一些其他的优化解决方案,比如只处理较小的特征图 Patch,而不是处理整个特征图空间。但是这样操作的代价是感受野比较小,这是在论文 Stand-Alone Self-Attention in Vision Models 中提出的。但即便这样的感受野受到了限制,也比卷积操作的卷积核的感受野要大得多。
在模型的最后一层用自注意力机制将前面的各种卷积层融合时,就可以得到最优的模型结果。
事实上,在实验中我们会发现,自注意力机制和卷积层是很类似的,尤其是在 网络的前若干层中自注意力机制学习到的归纳偏差和卷积层学习到的特征图十分类似。
现有的 CV 工作中,除了那些将自注意力机制加入卷积流程中的工作外,其他的方法的计算都仅仅依赖于自注意力层,并且只使用了最原始的 Transformer 的编-解码器结构。
当我们的模型参数量能够设置得很大,并且数据量充足时,这些模型在图像分类任务/目标检测等任务中所表现出的效果能够达到 SOTA 的程度,甚至有时更好。同时这些模型的结构会更加简单,训练速度还会更快。最原始的 Transformer 的编码-解码器结构:
接下来简要的介绍三篇重要的相关论文,它们都在自己的网络中使用了 Transformer 结构。
此文提出了一种在 ImageNet 数据集上的全新 SOTA 图像生成器,并在超高分辨率任务上取得了很好的效果。
在这篇论文中,他们将图像生成任务视作一个自回归问题,图片中的每个新像素仅基于图像中先前已知的像素值生成。在每一个特征生成过程中,自注意力机制将 m 个展开后的特征图作为上下文,从而生成未知的像素值。
为让这些像素能够匹配自注意力层的输入,论文使用 1D 卷积将每个 RGB 值转换为 d 维张量,并将局部的上下文特征图的 m 维特征展平到一维。
下图就是该模型的示意图:
在图中,q 表示要更新的像素 Embedding,它与内存中的像素 m 的所有其他嵌入相乘,使用 查询 和 键 矩阵(Wq 和 Wk)生成一个得分,然后对该得分进行 softmax 操作,并将其作为矩阵 Wv 的权重。算法最终将该 Embedding 加到原始的 q Embedding 中,从而得到最终的结果。在图中,p 表示添加到每个输入嵌入中的位置编码。这种编码是从每个像素的坐标生成的。
需注意的是,通过使用自注意力机制,算法可以并行地预测多个像素值,因为算法已经知道输入图像的原始像素值,并且用于计算自注意的 Patch 机制,可以处理比卷积层更高的感受野。但是在评估的操作过程中,由于图像的生成依赖于每个像素的邻居的值,因此只能单步执行。
DETR 是 DEtection TRansformer 的缩写,它是一种结构较为简单的模型,在目标检测领域中达到了 SOTA 的高度。
模型结构如下所示:
它搭配着使用了自注意力机制,以及从卷积神经网络提取的视觉特征。在 CNN 的主干模块中,算法计算的特征图会首先被展平,也就是说,如果特征地图具有形状 (h × w × d),则展平结果将具有形状(hw × d)。每一个维度中都添加了一个可学习的位置编码,而编码器也会将结果序列作为输入。
编码器使用多个自注意力块来组合不同 Embedding 之间的特征。处理后的 Embedding 被传递到一个解码器模块。这个解码器模块使用可学习的 Embedding 作为对象查询来处理所有视觉特征,从而生成一个嵌入。
在该嵌入中,执行目标检测所需的所有信息都被编码。每个输出被输入到一个全连接层中,该网络模块将输出一个包含元素 c 和 b 的五维张量,其中 c 表示该元素的预测类个数,b表示边界框的坐标(分别是一维和四维)。c 的值分配给一个 “no object” 标记,它表示没有找到任何有意义的检测的目标查询,所以说模型将不考虑它的坐标。
这个模型能够并行计算单个图像的多个检测。但是,它可以检测到的目标个数受制于所使用的目标查询次数。
论文的作者在文中表示,该模型在大尺寸目标识别的图像处理方面优于 SOTA 模型。他们认为这都归功于自注意力机制为模型提供了更高的感受野。
这个模型是图像识别领域的代表性 SOTA 工作,它仅使用了自注意力机制,而且达到了目前的 SOTA 识别率。
下面是论文模型的一个例子:
该模型的输入是从像素大小为 P×P 的块中提取的平坦像素向量。每个输入像素被送入一个线性投影层,这个层将产生文中所谓的 “补丁嵌入 (Patch embeddings)”。注意,在序列的开头处,模型附加了一个额外可学习的嵌入。这种嵌入处于自我注意更新之后,用于预测输入图像的类别。每个 Embedding 中也添加了一个可学习的位置Embedding。
分类只需将一个 MLP 头放在 Transformer 结构的顶部,具体的插入位置就是在我们添加到序列中的额外可学习的Embedding位置。
此外,本文还给出了一种混合的模型结构。它使用 ResNet 早期的特征映射作为 Transformer 的输入,而没有选择输入投影的图像块。通过对 Transformer 模型和 CNN 骨干网络端到端的训练,模型能够达到最好的图像分类结果。
由于 Transformers 需要学习一个具体的任务,也就是需要学习该任务的归纳偏差,所以只要进行模型训练,就都会对该网络产生一定的收益。换句话说,任何可以包含在模型输入中的归纳偏差都将有助于模型的学习,并能够用于改善结果。
当使用 Transformers 的更新功能时,输入序列的顺序信息会被丢失。对 Transformer 模型来说,顺序信息是很难被学习到的,或者说有时根本不可能被学习到。
所以,它所做的就是 将一个位置表示聚合到模型的输入嵌入中。这种位置编码可通过学习获得,也可从一个固定的函数中取样得到。虽然聚合操作通常只在输入到模型的嵌入处完成,但我们其实是可以改变这个聚合操作的位置。
在计算机视觉中,这些嵌入既可以表示特征在一维平坦序列中的位置,也可以表示特征的二维位置。
在该领域中,大家普遍认为位置编码是很有效的一种信息。它们由可学习的若干个嵌入组成。这些嵌入特征不用编码全局的位置,转而去学习各个编码特征之间的相对距离从而达到更好的效果。
原文链接:https://towardsdatascience.com/transformers-in-computer-vision-farewell-convolutions-f083da6ef8ab
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。