Transformer 学习笔记 | Encoder

简介: 本文记录了学习Transformer模型过程中对Encoder部分的理解,包括多头自注意力机制(Multi-Head Self-Attention)和前馈网络(Feed-Forward Network)的工作原理。每个Encoder Layer包含残差连接(Residual Connection)和层归一化(Layer Normalization),以缓解梯度消失问题并稳定训练过程。文中详细解释了Q、K、V的含义及缩放点积注意力机制(Scaled Dot-Product Attention),并通过图解展示了各组件的工作流程。欢迎指正。

前言

本文是在学习Transformer过程中记录的笔记,可能有一些理解不到位的错误。望指正。


Pasted image 20250218093336.png

在 Transformer 模型中,Encoder 部分由多个相同的 Encoder Layer 堆叠而成,每个 Encoder Layer 包含两个主要子层,分别是 Multi-Head Self-Attention (多头自注意力机制) 和 Position-wise Feed-Forward Network(前馈网络)。

Multi-Head Self-Attention由 Scaled Dot-product Attention 和 Multi-Head Attention 以及 Self Attention 和 Add & Norm 组成。

(1)多头自注意力层处理
每个 Encoder 子模块在接收到输入后,首先会将其传递到多头自注意力层(Multi-Head Self-Attention layer)。在这一层中,通过多头自注意力机制(如前面所述,查询、键、值都来自同一个输入序列自身)去计算输入序列不同位置之间的关联关系,生成相应的自注意力输出。

(2)前馈层处理
自注意力层的输出紧接着被传递到前馈层(Feedforward layer)。前馈层一般是由全连接网络等构成,对自注意力层输出的特征做进一步的非线性变换,提取更复杂、高层次的特征,然后将其输出向上发送到下一个编码器(如果不是最后一个 Encoder 的话),以便后续 Encoder 子模块继续进行处理。

下图是一层Encoder Layer 的图解。
Pasted image 20250218094635.png

  • Multi-Head Attention (多头注意力机制)
  • Residual connection (残差连接)
  • Normalisation (层归一化)
  • Position-wise Feed-Forward Networks(前馈网络)

Residual connection (残差连接)

"残差" 的字面意思是 "剩余的差异" 或 "误差"。 在神经网络中,残差 指的是 期望输出与模型实际输出之间的差异。 但在 残差连接 的语境下,"残差" 的含义略有不同,更侧重于 "输入与输出的差异部分" 或者说 "模型学习到的输入之外的 额外信息"

数学定义:假设我们有一个神经网络层,输入是 x,输出是 F(x)(F(x) 表示对 x 进行某种变换,例如自注意力计算或前馈网络计算)。

  • 没有残差连接: 输出就是 F(x)。
  • 有残差连接: 输出是 x + F(x)。 这里,F(x) 就是 残差,它表示网络层学习到的 相对于输入的变化。

过程:

1. 输入: 将网络层(例如,自注意力层或前馈网络层)的输入 x 复制一份。
2. 变换: 对输入 x 进行正常的变换,得到 F(x)。        
3. 相加: 将 F(x) 与 原始输入 x 相加,得到最终输出:x + F(x)。
简而言之,残差连接就是在网络层的输出上加上它的输入。

总结

  • 残差连接 将子层的输出添加到其输入上,这样可以形成一个短路,允许梯度直接流过网络层,有助于缓解深层网络中的梯度消失问题。

  • 数学上,残差连接可以表示为: $$Residual=x+SubLayer(x)$$ 其中 x 是子层的输入 $SubLayer(x)$ 是子层的输出。

