【经典精读】万字长文解读Transformer模型和Attention机制

Transformer是2017年的一篇论文《Attention is All You Need》提出的一种模型架构,这篇论文里只针对机器翻译这一种场景做了实验,全面击败了当时的机器翻译各个benchmark上的SOTA。其优点除了效果好之外,由于encoder端是并行计算的,训练的时间也被大大缩短了。

它开创性的思想,颠覆了以往序列建模和RNN划等号的思路,现在被广泛应用于NLP的各个领域。目前在NLP各业务全面开花的语言模型如GPT, BERT等,都是基于Transformer模型的。因此弄清楚Transformer模型内部的每一个细节就显得尤为重要。

本文将按照下面的思路展开

  1. Transformer 是什么

  2. Attention的背景溯源(为什么要有attention?)

  3. Attention的细节(attention是什么?)

    1. Query, Key, Value
    2. Multi-head Attention的本质
  4. Transformer模型架构中的其他部分

    1. Feed Forward Network
    2. Positional Embedding
    3. Layer Normalization
  5. Transformer的参数量和显存消耗估计

  6. 其他引发思考的问题(To be done…)

  7. 参考


0. Transformer是什么

img

Transformer模型的架构

Transformer的核心思想是:使用attention机制, 在一个序列的不同位置之间建立distance = 1的平行关系,从而解决RNN的长路径依赖问题(distance = N)。

  • 理解“平行”的含义:在Transformer结构中,序列的不同pos(位置)之间距离都是1,具体请看3.3

Transformer的核心优势在于:由于同一个序列的不同位置之间的平行关系,带来了两个重要优势 —(1)它在训练时相对序列长度的复杂度是O(1) (实际上还是有一些额外的开销,比如attention里的某些运算复杂度和长度呈线性关系),和先辈RNN的O(N)复杂度比起来是一个重大突破;(2)做到了真正的双向context融合,在此之前我们只有BiLSTM,但是其本质只是两个单向建模的叠加,而不是Transformer这种彻底的context融合

1. Attention是什么?

想要深度理解Transformer和Attention的机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。

首先从机器翻译领域的模型演进历史切入:

机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是: Simple RNN -> Contextualize RNN -> Contextualized RNN with attention -> Transformer(2017),下面来一一介绍。

1.1. Simple RNN

这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoder output),源端信息和decoder之间唯一的联系只是: encoder output会作为decoder的initial states的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoder output的信息会衰减。

img

Simple RNN (without context)

【这种模型有2个主要的问题】

  1. 源端序列不论长短,都被统一压缩成一个固定维度的向量,并且显而易见的是这个向量中包含的信息中,关于源端序列末尾的token的信息更多,而如果序列很长,最终可能基本上“遗忘”了序列开头的token的信息。
  2. 第二个问题同样由RNN的特性造成: 随着decoder timestep的信息的增加,initial hidden states中包含的encoder output相关信息也会衰减,decoder会逐渐“遗忘”源端序列的信息,而更多地关注目标序列中在该timestep之前的token的信息。

1.2. Contextualized RNN

为了解决上述第二个问题,即encoder output随着decoder timestep增加而信息衰减的问题,有人提出了一种加了context的RNN sequence to sequence模型:decoder在每个timestep的input上都会加上一个context。为了方便理解,我们可以把这看作是encoded source sentence。这样就可以在decoder的每一步,都把源端的整个句子的信息和target端当前的token一起输入到RNN中,防止源端的context信息随着timestep的增长而衰减。

img

Contextualized RNN

但是这样依然有一个问题: context对于每个timestep都是静态的(encoder端的final hidden states,或者是所有timestep的output的平均值)。但是每个decoder端的token在解码时用到的context真的应该是一样的吗?在这样的背景下,Attention就应运而生了:

1.3. Contextualized RNN with soft align (Attention)

Attention在机器翻译领域的应用最早的提出来自于2014年的一篇论文 Neural Machine Translation by Jointly Learning to Align and Translate

img

Contextualized RNN with Attention

在每个timestep输入到decoder RNN结构中之前,会用当前的输入token的vector与encoder output中的每一个position的vector作一个"attention"操作,这个"attention"操作的目的就是计算当前token与每个position之间的"相关度",从而决定每个position的vector在最终该timestep的context中占的比重有多少。最终的context即encoder output每个位置vector表达的加权平均

img

context的计算公式

2. Attention的细节

