地址:

1706.03762v5.pdf (arxiv.org)

abstrat

作者在abstract中先是简述了一种传统的翻译模型:encoder and decoder + Attention注意力机制(回顾:Simple to seq2seq And attention | Ripshun Blog),然后引出了他们新的简单网络模型:Transformer,在实验中Transfromer有了很高的表现:

  • 28.4BLEU 在WMT2014 English to Germen
  • 41.8BLEU 在WMT2014 English to Freach 运行3.5天在8台gpu上

Introduction

在Introduction中作者首先提出了Lstm和GRU(一种门结构的RNN模型)

然后是加入Attention的seq2seq模型

在这基础上引出了Transformer(没有什么特别的点)

Background

首先作者介绍了一般的Attention机制在并行计算上,注意力加权的位置导致有效分辨率降低(个人理解应该是无效的特征提取太多容易过拟合),从而作者引出了多头注意力机制(多个注意力机制组合,每个只关心特定的区域)。

然后提出了一种self-attention(内部的attention,通常其他Attention运行在encoder和decoder之间),Transformer就是使用的self-attention。

Model Architecture

Encoder and Decoder Stacks

Encoder由N=6个相同的layer组成,layer指的就是上图左侧的单元,最左边有个“Nx”,这里是x6个。每个Layer由两个sub-layer组成,分别是multi-head self-attention mechanism和fully connected feed-forward network。其中每个sub-layer都加了residual connection和normalisation,因此可以将sub-layer的输出表示为:

Dncoder其实和Encoder差不多,主要区别在于encoder是并行计算一次性将结果直接输出,而Dncoder是一个词一个词输入,所以在第二层Attention中加入了Encoder的输出。

Scaled Dot-Product Attention

注意功能可以描述为将查询和一组键值对映射到输出,其中查询,键,值和输出都是向量。 将输出计算为值的加权总和,其中分配给每个值的权重是通过查询与相应键的兼容性函数来计算的。

翻译为中文为:点积乘积注意力。

论文中给出了Attention的计算公式:

可以看出Attention的输入是由Q,K,V组成,而有前图可以发现encoder中QKV均由输入组成,但是他们又不同的权重。

作者同样提到了另一种复杂度相似但计算方法additive attention,在 dk很小的时候和dot-product结果相似,dk大的时候,如果不进行缩放则表现更好,但dot-product的计算速度更快,进行缩放后可减少影响(由于softmax使梯度过小,具体可见论文中的引用)。

Multi-Head Attention:

  • 公式:

通过图片不难看出多头注意力主要将QKV分为了三份,每份进入不同权重的Attention,最后通过全连接得到最后的结果(其实个人理解就是用不同的初始值生成多个结果做集成得到一个综合的结果,未来防止过拟合)

Position-wise feed-forward networks

这层主要是提供非线性变换。Attention输出的维度是[bsz*seq_len, num_heads*head_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。(因为同样的结构有多层,所以必须保证输入和输出的维度相同)

Positional Encoding

Positional Encoding在文中没有很详细的解释,所以我也是通过其他资料参考得到的

Transformer主要摒弃了之前机器翻译任务中常用的RNN结构,使得并行性更好。但是RNN的这种结构天生考虑了词语的先后顺序关系。当Transformer模型不使用RNN结构时,它就要想办法通过其它机制把位置信息传输到Encoding的部分。所以在该模型中中,每个时刻的输入是Word Embedding+Position Embedding。

什么是Position Embedding呢?

其实理解就是将文字的顺序用向量表示,从而获取词语的前后关系,而Positional Embedding的计算方式有很多。文章中主要使用正余弦的方法:

为什么要用正余弦

主要原因在于任意位置之间可以线性函数表示:

优点:

可以发现弃用RNN结构的Positional Encoding可以在时间复杂度上有很大的提升。

others:

  • Optimizer:adam
  • Regularization:使用了Residual Dropout防止过拟合,Label Smoothing 来处理平滑。
  • Layer normalization:层归一化处理。
  • 残差处理:具体思想可以结合resnet网络,主要是为了防止网络加深而产生的退化现象

Results

主要结果就是在开篇介绍的那样,其他内容我也没仔细去看。

总结

这篇论文提出的Transformer结构,通过self-attention和Positional Encoding很大提高了模型训练的效率和效益。从后面的bert的出现提供了基础。

 
目前共有0条评论
  • 暂无Trackback
你目前的身份是游客,评论请输入昵称和电邮!