文章目录
- LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)
- Self-Attention (自注意力机制)
- 结构
- 多头注意力
- Encoder
- Add & Norm 层
- Feed Forward 层
- Encoder
- Decoder的第一个Multi-Head Attention
- Masked 操作
- Teacher Forcing 概念
- Decoder 预测
- 第一个Multi-Head Attention的具体步骤
- 输入准备
- 生成 Q、K、V 矩阵并计算 (QK^T)
- Mask 操作
- 计算输出矩阵 Z
- 获取最终输出
- Decoder的第二个Multi-Head Attention
- 第二个Multi - Head Attention介绍
- Softmax 预测输出单词
- 并行训练
- 序列到序列模型的常规训练困境
- Teacher Forcing 实现并行化的原理
- 不使用教师强制
- 基础序列设定
- 解码器的输入输出过程(按时间步展开)
- 无法并行化的核心原因
- 采用教师强制
- 解码器输入与目标输出
- 并行化训练过程
- 并行化训练的关键点
- 并行化训练的核心原理
- 已知的输入序列
- 去除时间步依赖
- 并行计算所有时间步
- Transformer 架构的核心特点的总结
- 1. 并行训练能力
- 2. 位置信息的处理
- 3. Self - Attention 结构的核心性
- 4. Multi - Head Attention 的作用
- 正采样和负采样
- RNN(循环神经网络)和 LSTM(长短期记忆网络)的区别
- 结构方面:
- 处理依赖关系的能力方面:
- 复杂度方面:
- 训练方面:
- 应用场景方面:
LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)
原视频链接
Self-Attention (自注意力机制)
这段内容主要介绍了 Transformer 的整体结构,要点如下:
- 结构:图中为论文里 Transformer 的内部结构图,左侧是 Encoder block(编码器模块),右侧是 Decoder block(解码器模块) 。
- Multi-Head Attention(多头注意力机制):
- 由多个 Self-Attention(自注意力机制)组成。
- Encoder block 包含一个 Multi-Head Attention;Decoder block 包含两个 Multi-Head Attention,其中一个使用了 Masked(掩码)。
- Add & Norm 层:位于 Multi-Head Attention 上方。Add 即残差连接,作用是防止网络退化;Norm 即 Layer Normalization(层归一化),用于对每一层的激活值进行归一化。
- 重点:Self-Attention 是 Transformer 的重点,后续将着重关注 Multi-Head Attention 和 Self-Attention,会先详细讲解 Self-Attention 逻辑 。
- 在 Transformer 架构中,左侧 Encoder 向右侧 Decoder 传递的两个箭头分别代表:
- Key(K)矩阵:由 Encoder 对输入序列(如源语言句子)编码生成,用于在 Decoder 的交叉注意力计算中,衡量源序列各位置与当前解码位置的关联权重。
- Value(V)矩阵:同样由 Encoder 输出,包含源序列各位置的语义 “值” 信息。在交叉注意力中,基于计算出的注意力权重,对 V 矩阵加权求和,为 Decoder 生成目标序列(如翻译结果)提供语义依据。
这两个矩阵是 Decoder 交叉注意力层的核心输入,配合 Decoder 自身生成的 Query(Q),实现对源序列编码信息的利用,确保目标序列生成的准确性。
结构
1.计算 Attention 公式
- 得到矩阵 Q(Query,查询矩阵)、K(Key,键矩阵)、V(Value,值矩阵)后,通过公式 ( A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V ) 计算 Self-Attention 的输出,其中 (d_k) 是 Q、K 矩阵的列数,也就是向量维度。除以 ( d k \sqrt{d_k} dk) 是为了防止内积过大。
- Q 乘以 K 的转置 (
K
T
K^T
KT) 后,得到的矩阵行列数都为 n(n 为句子单词数),这个矩阵表示单词之间的 attention 强度。
2.( Q K T QK^T QKT) 的计算 - 得到(
Q
K
T
QK^T
QKT) 矩阵后,对矩阵的每一行进行 Softmax 操作,使得每一行的和变为 1,这样就得到了每个单词对于其他单词的 attention 系数。
3.计算最终输出 Z - 将经过 Softmax 后的矩阵与 V 矩阵相乘,得到最终的输出 Z。以单词 1 为例,Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出( Z 1 Z_1 Z1) 等于所有单词 i 的值 ( V i V_i Vi) 根据 attention 系数的比例加和得到。
多头注意力
1.结构组成:从图中可以看到,Multi-Head Attention 包含多个 Self-Attention 层。输入 X 首先分别经过线性变换得到 Q(Query)、K(Key)、V(Value)矩阵,然后进入多个(h 个)Scaled Dot-Product Attention(缩放点积注意力,即 Self-Attention)层中。
2.计算步骤
- 以 h=8 为例,输入 X 分别传入 8 个不同的 Self-Attention 层中,每个 Self-Attention 层独立计算,得到 8 个输出矩阵 Z1 到 Z8。
- 将这 8 个输出矩阵拼接在一起(Concat 操作)。
- 拼接后的矩阵再传入一个 Linear(线性)层进行变换,最终得到 Multi-Head Attention 的输出矩阵 Z。
3.输出特点:Multi-Head Attention 输出的矩阵 Z 与其输入的矩阵 X 的维度是一样的,这保证了在模型结构中数据维度的一致性,方便后续的处理 。
Encoder
Add & Norm 层
- 组成与公式:Add & Norm 层由 Add(加法)和 Norm(归一化)两部分组成。其计算公式为 LayerNorm (X + MultiHeadAttention (X)) 或 LayerNorm (X + FeedForward (X)),其中 X 是 Multi-Head Attention 或 Feed Forward 的输入,由于它们的输出与输入 X 维度相同,所以可以相加。
- Add 操作(残差连接):X 与 MultiHeadAttention (X) 相加的操作是一种残差连接,常见于 ResNet 中。这种连接方式有助于解决多层网络训练时的问题,让网络专注于当前差异部分的学习。
- Norm 操作(层归一化):Norm 指 Layer Normalization(层归一化),常用于 RNN 结构中。它将每一层神经元的输入转化为均值和方差一致的形式,从而加快模型的收敛速度。
Feed Forward 层
- 结构与公式:Feed Forward 层是一个两层的全连接层。第一层使用激活函数 ReLU(Rectified Linear Unit),第二层不使用激活函数。对应的公式是 max (0, XW₁ + b₁) W₂ + b₂,其中 X 是输入。
- ReLU 函数:ReLU 函数定义为 ReLU (x) = max (0, x)。当输入值 x > 0 时,输出为 x;当 x ≤ 0 时,输出为 0 。
- 输出特点:Feed Forward 层最终得到的输出矩阵维度与输入 X 一致。
Encoder
Decoder的第一个Multi-Head Attention
Masked 操作
- 操作原因:在实际的翻译过程中,单词是按照顺序逐个生成的,在生成第 i 个单词时,模型不应该提前获取到第 (i+1) 个单词及之后的信息,否则就不符合真实的翻译流程,也会导致模型学习到错误的依赖关系。因此,在 Decoder block 的第一个 Multi - Head Attention 中引入了 Masked 操作,来防止信息的 “泄露”。
- 示例说明:以 “我有一只猫” 翻译成英文 “I have a cat” 为例,在进行翻译时,模型首先根据输入的起始标记 “” 预测第一个单词 “I”,然后根据 “ I” 预测下一个单词 “have”,依此类推。在这个过程中,为了模拟真实的翻译过程,需要对后续未生成的单词进行掩盖。
- 技术实现:在 Self - Attention 计算过程中,Mask 操作是在 Softmax 之前执行的。假设输入矩阵包含了 “ I have a cat” 这五个单词的表示向量,对应的 Mask 矩阵是一个 5×5 的方阵。在 Mask 矩阵中,用 0 表示不遮挡,用其他值(这里可理解为一种表示遮挡的标记)表示遮挡。从矩阵中可以看出,单词 0(即 “”)只能使用自身的信息;单词 1(即 “I”)可以使用单词 0 和自身的信息,以此类推,每个单词只能使用其之前单词的信息,从而实现了对未来信息的屏蔽。
Teacher Forcing 概念
- 训练方法:在处理像语言翻译这样的序列生成任务时,为了使模型能够有效地从输入句子逐步生成相应的翻译,经常会采用 Teacher Forcing 方法。简单来说,在模型训练过程中,每一步模型不是依据自己上一步预测的单词来生成下一步的输出,而是直接使用正确的下一个单词来辅助模型做出判断。例如,在教小朋友用英语造句时,不希望小朋友自由发挥,而是让他们按照正确的例子进行练习,这样小朋友能更快学会如何正确造句,对于模型训练也是同样的道理。
- 好处
- 加快学习速度:模型在训练时总是基于正确的信息进行学习,避免了被自己错误的预测所误导,从而能够更快地收敛,减少训练时间。
- 帮助理解语言结构:通过不断地接触正确的单词序列,模型可以更好地学习语言中单词之间的顺序、语法结构以及语义关系等重要信息。
- 使用时机
- 训练阶段:在模型训练时,使用 Teacher Forcing 可以让模型快速学习到语言的模式和规律,提高训练效率。
- 独立工作阶段:当模型在实际应用中,比如进行实时翻译时,由于没有正确答案可供参考,模型就只能根据自己上一步的输出结果继续生成后续内容,此时模型将展示其真实的学习和预测能力。
Decoder 预测
- 训练过程:在 Decoder 的训练过程中,可以采用 Teacher Forcing 方法,并且可以进行并行训练。具体做法是将正确的单词序列(如 “ I have a cat”)作为输入传递给 Decoder,同时将对应的输出(“I have a cat ”)也提供给模型,模型通过不断调整参数,使得自己的输出尽可能接近正确答案。
- 预测过程:在预测第 i 个输出时,模型会按照上文提到的 Mask 操作,将第 (i+1) 之后的单词进行掩盖,只使用之前生成的单词信息以及 Encoder 的输出信息来生成当前单词,从而逐步生成整个目标序列。
第一个Multi-Head Attention的具体步骤
输入准备
- 输入矩阵 X:包含 “ I have a cat” 这 5 个单词的表示向量,维度对应 5 个单词。
- Mask 矩阵:一个 5×5 的方阵,用于限定每个单词可获取信息的范围。从矩阵中能看出,单词 0 只能使用自身信息,单词 1 可使用单词 0 和自身的信息,依此类推,体现了单词只能利用其之前单词信息的规则。
生成 Q、K、V 矩阵并计算 (QK^T)
- 按照 Self - Attention 的常规流程,由输入矩阵 X 计算得出 Q(查询矩阵)、K(键矩阵)、V(值矩阵)。
- 将 Q 矩阵与 K 矩阵的转置 (K^T) 相乘,得到 (QK^T) 矩阵,该矩阵反映了单词间的注意力关联程度。
Mask 操作
在对 (QK^T) 进行 Softmax 计算注意力得分前,使用 Mask 矩阵进行遮挡。通过按位相乘的方式,将 (QK^T) 与 Mask 矩阵运算,得到 Mask (QK^T) 矩阵。被 Mask 矩阵中黄色(遮挡部分)对应的位置,在 Mask (QK^T) 矩阵中会被特殊处理,使其在后续计算中不起作用。
计算输出矩阵 Z
将 Mask (QK^T) 矩阵与 V 矩阵相乘,得到输出矩阵 Z。以单词 1 为例,其输出向量 (Z_1) 仅包含单词 1 及其之前单词的信息,保证了生成过程中不会提前获取未来信息。
获取最终输出
经上述步骤得到 Masked Self - Attention 的输出矩阵 (Z_1) 。和 Encoder 类似,多个这样的输出通过 Multi - Head Attention 拼接,最终得到第一个 Multi - Head Attention 的输出 Z,且 Z 与输入 X 维度一致,以便于后续模型处理。
Decoder的第二个Multi-Head Attention
Decoder的第二个Multi-Head Attention接收来自Encdoer的K和V矩阵,以及来自Decoder的第一个Multi-Head Attention发送的Q矩阵。
第二个Multi - Head Attention介绍
- 计算差异:Decoder block 的第二个 Multi - Head Attention 与第一个不同,Self - Attention 中的 K、V 矩阵并非用上一个 Decoder block 的输出计算,而是基于 Encoder 的编码信息矩阵 C 。对于 Q 矩阵,若为第一个 Decoder block,使用输入矩阵 X 计算;若非第一个,则使用上一个 Decoder block 的输出 Z 计算。
- 优势:在后续计算中,每个单词都能无掩码地利用 Encoder 中所有单词的信息,这有助于 Decoder 在生成输出时,充分借鉴 Encoder 提取的完整语义,使生成结果更精准合理。
- 中间矩阵 C 的使用:连接 Encoder 和 Decoder 的中间矩阵 C 的使用次数取决于 Decoder 的层数,有 N 层 Decoder,C 就会被使用 N 次。
Softmax 预测输出单词
- 输出矩阵 Z 的特性:经前面网络层计算得到最终输出矩阵 Z,由于 Mask 操作,每个单词的输出仅包含该单词及其之前单词的信息。比如单词 0 的输出 (Z_0) 只含单词 0 的信息,而整个矩阵 Z 涵盖单词 0 到 4 的信息。
- Softmax 预测机制:Softmax 函数对输出矩阵 Z 的每一行进行运算,将其转化为概率分布,以此来预测下一个单词。图中呈现了 Softmax 分别处理矩阵 Z 的每一行,逐个预测单词的过程。
- Decoder 的构成:Decoder 和 Encoder 相似,由多个 Decoder block 叠加组成。每个 Decoder block 执行从输入到 Softmax 预测单词的完整流程,多个 Decoder block 协同工作,增强模型处理复杂信息的能力,助力完成序列生成任务,如机器翻译 。
并行训练
序列到序列模型的常规训练困境
在序列到序列(Seq2Seq)模型训练中,若不使用 Teacher Forcing:
- 解码器(Decoder)每个时间步的输入依赖前一个时间步的输出。例如,生成句子时,下一个词的输入需基于上一个词的预测结果。
- 这种时间步间的依赖性导致计算必须按顺序进行,无法并行化处理,训练效率较低。
Teacher Forcing 实现并行化的原理
使用 Teacher Forcing 后:
- 输入替换:训练时,将解码器每个时间步的输入替换为目标序列中对应的真实词语。例如,翻译任务中直接使用正确的目标词序列作为输入,而非模型前一步的预测结果。
- 消除依赖:所有时间步的输入均为已知的真实序列,时间步之间不再有依赖关系。
- 并行计算:由于输入独立,可同时计算解码器在所有时间步的输出,利用矩阵运算和硬件加速(如 GPU)实现并行化训练,大幅提升训练效率。
Teacher Forcing 通过引入目标真实序列作为输入,打破时间步间的依赖,使 Decoder 的多时间步计算可并行执行,解决了 Seq2Seq 模型训练中的效率瓶颈。
不使用教师强制
在序列到序列模型中,不使用教师强制(Teacher Forcing)时,解码器(Decoder)无法并行化训练的原因,具体内容如下:
基础序列设定
- 输入序列(Encoder 输入):<Begin> I have a cat,包含起始标记<Begin>,作为编码器的输入。
- 目标输出序列(解码器目标输出):I have a cat <end>,是解码器需要拟合的正确输出,包含结束标记<end>。
解码器的输入输出过程(按时间步展开)
- 时间步 t=1:
- 输入:仅起始标记<Begin>。
- 输出预测:模型生成第一个词的预测结果Y1。
- 时间步 t=2:
- 输入:前一时间步的预测输出Y1。
- 输出预测:基于Y1生成第二个词的预测结果Y2。
- 时间步 t=3 至 t=5:依此类推,每个时间步的输入都是前一步的预测输出(Y2→Y3→Y4),最终生成对应时间步的预测结果(Y3→Y4→Y5)。
无法并行化的核心原因
在这种模式下,每个时间步的输入依赖前一个时间步的输出。例如,t=2 的输入Y1是 t=1 的预测结果,t=3 的输入Y2是 t=2 的预测结果。这种强依赖关系使得计算必须按顺序逐步执行,无法同时计算多个时间步的输出,因此无法实现并行化训练,训练效率较低。
采用教师强制
解码器输入与目标输出
- 解码器输入序列:以<Begin> I have a cat为例,包含起始标记<Begin>,作为解码器的输入引导。
- 解码器目标输出序列:对应I have a cat <end>,包含结束标记<end>,是模型训练需要拟合的正确输出。
并行化训练过程
- 步骤 1:准备输入和目标输出
- t=1:输入为<Begin>,目标输出为I;
- t=2:输入为<Begin> I,目标输出为have;
- 依此类推,直至 t=5,输入为完整序列<Begin> I have a cat,目标输出为<end>。
- 步骤 2:模型计算
- 输入处理:将输入词转换为词向量或嵌入表示,组织成矩阵形式。
- 并行计算:将整个输入序列一次性传入解码器,利用矩阵运算和硬件加速(如 GPU),并行计算所有时间步的输出(如 t1 到 t5 的预测结果Y1到Y5),而非逐步计算。
- 步骤 3:损失计算和反向传播
- 损失计算:并行计算每个时间步的预测输出与目标输出的损失(如交叉熵损失)。
- 梯度更新:基于并行计算的损失,同步计算模型参数的梯度并更新,提升训练效率。
并行化训练的关键点
- 时间步无依赖性:使用教师强制后,解码器的输入序列完全由真实目标序列决定,不再依赖模型前一时间步的预测结果,避免了时间步间的计算依赖,使多时间步计算可同时进行。
- 利用矩阵运算并行化:将序列数据组织成矩阵形式,借助深度学习框架(如 TensorFlow、PyTorch)的向量化计算能力,一次性完成整个序列的前向传播、损失计算和梯度更新,大幅缩短训练时间。
并行化训练的核心原理
已知的输入序列
在训练过程中,教师强制直接使用目标序列中正确的词语作为解码器的输入,而非依赖模型前一时间步的预测结果。例如在翻译任务中,直接将目标语言的正确词序列(如 “I have a cat <end>”)作为解码器输入,所有输入内容在训练前就已确定,无需等待模型逐步生成。
去除时间步依赖
传统序列生成模型中,每个时间步的输入依赖前一步的输出,导致计算必须串行。而教师强制通过输入已知的目标序列,消除了时间步之间的依赖关系。每个时间步的计算仅基于已确定的输入数据,无需等待前一步的预测结果,为并行计算创造了条件。
并行计算所有时间步
由于所有时间步的输入均为已知的目标序列,可将整个输入序列一次性提供给模型。借助深度学习框架的矩阵运算和硬件加速(如 GPU),模型能够同时计算所有时间步的输出,而非按顺序逐步生成。这种方式充分利用了并行计算能力,大幅提升训练效率。
综上,教师强制通过 “输入已知化” 和 “消除依赖”,让模型摆脱串行计算的限制,最终实现多时间步的并行化训练。
Transformer 架构的核心特点的总结
1. 并行训练能力
Transformer 与 RNN 不同,具备良好的并行训练特性。RNN 因序列处理的前后依赖关系(需按时间步依次计算),难以实现并行化;而 Transformer 通过 Self - Attention(自注意力机制),可同时处理序列中所有位置的信息,能充分利用 GPU 等硬件进行并行计算,大幅提升训练效率。
2. 位置信息的处理
Transformer 本身无法直接利用单词的顺序信息(若不处理,其效果类似 “词袋模型”,忽略词序)。因此,需在输入中添加位置 Embedding(位置嵌入),将单词的位置信息编码到输入向量中,使模型能够感知单词在序列中的位置,从而理解文本的顺序结构。
3. Self - Attention 结构的核心性
Transformer 的核心是 Self - Attention 结构。其中的 Q(Query,查询矩阵)、K(Key,键矩阵)、V(Value,值矩阵)通过对输入进行线性变换得到。通过计算 Q 与 K 的关联,再结合 V 生成注意力输出,这一机制是 Transformer 捕捉序列内部依赖关系的基础。
4. Multi - Head Attention 的作用
Multi - Head Attention(多头注意力机制)包含多个并行的 Self - Attention。每个 Self - Attention 从不同维度捕捉单词之间的关联关系(即不同的 attention score,注意力得分),最后融合多头结果。这种设计让模型能从多种视角学习序列信息,增强对复杂语义关系的表达能力。
正采样和负采样
- 正采样:是从数据集中选择正例(目标类别)样本的过程。在分类或对比学习等任务里,正例样本是期望模型能够正确分类、识别或捕获特征的样本。 例如在图像分类任务中,要训练一个识别猫的模型,那么所有猫的图片就是正例样本,从这些猫的图片中挑选样本的操作就是正采样,它能保证模型在训练过程中学习到猫的关键特征 。又如在自然语言处理的情感分析中,如果将积极情感的文本视为正例,从积极情感文本集合中选取样本用于训练,就是正采样。
- 负采样:是从数据集中选择负例(非目标类别)样本的过程。在对比学习里,负例样本与正例相对,是不属于目标类别的样本。 比如在上述猫的图像分类模型训练中,狗、汽车等非猫的图片就是负例样本,对它们进行采样即为负采样。在推荐系统中,用户点击、购买的商品可作为正样本,而用户未交互过的商品则可作为负样本进行负采样。
在实际应用中,二者常配合使用,例如在对比学习中:
1.锚定样本的选择:随机从数据集中选一个样本作为锚定样本,这是要学习的目标样本。
2.正例样本的选择:从同一类别中挑选与锚定样本相似的作为正例样本,它们应属于相同类别或有相似特征。
3.负例样本的选择:从不同类别或特征差异大的样本中选取若干作为负例样本 。
4.模型训练:模型通过计算锚定样本与正例、负例样本之间的相似性得分,并利用对比损失函数,最大化锚定样本与正例样本的相似性得分,最小化与负例样本的相似性得分,再经反向传播和参数更新,使模型学习到更好的特征表示,提升分类或相似性度量性能。
此外,负采样还有其他作用: - 提升计算效率:在推荐系统基于隐式反馈的协同过滤算法中,若不进行负采样,需将用户未交互的所有商品都作为负例优化,计算量巨大。而负采样只需优化部分负例相关向量,能减少训练负荷。
- 保证训练效果:实际中,正例数量相对有限,随机负例过多可能无效。 负采样能针对性提供高质量负例,加快收敛速度,让模型朝预期方向优化 。
RNN(循环神经网络)和 LSTM(长短期记忆网络)的区别
结构方面:
- RNN:结构较为简单,包含一个循环,允许信息从网络的一个步骤传递到下一个步骤,通过隐藏层的循环连接来处理序列数据,每个时间步的隐藏状态依赖于前一个时间步的隐藏状态和当前输入。
- LSTM:结构相对复杂,在 RNN 基础上引入了 “门”(gate)的结构,包括输入门、遗忘门和输出门,还增加了细胞状态(cell state) 。这些门和细胞状态相互配合,对信息的流动进行精准控制。
处理依赖关系的能力方面:
- RNN:理论上可以处理序列数据,能捕捉短期依赖关系,但在处理长期依赖关系时存在困难。因为在反向传播过程中,随着时间步的增加,梯度会逐渐消失(也可能出现梯度爆炸,但可通过梯度裁剪缓解),导致无法有效学习长距离的依赖信息 。
- LSTM:专门为解决 RNN 的梯度消失问题而设计,通过门控机制和细胞状态,LSTM 可以选择性地记住或者忘记信息,维持长期依赖关系,从而在处理长序列数据时能保持较好的性能,有效捕捉长距离的语义关联。
复杂度方面:
- RNN:结构简单,计算成本较低,所需的计算资源和时间相对较少。
- LSTM:由于引入了多个门和细胞状态等结构,参数更多,计算复杂度更高,训练时需要更多的计算资源和时间。
训练方面:
- RNN:通常训练速度比 LSTM 快,但由于梯度消失问题,在训练时往往需要更细致的设计,如合适的初始化、学习率调整等,以避免训练失败。
- LSTM:虽然训练时间更长,但在涉及长序列的任务上更倾向于收敛,训练过程相对更稳定可靠。
应用场景方面:
- RNN:在序列相对较短,对计算效率要求较高,且对长期依赖关系要求不高的场景中可能会被使用,不过在很多实际复杂的序列处理应用中,正逐渐被 LSTM 等改进模型取代。
- LSTM:在机器翻译、语音识别、文本生成、情感分析、时间序列预测等需要理解长期依赖关系和处理长序列数据的任务中广泛应用 。