上面这一章节讲了attention机制的历史,帮助读者更加清楚地理解attention的作用,下面我们就来展开讲讲attention的细节

2.1. 点积attention

我们来介绍一下attention的具体计算方式。attention可以有很多种计算方式: 加性attention、点积attention,还有带参数的计算方式。我着重介绍一下点积attention的公式,这也是Transformer模型中所使用的attention公式:

Attention (Q,K,V)=softmax⁡(QKTdk)V

img

Attention中(Q^T)*K矩阵计算,query和key的维度要保持一致

如上图所示, QM×d , KN×d 分别是query和key,其中,query可以看作M个维度为d的向量(长度为M的sequence的向量表达)拼接而成,key可以看作N个维度为d的向量(长度为N的sequence的向量表达)拼接而成。

  • 【一个小问题】为什么有缩放因子 1dk ?

    • 先一句话回答这个问题: 缩放因子的作用是归一化
    • 假设Q , K里的元素的均值为0,方差为1,那么 AT=QTK 中元素的均值为0,方差为d. 当d变得很大时, A 中的元素的方差也会变得很大,如果 A 中的元素方差很大,那么softmax⁡(A) 的分布会趋于陡峭(分布的方差大,分布集中在绝对值大的区域)。总结一下就是softmax⁡(A)的分布会和d有关。因此A 中每一个元素乘上 1dk 后,方差又变为1。这使得softmax⁡(A) 的分布“陡峭”程度与d解耦,从而使得训练过程中梯度值保持稳定。

2.2. Attention机制涉及到的参数

一个完整的attention层涉及到的参数有:

  • 把q , k , v分别映射到Q , K , V的线性变换矩阵 WQ ( dmodel×dk ), WK( dmodel×dk ), WV ( dmodel×dv )
  • 把输出的表达 O 映射为最终输出 o 的线性变换矩阵 WO ( dv×dmodel )

2.3. Query, Key, Value

Query和Key作用得到的attention权值会作用到Value上。因此它们之间的关系是:

  1. Query(M×dqk) 和Key(N×dqk)的维度必须一致,Value (N×dv) 和Query/Key的维度可以不一致。
  2. Key(N×dqk)和Value (N×dv)的长度必须一致。Key和Value本质上对应了同一个Sequence在不同空间的表达。
  3. Attention得到的Output (M×dv) 的维度和Value的维度一致,长度和Query一致。
  4. Output每个位置 i 是由value的所有位置的vector加权平均之后的向量;而其权值是由位置为i 的query和key的所有位置经过attention计算得到的 ,权值的个数等于key/value的长度。

img

Attention示意图

在经典的Transformer模型中,我们记线性映射之前的Query, Key, Value为q, k, v,映射之后为Q, K, V。那么:

  1. self-attention的q, k, v都是同一个输入, 即当前序列由上一层输出的高维表达。
  2. cross-attention的q代表当前序列,k,v是同一个输入,对应的是被编码的序列,也即encoder最后一层的输出结果(对decoder端的每一层来说,k和v保持不变)

而每一层线性映射参数矩阵都是独立的,所以经过映射后的Q, K, V各不相同,模型参数优化的目标在于将q, k, v被映射到新的高维空间,使得每层的Q, K, V***在不同抽象层面上***捕获到q, k, v之间的关系。一般来说,底层layer捕获到的更多是lexical-level的关系,而高层layer捕获到的更多是semantic-level的关系。

2.4. Attention的作用(high-level理解)

下面这段我会以机器翻译为例,用通俗的语言阐释一下attention的作用,以及query, key, value的含义。

img

Transformer模型Encoder, Decoder的细节图(省去了FFN部分)

query对应的是需要被表达的序列(称为序列A),key和value对应的是用来表达A的序列(称为序列B)。其中key和query是在同一高维空间中的(否则无法用来计算相似程度),value不必在同一高维空间中,最终生成的output和value在同一高维空间中。上面这段巨绕的话用一句更绕的话来描述一下就是:

序列A和序列B在高维空间 α 中的高维表达 Aα 的每个位置分别和 Bα 计算相似度,产生的权重作用于序列B在高维空间 β 中的高维表达 Bβ ,获得序列A在高维空间 β 中的高维表达 Aβ

Encoder部分中只存在self-attention,而Decoder部分中存在self-attention和cross-attention

【self-attention】encoder中的self-attention的query, key, value都对应了源端序列(即A和B是同一序列),decoder中的self-attention的query, key, value都对应了目标端序列。

