Attention is all you need中Transformer方法


主要关注提出的Transformer,可以将不同的位置联系起来,计算相关注意力,而且不管两个信息的位置有多远,计算的复杂程度都是相同的

结构

在这里插入图片描述
结构图

编码器解码器构成,左边是编码器,右边是解码器。

编码器

将一系列表示符号 ( x 1 , . . . , x n ) (x_1,...,x_n) 映射成一系列连续的表示 z = ( z 1 , . . . , z n ) z=(z_1,...,z_n) ,由六个完全相同 ( N = 6 ) (N=6) 的层堆叠而成,每个层有两个子层: 第一个是多头self-attention机制,第二个是逐点的全连接前向传播网络。

在两个子层上面,都使用了正则化的残差连接,所以每个子层的输出都是 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) ,其中 S u b l a y e r ( x ) Sublayer(x) 是经过该子层后生成的值,为了方便做残差连接,模型中的所有的子层还有嵌入层的输出维度都是 d m o d e l = 512 d_{model} = 512

解码器

利用z来生成输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) ,一次一个,也是六个完全相同的 ( N = 6 ) (N=6) 的层堆叠而成,比编码器多了一个子层,这个子层和编码器的输出一起执行多头attention。
在这里插入图片描述
比解码器多的子层

还修改了解码器堆栈中的self-attention子层,以防止位置对后续位置的attention。
这种mask,加上输出嵌入被一个位置偏移的事实,确保了位置 i i 的预测只能依赖于小于 i i 的位置的已知输出,这个图能较好的表示Mask效果:
在这里插入图片描述

就是说当前位置的操作只能结合之前的信息,而不能依赖后面的信息对这个位置进行预测,使用Mask来将后面的位置信息都变成0
解码器就是将输出和编码后的输入一起处理,又得到一个输出,为什么这样的输出就是想要的?
找到了二者的联系?


Attention

attention函数可以看成将一个query和一系列key-value映射成一个输出。其中query、key-value还有输出都是向量,输出就是将值加权求和得来的,而这些权重是通过query和对应的key的兼容性函数得来的

兼容性就是说query和key之间越匹配,权重越大

Scaled Dot-Product Attention

这个计算是关注的重点

在这里插入图片描述
图解
在这里插入图片描述
公式
在这里插入图片描述
输入由 q u e r i e s k e y s ( d k ) v a l u e s ( d v ) queries、keys(d_k)、values(d_v) 组成,计算 q u e r y query 和所有 k e y s keys 的点乘,然后除上 d k \sqrt{d_k} ,然后再使用一个softmax函数来获得 v a l u e s values 的权重

有内味儿了,在6DVNet中,V就是 x j x_j 的特征信息,而 Q , K Q,K 都是学习出来的矩阵点乘 x i x_i c处的信息。
为什么6DVNet可以做出这样的迁移?还是说这是一种很常见的使用方法?
要先知道和迁移,那就要知道式子的参数都是什么,

Multi-Head Attention

作者发现,使用不同的、学习的线性射影来进行h次queries、keys、values到 d k , d k , d v d_k,d_k,d_v 维度的线性射影是有益的。

做了h次前向传播,每次的参数都不一样,然后把h次的结果和在一块了,再做线性射影

在这里插入图片描述
M u l t i H e a d   A t t e n t i o n Multi-Head\ Attention

多头注意力允许模型在不同的位置共同关注来自不同表示子空间的信息。只有一个注意力头,平均就会抑制这种情况

说的真对,只有一个头每种信息都会对网络参数进行调整,调来调去干啥都不行,也就是 全能=全不能。
看看6DVnet是如何处理2D平面的位置的?

M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W o MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^o
h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i = Attention(QW_i^Q,KW_i^K,VW^V_i)
其中 W i Q R d m o d e l × d k , W i K R d m o d e l × d k , W i V R d m o d e l × d v , W i O R h d v × d m o d e l W^Q_i \in R^{d_{model} \times d_k},W^K_i \in R^{d_{model} \times d_k},W^V_i \in R^{d_{model} \times d_v},W^O_i \in R^{hd_v \times d_{model}}

作者设置 h = 8 h=8 ,其他的 d k = d v = d m o d e l h = 64 d_k = d_v =\frac{d_{model}}{h} = 64 ,因为每个头的参数减少了,所以总的计算量和一个头相似。

什么时候能这么做?同范畴不同类?

Position-wise Feed-Forward Networks

解码器和编码器的每一层都有个全连接,应用在每个位置都是独立的,参数不共享,包括两个线性变换,其中加了个ReLU函数:
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x) = max(0,xW_1 +b_1)W_2 + b_2
就相当于有两个卷积核,输入和输出的维度都是512,中间的维度是2048

Positional Encoding

这一块是考虑到NLP的序列问题,如果是图像处理,或许是加入mesh层再卷积?

发布了63 篇原创文章 · 获赞 2 · 访问量 8027

猜你喜欢

转载自blog.csdn.net/McEason/article/details/104148394