ViT论文学习

模型最重要的部分——怎么把cv问题转到nlp问题,即图片到tokens

ViT论文学习_第1张图片

参考B站:

37分
走一遍单张图片的前向(多张只需在所有尺寸的最前面加上batch size即可):
1.224x224x3------------------------输入图片尺寸
2.196x768---------------------------分割为尺寸为16x16的patch序列s。通道数变为768,768这个数是怎么出来的?16x16x3=768,即可以理解为把每个小patch的所有信息压成一个向量; 不过在代码实践当中,这里往往利用kernel_size=16的卷积,输入channel=3,输出的channel=768。然后再reshape得到196x768。从而省略了第3步的全连接层ViT论文学习_第2张图片事实上,这样一来,embed_dim可以自己指定了,在后续工作mae中,输出的channel不再是768,而是更大的1024

196怎么来的?14*14=196,即边长为224的一整张图片分成的patch的总数目。

3.196x768------------------------通过768x768全连接层形成tokens,维度不变
4.197x768----------------------添加特殊的cls_token,这个cls_token设置为可以学习的参数。(见上图左下角)
5.197x768---------------------对每个token叠加各自的位置编码,一个token对应一个独特的位置编码,为1x768的向量(即1D的位置编码)。
后面输入transformer,和经典的nlp版本没区别了。
D=768,这个token的维度参数在ViT是从头到尾不变的。
ViT论文学习_第3张图片

6.经过layerNorm(即上图右侧的Norm),维度不变:197x768。
7.经过Attention, 首先得到ki,qi,vi张量(i=1…12)。ki,qi,vi维度都是197x64
(假设有12个头,注意这里的i跟李宏毅课件里的i下标没关系,李宏毅课件里的i下标是token的标号)。 q i k i T q_ik_i^{T} qikiT经过scale,softmax操作得到注意力张量197x197,与vi相乘,得到经过“注意”的张量。输出后拼接维度回到197x768.
所谓多头,就是把embed_dim//头数 ,然后对每个小的部分分别做注意力最后再合起来。因此,要确保embed_dim可以被头数整除,不然会出现报错。:RuntimeError: shape ‘[10, 101, 3, 6, 10]’ is invalid for input of size 193920
8.和输入相加,维度不变197x768.
9.经过LayerNorm,仍为197x768.
10.经过一个MLP,维度先被映射为197xhidden_dim后来映射回197x768
11.和第8步的输出相加,维度不变197x768.
12.输出。

关于位置编码

经典的nlp 1D的位置编码和考虑2D位置的位置编码经过实验,效果差不多。可能是由于tokens的数目不大。

标准的transformer也能做视觉——作者的倔强

ViT仅仅使用cls_token经过transformer主体后的输出,经过MLP分类头做分类任务
事实上,不使用cls_token,而直接用所有token的输出做处理也可以做分类任务(效果和使用cls_token差不多)。作者为了证明标准的transformer也可以做视觉(通用人工智能),而不是某种技巧的堆砌保证ViT的效果。

多注意力的维度问题

D / 注 意 力 头 数 D/注意力头数 D/是每个新的Qi,Kj,Vk(i,j,k=1,…注意力头数)的维度,做完注意力拼接起这些头的输出,维度又回到了D。

你可能感兴趣的:(深度学习,transformer,自然语言处理)