transformer系列之一:从ViT讲起

想做一系列关于transformer的论文整理,系统梳理下其进化路线,同时记录自己的学习过程。

本文主要将从封神之作-Visual Attention Transformer (ViT)讲起,重点讲述其原理,并总结给出相关code连接.期待后面陆续更新!

1 论文原文
Title: An image is worth 16x16 words: Transformers for image recognition at scalehttps://arxiv.org/abs/2010.11929
code: 原文github code
原文链接见文末,看了下Google scholar,发现其引用已经超过3000次。自该文发表之后,模仿和改进版ViT可谓刷榜利器,高歌猛进,动摇了CNN不可一世的霸主地位,甚至一度有超越CNN的势头。

2 Visual Attention Transformer到底是个啥
先上图,一睹为快,再来慢慢细品。


ViT模型框架

从图中可以看出,ViT主要结构包括patch prepare,patch线性映射,patch
+position Embeding,encoder, classification。其中关键是patch
+position Embeding和encoder, 难点在于Encoder中的Multi-Head Attention(MSA)的理解和实现。细节如下:

  • patch prepare: 对于输入的图片信号,先设定patch大小:H * W ,原文中H=W,实际可根据自己的任务调整;然后按照设定的H和W分别对原图的长宽分割,形成一系列的小图,称为patch,patch全部排列起来,等待下一步;
  • 线性映射:这里需要首先设定embedding_dim, 也就是需设定映射后的维度大小,这一步实际是把二维patch映射成一维数据,其大小为embedding_dim,映射方法可以是全连接linear,也可以是kerner=1的CNN;
  • ViT的神来之笔来到了,作者在embedding层加入了和embedding同样规模位置参数和一个额外的类标签。常见的位置参数可以是正弦的,也可以设为随机数,通常这部分参数设为可学习状态,即会随着网络学习而不断更新;
  • 紧着就到了重难点的Encoder部分,由ViT模型框图中的transformer Encoder部分可以看出,Encoder由多头注意力机制Multi-Head Attention(MSA)和一个全连接层MLP构成,两者均使用了Resdual Model结构。要理解MSA结构其实得从Self-Attention说起,Self-attention结构可谓被大家玩得不亦乐乎,有时有用,有时也玄学。

继续来填坑:
self-attention的计算公式如下,大家看来也许很眼熟,也许和我一样在刚开始看到这公式时有些困惑:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V . (1) Attention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt {d_k}}\right)V\tag{1} . Attention(Q,K,V)=softmax(dk QKT)V.(1)
那么,Q、K、V、 d k {d_k} dk是啥呀,我们似乎只对softmax熟悉点【归一化】?别急,透过现象看本质,咱们先来回顾下向量的内积 x x T xx^T xxT的含义,进而理解矩阵与其转置的乘积 X X T XX^T XXT又有何表征意义。抄一段百度百科的解释如下:

  • 两个向量的内积 x y T xy^T xyT两种定义方式:代数方式和几何方式。
    通过在欧氏空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。
    广义定义:在一个向量空间V中,定义在 上的正定对称双线性形式函数即是V的数量积,而添加有一个数量积的向量空间即是 内积空间
    代数定义:设二维空间内有两个向量 x → = ( x 1 , x 2 ) \overrightarrow {x}=(x_1,x_2) x =(x1,x2) y → = ( y 1 , y 2 ) \overrightarrow {y}=(y_1,y_2) y =(y1,y2) ,定义它们的数量积(又叫内积、点积)为以下实数:
    x → ∙ y → = x 1 y 1 + x 2 y 2 (2) \overrightarrow {x}\bullet\overrightarrow {y} =x_1y_1+x_2y_2 \tag{2} x y =x1y1+x2y2(2)
    更一般地,n维向量的内积定义如下:
    x → ∙ y → = ∑ i = 1 n x i y i = x 1 y 1 + x 2 y 2 + ⋯ + x n y n (3) \overrightarrow {x}\bullet\overrightarrow {y} =\sum_{i=1}^nx_iy_i =x_1y_1+x_2y_2+\cdots +x_ny_n\tag{3} x y =i=1nxiyi=x1y1+x2y2++xnyn(3)
    上述计算有没有让人觉得像矩阵乘法,确实就是呀!
    几何定义:设二维空间内有两个向量 \overrightarrow {x}和\overrightarrow {y} , ∣ x → ∣ |\overrightarrow {x}| x ∣ y → ∣ |\overrightarrow {y}| y 表示向量a和b的大小,它们的夹角为 ,则内积定义为以下实数:
    x → ∙ y → = ∣ x → ∣ ∣ y → ∣ c o s θ (4) \overrightarrow {x}\bullet\overrightarrow {y} =|\overrightarrow {x}||\overrightarrow {y}|cos\theta\tag{4} x y =x y cosθ(4)

