【论文阅读】Attention Is All You Need

【2017NIPS】

论文:https://arxiv.org/pdf/1706.03762v5.pdf

代码:https://github.com/tensorflow/tensor2tensor

 

本文提出了新的网络结构Transformer,仅仅依靠注意力机制而不再使用循环和卷积结构

训练可以采用并行化,从而大大缩短训练时间

 

介绍

现有的循环模型每个时间步依次计算,这种序列化的方法大大阻碍了训练的并行

尽管有工作采用一些技巧提高了计算效率,但是这种序列化的本质问题仍然存在

 

注意力机制越来越多的被采用,因为可以建模与元素之间距离无关的相关性,但是目前还没有与循环网络想结合

 

本文提出了Transformer,避开了循环,而是完全依赖注意力机制来建模输入和输出之间的全局相关性,大大提高了模型的并行性,在8卡P100上训练12小时就可以达到翻译的SOTA

 

 

模型结构

现有的模型通常采用encoder-decoder结构,encoder将输入序列𝑥1, ⋯, 𝑥𝑛映射到连续的特征表示𝑧=𝑧1, ⋯, 𝑧𝑛,再基于z使用decoder生成输出序列𝑦1, ⋯, 𝑦𝑚

每一时间步都可以看做是一个自回归模型,将前面生成的输出作为当前步额外的输入

 

Transformer沿用这个整体框架,由堆叠的self-attention和point-wise、FC层构成encoder、decoder(分别对应下图左右部分)

 

Encoder and Decoder Stacks

encoder:由6个相同的layer组成,每个layer有两个sub-layer

第一个是multi-head self-attention 机制

第二个是position-wise fully connected feed-forward网络

在每个sub-layer中同时使用了残差结构,后面再接上LayerNormalization

即每个sublayer可以表示为LayerNorm(x+Sublayer(x))

 

网络中所有sub-layer,包括embedding layer输出的维度都为512

 

Decoder:也由6个相同的layer组成,每个layer除了和encoder相同的两个sub-layer,还有第三个sub-layer

第三个sub-layer为对encoder stack的输出进行multi-head attention

在每个sub-layer中同时使用了残差结构,后面再接上LayerNormalization

同时对decoder stack的self-attention(第一个sub-layer)使用了masking,使得在当前的decoder的output输入中,不能获知后面时间步的输出,同时对于decoder的输入,是将gt的句子整体右移了一个时间步

例如输入为11 12 13,对应输出为21 22 23,在decoder中第二时间步时,decoder的输入为21(不能让它见到22 23),第三时间步decoder的输入为21 22(不能让它见到23)

 

具体解释见下面链接:

https://stackoverflow.com/questions/58127059/how-to-understand-masked-multi-head-attention-in-transformer

 

Attention

attention函数可以看是做将query和一组(key,value)对映射到output(query、keys、value和output都是向量)

output是value的加权求和,而每个value的权重系数是通过其对应的key以及query之间的函数计算得到的

 

Scaled Dot-Product Attention

 

输入有𝑑𝑘维的query和key向量组成,计算query和各个key之间的点乘,再除以\sqrt{d_k},再使用softmax函数得到每个value对应的权重系数

 

在实际计算时,使用矩阵将一组query同时计算

现有的有些attention比较类似,但是没有除以\sqrt{d_k},但是当𝑑𝑘比较大时,向量点乘的结果也会比较大,softmax会倾向于到达梯度较小的区域(更靠近0或1)

 

Multi-Head Attention

作者发现将query、key和value使用h个不同的线性映射,从而学习到不同的特征,最后再将它们output的结果进行concat会十分有效,而且这h组attention操作可以并行进行

multi-head attention可以让模型在不同的位置学习到不同的特征表示子空间信息

在实际计算时,h=8,𝑑𝑘=𝑑𝑣=𝑑𝑚𝑜𝑑𝑒𝑙/ h = 64

 

 

Applications of Attention in our Model

Transformer的multi-head attention有三个特点

1、在decoder的第三个sub-layer中,query来自前一层的decoder,而key和value则来自encoder的输出,这样在decoder的每个位置,都可以感知到来自输入序列的所有位置

2、在encoder中的self-attention层中,key、value和query都来自上一层encoder的输出,因此encoder的每个位置也都可以感知到前面encoder层的所有位置

3、在decoder中的self-attention(第一个sub-layer),decoder的每个位置可以感知到前面时间步的位置(包括当前位置),而剩下的位置为非法位置

 

Position-wise Feed-Forward Networks

在每个layer中,除了attention结构,还有一个Position-wise的Feed-Forward网络

每个位置都进行独立的进行FC,但是不同位置共享同一组参数

 

 

Embeddings and Softmax

Encoder部分的embedding、Decoder部分的embedding和最后输出前的线性变换,共享同一个参数

 

Positional Encoding

间隔地使用sin和cos函数获得位置编码

其中pos为当前位置(步数),i为特征维度

 

为什么采用self-attention

1、每层的计算量减少

2、在训练时,可以并行计算

3、网络中长范围的相关性,当两个位置的输入输出之前的路径更短时,更容易学习到两者之间的相关性

 

比较不同方法的复杂度、最大的两个位置之间的路径长度

 

此外,self-attention可以得到更具有解释性的模型

 

 

训练

训练数据

WMT2014 英语-德语数据集,有450万个句子对

句子使用byte-pair encoding进行编码,可以解决在测试的OOV问题(out of vocabulary)

BPE编码详见:https://blog.csdn.net/foneone/article/details/103811328

大致过程为先按照字母拆开,词汇表为字母级,然后将连续出现高频的字母组合加入词汇表,直到词汇表到达预定大小

源语言和目标语言使用共同的词汇表,共有37000个tokens

 

WMT201 4英语-法语数据集有360万个句子对,拆分为32000个单词级的词汇表

 

训练时每个batch大约有25000个源tokens和25000个目标tokens

 

硬件

8块P100 base模型训练12hours big模型训练3.5天

 

优化器

Adam β1=0.9 β2=0.98

学习率现在warmup步内线性增加,再按照逆平方根下降

 

正则化

残差dropout:在每个sub-layer的输出与residual直连相加前使用dropout,对于encoder和decoder中的embedding之和(input+position)以及position embedding使用dropout,比例为0.1

标签平滑:以0.1的比例进行标签平滑

 

结果

机器翻译

对于base模型,使用最后5个checkpoint的均值,对于big模型,使用最后20个checkpoint的均值

beam search是beam size为4

 

模型变种

 

A组改变了attention head数量以及key和value的维度,以保证总的计算量相同,发现head数太多或太少都不好

B组减少了attention key的维度,发现性能损失

C和D组发现更大的模型性能更好,同时dropout可以有效避免过拟合

E组将正弦式的位置编码换成可学习式的参数,结果基于一样

 

英文成分句法分析

这个任务很难:输出受到很强的结构限制,同时输出比输入长很多

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值