Normalisation (层归一化)

  1. 输入 (X + Sublayer_output): 层归一化的输入是 残差连接后的结果 $X + Sublayer_output$。
  2. 计算均值和方差 (Mean and Variance): 对于 每个样本 (在 Transformer 中,可以理解为序列中的每个 token 位置),计算其 所有特征维度 的均值 (mean) 和方差 (variance)。 注意: 层归一化是 对每个样本 内部 的特征维度进行归一化,而不是像 Batch Normalization 那样对整个 batch 的样本进行归一化。
  3. 归一化 (Normalization): 使用计算出的均值和方差,对每个样本的特征进行 标准化,使其均值为 0,方差为 1。
  4. 缩放和偏移 (Scale and Shift - 可选): 为了增加灵活性,层归一化通常还会引入两个 可学习的参数缩放系数 γ (gamma)偏移量 β (beta)。 归一化后的结果会再经过 缩放和偏移 操作: y = γ * normalized_x + β。 模型可以学习到最佳的缩放和偏移参数。

    层归一化可以 稳定神经网络的训练过程。 它可以 减少 Internal Covariate Shift (内部协变量偏移) 现象,即网络层输入分布在训练过程中不断变化的问题。 稳定的输入分布有助于网络更快、更稳定地学习。


将这两个操作结合在一起,“Add & Norm” 的步骤如下:

  1. 计算子层的输出: $SubLayer(x)$
  2. 执行残差连接:$Residual=x+SubLayer(x)$
  3. 应用层归一化: $Output=LayerNorm(Residual)$

所以,“Add & Norm” 的整个过程可以表示为: $Output=LayerNorm(x+SubLayer(x))$

多头注意力

Q,K,V 叫法的起源 Q、K 和 V 分别代表 Query(查询)、Key(键)和 Value(值)。这些术语的来源和它们在注意力机制中的角色都与数据库的查询概念有相似之处。

在注意力机制中:

  1. Query (Q): 它代表了正在询问的信息或关心的上下文。在自注意力机制中,每个序列元素都有一个对应的查询,它试图从其他部分找到相关信息。
  2. Key (K): 这些是可以查询的条目或“索引”。在自注意力机制中,每个序列元素都有一个对应的键。
  3. Value (V): 对于每一个“键”,都有一个与之关联的“值”,它代表实际的信息内容。当查询匹配到一个特定的键时,其对应的值就会被选中并返回。

这种思路与数据库查询非常相似,可以将 Query 看作是搜索查询,Key 看作是数据库索引,而 Value 则是实际的数据库条目。

在 "Attention Is All You Need" 这篇 Transformer 论文中,这些术语首次被广泛地采纳和使用。注意力机制的核心思想是:对于给定的 Query,计算其与所有 Keys 的相似度,然后用这些相似度对 Values 进行加权求和,得到最终的输出。

多头(Multi-Head) 的方式是将多个 head 的输出 z,进行拼接concat)后,通过线性变换得到最后的输出 z

Pasted image 20250218102211.png

缩放点积注意力(Scaled Dot-Product Attention)

Pasted image 20250218101324.png

也就是说,Q、K、V 都是对输入 x 的线性映射:

  • query = linear_q(x)
  • key = linear_k(x)
  • value = linear_v(x)

注意:这里的 linear_q(x),linear_k(x),linear_v(x) 相互独立,通过 softmax 函数对 Query(Q)和 Key(K)向量缩放点积的分数进行归一化,得到权重系数(attention weights),值都介于0到1之间。按照公式: $$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$$ 使用权重系数对$Value(V)$向量进行加权求和,得到最终的注意力输出 $Attention(Q, K, V)$。

Pasted image 20250218101653.png

其中,$\sqrt{d_k}$ 为缩放因子。这个缩放因子可以防止内积过大,防止它经过 softmax 后落入饱和区间,因为饱和区的梯度几乎为0,容易发生梯度消失。

在多头注意力机制中,参数 $dk$ (每个头的维度)通常是由总的模型维度 $d{model}$ 和多头注意力的头数 (h) 决定的。具体来说,$d_k$ 通常是这样计算的:
$$d_k=\frac{d_{\mathrm{model}}}h$$

总结

Pasted image 20250218101122.png

参考资料