【cross-attention】decoder中的cross-attention的query对应了目标端序列,key, value对应了源端序列(每一层中的cross-attention用的都是encoder的最终输出)

2.5. 多头Attention (Multi-head Attention)

Attention是将query和key映射到同一高维空间中去计算相似度,而对应的multi-head attention把query和key映射到高维空间 α 的不同子空间 (α1,α2,…,αh) 中去计算相似度。

为什么要做multi-head attention?论文原文里是这么说的:

Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

也就是说,这样可以在不改变参数量的情况下增强每一层attention的表现力。

img

Multi-head Attention示意图

Multi-head Attention的本质是,在参数总量保持不变的情况下,将同样的query, key, value映射到原来的高维空间的不同子空间中进行attention的计算,在最后一步再合并不同子空间中的attention信息。这样降低了计算每个head的attention时每个向量的维度,在某种意义上防止了过拟合;由于Attention在不同子空间中有不同的分布,Multi-head Attention实际上是寻找了序列之间不同角度的关联关系,并在最后concat这一步骤中,将不同子空间中捕获到的关联关系再综合起来。

从上图可以看出, qi 和 kj 之间的attention score从1个变成了h个,这就对应了h个子空间中它们的关联度。

2.6. Attention层的公式

img

Transformer中Attention层的完整公式,使用Multi-head Attention

如上是Transformer中Attention层的完整公式。在经过并行的多个head的qkv计算后,它们的结果被拼接在一起,再经过 WO 的线性映射,得到最终的结果。

2.7. Decoder端的Mask

Transformer模型属于自回归模型(p.s. 非自回归的翻译模型我会专门写一篇文章来介绍),也就是说后面的token的推断是基于前面的token的。Decoder端的Mask的功能是为了保证训练阶段和推理阶段的一致性。

论文原文中关于这一点的段落如下:

We also modify the self-attention sub-layer in the decoder stack to prevent from attending to subsequent positions. This masking, combined with the fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

在推理阶段,token是按照从左往右的顺序推理的。也就是说,在推理timestep=T的token时,decoder只能“看到”timestep < T的 T-1 个Token, 不能和timestep大于它自身的token做attention(因为根本还不知道后面的token是什么)。为了保证训练时和推理时的一致性,所以,训练时要同样防止token与它之后的token去做attention。

3. Transformer模型架构中的其他部分

除了最有特色的Attention层之外,Transformer还应用了一些之前的技术,比如Layer Normalization,Residual Connection,还有为了在并行编码同时捕获位置信息的Positional Embedding。

3.1. Layer Normalization

在每个block中,最后出现的是Layer Normalization。Layer Normalization是一个通用的技术,其本质是规范优化空间,加速收敛。

当我们使用梯度下降法做优化时,随着网络深度的增加,数据的分布会不断发生变化,假设feature只有二维,那么用示意图来表示一下就是:

img

数据的分布发生变化,左图比较规范,右图变得不规范

为了保证数据特征分布的稳定性(如左图),我们加入Layer Normalization,这样可以加速模型的优化速度。

3.2. Feed Forward Network

每一层经过attention之后,还会有一个FFN,这个FFN的作用就是空间变换。FFN包含了2层linear transformation层,中间的激活函数是ReLu。

公式是: FFN(x)=max(0,xW1+b1)W2+b2

曾经我在这里有一个百思不得其解的问题:attention层的output最后会和 WO 相乘,为什么这里又要增加一个2层的FFN网络?

其实,FFN的加入引入了非线性(ReLu激活函数),变换了attention output的空间, 从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。

3.3. Positional Encoding

位置编码层只在encoder端和decoder端的embedding之后,第一个block之前出现,它非常重要,没有这部分,Transformer模型就无法用。位置编码是Transformer框架中特有的组成部分,补充了Attention机制本身不能捕捉位置信息的缺陷。

img

position encoding

Positional Embedding的成分直接叠加于Embedding之上,使得每个token的位置信息和它的语义信息(embedding)充分融合,并被传递到后续所有经过复杂变换的序列表达中去。

使用Positional Encoding带来的独特优势

优势1

不得不说,使用Positional Encoding作为每个token位置的唯一表示,这一思路很NB,为什么呢?

  • 模型输入Encoder的每个token对应的向量有2部分:

    • Positional Encoding
    • Embedding Output
  • Transformer的特性使得encoder的输入向量之间完全平等(不存在RNN那种recurrent结构),token的实际位置和positional encoding唯一绑定,我们可以通过对positional encoding进行操作来改变token在序列中的实际位置。

