发布时间:2024-10-10 19:01
论文:https://arxiv.org/abs/1706.03762
编码器(左边)和解码器(右边)
左边的编码器一共有N = 6个子编码器,图中仅显示一个。
每一个子编码器都有两层,一层是Multi-Head Attention (多头自注意机制),另一层是 Feed Forward(全连接的前馈网络)。这两层都使用一个恒等映射(残差结构),然后进行层归一化。每一层的输出表示为 LayerNorm ( x + Sublayer ( x ) ) \\text{LayerNorm}(x + \\text{Sublayer}(x)) LayerNorm(x+Sublayer(x))其中 Sublayer ( x ) \\text{Sublayer}(x) Sublayer(x)为Multi-Head Attention 或者 Feed Forward。
为了方便这些残差连接,模型中的所有的层以及嵌入层产生维度为 d m o d e l = 512 d_{model}= 512 dmodel=512 的输出。
右边的解码器一共有N = 6个子解码器,图中仅显示一个。
每一个子解码器都有三层,子解码器的上两层和子编码器差不多,将编码器的输出一分为二作为子解码器中间层的输入。
子解码器第一层。因为预测是一个前向过程,所以为了防止该位置对后续位置的注意(确保了位置i的预测只能依赖于小于i位置的已知输出),需要对输出进行掩盖。
子编码器和子解码器的 Multi-Head Attention
Multi-Head Attention允许模型同时关注不同位置的不同表示子空间的信息。如果只有一个attention head,平均就会抑制这一点。
在上一张架构图中可以看到,输入经过输入嵌入和位置嵌入后一分为三,(下图)从右到左分别为查询、键、值(Q、K、V)。
Multi-Head Attention 一共有h层,将Q、K、V一分为h,Q、K、V分别经过一个线性映射,再经过Scaled Dot-Product Attention,合并h层,最后经过一个线性映射。
head i \\text{head}_i headi:
where head i = Attention ( Q W i Q , K W i K , V W i V ) \\text{where head}_i= \\text{Attention}(QW_i^Q, KW_i^K, V W_i^V) where headi=Attention(QWiQ,KWiK,VWiV)
MultiHead \\text{MultiHead} MultiHead:
MultiHead ( Q , K , V ) = Concat (head 1 , . . . , head h ) W O \\text{MultiHead}(Q, K, V ) = \\text{Concat}\\text{(head}_1, ...,\\text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
看下图,Q和K的点积(得到Q和K相关性) —> 缩放Scale —> (Mask) —> softmax(得到权重) —> V和权重的点积 —> 输出。其公式如下:
Attention ( Q , K , V ) = s o f t m a x ( Q K ⊤ d k ) V \\text{Attention}(Q, K, V ) = softmax(\\frac{QK^{\\top}}{\\sqrt d_k})V Attention(Q,K,V)=softmax(d kQK⊤)V
其中,除以 d k \\sqrt d_k d k的目的:理论上的复杂性一样,实践上矩阵乘法更快。
其中,Mask 在子解码器中使用。
Transformer 以三种不同的方式使用Multi-Head Attention(下图橙色部分):
左边 Multi-Head Attention:
右上 Multi-Head Attention:
右下 Multi-Head Attention:
两层全连接的前馈网络
FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \\text{FFN}(x) = \\text{max}(0, xW_1+ b1)W_2+ b_2 FFN(x)=max(0,xW1+b1)W2+b2
使用学习的嵌入将输入标记和输出标记转换为维度为 d m o d e l d_{model} dmodel的向量。
还使用通常学习的线性变换和softmax函数来将解码器输出转换为预测的下一个token的概率。
在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。在嵌入层中,我们将这些权值乘以 d m o d e l \\sqrt {d_{model}} dmodel 。
模型不包含递归和卷积,为了让模型利用序列的顺序,我们必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们将“位置编码”添加到编码器和解码器的第一个子编码器和子解码器的输入嵌入中。
位置编码与嵌入具有相同的维度 d m o d e l d_{model} dmodel,因此可以将两者相加。有许多位置编码可供选择,包括学习的和固定的。
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) P E(pos,2i)= sin(pos/10000^{2i/d_{model}})\\\\ P E(pos,2i+1)= cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
p o s pos pos 是位置, i i i 是维数。也就是说,位置编码的每个维度对应于一个正弦信号。波长从 2 π 2\\pi 2π到 10000 ⋅ 2 π 10000·2\\pi 10000⋅2π呈几何级数。我们选择这个函数是因为我们假设它可以让模型很容易地了解相对位置,因为对于任意固定偏移量 k k k, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。
自注意力,有时也被称为内注意,是一种注意机制,将单个序列的不同位置联系起来,以计算该序列的表示。
在本节中,我们将自注意层的各个方面与循环层和卷积层进行比较,这些层通常用于映射一个可变长度的符号表示序列(x1,…, xn)到另一个等长序列(z1,…, zn),具有xi, zi∈Rd,如典型序列转换编码器或解码器中的隐藏层。在激励我们使用自注意时,我们考虑了三个需要。
一个是每层的总计算复杂度。另一个是可以并行化的计算量,由所需的最小顺序操作数来衡量。三是网络中长距离依赖之间的路径长度。学习长期依赖是许多序列转导任务的关键挑战。影响学习这种依赖关系能力的一个关键因素是网络中前进和后退信号必须经过的路径长度。输入和输出序列中任意位置组合之间的这些路径越短,就越容易学习长期依赖[12]。因此,我们也比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表1所示,自注意层用固定数量的顺序执行操作连接所有位置,而循环层需要O(n)个顺序操作。在计算复杂性方面,self-attention层速度比周期性层当序列长度n小于表示维数d,这是最常使用的情况下与句子表示最先进的机器翻译模型,如word-piece[38]和byte-pair[31]表示。为了提高涉及很长的序列的任务的计算性能,可以将自注意限制为只考虑输入序列中以各自输出位置为中心的大小为r的邻域。这将使最大路径长度增加到O(n/r)。我们计划在今后的工作中进一步研究这种方法。
单个卷积层的核宽度为k < n,不连接所有的输入和输出位置对。如果是连续的核,则需要O(n/k)个卷积层,如果是扩张的卷积[18],则需要O(logk(n))个卷积层,增加网络中任意两个位置之间的最长路径的长度。卷积层通常比递归层的代价高k倍。然而,可分离卷积[6]大大降低了复杂度,达到O(k·n·d + n·d2)。然而,即使k = n,可分离卷积的复杂性等于自注意层和点前馈层的结合,这是我们在模型中采用的方法。
作为附带好处,自我关注可以产生更多可解释的模型。我们从我们的模型中考察注意力分布,并在附录中给出并讨论例子。单个注意头不仅清楚地学会了执行不同的任务,而且许多注意头似乎表现出了与句子的句法和语义结构相关的行为。
【Azure 应用服务】App Service 开启了私有终结点(Private Endpoint)模式后,如何来实现公网Git部署呢?
ElasticJob3.0整合SpringBoot,ElasticJob-Lite【ElasticJob入门篇】
SpringCloud中集成Eureka实现集群部署服务注册与服务提供者
牛客题霸在线编程Python题库——Python入门到实践40招(三)列表
Vue监测数据的原理(对象、数组)、Vue.set()、vm.$set()
2022届秋招,从被拒到上岸 | 谈谈YK菌在2021年的经历与收获
Verilog数字系统设计——任务和函数二(系统任务readmemb或readmemh)