学习视觉CV Transformer (1)

编程入门 行业动态 更新时间:2024-10-27 20:32:37

学习<a href=https://www.elefans.com/category/jswz/34/1769927.html style=视觉CV Transformer (1)"/>

学习视觉CV Transformer (1)

先放Transformer的经典文章
Attention Is All You Need
论文代码:

Transformer结构是google在17年的Attention Is All You Need论文中提出,首先主要是在自然语言处理NLP方面应用,取得非常好的成果,当然现在最火的ChatGPT也要归功于Transformer。
最大特点是抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。由于其出色性能以及对下游任务的友好性或者说下游任务仅仅微调即可得到不错效果。
在计算机视觉CV领域不断有人尝试将transformer引入,2020年后也出现了一些效果不错的尝试,典型的如目标检测领域的DETR和可变形DETR,分类领域的vision transformer等等。

1 Transformer介绍

以机器翻译任务为例子讲解transformer,机器翻译任务是指将一种语言转换得到另一种语言,例如英语翻译为中文任务。最简单的模型如下图所示:

1.1 早期seq2seq(序列转序列)

机器翻译是一个历史悠久的问题,本质可以理解为序列转序列问题,也就是我们常说的seq2seq结构,也可以称为Encoder-Decoder(编码-解码)结构,如下图所示:


Encoder和Decoder在早期一般是RNN模块(因为其可以捕获时序信息),后来引入了LSTM或者GRU模块,不管内部组件是啥,其核心思想都是通过Encoder编码成一个表示向量,即上下文编码向量,然后交给Decoder来进行解码,翻译成目标语言。一个采用典型RNN进行编码码翻译的可视化图如下:


可以看出,其解码过程是顺序进行,每次仅解码出一个单词。
上述结构其实有缺陷,具体来说是:
1.不论输入和输出的语句长度是什么,中间的上下文向量长度都是固定的,一旦长度过长,仅仅靠一个固定长度的上下文向量明显不合理;
2.仅仅利用上下文向量解码,会有信息瓶颈,长度过长时候可能会丢失信息
3.RNN不能做到并行操作,需要不断交互,处理速度会变慢

通俗理解是编码器与解码器的连接点仅仅是编码单元输出的隐含向量,其包含的信息有限,对于一些复杂任务可能信息不够,如要翻译的句子较长时,一个上下文向量可能存不下那么多信息,就会造成翻译精度的下降。

1.2 基于attention的seq2seq

基于上述缺陷进而提出带有注意力机制Attention的seq2seq,同样可以应用于RNN、LSTM或者GRU模块中。
注意力机制Attention对人类来说非常好理解,假设给定一张图片,我们会自动聚焦到一些关键信息位置,而不需要逐行扫描全图。
此处的attention也是同一个意思,其本质是对输入的自适应加权,结合CV领域的SEnet中的SE模块就能好理解了


SE模块最终是学习出一个1x1xC的向量,然后逐通道乘以原始输入,从而对特征图的每个通道进行加权即通道注意力,对Attention进行抽象,不管啥领域其机制都可以归纳为下图:

将Query(通常是向量)和4个Key(和Q长度相同的向量)分别计算相似性,
然后经过softmax得到q和4个key相似性的概率权重分布,
接着对应权重乘以Value(和Q长度相同的向量),
最后相加即可得到包含注意力的Attention value值输出。

举个简单例子说明:

  • 假设世界上所有小吃都可以被标签化,例如微辣、特辣、变态辣、微甜、有嚼劲…,总共有1000个标签,现在我想要吃的小吃是[微辣、微甜、有嚼劲],这三个单词就是,我的Query
  • 来到南门老街一共100家小吃点,每个店铺卖的东西不一样,但是肯定可以被标签化,例如第一家小吃被标签化后是[微辣、微咸],第二家小吃被标签化后是[特辣、微臭、特咸],第二家小吃被标签化后是[特辣、微甜、特咸、有嚼劲],其余店铺都可以被标签化,每个店铺的标签就是Keys,但是每家店铺由于卖的东西不一样,单品种类也不一样,所以被标签化后每一家的标签List不一样长
  • Values就是每家店铺对应的单品,例如第一家小吃的Value1是[烤羊肉串、炒花生]
  • 将Query和所有的Keys进行一一比对,相当于计算相似性,此时就可以知道我想买的小吃和每一家店铺的匹配情况,最后有了匹配列表,就可以去店铺里面买东西了(Values和相似性加权求和)。最终的情况可能是,我在第一家店铺买了烤羊肉串,然后在第10家店铺买了个玉米,最后在第15家店铺买了个烤面筋

