深度学习进阶(五)Vision Transformer有哪些应用?

摘要:在上一篇,我们已经完整介绍了原始 Transformer 的结构和整体传播逻辑。 从结果上看,Transformer 在 NLP 领域带来了范式级的突破:通过自注意力机制实现了对序列的全局建模能力。 然而,实际上,原始 Transforme
在上一篇,我们已经完整介绍了原始 Transformer 的结构和整体传播逻辑。 从结果上看,Transformer 在 NLP 领域带来了范式级的突破:通过自注意力机制实现了对序列的全局建模能力。 然而,实际上,原始 Transformer 依然只是一个面向序列数据的模型。 自然而然地,这种全新的建模方式引起了相关的思潮,首当其冲的便是: 既然自注意力机制本质上是一种全局依赖建模方法,它是否真的只适用于“序列”这一种数据形式? 换句话说,如果我们不再局限于文本,而是将目光投向更广泛的数据类型,例如图像这种天然具有二维结构的信息,Transformer 是否依然能够发挥作用? 于是 Vision Transformer 应运而生。它尝试回答的问题便是: 如果抛开卷积结构,仅依赖注意力机制,能否完成视觉任务的建模? 我们以此为出发点,展开 Vision Transformer,即 ViT 的逻辑。 1. ViT 的核心思想 ViT 提出于 2020 年的论文:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale,它首次证明了纯 Transformer(无卷积)可以在视觉任务上达到 SOTA 。 你会发现 ViT 的提出距离原始 Transformer 的发表已经过去三年了,但这并不意味着Transformer 的发展进入了停滞期。 实际上,这三年正是 Transformer 爆炸式扩展的阶段,只不过主要发生在 NLP 内部,在语言任务中完成充分验证之后,Transformer 逐渐被视为一种通用的序列建模框架。在此基础上,向视觉等其他模态的扩展,才成为顺理成章的下一步。 再回到 ViT 自身,其核心思路不难理解,可以一句话概括: 把图像切成“块(Patch)”,然后当作 token 序列送入 Transformer 的 encoder 。 2.ViT 的数据处理 要说明的是:对标 CV 任务,ViT 只使用了 Transformer 的 encoder 逻辑,因此,其重点其实是在对数据的处理上。 2.1 Patch 划分 首先,我们要把图像分割成一个个等大不重叠的块,即 Patch : 原始 ViT 设计输入图像大小为 \(224 \times 224 \times 3\),而 patch 大小是 \(16 \times 16\) 。 于是,最终得到 patch 数量即为: \[N = \frac{224 \times 224}{16 \times 16} = 14 \times 14 = 196 \] 很好理解,再简单推广一下,对于输入图像: \[\mathbf{X} \in \mathbb{R}^{H \times W \times C} \] 如果设计每个 patch 大小为 \(P \times P\),那么得到的 patch 数量就是: \[N = \frac{HW}{P^2} \] 2.2 展平 现在,我们已经把一张二维图像拆成了 \(N\) 个小块。但仍然存在问题:Transformer 并不能直接处理二维结构的数据,它只能接收“向量序列”。 因此,接下来要做的事情就很明确了:把每一个 Patch 转换为一个向量。 而转换方法就是最基本的展平: 即对于每一个 patch,其原始形状为: \[P \times P \times C \] 我们将其按通道展开为一个一维向量: \[\mathbf{x}_p \in \mathbb{R}^{P^2 \cdot C} \] 以 ViT 中的配置 \(P = 16\)、\(C = 3\) 为例,则: \[\mathbf{x}_p \in \mathbb{R}^{16 \times 16 \times 3 = 768} \] 现在,每一个 patch 已经变成了一个固定长度的向量表示。 但是,我们在很早之前的图像处理基础中就提到过:展平会带来空间信息的损失。 在这一步处理后,数据就无法再提供类似“鼻子要在嘴巴上面”的空间信息了,这也是我们在卷积内容中提到的用全连接网络处理图像的弊端之一。 显然,ViT 会采用别的措施来弥补这个问题,我们继续: 2.3 线性映射 完成展开后,我们已经得到了每个 patch 的序列表示,但这里还有一个细节问题:展平后的向量维度是 \(P^2C\),而 Transformer 的输入维度通常是一个统一的隐藏维度 \(D\)。
阅读全文