transformer系列之一:从ViT讲起

2024-02-12 15:10
文章标签 系列 transformer vit 讲起

本文主要是介绍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

这篇关于transformer系列之一:从ViT讲起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702852

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava