从Transformer到ViT:多模态编码器算法原理解析与实现

Posted 易烊千玺铁粉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Transformer到ViT:多模态编码器算法原理解析与实现相关的知识,希望对你有一定的参考价值。

从Transformer到ViT:多模态编码器算法原理解析与实现

Transformer架构是一种使用自注意力机制的神经网络,最初是由谷歌提出的,被广泛应用于自然语言处理和图像处理任务中。它是一种基于注意力机制的深度学习模型,适用于序列到序列的学习任务,例如机器翻译、语音识别、文本摘要等。

多模态Transformer前部分encoder算法是近年来在计算机视觉领域备受瞩目的研究方向之一。它的出现极大地推动了多模态信息的融合与处理,被广泛应用于图像、文本等多种数据类型的处理。

其中,Vision Transformer(ViT)是一种以Transformer为基础的视觉编码器,已经在各种视觉任务中取得了极佳的效果。本篇博客将介绍多模态Transformer前部分encoder算法的原理,重点讲解其在ViT中的实现,同时附带完整的ViT代码实现。如果您对多模态Transformer前部分encoder算法感兴趣,或是对ViT的实现方式想要深入了解,本文或许能为您提供帮助。

下面是vit模型核心架构图,下文是对模型架构各部分做了详细的介绍。

模型架构与算法原理

Image Token Embedding

模型输入一个将一张28x28x3的图片,模型先将图片切成一个16块,每一块为7x7。还是3通道的。

再将7x7,3通道的数据,并成一行,[1,7x7x3]=[1,147],
有16块那就是[16,147]。

接着将图片转为特征向量Embedding:
I m a g e 16 ∗ 147 Image_16*147 Image16147* W 147 ∗ 96 W_147*96 W14796= E m b e d d i n g Embedding Embedding

其中 W 147 ∗ 96 W_147*96 W14796就是要训练的参数,也就是下图中的Patch Embedding,

Multi-head Self-attention流程

依据模型输入的图片转换为的Image token Embedding,我们假设这个图像块集合为 [ x 1 , x 2 , . . . , x 16 ] [x_1, x_2, ..., x_16] [x1,x2,...,x16],每个图像块的维度为 96 × 16 96 \\times 16 96×16,接着将这个embedding输入到transformer中。

在transformer首先进入到Multi-head Self-attention进行以下四个步骤:线性变换、多头机制、scale和softmax、多头机制。下面我们将逐步说明这些步骤的算法流程。

线性变换

我们首先将每个图像块 x i x_i xi映射到一个10维的向量 z i z_i zi

这个映射是通过对 x i x_i xi做一个线性变换得到的,具体而言,我们将 x i x_i xi乘以一个 96 × 10 96 \\times 10 96×10的权重矩阵 W q W_q Wq得到一个10维的向量 z i z_i zi

z i = W q a i z_i = W_q a_i zi=Wqai

其中 z i z_i zi向量包含有 q i , k i , v i q_i,k_i,v_i qi,ki,vi,模型训练需要算出参数有三个变换矩阵 W q , W k , W v W_q,W_k,W_v WqWkWv

MatMul

我们计算每个图像块 x i x_i xi与其他所有图像块的注意力分数。具体而言,我们计算每对图像块 ( x i , x j ) (x_i, x_j) (xi,xj)的注意力分数 a i , j a_i,j ai,j,并将其用于加权求和所有图像块的向量表示。

为了计算注意力分数,我们需要先计算每对图像块之间的“相似度”

这个相似度是通过将 q i q_i qi k j k_j kj做点积得到的。
其中, q i q_i qi k j k_j kj分别是图像块 i i i和图像块 j j j通过线性变换得到的向量。这个点积的结果可以看作是两个向量的余弦相似度,用于衡量它们之间的相似程度, i ∈ [ 1 , 16 ] , j ∈ [ 1 , 16 ] i \\in[1,16],j\\in [1,16] i[1,16],j[1,16]

s j = q i ⋅ k j s_j = q_i \\cdot k_j sj=qikj

Scale和softmax

然而,直接计算点积可能会因为向量维度较大而导致计算上的不稳定性,因此我们在计算前先将 q i q_i qi k j k_j kj除以一个缩放因子 10 \\sqrt10 10 ,就是特征的维度10,从而保证点积的值较小,不容易出现计算上的不稳定性,然后在进行softmax函数计算。

具体公式如下:

p j = s o f t m a x ( ∑ i ∑ j q i ⋅ k j 10 ) = q i ⋅ k j 10 ∑ i ∑ j q i ⋅ k j 10 p_j =softmax(\\sum_i\\sum_j\\fracq_i \\cdot k_j\\sqrt10)=\\frac \\fracq_i \\cdot k_j\\sqrt10\\sum_i\\sum_j \\fracq_i \\cdot k_j\\sqrt10 pj=softmax(ij10 qikj)=ij10 qikj10 qikj

其中, ⋅ \\cdot 表示向量点积运算。注意力分数的分母 10 \\sqrt10 10以上是关于从Transformer到ViT:多模态编码器算法原理解析与实现的主要内容,如果未能解决你的问题,请参考以下文章

从ViT到Swin,10篇顶会论文看Transformer在CV领域的发展历程

一文梳理视觉Transformer:与CNN相比,ViT赢在哪儿?

2021深度学习的研究方向推荐!TransformerSelf-SupervisedZero-Shot和多模态

Transformer专题Vision Transformer(ViT)原理 + 代码

PyTorch笔记 - Position Embedding (Transformer/ViT/Swin/MAE)

PyTorch笔记 - Position Embedding (Transformer/ViT/Swin/MAE)