《Attention Is All You Need》

本文介绍谷歌的Transformer结构,它是首个完全基于自注意力机制的模型。文中阐述其结构,包括编码器、解码器各层子层设置,还介绍注意力模型、多头注意力等原理,分析选择自注意力的原因,提及训练环境、优化方法和正则化方式,该模型在翻译任务取得佳绩且推广性好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Attention Is All You Need》
概述:
谷歌的transformer结构,17年6月,单模型在机器翻译领域就能吊打所有模型或者组合模型。

笔记:
1.循环神经网络+attention机制,无法满足并行计算要求。

2.transformer将词语词之间注意力的计算降低至常数复杂度,虽然这种平均注意力权重位置的做法削弱了有效的resolution(这玩意到底是啥),但是多头机制弥补了这一点。

3.transformer是第一个完全基于自注意力机制的模型,而不是通过RNN+self-attention或者CNN+self-attention。

4.encoder有6层相同的layer组成。每层两个子层,第一个子层是多头的self-attention,第二层是个简单的全连接ffn。每个子层是残差连接和layer normalization。
每个子层的输出维度同embedding层,都是512维。

5.decoder也是6层,每层3个子层,新加的子层用来计算编码器输出和解码器输入的多头注意力运算,decoder的原多头注意力层也进行了重新定义,加了mask,确保了当前预测结果只和当前预测结果之前的输出有关。

6.一个注意力模型可以认为是一个query和一个输出的key-value的映射关系。
这里的query、key、value还有输出全是向量。输出被当做所有value的权重和,value的权重是根据query查询的函数和相应的key计算得到的。

7.transformer中的注意力模型为“施加了缩放因子的点乘的多投注意力”。缩放因子是根号dk,用所有keys计算query的点积,除以缩放因子,然后通过softmax获取value的权重,就是value。

8.计算相关性函数由加法式,乘法式,transformer使用的是乘法式,也就是点乘。两种方式复杂度相同,但是高度优化的点乘式更加节省空间。

9.对于较小的dk值,这两种机制的性能相似,对于较大的dk[3]值,在不缩放的情况下,加法注意优于点积注意。本文认为,较大的dk会把softmax推向梯度更新较慢的区域饱和域,所以加了缩放因子。

10.多头注意力是把单层的“施加了缩放因子的点乘的多投注意力”并行计算,并投影到一个线性空间里,然后再连接起来,再次投影,获得最终的输出。

11.多头注意允许模型在不同的位置共同关注来自不同表示子空间的信息。用一个注意力头,平均就能抑制这种情况。

12.每个多头注意力层有8个并行的self-attention,每个头的dk dv dmodel = 64 = dmodel/8,这样每个头尺寸较小和单头的全尺寸计算量相当。

13.ffn包含两层线性传导层和一个relu激活函数,输入层和输出层都是512维,隐藏层的维度是2048。

14.PE位置编码,self-attention由于不是rnn也不是cnn,为了使用序列的顺序信息,将位置编码添加到embedding中,维度同embedding都是512维,与embedding层相加。

15.文中使用的位置编码公式十分先验,奇偶数词采用正余弦函数计算。文中假设是该函数可以让模型更好的学习相对位置信息,因为对于任意的偏移k,PEpos+k都能被一个线性变换后的PEpos表示。

16.不用正弦函数,而是直接用学习过位置的embeddings的效果跟正弦函数+embedding差不多,文中用了正弦函数的版本,因为may让模型推测更长的句子。

17.为什么选择self-attention
    1.单层的计算复杂度,当词数n小于词的维度d的时候,self-attention计算量小于rnn,而且这种情况很常见,embedding维度一般都上好几百,
    2.总的可以并行计算的计算量,用所需最小顺序op衡量。

18.self-attention的一个附带好处,有更好的可解释性。

19.训练环境:8张NVIDIA p100,base模型训了10万步12个小时。big模型选了30万步,三天半。