img

[a] 输入等于Positional Encoding + Embedding Output

*** 对inference阶段而言**

  • 下图[b]中的输入Embedding部分没有变化,但是Positional Encoding部分被打乱了顺序
  • 下图[c]中的Positional Encoding部分没有变化,但是Embedding部分被打乱了顺序
  • 实际上[b]和[c]完全等价,因为在2种输入中E1-P5, E2-P1, E3-P3, E4-P2, E5-P4这个对应关系恒定。

img

[b] 输入token顺序不变,只改变positional encoding顺序

img

[c] 输入positional encoding顺序不变,token顺序改变

*** 对train阶段而言(针对learned postional encoding的情况)**

  • 由于positional encoding是训练出来的,那么它在inference阶段代表哪个位置,完全由训练时的实际位置决定
  • 举个例子,在decoder中,cross-attention模块是有mask的,目的是防止token与它之后的token去做attention,也就是left-to-right模型。如果这时我突然想要训一个right-to-left的模型,那么做法1是在预处理阶段将序列翻转过来(比较简单也比较容易想到);做法2是在训练时将mask策略换一下

img

Left-to-Right模型训练时对应的decoder mask

img

Right-to-Left模型训练时对应的decoder mask

  • 做法1和做法2训练出来的positional encoding是等价的

优势2

论文中使用的Positional Encoding(PE)是正余弦函数,位置(pos)越小,波长越长,每一个位置对应的PE都是唯一的。同时作者也提到,之所以选用正余弦函数作为PE,是因为这可以使得模型学习到token之间的相对位置关系:因为对于任意的偏移量k, PEpos+k 可以由 PEpos 的线性表示:

PE(pos+k,2i)=sin[(pos+k)/100002i/dmodel]

PE(pos+k,2i+1)=cos[(pos+k)/100002i/dmodel]

上面两个公式可以由 sin[(pos)/100002i/dmodel] 和cos[(pos)/100002i/dmodel]的线性组合得到。也就是 PEpos乘上某个线性变换矩阵就得到了PEpos+k

p.s. 后续也有很多工作在attention中使用了“相对位置表示”

4. Transformer的参数量和显存消耗估计

4.1 参数量

  • For each Encoder layer: (MHDPA + 2 * LN + FFN) * N_Layer

    • Multi-head dot product attention: MHDPA has 4 linear connections (i.e., K, V, Q, output after concat) ⇒ 4 * [(x*x) + x]
    • Layer norm: (2*x)
    • FFN: (2 * x*x_f)+x+x_f (2-layer FFN, inner dim x_f (FFN size) )
  • For each Decoder layer: (2 * MHDPA + 3 * LN + FFN) * N_Layer

  • The embedding(input output share): V * E

  • Decoder output (pre-softmax linear transformation): V*E (may share with input embedding)

  • Learned positional embedding: V * E

所以可训练参数总量为: (MHDPA + 2* LN + FFN) * N_Layer (encoder) + (2*MHDPA + 3 LN + FFN) * N_Layer (decoder) + 2V * E (shared embedding + learned pos emb)

4.2 训练阶段显存消耗

训练时的显存占用包括 (1) weights/parameters (2) hidden layers (3) bp gradients (1x in SGD, 3x in Adam) (4) attention这几个部分。

和seq length关系和batch size关系
weight/parametersConstantConstant
hidden layersLinearLinear
BP gradients(1x in SGD, 3x in Adam)ConstantConstant
AttentionQuadraticLinear

5. 其它问题(未完待续)

  • ✅Attention在反向传播算法如何更新其中参数,又是如何影响其他参数的更新的?
  • ✅Multi-head Attention本质上做了一件什么事?从反向传播算法的角度分析?
  • ✅Positional Encoding应用反向传播算法时是如何影响到其他参数的更新的?同样的理论可以延伸到其他additional embedding,比如多语言模型中的language embedding。
  • ✅从反向传播算法角度分析每个Encoder/Decoder Layer中FFN部分的作用?

零基础如何高效学习大模型?

你是否懂 AI,是否具备利用大模型去开发应用能力,是否能够对大模型进行调优,将会是决定自己职业前景的重要参数。

为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和鲁为民博士系统梳理大模型学习脉络,这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码免费领取🆓**⬇️⬇️⬇️

