《Attention is all you need》论文阅读笔记

Attention is all you need
KeyInformation
Tagsclassic, transformer
Paper AuthorAshish Vaswani
Paper Linkhttps://arxiv.org/pdf/1706.03762.pdf
Code Linkhttps://github.com/jadore801120/attention-is-all-you-need-pytorch/tree/master

Abstract

  • 提出了一个简单的网络架构Transformer,仅仅只是基于注意力机制,完全摒弃了循环和卷积结构。
  • Transformer在两个机器翻译任务上取得了很棒的性能,且有着更高的并行性和更少的训练时间
  • 在其他任务上Transformer也有很高的扩展性(现在来看完全证实了这一点)

Instruction

  • 本文提出的Transformer架构是一种摒弃循环框架,完全依赖注意力机制来建模输入输出之间依赖关系的框架。Transformer有着较高的并行度,且能达到SOTA。

Background

  • 减少顺串行计算的目标也构成了扩展神经 GPU、ByteNet 和 ConvS2S 的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数量随着位置之间的距离而增加,对于 ConvS2S 呈线性增长,对于 ByteNet 呈对数增长。这使得学习遥远位置之间的依赖关系变得更加困难。
  • 在 Transformer 中,这被减少到恒定数量的操作,尽管由于平均注意力加权位置而导致有效分辨率降低,我们通过多头注意力来抵消这种影响
  • self-attention,有时称为intra-attention,是一种将单个序列的不同位置相关联的注意力机制,以便计算序列的表示
  • Transformer是第一个不使用RNN和CNN等架构,而是完全使用自注意力来表示输入输出之间关系的架构

Model Architecture

  • 大多数有竞争力的深度学习sequence transduction models都是基于encoder-decoder架构的。encoder将输入的符号 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn)转换到一个连续的表示 z = ( z 1 , . . . , z n ) \mathbf{z}=(z_1,...,z_n) z=(z1,...,zn)。给定 z \mathbf{z} z,decoder生成符号的输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) (y1,...,ym),每次一个元素,在每个步骤中,模型都是自回归的,在生成下一个时将先前生成的符号用作附加输入
  • Transformer 遵循这一整体架构,编码器和解码器使用堆叠式自注意力和逐点、全连接层

Trnsformer架构

Encoder&Decoder

  • Encoder:堆叠6个相同的layers,每个layer由两个sub-layer组成。第一个sub-layer是multi-head attention + layer normalization,并且使用了一个residual connection。第二层是一个简单的position-wise fully connection前馈网络 + layer normalization,同样也使用了残差连接。

encoder架构

  • Decoder:堆叠6个相同的layers,每个layers包含三个sub-layer。第一个sub-layer和encoder第一个子层唯一不一样的是加入了Mask机制,主要是为了防止当前解码位置后面的信息作为context进入解码器,这种掩码屏蔽掉当前编码位置及之后的信息,确保当前位置预测只能依赖当前位置之前位置已经解码的输出(实际上Transformer在推理的时候是解码一个再解码下一个,因为只有解码完上一个位置,当前位置的context才能计算;训练的时候由于已知ground truth,所以可以通过mask的方式同时解码所有的位置)。第二个sub-layer的结构和encoder的第一个子层一致,该子层对编码器堆栈的输出执行多头关注。第三个sub-layer和encoder的第二个子层一样。

decoder架构

Attention

  • 注意力函数通常被描述为将一个query和一组key-value对映射到输出。输出一般为value的加权和,其中权重由query和对应的key的兼容性函数的到(相乘)

o u t p u t = s o f t m a x ( Q K T ) V output = softmax(QK^T)V output=softmax(QKT)V

Scaled Dot-Product Attention

Scaled Dot-Product Attention

  • 本文提出Scaled Dot-Product Attention(缩放点积注意力)输入包括 Q ( q u e r y ) Q(query) Q(query), d k d_k dk维度的 K ( k e y ) K(key) K(key) d v d_v dv维度的 V ( v a l u e ) V(value) V(value)。计算Q和K的点积,每个键除以 d k \sqrt d_k d k,然后通过 s o f t m a x softmax softmax函数来获取权重,最后乘V的到输出。

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 \textcolor{#FE6F5E}{Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d_k})V} Attention(Q,K,V)=softmax(d kQKT)V

  • 唯一和普通注意力不一样的是加入了缩放因子 d k \sqrt d_k d k,当 d k d_k dk比较大的时候可能会导致Q和K的点积结果幅度很大,这样会将softmax函数的梯度推入极小值,为了防止这样的事情加入了缩放因子(为什么 d k d_k dk变大Q和K的点积幅度变大:假设Q和K中的值都符合均值为0反差为1的随机分布,则点积结果 q ⋅ k = ∑ i = 1 d k q i k i q\cdot k = \sum_{i=1}^{d_k}q_ik_i qk=i=1dkqiki服从均值为0方差为 d k d_k dk的分布)

Muti-Head Attention

Multi-Head Attention

  • 本文发现使用多个注意力进行线性投影是有益的,因为多头注意力允许模型共同关注来自不同位置的不同表示的信息

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 w h e r e 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 ) MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O\\ where head_i = Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhereheadi=Attention(QWiQ,KWiK,VWiV)

  • 本文注意力头的数量h=8,相应的 d k = d k / h , d v = d v / h d_k=d_k/h,d_v=d_v/h dk=dk/h,dv=dv/h,这样多头注意力的计算复杂度和单个注意力差不多

Applications of Attention in transformer model

在Transformer架构当中有三个地方用到了多头注意力,功能略有不同。

  • 将encoder-decoder连接的attention(decoder的第二个sub-layer),它的query来自前面的decoder layer,key和value来自encoder的输出。这就让解码器当中每一个位置都能参与到输入序列的所有位置。(为什么K-V来自encoder,Q来自decoder?以翻译为例,是要将中文翻译成英语,所以V是encoder的输出,Q只是为了找出与当前encoder输出相关联的重要信息)
  • encoder当中的attention,QKV全部来自于上一个encoder layer的输出,这允许encoder中的诶个位置都能关注到上一个encoder layer中的所有位置的信息。
  • decoder当中的attention,和encoder的第一层一样的作用,但是decoder的第一个multi-head attention是由mask操作的。主要是为了防止解码器中的左向信息流(就是不让看没有解码位置的信息),通过将softmax输入中当前解码位置右边(未解码部分)设为 − ∞ -\infin 来实现。

Position-wise Feed-Forward Networks

  • FFN对每个位置都进行连接计算,由两个线性变换(使用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 FFN(x)=max(0,xW1+b1)W2+b2

Position Encoding

  • 由于Transformer没有使用循环结构和卷积,为了让模型可以利用序列的位置信息,我们必须给它一些无论是绝对位置也好、相对位置也行的相关信息让其确定某个token在输入序列中的位置
  • 本文使用的不同频率的正弦、余弦函数来进行位置编码

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 ) PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

Why Self-Attention

self-attention、rnn、cnn都可以将一个可变长度的序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn)转换为一个恒等长度的序列 ( z 1 , . . . , z n ) (z_1,...,z_n) (z1,...,zn)。本文将这三者做了全方面的比较,使用self-attention主要有以下三个原因:

  1. 每层的总计算复杂度SA较低
  2. 可并行计算的数量SA较多
  3. 建模长距离依赖的距离长度SA较少

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gorgeous秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值