Attention is all you need 学习笔记
序列转导模型(SequenceTransduction Model):处理序列数据的模型
序列数据:具有顺序关系的数据,每个元素的顺序对数据的整体含义非常重要(话的正反)。
在transformer之前,主流的序列转导模型的结构的特点:
- 基于RNN、CNN
- 使用编码器-解码器结构
- 使用注意力机制增强
transformer的创新:
- 完全放弃RNN,CNN
- 仍然使用编码器-解码器结构
- 完全基于注意力机制
前馈神经网络(Feedforward Neural Network FNN):

为什么不适合序列转导任务?
三个步骤:分词(tokenization)、词向量表示(Embedding)、合并词向量(平均或拼接)
由于FNN的输入是固定长度的,合并词向量时采用平均,会完全丢掉词语的顺序。采用拼接,则难以适应不同长度的句子,效率低下。且仍然当做一个整体来处理,无法理解谁先谁后。
循环神经网络 (Recurrent Neural Network)RNN
RNN 解决的问题:
能够建模词序:RNN 是按时间顺序 (token 顺序) 逐个处理输入的;
能够建模上下文依赖:RNN 是逐个喂入词语,并且会有“记忆”机制;
支持不定长输入:不再需要 FNN 那种固定长度的输入格式,句子多长都行;


RNN在不同的时刻输入不同的token,而FNN是同一时刻把所有token输入进去。RNN模拟了人的说话。RNN的计算单元和矩阵都与FNN完全一样。
优势:解决了FNN的问题。
缺陷:在输入输出不等长时会产生问题。
从而引入了编码器-解码器结构

可以理解为将RNN横着劈开来做。编码器只管输入,解码器只管输出。
C其实就是h4,然后隐式的包含了输入的内容和顺序。同时为了避免后续解码时上下文信息被稀释,所以给每个时间步重新输入一次上下文向量C。

编码器-解码器结构的问题:处理长序列时会有遗忘的问题。不同时间步的输入和输出的重要性是不同的。
因此引入注意力机制(Attention Mechanism):
注意力机制解决的问题:
1.解决模型处理长序列时的“遗忘”问题:随着序列长度的增长,远距离依赖信息在传递过程中易被稀释,导致模型对长距离依赖关系的建模能力减弱。
2,解决不同时间步输入对当前时刻输出的“重要性”问题:所有时间步的输入在计算当前时刻输出时被同等对待,忽略了不同时间步对当前时刻输出的重要性可能存在的差异。

RNN最大的问题是只能串行计算不能并行计算。
为了解决顺序计算的问题,一些模型引入了 CNN 以支持并行。但这些模型难以捕捉远距离依赖。
Transformer 通过注意力机制解决这一问题。
介绍自注意力机制、介绍Memory Network的递归注意力机制。
[Self-attention, sometimes called intra-attention is an attention mechanism relating different positions of a single sequence in order to compute a representation of the sequence. Self-attention has been used successfully in a variety of tasks including reading comprehension, abstractive summarization, textual entailment and learning task-independent sentence representations [4,27,28,22].
End-to-end memory networks are based on a recurrent attention mechanism instead of sequence-aligned recurrence and have been shown to perform well on simple-language question answering and language modeling tasks [34].]
Transformer 是首个完全基于自注意力、不使用 RNN 或 CNN 的序列建模模型。
为了解决串行计算的问题,transformer重点解决编码器解码器结构中串行计算的问题。
一方面,因为RNN的训练想模拟时序输入输出,从而导致串行。
另一方面,在训练的时候输入和输出都是已知的,即“我爱水课”和“I love easy course”都是已知的。因此让网络在训的时候不要等前面的结果,而是直接中答案处从全局的视角来训练。让它同时能看到其他所有词的信息。然后将这些信息都编码到这个“水”本身的语义向量上面去。对所有词都进行这样的操作,这可以并行处理。
并行