在这里插入图片描述

【大模型全套视频教程】

教程从当下的市场现状和趋势出发,分析各个岗位人才需求,带你充分了解自身情况,get 到适合自己的 AI 大模型入门学习路线。

从基础的 prompt 工程入手,逐步深入到 Agents,其中更是详细介绍了 LLM 最重要的编程框架 LangChain。最后把微调与预训练进行了对比介绍与分析。

同时课程详细介绍了AI大模型技能图谱知识树,规划属于你自己的大模型学习路线,并且专门提前收集了大家对大模型常见的疑问,集中解答所有疑惑!

在这里插入图片描述

深耕 AI 领域技术专家带你快速入门大模型

跟着行业技术专家免费学习的机会非常难得,相信跟着学习下来能够对大模型有更加深刻的认知和理解,也能真正利用起大模型,从而“弯道超车”,实现职业跃迁!

图片

【精选AI大模型权威PDF书籍/教程】

精心筛选的经典与前沿并重的电子书和教程合集,包含《深度学习》等一百多本书籍和讲义精要等材料。绝对是深入理解理论、夯实基础的不二之选。

在这里插入图片描述

【AI 大模型面试题 】

除了 AI 入门课程,我还给大家准备了非常全面的**「AI 大模型面试题」,**包括字节、腾讯等一线大厂的 AI 岗面经分享、LLMs、Transformer、RAG 面试真题等,帮你在面试大模型工作中更快一步。

【大厂 AI 岗位面经分享(92份)】

图片

【AI 大模型面试真题(102 道)】

图片

【LLMs 面试真题(97 道)】

图片

【640套 AI 大模型行业研究报告】

在这里插入图片描述

【AI大模型完整版学习路线图(2025版)】

明确学习方向,2025年 AI 要学什么,这一张图就够了!

img

👇👇点击下方卡片链接免费领取全部内容👇👇

在这里插入图片描述

抓住AI浪潮,重塑职业未来!

科技行业正处于深刻变革之中。英特尔等巨头近期进行结构性调整,缩减部分传统岗位,同时AI相关技术岗位(尤其是大模型方向)需求激增,已成为不争的事实。具备相关技能的人才在就业市场上正变得炙手可热。

行业趋势洞察:

  • 转型加速: 传统IT岗位面临转型压力,拥抱AI技术成为关键。
  • 人才争夺战: 拥有3-5年经验、扎实AI技术功底真实项目经验的工程师,在头部大厂及明星AI企业中的薪资竞争力显著提升(部分核心岗位可达较高水平)。
  • 门槛提高: “具备AI项目实操经验”正迅速成为简历筛选的重要标准,预计未来1-2年将成为普遍门槛。

与其观望,不如行动!

面对变革,主动学习、提升技能才是应对之道。掌握AI大模型核心原理、主流应用技术与项目实战经验,是抓住时代机遇、实现职业跃迁的关键一步。

在这里插入图片描述

01 为什么分享这份学习资料?

当前,我国在AI大模型领域的高质量人才供给仍显不足,行业亟需更多有志于此的专业力量加入。

因此,我们决定将这份精心整理的AI大模型学习资料,无偿分享给每一位真心渴望进入这个领域、愿意投入学习的伙伴!

我们希望能为你的学习之路提供一份助力。如果在学习过程中遇到技术问题,也欢迎交流探讨,我们乐于分享所知。

*02 这份资料的价值在哪里?*

专业背书,系统构建:

  • 本资料由我与鲁为民博士共同整理。鲁博士拥有清华大学学士美国加州理工学院博士学位,在人工智能领域造诣深厚:

    • 在IEEE Transactions等顶级学术期刊及国际会议发表论文超过50篇
    • 拥有多项中美发明专利。
    • 荣获吴文俊人工智能科学技术奖(中国人工智能领域重要奖项)。
  • 目前,我有幸与鲁博士共同进行人工智能相关研究。

在这里插入图片描述

内容实用,循序渐进:

  • 资料体系化覆盖了从基础概念入门核心技术进阶的知识点。

  • 包含丰富的视频教程实战项目案例,强调动手实践能力。

  • 无论你是初探AI领域的新手,还是已有一定技术基础希望深入大模型的学习者,这份资料都能为你提供系统性的学习路径和宝贵的实践参考助力你提升技术能力,向大模型相关岗位转型发展

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

抓住机遇,开启你的AI学习之旅!

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值