以上就是完整的注意力机制,采用我心中的标准Query去和被标签化的所有店铺Keys一 一比对,此时就可以得到我的Query在每个店铺中的匹配情况,最终去不同店铺买不同东西的过程就是权重和Values加权求和过程。
简要代码如下:

# 假设q是(1,N,512),N就是最大标签化后的list长度,k是(1,M,512),M可以等于N,也可以不相等
# (1,N,512) x (1,512,M)-->(1,N,M)
attn = torch.matmul(q, k.transpose(2, 3))  ## torch.matmul 矩阵相乘
# softmax转化为概率,输出(1,N,M),表示q中每个n和每个m的相关性
attn=F.softmax(attn, dim=-1)
# (1,N,M) x (1,M,512)-->(1,N,512),V和k的shape相同
output = torch.matmul(attn, v)

带有Attention的RNN模块组成的ser2seq,解码时候可视化如下:


在没有Attention时候,不同解码阶段都仅仅利用了同一个编码层的最后一个隐含输出,
加入Attention后,可以通过在每个解码时间步输入的都是不同的上下文向量,

以上图为例,解码阶段会将第一个开启解码标志(也就是Q)与编码器的每一个时间步的隐含状态(一系列Key和Value)进行点乘计算相似性得到每一时间步的相似性分数
然后通过softmax转化为概率分布
接着将概率分布和对应位置向量进行加权求和得到新的上下文向量
最后输入解码器中进行解码输出,
其详细解码可视化如下:

通过上述简单的attention引入,可以将机器翻译性能大幅提升,引入attention有以下几个好处:

  • 注意力显著提高了机器翻译性能
  • 注意力允许解码器以不同程度的权重利用到编码器的所有信息,可以绕过瓶颈
  • 通过检查注意力分布,可以看到解码器在关注什么,可解释性强

1.3 基于Transformer的seq2seq

基于Attention的seq2seq的结构虽然说解决了很多问题,但是其依然存在不足

  • 不管是采用RNN、LSTM还是GRU都不利于并行训练和推理,因为相关算法只能从左向右依次计算或者从右向左依次计算
  • 长依赖信息丢失问题,顺序计算过程中信息会丢失,虽然LSTM号称有缓解,但是无法彻底解决

最大问题应该是无法并行训练,不利于大规模快速训练和部署,也不利于整个算法领域发展,
故在Attention Is All You Need论文中抛弃了传统的CNN和RNN,将Attention机制发挥到底,整个网络结构完全是由Attention机制组成,这是一个比较大的进步。

Google所提基于Transformer的seq2seq整体结构如下所示:

其,包括6个结构完全相同的编码器,和6个结构完全相同的解码器,其中每个编码器和解码器设计思想完全相同,只不过由于任务不同而有些许区别,整体详细结构如下所示:

其中N=6,由于基于Tansformer的翻译任务已经转化为分类任务( 目标翻译句子有多长,那么就有多少个分类样本 ),故在解码器最后会引入FC+Softmax层进行概率输出,训练也比较简单,直接采用ce loss即可,对于采用大量数据训练好的预训练模型,下游任务仅仅需要训练FC层即可。
上述结构看起来有点复杂,一个稍微抽象点的图示如下:


看起来比基于RNN或者其余结构构建的seq2seq简单很多。

下面结合代码和原理进行深入分析
下一篇:学习视觉CV Transformer (2)

更多推荐

学习视觉CV Transformer (1)

本文发布于:2023-12-03 23:08:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1658751.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:视觉   CV   Transformer

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!