datawhale:Happy-LLM 打卡-Task02:注意力机制与Transformer的Encoder-Decoder架构《Attention Is All You Need》

📅 发布时间:2026/10/22 1:51:49
datawhale:Happy-LLM 打卡-Task02:注意力机制与Transformer的Encoder-Decoder架构《Attention Is All You Need》
前言该部分[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 NetworkFNN误差反向传播算法BP——卷积神经⽹络Convolutional Neural NetworkCNN——循环神经⽹络Recurrent Neural NetworkRNN——2017年Transformer1.2注意力机制注意⼒机制起源于最先源于计算机视觉领域要求聚焦重点区域。在自然语言领域要求聚焦重点token。“注意”就是根据“对象A”去关注“对象B”。“对象A”就是“查询Query”“对象B”则分为两面一个硬币的两面一个是它的表层“键Key”一个是它的本质“值Value”。通过“查询Query”与“键Key”的相关性对“值Value”进行加权聚合。大致计算过程如下图所示本科毕设的图~~1.3 计算过程在自然语言中“对象A”、“对象B”是两个序列一串token每个token都可以转化为一个向量然后“对象A”的每个token向量通过线性投影得到查询向量q“对象B”的每个token向量通过两个独立的线性投影分别得到键向量k与值向量v。对于两个序列即多个token就会分别构成查询矩阵Q、键矩阵K与值矩阵V。根据《Attention Is All You Need》中的图进行注释如下注加上掩码就是“因果注意力”根据Q与K\V是否来源于同一序列区分为“自注意力”、“交叉注意力”。具体的计算过程如下图所示由此可见注意力机制就是对Q中的每一个q计算K中的每一个k的注意力权重然后进行加权求和。总共有m个q与n个k复杂度即为O(m·n)。对于自注意力mn复杂度即为O(n2)。2 多头点积注意力⼀次注意⼒计算聚焦拟合⼀种相关关系所以通过“多头”并行的形式对⼀个过程进⾏多次注意⼒计算每次注意⼒计算都聚焦拟合不同的相关关系即为“多头注意力”主要就是一种并行形式。根据《Attention Is All You Need》中的图进行注释如下注1在 1 缩放点积注意力 中Q、K、V是已经变换后的矩阵而原文中尽管也是写作“Q、K、V”但实际上是变换前的原始特征序列是一种“端口”叫法。为了全文统一原始特征序列即“对象A”、“对象B”后续记作“X”、“Y”Q端口输入为XK、V端口输入为Y。注2神经网络里的 Linear 投影层就是进行了一次线性变换而“任意一个线性变换都可以用一个唯一的矩阵来表示”也就是乘以了一个变换矩阵/投影矩阵。线性层实际上数学上属于仿射变换在线性变换基础上加了平移但是在深度学习已经是通用叫法同时QKV 投影中很多实现会关闭偏置此时线性层就等价于纯线性变换也就是一次纯矩阵乘法具体的计算过程如下图所示注1这是对于缩放点积注意力的通用架构可以用于三种变体的注意力模块。注2核心是在融合信息把对象B的信息融入到对象A中。3 注意力模块3.1 自注意力计算一个序列自身中每个元素对其他元素的注意⼒分布。即在典型的注意力基础上“对象A”、“对象B”是同一个对象即XY。通过⾃注意⼒机制我们可以找到⼀段⽂本中每⼀个 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 前馈神经网络重点☆前馈神经网络Feed Forward Neural Network下简称FFN其实本质就是多层感知机 MLP也是全连接神经网络里面就是 Linear 投影层就是进行了线性变换也就是乘以了一个变换矩阵/投影矩阵......不同的在于Transformer模型中是两个线性变换中间夹一个 ReLU 激活函数设 FFN 子层的输入为 x Dropout 的丢弃概率为 p 在 FFN 输出端施加 Dropout 操作随机失活训练期随机置零缩放推理期为恒等映射则 FFN 输出端加 Dropout 的表达式为注这个地方有很多变种比如在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、多头注意力MHA1Post-Norm后归一化原始 Transformer 设计先完成子层计算 Dropout 残差相加最后做归一化。BERT、GPT1还是这种形式。2Pre-Norm前归一化当前大模型主流设计先对输入做归一化再进入子层计算 Dropout 残差相加。特点训练更稳定深层模型更容易收敛从GPT2开始大语言模型普遍均采用这种结构。对于前归一化最顶层需要额外加一个 Final Norm / Output Norm用于对结果进行归一化输入预测头。后、前归一化对比如下图所示目前主流LLM使用的归一化函数从 LayerNorm 换成了 RMSNorm此外还出现了 QK-Norm等等。。归一化问题也可以单独拿出来研究了。。。进一步内容可以参考[3] Transformer 中的 Pre-LN 与 Post-LN-CSDN博客4.3 残差连接堪称奠定了深度学习的基础最早用于ResNet网络缓解了由于网络加深导致的梯度消失问题有效保证了梯度在深层网络中的传播。也不展开了。。可以参考[4]https://zhuanlan.zhihu.com/p/1992918095468188119很简单的方式把输入的x取一条分支直接连接到这一层计算的后面这样设计的网络又被称为残差网络/残差块说白了就是把本层的输入直连到本层的输出并向后传递将学习任务从直接拟合目标函数转变为学习残差。通过直接传递输入保证梯度在深层网络中不消失或者说计算某一层学的不好还有这一层的输入作为支撑保底。所有网络层/残差块的贡献都能传递到最后进行叠加。在Transformer架构中的应用如下看见有旁路直连的就是编码器模块多头自注意力MHA层、前馈神经网络FFN层解码器模块多头掩码自注意力MMHA层、多头交叉注意力MHA层、前馈神经网络FFN层注随着深度学习的继续发展深度加深、参数加大在“残差连接”上已经形成了专门的研究改进领域。。比如字节跳动超连接Hyper-ConnectionsDeepSeek V4流形约束超连接mHC、月之暗面 Kimi注意力残差Attention Residuals等等。。[1]GitHub - datawhalechina/happy-llm: 从零开始构建大模型 · GitHub[2][1706.03762] Attention Is All You NeedTransformer——Attention Is All You Need经典论文翻译 - 邓范鑫 - 博客园感觉不错的中译版[3]Transformer 中的 Pre-LN 与 Post-LN-CSDN博客[4]https://zhuanlan.zhihu.com/p/1992918095468188119