注意力机制与Transformer

注意力机制(Attention)

简介

Attention机制可以描述为将一个query和一组key-value对映射到一个输出,其中query,keys,values和输出均是向量。输出是values的加权求和,其中每个value的权重 通过query与相应key的兼容函数来计算。

Attention机制

计算步骤

那么Query,Key,Value是什么意思呢?它们在Attention的计算中扮演着什么角色呢?先看一下Attention的计算方法,整个过程分成7步:

  1. 如上文,将输入单词转化成嵌入向量;
  2. 根据嵌入向量得到Q,K,V三个向量;
  3. 为每个向量计算一个score=Q*K;
  4. 为了梯度的稳定,Transformer使用了score归一化,即除以√(𝑑_𝑘 );
  5. 对score施以softmax激活函数;
  6. softmax点乘Value值 V,得到加权的每个输入向量的评分S;
  7. 相加之后得到最终的输出结果 Z=∑𝑆 。

运行可视化详解

在这里插入图片描述
在这个机制中,每个单词有3个不同的向量,它们分别是Query向量(Q ),Key向量(K)和Value向量(V),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量X乘以三个不同的权值矩阵𝑊𝑄,𝑊K,𝑊𝑉, 得到,其中三个矩阵的尺寸也是相同的。均是 512*64。
计算过程
这是计算的相应过程。
生成QKV
分别生成QKV矩阵
计算总结果Z矩阵
计算总结果Z矩阵。
总框架如下图所示:
总框架
在这项工作中,我们采用h=8 个并行attention层或head。 对每个head,我们使用dk​=dv​=dmodel​/h=64。 由于每个head尺寸上的减小,总的计算成本与具有全部维度的单个head attention相似。Multi-Head Attention相当于h个不同的self-attention的集成(ensemble),在这里我们以h=8举例说明。
Multi-Head Attention的输出分成3步:

  1. 将数据X分别输入到图13所示的8个self-attention中,得到8个加权后的特征矩阵𝑍_𝑖。
  2. 将8个𝑍_𝑖按列拼成一个大的特征矩阵;
  3. 特征矩阵经过一层全连接后得到输出Z。

两种版本

Scaled Dot-Product Attention

我们称我们的特殊attention为Scaled Dot-Product Attention(Figure 2)。输入由query、d_k 的key和d_v 的value组成。我们计算query和所有key的点积,再除以√(d_k ) ,然后再通过softmax函数来获取values的权重。
在实际应用中,我们把一组query转换成一个矩阵Q,同时应用attention函数。key和value也同样被转换成矩阵K和矩阵V。我们按照如下方式计算输出矩阵:
Attention公式
additive attention和dot-product(multi-plicative) attention是最常用的两个attention 函数。dot-product attention除了没有使用缩放因子1/√(d_k ) 外,与我们的算法相同。Additive attention使用一个具有单隐层的前馈神经网络来计算兼容性函数。尽管在理论上两者的复杂度相似,但是在实践中dot-product attention要快得多,而且空间效率更高,这是因为它可以使用高度优化的矩阵乘法代码来实现。
当d_k 的值较小时,这两种方法性能表现的相近,当d_k 比较大时,addtitive attention表现优于 dot-product attention。我们认为对于大的d_k ,点积在数量级上增长的幅度大,将softmax函数推向具有极小梯度的区域。为了抵消这种影响,我们对点积扩展1/√(d_k ) 倍。

Multi-Head Attention

相比于使d_model l维度的queries,keys,values执行一个attention函数,我们发现使用不同的学习到的线性映射把queries, keys 和 values线性映射到d_k , d_k 和 d_v 维度h次是有益的。在queries,keys和values的每个映射版本上,我们并行的执行attention函数,生成d_v 维输出值。它们被拼接起来再次映射,生成一个最终值,如 Figure 2 中所示。
Multi-head attention允许模型把不同位置子序列的表示都整合到一个信息中。如果只有一个attention head,它的平均值会削弱这个信息。
多头注意力机制

Transformer

Model Architecture(模型结构)

大多数有竞争力的序列转换模型都有encoder-decoder结构。这里,encoder将符号表示的输入序列(x1,…,xn)映射成一个连续表示的序列z=(z1,…,zn)。给定z,解码器以一次生成一个字符的方式生成输出序列(y1,…,ym) 。在每一步,模型都是自回归的,在生成下一个字符时,将先前生成的符号作为附加输入。
Transformer遵循这个总体架构,使用堆叠的self-attention层、point-wise和全连接层,分别用于encoder和decoder,如图1的左半部分和右半部分所示
transformer

Encoder and Decoder Stacks(编码器栈和解码器栈)

Encoder

encoder由N(N=6)个完全相同的layer堆叠而成.每层有两个子层。第一层是multi-head self-attention机制,第二层是一个简单的、位置全连接的前馈神经网络。我们在两个子层的每一层后采用残差连接,接着进行layer normalization。也就是说,每个子层的输出是 LayerNorm(x+Sublayer(x)),其中Sublayer(x) 是由子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及embedding层产生的输出维度都为d_model =512。

Decoder:

decoder也由N(N=6)个完全相同的layer堆叠而成.除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行multi-head attention操作,与encoder相似,我们在每个子层的后面使用了残差连接,之后采用了layer normalization。我们也修改了decoder stack中的 self-attention 子层,以防止当前位置信息中被添加进后续的位置信息。这种掩码与偏移一个位置的输出embedding相结合, 确保对第i个位置的预测 只能依赖小于i 的已知输出。

模型可视化详解

如论文中所设置的,编码器由6个编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入。
在这里插入图片描述

每个Encoder有两个子层。第一层是multi-head self-attention机制,第二层是一个简单的、位置全连接的前馈神经网络。每一子层后采用残差连接,接着进行layer normalization。
Decoder和encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:

  1. Self-Attention:当前翻译和已经翻译的前文之间的关系;
  2. Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。
    在这里插入图片描述
    在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量 Z,这个Z便是论文公式1中的Attention(Q,K,V)。得到Z之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
    在这里插入图片描述
    Z= Attentions(Q,K,V)。
    在这里插入图片描述
    完。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值