该定义只对二维和三维空间有效??? 这个有效的含义我也没明白,大家可先忽略,望高人指点。

这个运算可以简单地理解为:在点积运算中,第一个向量投影到第二个向量上(这里,向量的顺序是不重要的,点积运算是可交换的),然后通过除以它们的标量长度来“标准化”。这样,这个分数一定是小于等于1的,可以简单地转化成一个角度值。这个角度值可以表示两个向量的相似性。 这个角度值越大说明两个向量的相关度就越高 。这一点在后面我们将反复提起。
向量的内积运算可以表示两向量之间相似性,那矩阵内积 X X T XX^T XXT呢?
令, X = ( x 1 → ; x 2 → ; … ; x n → ) X = (\overrightarrow {x_1};\overrightarrow {x_2};\dots;\overrightarrow {x_n}) X=(x1 x2 xn ),矩阵 X X T XX^T XXT是一个 n ∗ n n*n nn方阵,我们以行向量的角度理解, X X T XX^T XXT里面保存了n个行向量与所有行向量(包括自己在内的n个行向量)进行内积运算的结果。这可以理解为是升级版内积。

s o f t m a x ( X X T ) softmax(XX^T) softmax(XXT)就可以理解为对上述内积结果的归一化了。
s o f t m a x ( z i ) = e z i ∑ c = 1 C e z c (5) softmax(z_i) = \frac{e^{z_i}}{\sum^C_{c=1} e^{z_c}} \tag{5} softmax(zi)=c=1Cezcezi(5)

那么,呼之欲出的Attention机制的核心–加权求和

那么,回到公式(1):

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V . (1) Attention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt {d_k}}\right)V\tag{1} . Attention(Q,K,V)=softmax(dk QKT)V.(1)
盗个图[3]:

在这里插入图片描述

其实,许多文章中所谓的Q K V矩阵、查询向量之类的字眼,其来源是 X X X 与矩阵的乘积,本质上都是 X X X的线性变换。

为什么不直接使用 X X X 而要对其进行线性变换?

当然是为了提升模型的拟合能力,矩阵 w w w都是可以训练的,可以有利于模型的训练和泛化。
如下流程计算 X 1 X_1 X1在序列中的Attention:
X_1
X 1 X_1 X1会通过三个相同形式的矩阵计算得到对应q,k,v值,这三者本质都是X线性变换得到的。只是各自使命不同,q与k内积,求得相似性,

在这里插入图片描述
d k \sqrt{d_k} dk 的意义
假设Q、K里的元素的均值为0,方差为1,那么 A T = Q T K A^T=Q^TK AT=QTK中元素的均值为0,方差为d. 当d变得很大时, A A A 中的元素的方差也会变得很大,如果 A A A中的元素方差很大,那么 A A A 的分布会趋于陡峭(分布的方差大,分布集中在绝对值大的区域)。总结一下就是 s o f t m a x ( A ) softmax(A) softmax(A)的分布会和d有关。因此 A A A中每一个元素除以 d k \sqrt{d_k} dk 后,方差又变为1。这使得 s o f t m a x ( A ) softmax(A) softmax(A)的分布“陡峭”程度与d解耦,从而使得训练过程中梯度值保持稳定。这个 d k d_k dk在ViT中其实就是embedding_dim,embeding的维度。

相似性通过scale和归一化,即视为attention,再与v相乘,即加权。
在这里插入图片描述
在这里插入图片描述

那self-attention又是怎么升级成multi-head Attention呢?看一下直观的图:
在这里插入图片描述
没错,可以理解为多个self-attention的组合操作,只是在代码实现上使用了一些矩阵的技巧。其本质就是线性变换->求相似性->加权求和。

在这里插入图片描述

这部分内容在开源项目“百度PaddleViT 视频”也有介绍,讲解很直观,上面ViT的拆解图也是视频里的,搬运于此希望帮助自己和大家共同理解,有兴趣的也可以先去看看,见参考文献2。

仓促成文,难免出错,欢迎评论指正!

觉得有用点个赞呀~

参考文献:
[1] Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., … & Houlsby, N. (2020). An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929. ViT https://arxiv.org/pdf/2010.11929.pdf?ref=https://githubhelp.com

[2] 开源项目,百度PaddleViT 视频,带你code飞起https://aistudio.baidu.com/aistudio/course/introduce/25102

[3] 超详细图解Self-Attention

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值