前言:
该部分[1]涉及到了经典的注意力机制,便是那篇著名的论文《Attention Is All You Need》[2],提出了Transformer架构,完全的注意力机制。
核心便是提出了缩放点积注意力(Scaled Dot-Product Attention),并进一步使用多头注意力(Multi-Head Attention),由于使用的是编码器-解码器架构(Encoder-Decoder),根据“Q/KV 的来源与是否加掩码约束”,注意力模块进一步可分为三种:自注意力(Self-Attention)、掩码自注意力(Masked Self-Attention,又称为因果注意力Causal Attention)、交叉注意力(Cross-Attention,又称编解码注意力Encoder-Decoder Attention)。
并对Transformer架构神经网络核心部分(前馈神经网络、层归一化、残差连接)进行了简要总结。Transformer架构的输入输出部分(tokenizer分词器、Embedding 层、位置编码、输出头)放于Task03总结。Transformer架构神经网络的编码器模块、解码器模块,分别放于Task04 Encoder-only与Task05 Decoder-only部分进行总结。
值得注意的是,,,其实“缩放点积”(对应相似度计算方式)、“多头”(对应特征维度)、“自、掩码自、交叉”(对应掩码与序列来源)是从三个维度去描述的架构特征。
1 缩放点积注意力
1.1 神经网络的发展历程
1943年神经元模型——1957年感知器算法——多层感知器(全连接神经⽹络(Feedforward Neural Network,FNN))+误差反向传播算法(BP)——卷积神经⽹络(Convolutional Neural Network,CNN)——循环神经⽹络(Recurrent Neural Network,RNN)——2017年,Transformer
1.2注意力机制
1.3 计算过程
根据《Attention Is All You Need》中的图,进行注释如下:
- 注:加上掩码就是“因果注意力”,根据Q与K\V是否来源于同一序列,区分为“自注意力”、“交叉注意力”。
具体的计算过程如下图所示:
由此可见,注意力机制,就是对Q中的每一个q,计算K中的每一个k的注意力权重,然后进行加权求和。总共有m个q与n个k,复杂度即为O(m·n)。对于自注意力,m=n,复杂度即为O(n2)。
2 多头点积注意力
⼀次注意⼒计算聚焦拟合⼀种相关关系,所以通过“多头”并行的形式,对⼀个过程进⾏多次注意⼒计算,每次注意⼒计算都聚焦拟合不同的相关关系,即为“多头注意力”,主要就是一种并行形式。
根据《Attention Is All You Need》中的图,进行注释如下:
- 注1:在 1 缩放点积注意力 中,Q、K、V是已经变换后的矩阵,而原文中尽管也是写作“Q、K、V”,但实际上是变换前的原始特征序列,是一种“端口”叫法。为了全文统一,原始特征序列,即“对象A”、“对象B”,后续记作“X”、“Y”,Q端口输入为X,K、V端口输入为Y。
- 注2:神经网络里的 Linear 投影层,就是进行了一次线性变换,而“任意一个线性变换,都可以用一个唯一的矩阵来表示”,也就是乘以了一个变换矩阵/投影矩阵。(线性层
,实际上数学上属于仿射变换,在线性变换基础上加了平移,但是在深度学习已经是通用叫法,同时QKV 投影中,很多实现会关闭偏置,此时线性层就等价于纯线性变换,也就是一次纯矩阵乘法)
具体的计算过程如下图所示:
- 注1:这是对于缩放点积注意力的通用架构,可以用于三种变体的注意力模块。
- 注2:核心是在融合信息,把对象B的信息融入到对象A中。
3 注意力模块
3.1 自注意力
计算一个序列自身中每个元素对其他元素的注意⼒分布。
即在典型的注意力基础上,“对象A”、“对象B”是同一个对象,即X=Y。
通过⾃注意⼒机制,我们可以找到⼀段⽂本中每⼀个 token与其他所有token的相关关系⼤⼩,从⽽建模⽂本之间的依赖关系。[1]
3.2 掩码自注意力
在自注意力的基础上,使用“掩码”,遮盖未来的信息。让模型只能通过“要预测目标”之前的token,来预测当前目标token,遮盖住“要预测目标”之后的token,即未来信息。
通常使用“上三角矩阵”的方法,如下:
“掩码自注意力”也是GPT架构(仅解码器架构)的核心,可以充分发挥并行计算优势,在后续GPT部分(Decoder-Only仅解码器架构)详细说明。
3.3 交叉注意力
计算一个序列中每个元素对另一个序列中每个其他元素的注意⼒分布。
即在典型的注意力基础上,“对象A”、“对象B”是两个对象,即X≠Y。
对象 A仅作为查询侧输入,是 “发起查询的一方”,代表当前 token 的 “关注意图”,决定了要去匹配什么样的特征。
对象 B作为信息侧输入,被分为表层的 “特征标识”与本质的 “信息载体”,是最终被加权聚合的实际内容。
以一个序列作为 Query,以另一个序列的表征作为 Key 和 Value,实现两个序列之间动态的、token 级的信息交互与对齐。
本质就是将 B 序列的信息,按照 A 序列每个位置的查询意图,动态、选择性、单向、按需地融合进 A 的表征当中。
4 Transformer编码器-解码器架构
“序列到序列”(Seq2Seq)是NLP典型模式。编码器-解码器架构则是常用架构,即先对序列编码为表征向量,再解码为对应的序列。(更多算是一种思想吧)
Transformer是编码器-解码器架构,输⼊为⽂本序列,输出为另⼀个⽂本序列。
编码器(Encoder)部分,通过自注意力机制进行反复信息的融合,得到深层次表示;“编码”的核心是把具体的东西转化为抽象的表示;
解码器(Decoder)部分, 通过掩码自注意力机制对已输出序列进行信息融合,然后通过交叉注意力机制将来自“编码器”部分的深层次表示融入,同样经过多层传递,最后输出对下一个token的预测。解码的核心是把抽象的表示转化为具体的东西。
- 注:“交叉注意力机制将来自“编码器”部分的深层次表示融入”这里,又被称为“跨模态”,当然在Transformer里都是文本,没有“跨模态”,但也是英文-德文的源序列 - 目标序列的跨越。但是,如果把“文本编码器”换成别的模态编码器呢?语音编码器、图像编码器等等,就形成了以交叉注意力作为跨模态融合的方案。
先放一张论文原图:
然后是我注释过的图:
具体的“前馈神经网络”、“层归一化”、“残差连接”、编码器模块、解码器模块,前三者属于深度学习前置知识,后两者就是分别对自注意力、掩码自注意力+交叉注意力的应用,对“1-3”部分足够理解情况下应该比较好看懂架构了。下面对前三者进行简要说明。编码器模块、解码器模块具体内容放到“仅编码器Encoder-only”与“仅解码器Decoder-Only”部分吧~
4.1 前馈神经网络(重点☆)
- 注:这个地方有很多变种,比如在FFN 两层线性之间也加入 Dropout等等。
FFN接受的输入,是注意力层输出的 token 特征矩阵,也就是交互后的词元行向量按序列堆叠而成的矩阵(m个token就m行,每行d维度的向量)。
FFN逐位置进行处理,对每个 token 的特征向量独立执行完全相同的两层变换,不做跨 token 的信息交互。《Attention Is All You Need》中,第一层线性变换是升维,从512维到2048维,然后对升维后的特征逐元素施加激活函数,在进行第二层线性变换降维,从2048维到512维。在同一层 FFN 内,所有 token 位置共享同一套权重。这个过程也被等价为1*1卷积在通道维度做变换。
FFN输出和输入形状完全一致的 token 特征矩阵,每个 token 的向量都经过了非线性特征提炼,且维度与输入对齐,方便后续做残差连接和层归一化。
由此来看注意力层与FFN层:
注意力机制主要在序列维度,是在token之间进行交互,让每个 token 融合目标序列中所有 token 的上下文信息,捕捉序列依赖和上下文关系,对目标序列中 token 的特征做加权求和,整体非线性能力偏弱。注重序列上token之间的信息融合。
而 FFN 作用于特征维度,对每个位置的向量独立进行变换,不做跨 token 的信息交互,对 “融合完上下文的 token 表示” 做深度特征提炼,并通过非线性激活函数为模型引入了非线性变换能力,让 Transformer 可以拟合更任意复杂的语义映射。即注重在单个token 上进行特征的非线性变换。
4.2 层归一化
层归⼀化,也就是 Layer Norm,是深度学习中经典的归⼀化操作。神经⽹络主流的归⼀化⼀般有两种,批归⼀化(Batch Norm)和层归⼀化(Layer Norm)。[1]
层归一化(Layer Normalization,简称 LN)是深度学习中针对单个样本特征维度的归一化方法,核心作用是稳定神经网络的训练过程、加速收敛、缓解梯度消失 / 爆炸。
计算对象是单个样本的所有特征维度,和批次大小、序列长度完全无关。
给定某一层的输入向量(d 为特征维度),计算分为三步:
1. 计算该样本所有特征的均值和方差
2. 对每个特征做标准化,得到均值为0、方差为1的输出
3. 引入可学习的缩放参数和平移参数
(维度均为 d ),恢复模型的非线性表达能力
完整公式:
其中:,
;
是极小值,防止分母为0;
表示逐元素相乘。
归一化有两种位置,设为子层计算(比如前馈神经网络FFN、多头注意力MHA):
(1)Post-Norm(后归一化,原始 Transformer 设计):先完成子层计算 + Dropout + 残差相加,最后做归一化。
BERT、GPT1还是这种形式。
(2)Pre-Norm(前归一化,当前大模型主流设计):先对输入做归一化,再进入子层计算 + Dropout + 残差相加。
特点:训练更稳定,深层模型更容易收敛,从GPT2开始,大语言模型普遍均采用这种结构。
对于前归一化,最顶层需要额外加一个 Final Norm / Output Norm,用于对结果进行归一化输入预测头。
后、前归一化对比如下图所示:
4.3 残差连接
堪称奠定了深度学习的基础,最早用于ResNet网络,缓解了由于网络加深导致的梯度消失问题,有效保证了梯度在深层网络中的传播。(也不展开了。。可以参考[4]https://zhuanlan.zhihu.com/p/1992918095468188119)
很简单的方式:把输入的x取一条分支,直接连接到这一层计算的后面,这样设计的网络又被称为:残差网络/残差块,说白了就是把本层的输入直连到本层的输出并向后传递:
将学习任务从直接拟合目标函数转变为学习残差。通过直接传递输入,保证梯度在深层网络中不消失,或者说计算某一层学的不好,还有这一层的输入作为支撑保底。所有网络层/残差块的贡献,都能传递到最后进行叠加。
在Transformer架构中的应用如下(看见有旁路直连的就是):
编码器模块:多头自注意力MHA层、前馈神经网络FFN层;
解码器模块:多头掩码自注意力MMHA层、多头交叉注意力MHA层、前馈神经网络FFN层;
- 注:随着深度学习的继续发展,深度加深、参数加大,在“残差连接”上已经形成了专门的研究改进领域。。比如字节跳动:超连接(Hyper-Connections)DeepSeek V4:流形约束超连接(mHC)、月之暗面 Kimi:注意力残差(Attention Residuals)等等。。
[1]GitHub - datawhalechina/happy-llm: 📚 从零开始构建大模型 · GitHub
[2][1706.03762] Attention Is All You Need
Transformer——Attention Is All You Need经典论文翻译 - 邓范鑫 - 博客园(感觉不错的中译版)
[3]Transformer 中的 Pre-LN 与 Post-LN-CSDN博客
[4]https://zhuanlan.zhihu.com/p/1992918095468188119