https://www.datawhale.cn/learn/summary/87
https://www.researchgate.net/publication/355061779_Lightweight_Transformer_in_Federated_Setting_for_Human_Activity_Recognition?_tp=eyJjb250ZXh0Ijp7ImZpcnN0UGFnZSI6Il9kaXJlY3QiLCJwYWdlIjoiX2RpcmVjdCJ9fQ
https://github.com/xmu-xiaoma666/External-Attention-pytorch

相关文章
|
机器学习/深度学习 自然语言处理 索引
深度学习:Self-Attention与Multi-heads Attention详解
深度学习:Self-Attention与Multi-heads Attention详解
885 0
深度学习:Self-Attention与Multi-heads Attention详解
|
数据采集 PyTorch 数据处理
Pytorch学习笔记(3):图像的预处理(transforms)
Pytorch学习笔记(3):图像的预处理(transforms)
2456 1
Pytorch学习笔记(3):图像的预处理(transforms)
|
2月前
|
机器学习/深度学习 存储 人工智能
[大模型实战 03] 拆解 Transformers:从原理图解到 HuggingFace Transformers 实战
本文图解Transformer核心原理(注意力机制+位置编码),在Kaggle双T4 GPU环境下实战拆解Hugging Face“铁三角”(Config/Tokenizer/Model),并详解Temperature与Top_p两大生成调控参数,助你真正理解并掌控大模型推理。
705 11
[大模型实战 03] 拆解 Transformers:从原理图解到 HuggingFace Transformers 实战
|
2月前
|
机器学习/深度学习 监控 算法
PPO与DPO:大模型对齐的两大核心算法,差异与选型全解析
本文深度解析大模型对齐核心算法PPO与DPO:PPO基于RLHF框架,需训练奖励模型,对齐精准、稳定性强,但流程繁琐、资源消耗大;DPO跳过奖励建模,直接优化偏好,轻量高效、易上手。对比原理、流程、优劣及适用场景,助你科学选型,提升对齐效率。
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
编码器-解码器架构详解:Transformer如何在PyTorch中工作
本文深入解析Transformer架构,结合论文与PyTorch源码,详解编码器、解码器、位置编码及多头注意力机制的设计原理与实现细节,助你掌握大模型核心基础。建议点赞收藏,干货满满。
1675 3
|
4月前
|
机器学习/深度学习 自然语言处理 网络架构
Transformer基础结构
Transformer是Vaswani等人于2017年提出的基于注意力机制的神经网络架构,摒弃了传统RNN,实现并行化处理,显著提升自然语言处理性能。其核心为编码器-解码器结构,通过自注意力机制捕捉长距离依赖,结合位置编码、残差连接与层归一化,有效训练深层模型。多头注意力机制增强特征表达能力,广泛应用于机器翻译、文本生成等任务,成为现代大模型基石。
|
机器学习/深度学习 自然语言处理 算法
Transformer 学习笔记 | Decoder
本文记录了笔者学习Transformer的过程,重点介绍了填充(padding)和掩码(masking)机制。掩码确保解码器只依赖于之前的位置,避免信息泄露,保持因果关系及训练与推理的一致性。通过线性层和softmax函数生成输出概率,并使用梯度下降和反向传播进行训练。评估指标包括BLEU、ROUGE、METEOR和困惑度等。欢迎指正。
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
13556 46
|
5月前
|
机器学习/深度学习 人工智能 计算机视觉
Transformer中的残差连接与层归一化
残差连接与层归一化是深度学习的稳定基石:前者通过“信息高速公路”缓解梯度消失,后者以“训练稳定器”解决分布偏移。二者协同,使深层网络训练更高效,成为Transformer及大模型成功的关键。
|
5月前
|
存储 监控 Java
Project Loom 实战:百万并发的虚拟线程不是梦
Project Loom 引入虚拟线程,以极低开销实现百万级并发。轻量、易用,显著提升I/O密集型应用性能,重塑Java高并发编程体验。
493 7