20.使用adam优化,学习率公式比较先验,叫warm-up,看上去比较复杂,其实逻辑表达起来比较清楚,需要预先设置一个warmup_steps超参。当训练步数step_num小于该值时,以括号中的第二项公式决定学习率,该公式实际是step_num变量的斜率为正的线性函数。当训练步数step_num大于warm_steps时,以括号中的第一项决定学习率,该公式就成了一个指数为负数的幂函数。所以整体来看,学习率呈先上升后下降的趋势,有利于模型的快速收敛。文中的warm-up 超参是4000.

21.三种正则化方式:
    1.子层drop-out,在残差连接和层归一化之前,DropoutKeepprob = 0.1。
    2.attentiion计算的时候,对softmax(QK)进行dropout。
    3.label smoothing,这应该算加噪声了。

结论:

提出了transformer,第一个完全基于注意力的序列建模模型,使用多头自注意力替代了额编码器-解码器框架中最常用的rnn。在wmt2014英德和英法翻译任务上取得了state-of-art的最好成绩。另外在其他实验上证明了具有很好的推广性和适应性。

                                         

### 关于 'Attention is all you need' 论文及其注意力机制 #### 什么是 Attention Mechanism? 注意力机制是一种模仿人类视觉注意能力的技术,在处理序列数据时能够动态分配权重给输入的不同部分。这种机制允许模型专注于最相关的上下文信息,从而提高性能[^1]。 #### Self-Attention 的定义与作用 Self-Attention 是一种特殊的注意力形式,它通过计算同一序列中的不同位置之间的关系来捕捉全局依赖性。这种方法首次被引入到 Transformer 架构中,并成为其核心组件之一。相比传统的 RNN 或 CNN 方法,Self-Attention 提供了一种更高效的方式来进行长距离依赖建模[^4]。 #### Additive Attention 和其他变体 除了 Self-Attention 外,还有多种实现方式可以用于衡量两个向量间的相似度。例如 additive attention 使用单层前馈神经网络作为兼容函数来评估查询和键之间匹配程度[^2]。每种方法都有各自特点以及适用场景,在实际应用过程中可以根据具体需求选择合适版本。 #### Dropout 技术防止过拟合 为了减少复杂模型可能出现的过拟合现象,Dropout 成为训练大型深度学习架构时常用技巧之一。该策略随机丢弃一部分节点连接以增强泛化能力。Srivastava 等人在研究中证明了这一简单有效的方法对于提升测试集表现具有重要意义[^3]。 ```python import torch import torch.nn as nn class MultiHeadedAttention(nn.Module): def __init__(self, h, d_model, dropout=0.1): super(MultiHeadedAttention, self).__init__() assert d_model % h == 0 # We assume d_v always equals d_k self.d_k = d_model // h self.h = h self.linears = clones(nn.Linear(d_model, d_model), 4) self.attn = None self.dropout = nn.Dropout(p=dropout) def forward(self, query, key, value, mask=None): if mask is not None: # Same mask applied to all h heads. mask = mask.unsqueeze(1) nbatches = query.size(0) # 1) Do all the linear projections in batch from d_model => h x d_k query, key, value = \ [l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2) for l, x in zip(self.linears, (query, key, value))] # 2) Apply attention on all the projected vectors in batch. x, self.attn = attention(query, key, value, mask=mask, dropout=self.dropout) # 3) "Concat" using a view and apply a final linear. x = x.transpose(1, 2).contiguous() \ .view(nbatches, -1, self.h * self.d_k) del query, key, value return self.linears[-1](x) ``` 以上代码展示了如何构建一个多头自注意力模块(Multi-Head Attention),这是基于论文《Attention Is All You Need》设计的核心结构的一部分。 #### 性能影响因素分析 在实验设置下调整 multi-head attention 中heads数量及key/value维度大小会对最终翻译质量产生显著影响。尽管增加head数目通常有助于改善效果,但如果超过某个阈值则可能导致BLEU分数下降[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值