但是由于这种方式没法自然的把位置顺序给代入进去。所以还需要一个额外的编码,将位置信息也编码入每个词的语义向量中。这样得到的是一个全面的矩阵。包含了上下文的信息。
对于解码器,则是通过看答案的方式知道前面的词“I love”空出当前词“easy”,并遮住后面的词。然后来训练。这样就实现了并行。


流程讲解:
inputs:“我爱水课” outputs:“I love easy course”
input Embedding:词嵌入,将自然语言文本都映射成机器可以理解的高维向量的形式。这里是一个512维的向量。后续机器可以通过这种向量之间的余弦相似度之类的东西去计算不同词语之间的相似关系。可以用别人做好的词嵌入模型,也可以自己训练。经过词嵌入之后,每个词都得到了包含其本身语义信息的512维向量。
+
=

positional encoding 位置编码:(用上面的正余弦公式,以及傅里叶变换的思想等,不展开)
可以理解成其给每个词都打了一个tag,也是512维,这个tag就表示其在整个上下文中的相对的位置。
直接将位置编码加到原来的语义向量中。相当于将tag铁道了词语上。
为什么位置编码这么复杂,不能直接给每个词一个位置编号 1,2,3,4...?
这种方案其实是存在的,有的模型 (如 BERT) 确实就是这么做的。
但是,这种编码是标量,信息量太少;模型无法理解“第 3 个词和第 7 个词的关系有多远” ;尤其是注意力机制是靠向量计算的 (比如点积) ,而单个数字在向量空间里几乎没法建立复杂的关系。
所以我们要把这个位置变成一个高维向量,这个向量里包含的信息就丰富多了,比如:能让模型感受到不同位置之间的差异;甚至能让模型捕捉到"某两个词之间的位置差”等相对关系。
上下文信息编码:
分三个不同的输入方向,每个方向都有一个权重矩阵Wq,Wk,Wv,每个矩阵都是512*512的。这三个矩阵是模型训练中得到的重要参数。query,key,value,对应查询、键、值




注意:因为刚才经过了 softmax,所以这四个权重的和为 1 所以:
权重 1*我 v+权重 2*爱 v+权重 3*水 v+权重 4*课 v 带上了上下文信息的“水”的新向量
单头注意力机制计算过程:
多头注意力机制计算:

降维的本质含义:将原本的语义空间缩小到一个语义子空间中。从512维降低到64维度,使得对事物的描述专注于某个子问题,如外形、口味。。。
为什么用多头注意力:
多头注意力机制将其映射为8组64维的矩阵,再进行后续计算和拼接融合。每个头关注的重点信息是不同的。
为什么最后需要经过线性层,重新融合?
线性层再做了一个映射,将八个粗糙的描述维度,融合成一个精细的完整的描述维度。
为什么要拆成8个64维?
保证了计算量没变,又保留了多头注意力的优势。
add & Norm 残差连接和归一化 层
作用:假设深度学习中有个模块的学习效果很差,那么对后续训练来说造成很大的干扰。那么将输入与训练结果相加,保证后续输入时输入信息依然存在。归一化就是让数值趋于稳定。

masked multi-head attention其实就是将当前要输出的和后续的内容打码,防作弊。给了一个非常小的权重。给注意力权重矩阵的上三角部分打分非常低或为负无穷。使得只有下三角可以参与计算。

对于编码器-解码器注意力模块(右上角的),其KV权重来自左边计算,Q来自右下边的masked的计算。

三种不同的网络结构:
Self-Attention RNN CNN 从三个关键因素分析为什么选择 Self-Attention
第一点:每层的总计算复杂度;
第二点:并行计算能力;
第三点:模型内部学习长距离依赖的能力
src:
《Attention is all you need》论文解读及Transformer架构详细介绍_哔哩哔哩_bilibili
PPT、论文笔记版github地址:https://github.com/huangyf2013320506/bilibili_repository
20250613

浙公网安备 33010602011771号