论文解读8——Attention Is All You Need


在这里插入图片描述

在上篇GAT中attention机制功不可没,也是在那篇中发现不是很懂注意力机制背后的运算,于是找了这篇原文,后来发现……其实原文中的attention写的也是云里雾里—_—

推荐b站李宏毅老师讲解的注意力机制,对小白非常友好,听完真的醍醐灌顶,再推荐一篇总结的很到位的attention详解:https://blog.csdn.net/qq_37541097/article/details/117691873
感觉明白了一大半,回头再去看这篇原文,曾经被吃掉的脑子又回来了
没办法真的太菜理解一篇文献还是那么艰难(在努力了)—_—

1、文章贡献

提出了一个完全基于注意力机制的网络结构 transformer 来处理序列相关问题,跟以往不同,没有用到CNN和RNN的结构,将 encoder-decoder 中的循环层替换成了multi-head attention机制,且能够实现并行化操作提高模型效率。

下面就只写一写有关模型结构的理解,其余实验的部分就不讲了

2、attention机制

2.1 self-attention

文中用的是点乘形式的self-attention

  • 假设有2个输入特征 x1 和 x2,通过input embedding转化成向量 a1 和 a2
  • 对a1和a2分别通过Wq、Wk、Wv矩阵线性映射成query、key、value(对应图中q、k、v),其中每个query负责跟其他节点(包括自己)的key值进行匹配(就是相乘得到一个系数);每个key来被query匹配;每个value代表从a向量中提取的信息
  • 将每个query跟其他节点(包括自己)的key相乘,即计算出其他节点与该节点的重要性系数α
  • 将上步算出的α值除以根号dk后经过softmax得到归一化后的α’ (dk代表向量k的长度,除以dk是防止qk相乘后的值太大输入softmax中会很小)
  • 将每个 α’ 乘上之前提取的特征value求和后便得到论文中写的 self-attention公式
    在这里插入图片描述

2.2 multi-head attention

多头注意力机制主要是通过聚合独立的不同的head来学习信息,和self-attention区别是在生成query后

  • 也是假设有2个输入特征,此外多头的head也以2个为例
  • 在生成query、key、value后,多头注意力机制主要是考虑到不同的线性映射计算出的不同相关性可能会有更好的效果,于是根据head的不同要求数再次分别用k个不同的线性映射生成k个query、k个key、k个value(图上只画了2个)
  • 后面的操作和self-attention类似,对应的qk相乘生成系数α(这里每次考虑的q、k、v下标1、2分开计算,即q11和k11相乘的时候无需考虑q12和k12,因为算的是不同的head)
  • 最后将算出的head拼接起来通过一个线性映射就能得到论文中给出的两行multi-head公式(就这么两行……)
    在这里插入图片描述

3、transformer

模型整体结构是由 encoder 和 decoder 组成

  • 首先考虑 encoder
  • 将输入特征通过input embedding向量化后,通过一个positional encoding进行位置编码(主要是因为模型中没有循环层和卷积层,输入特征之间是并行的,也就没有顺序可言,然而有些序列需要考虑顺序比如语句)
  • 位置编码后的向量通过多头注意力机制,同时加上了残差连接,通过layer norm标准化后作为前馈全连接层的输入
  • 前馈层中加入残差连接后通过layer norm就得到encoder模块的一个输出
  • 其次是decoder
  • decoder结构比encoder多的地方无非是第一个多头机制后的masked以及中间那两层混合输入的多头机制
  • 先说masked,它的作用像是在进行解码的时候遮住了后面顺序的向量,只考虑前面已经出现的特征(因为解码的时候是一个一个输出的,在解前面特征的时候没有办法把后面未解码的部分考虑进来,这和encoder不一样)
  • 再看中间那一块,多头机制输入的三个箭头里,左边两个输入来自encoder的输出,最右边的输入由decoder自己提供(用decoder产生的query来匹配encoder中产生的key和value得到输出)
  • 最后通过线性层和softmax得到decoder模块的输出
    在这里插入图片描述
### 解读 'Attention is All You Need' 论文 #### 关键思想 《Attention is All You Need》这篇论文提出了一个新的神经网络架构——Transformer,该架构完全依赖于自注意力机制来处理序列数据。传统上,在自然语言处理领域中使用的RNN及其变体(LSTM, GRU),由于其固有的顺序计算特性,难以并行化训练,并且对于长距离依赖关系的学习效果不佳。 为了克服这些问题,研究者引入了一种全新的方法论,即通过多头自注意力建模输入序列中的不同表示子空间[^1]。这种方法不仅能够有效捕捉到句子内部词语之间的关联性,而且极大地提高了模型的表达能力与泛化性能。 #### Transformer 架构 Transformer 的核心组件包括编码器(encoder) 和解码器(decoder),两者均由多个相同的层堆叠而成。每一层主要由两个子模块构成: - **Multi-head Self-Attention Layer**: 这一层允许模型在同一时间关注来自不同位置的不同表征特征,从而增强了对上下文的理解。 - **Feed Forward Neural Network (FFN)**: FFN是一个简单的全连接前馈网络,应用于每个位置上的独立操作,不涉及任何跨位置交互。 此外,还存在残差连接(residual connection)围绕着这两个子模块,并在其后接一个Layer Normalization 层以稳定梯度传播过程。 ```python class TransformerBlock(nn.Module): def __init__(self, d_model, num_heads, dropout=0.1): super().__init__() self.self_attn = MultiHeadedSelfAttention(d_model=d_model, h=num_heads) self.feed_forward = PositionwiseFeedForward(d_model=d_model) self.norm_1 = nn.LayerNorm(d_model) self.norm_2 = nn.LayerNorm(d_model) self.dropout_1 = nn.Dropout(dropout) self.dropout_2 = nn.Dropout(dropout) def forward(self, x): attn_output = self.self_attn(x) out = self.norm_1(x + self.dropout_1(attn_output)) ff_output = self.feed_forward(out) output = self.norm_2(out + self.dropout_2(ff_output)) return output ``` #### 引入自注意力机制的意义 自注意力机制使得模型能够在无需考虑固定长度窗口的情况下动态调整权重分配给不同的词或字符片段。相比于传统的循环结构,这种方式显著减少了计算复杂度,并促进了更高效的并行运算实现方式。更重要的是,它提供了一个灵活而强大的工具来建模复杂的句法和语义模式,这对于提高机器翻译、文本摘要等多种下游任务的表现至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值