Attention Is All You Need

本文深入探讨了Google在2017年提出的Transformer模型,该模型通过引入self-attention机制,解决了传统RNN和CNN在处理长距离依赖问题上的不足。Transformer不再依赖序列操作,允许并行计算,提高了效率。文章详细阐述了Encoder和Decoder的结构,包括scaled dot-product attention、multi-head attention、self-attention和position-wise feed-forward networks,并讨论了self-attention的优势,如复杂度、并行化和处理长距离依赖的能力。

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

引言

google 在2017年发布的一篇论文,即是transformer,原文地址:Attention Is All You Need
总结前面的工作,更加正式的定义了attention。此前,无论是基于序列还是卷积的网络,大都是在decoder端引入attention,可以称之为decoder attention机制,这种机制主要用来处理的是对齐问题。
而google这篇论文,直接在encoder端就引入了attention机制,同时在decoder端也实现了同样的一套attention结构,这个部分可以理解为是对文本语义表征的提取。
传统的利用序列的模型,需要一步步的由前往后计算出序列的表征,这样就存在长距离的依赖问题,同时当前词语能够获取到上下文信息其实比较有限,毕竟类似RNN这样的模型,本质上属于马尔可夫模型。
或者利用卷积网络,通过层叠卷积层来扩大感受野,从而获取全文信息。但是文本的处理不同于图像,图像从点到线再到组合,需要关注的特征都是在局部扩展而来,而文本在表征语义时,需要获取的信息可能来自距离很远的另一个词,所以也存在问题。
相比以上两者,直接通过attention的方式获取全局语义,这种做法就来的更加有效率。

模型

transformer的整体模型如下图所示:
在这里插入图片描述
整体上保持了Encoder-Decoder的机制,与前面工作一致的是在Decoder端也attend了Encoder的输出作为输入,最后通过softmax归一化概率矩阵。

Encoder and Decoder Stacks

Encoder

Encoder由N个层堆叠而成,N=6,其中的每个层都拥有两个子层。第一个子层称为Multi-head self-attention,第二个子层称为Position-wise Feed-Forward Networks。
同时,在这两个子层中还加入残差网络和layer normalization,所以每个子层的可以描述为以下公式:
L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x + Sublayer(x)) LayerNorm(x+Sublayer(x))
其中 x x x为残差, S u b l a y e r ( x ) Sublayer(x) Sublayer(x)即是通过子层得到的输出,两者的维度均为 d m o d e l = 512 d_{model} = 512 dmodel=512

Decoder

Decoder与前面一样,也是由N=6个层堆叠而成,这里每个层都拥有三个子层。其中前两个层与Encoder类似,需要注意的是为了防止序列获取未来信息,所以在attention时对未来信息加上了掩码。第三个层则是attend了Encoder的输出,类似在前面工作中提出过的align方式,需要注意这里N=6个层都需要attend前面Encoder的输出,所以与Encoder的N=6个层是一一对应的attend的值为stack后的最终结果。
类似的,Decoder中也加入残差网络和layer normalization。

Scaled Dot-Product Attention

在前面的工作中,一般将Attention作为一个序列化编码的结果进行处理,在本论文中,作者给出了一个更一般的模式:
在这里插入图片描述
对于attention,可以将其形容为Q(query)、K(key)、V(value)三者的某种函数表达,比如在论文Neural Machine Translation by Jointly Learning to Align and Translate中, Q = H t − 1 Q=H_{t-1} Q=Ht1 K = V = { h 1 , . . . , h t } K=V=\{h_1,...,h_t\} K=V={ h1,...,ht},其中 H H H为decoder隐层输出, h h h为encoder隐层输出。
在具体的任务中,Q、K、V可以有不同的表达方式,一般化的公式如下:
在这里插入图片描述
其中 Q ∈ R n ∗ d k Q∈R^{n*d_k} QRndk K ∈ R m ∗ d k K∈R^{m*d_k} KR

### Attention is All You Need 的详细解读 《Attention is All You Need》是一篇由Google Brain团队于2017年发布的开创性论文,它提出了Transformer架构,彻底改变了自然语言处理领域。以下是这篇论文的核心概念及其重要性的详细介绍。 #### 一、注意力机制 (Attention Mechanism) 注意力机制是一种允许模型聚焦于输入序列特定部分的技术。通过计算查询向量(query)与键向量(key)之间的相似度得分,并将其应用于值向量(value),可以动态加权不同位置的信息[^1]。这种机制使得模型能够更好地捕捉长距离依赖关系,而无需像RNN那样逐词处理整个序列。 对于不同的应用场景,注意力分为多种类型: - 当 **query** 来自解码层,而 **key 和 value** 均来源于编码层时,称为 vanilla attention(尽管原论文未明确提出此术语)。这是最基础形式的一种跨模态注意方式。 - 如果 query, key 及 value 都取自同一层,则定义为 self-attention 或 intra-attention。Self-attention 特别适用于理解单个句子内部的关系结构,在 Transformer 架构中有广泛应用[^2]。 #### 二、Transformer 模型概述 ##### 2.1 编码器-解码器框架 Transformer 使用了一个纯基于注意力的编码器-解码器结构来替代传统的循环神经网络(RNNs)或者卷积神经网络(CNNs)[^3]。具体来说: - **Encoder**: 包含多个堆叠子层,每个子层主要由一个多头注意力模块(Multi-head Attention Layer)以及一个前馈全连接网络(Position-wise Feed Forward Network)组成; - **Decoder**: 类似 Encoder 设计但额外加入 Masked Multi-head Attention 层用于防止当前位置看到未来信息;同时还存在另一个 multi-head cross-attention layer 进行源目标间交互学习。 ##### 2.2 多头注意力 (Multi-Head Attention) 为了捕获更多样化的特征表示并提升表达能力,作者引入了多头注意力的概念——即同时执行 h 组独立平行的标准 dot-product attentions 并拼接其结果作为最终输出[^4]: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super().__init__() assert d_model % num_heads == 0 self.d_k = d_model // num_heads self.num_heads = num_heads self.linear_layers = nn.ModuleList([nn.Linear(d_model, d_model) for _ in range(4)]) def forward(self, q, k, v, mask=None): batch_size = q.size(0) # Linear projections q = self.linear_layers[0](q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) k = self.linear_layers[1](k).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) v = self.linear_layers[2](v).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) scores = torch.matmul(q, k.transpose(-2,-1)) / math.sqrt(self.d_k) if mask is not None: scores = scores.masked_fill(mask==0, float('-inf')) p_attn = F.softmax(scores,dim=-1) output = torch.matmul(p_attn,v) concat_output = output.transpose(1,2).contiguous().view(batch_size,-1,self.num_heads * self.d_k) return self.linear_layers[-1](concat_output),p_attn ``` 以上代码片段展示了如何构建一个多头注意力层,其中包含了线性变换、缩放点乘法操作及Softmax激活函数应用等步骤。 #### 三、位置嵌入 (Positional Encoding) 由于 Transformer 不具备内在顺序感,因此需要显式地给定单词的位置信息。为此采用了正弦余弦波形组合而成的位置编码方案[^3]。 --- ### 实现资源推荐 如果希望深入研究本主题的实际编程实践,可参考以下链接获取官方或其他高质量开源项目中的 PyTorch/TensorFlow 版本实现案例: 1. HuggingFace Transformers Library: 提供大量预训练模型支持快速开发部署 NLP 应用程序 https://github.com/huggingface/transformers. 2. TensorFlow 官方教程系列中有关 Seq2Seq with Attention 的讲解文档 http://tensorflow.org/tutorials/text/nmt_with_attention. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值