LLM中的transformer结构学习(二 完结 Multi-Head Attention、Encoder、Decoder)
文章目录
- LLM中的transformer结构学习(二 完结 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中的transformer结构学习(二 完结 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:在机器翻译、语音识别、文本生成、情感分析、时间序列预测等需要理解长期依赖关系和处理长序列数据的任务中广泛应用 。
相关文章:
LLM中的transformer结构学习(二 完结 Multi-Head Attention、Encoder、Decoder)
文章目录 LLM中的transformer结构学习(二 完结 Multi-Head Attention、Encoder、Decoder)Self-Attention (自注意力机制)结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMas…...
高效编程指南:PyCharm与DeepSeek的完美结合
DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了,这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注:本文适用于所有的JetBrains开发工具,…...
嵌入式c学习四
c语言的输入输出:ANSI组织发布的标准c库,使用函数需要包含对应头文件,使用输入输出函数时需要包含stdio.h (stdio -> standard input output)标准输入输出 格式化输出:int printf(const char * restrict format, ...)…...
爱可以传递,幸福可以具象化
遇到什么:晚上上课学生吵吵吵,把学生手机全部收了,放讲台上。 感受到的情绪:很烦躁。 反思:收手机也不是长久之计,可是物理有什么翻转课堂呢? 明天的待办事项:早上高数选修课&#x…...
力扣-数组-367 有效的完全平方数
思路和时间复杂度 思路:利用二分,确定区间是左闭右闭,然后根据大小进行二分时间复杂度: 代码 class Solution { public:bool isPerfectSquare(int num) {bool flag false;if(num 0 || num 1) return true;long long …...
Java关键字与标识符
Java关键字是预定义的保留字,用于定义程序结构和语义,如if、for、class等,不能用作标识符。JDK 8有50个关键字,JDK 11引入var用于局部变量类型推断。标识符用于命名变量、类等,由字母、数字、_、$组成,不能…...
【神经网络】python实现神经网络(二)——正向推理的模拟演练
一.神经网络假设 在开始讲解之前,首先我们假设有这样一套神经网络,一共有三层: 其中,关于神经网络的权重、偏置的符号定义如下(如果不知道什么是权重和偏置,可以参考我之前写过的一篇文章:【机器学习】机器学习是什么意思): 以下文章将沿用以上这个设…...
DeepSeek模型本地化部署方案及Python实现
DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI…...
Rust规律归纳随笔
1. 针对所有权规则: 唯一所有权 <------------> 智能指针(引用计数)<-------------->共享所有权 (引用计数) { 单线程:Rc 多线程:Arc } 2. 针对借用规则: 共享不可变(多读)<----->…...
Houdini SOP层 Scatter节点
SOP 代表 Surface Operator(几何体操作节点),所有几何体的建模、变形、分布等操作都在此层级完成。 Scatter节点的作用就是 以不同的密度在模型表面撒点 Scatter 节点属于 SOP(几何体)层级: 进入 Geometr…...
Win7 火狐浏览器 Mozilla Firefox 115.7.0esr下载地址(及Chrome、Supermium浏览器)
如题,官网下载地址: Mozilla Firefox 115.7.0esr 已经发布,感兴趣的朋友可去官方下载! https://ftp.mozilla.org/pub/firefox/releases/115.7.0esr/ 其他方案: 1、谷歌 Chrome 浏览器的 109版本,即最后一…...
Docker 学习笔记:从入门到部署,实战演练全流程!
📌 开篇:为什么要学 Docker? 还在为环境不一致、部署麻烦、依赖冲突头疼吗?Docker 让一切变得简单!作为现代开发和运维的神器,Docker 让我们可以用 一句命令 解决 “在我电脑上能跑” 的问题。今天&#x…...
【网络安全工程】任务12:网络安全设备
目录 一、防火墙 1、作用 2、配置方式 3、存在的漏洞 二、入侵检测系统(IDS)和入侵防御系统(IPS) 1、作用 2、配置方式 3、存在的漏洞 三、防病毒网关 1、作用 2、配置方式 3、存在的漏洞 …...
Linux 进程控制:创建、终止、等待与程序替换全解析
亲爱的读者朋友们😃,此文开启知识盛宴与思想碰撞🎉。 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 目录 1.进程创建 1-1 fork函数初识 1-2 fork函数返回值 1-3…...
SwiftUI 让视图自适应高度的 6 种方法(四)
概览 在 SwiftUI 的世界里,我们无数次都梦想着视图可以自动根据布局上下文“因势而变”。大多数情况下,SwiftUI 会将每个视图尺寸处理的井井有条,不过在某些时候我们还是得亲力亲为。 如上图所示,无论顶部 TabView 容器里子视图…...
机器学习中的梯度下降是什么意思?
梯度下降(Gradient Descent)是机器学习中一种常用的优化算法,用于最小化损失函数(Loss Function)。通过迭代调整模型参数,梯度下降帮助模型逐步逼近最优解,从而提升模型的性能。 1.核心思想 梯…...
opencv-显示图片
安装软件 sudo apt install python3 //确保虚拟机只有python3 ln -sf /usr/bin/python3.6 /usr/bin/python sudo apt install python3-pip pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple pip install opencv-contrib-python -i https://pypi.tuna…...
sap关账+策略模式(避免大量if elseif)
旧代码 Transactional(rollbackFor Exception.class)public AjaxResult purchaseOrderReceiptOutSourceAfterSapCloseAccountingPeriod(Long id) {SysPurorderPostingLog sysPurorderPostingLog sysPurorderPostingLogMapper.selectSysPurorderPostingLogById(id);if (Object…...
EverArt MCP 服务器安装调试笔记 -cline
EverArt MCP 服务器安装调试笔记 问题描述 用户在使用 EverArt MCP 服务器时遇到报错:“MCP error -1: Connection closed”。 调试过程 检查配置文件 cline_mcp_settings.json: 确认 everart 服务器的配置信息,包括 command、args 和 env 是否正确。…...
1035.不相交的线
1035.不相交的线 力扣题目链接(opens new window) 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j]且绘制的直线…...
Django-ORM-select_related
Django-ORM-select_related 作用使用场景示例无 select_related 的查询有 select_related 的查询 如何理解 "只发起一次查询,包含所有相关作者信息"1. select_related 的工作原理2. 具体示例解析3. 为什么只发起一次查询 数据库中的books量巨大࿰…...
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MD&A词频统计两种方式)(吴非、赵宸宇、甄红线300关键词三种方法) 1、时间:2001-2023年 2、来源:上市公司年报 3、参考文献: …...
IO多路复用实现并发服务器
一.select函数 select 的调用注意事项 在使用 select 函数时,需要注意以下几个关键点: 1. 参数的修改与拷贝 readfds 等参数是结果参数 : select 函数会直接修改传入的 fd_set(如 readfds、writefds 和 exceptfds…...
React 如何实现组件懒加载以及懒加载的底层机制
前言 在现代前端开发中,性能优化始终是一个核心课题。React 作为当下流行的前端库之一,提供了一些非常有用的工具和技术来提升应用的性能,其中懒加载(Lazy Loading)就是一项不可忽视的重要技术。通过懒加载࿰…...
《论语别裁》第01章 学而(22) 种瓜者
下面一节,等于一个结论: 曾子曰:慎终追远,民德归厚矣。 古人对于这一句的解释,我也有点意见。拿孝道来讲,过去讲中国文化的孝道,本来很重要,我们看历史上给皇帝的奏议,常…...
如何设置GET请求的参数?
在使用PHP爬虫时,设置GET请求的参数是与目标网站交互的关键步骤。通过正确设置GET请求的参数,可以向目标网站发送查询请求并获取相应的数据。以下是如何在PHP中设置GET请求参数的详细说明,包括使用cURL和GuzzleHttp库的示例。 一、使用cURL设…...
C++20 模块:告别头文件,迎接现代化的模块系统
文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…...
SpringBoot集成Swagger指南
在Spring Boot项目中集成Swagger可以帮助你自动生成API文档,并且提供一个交互式的UI界面,方便开发者测试和调试API。以下是集成Swagger的步骤: 1. 添加Swagger依赖 首先,在你的pom.xml文件中添加Swagger的依赖项。通常使用的是s…...
有必要使用 Oracle 向量数据库吗?
向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索,进化到了可以直接基于语义的数据检索。这在AI时代至关重要! 回到标题问题:是否有必要使用 Oracle 向量数据库? 这实际还要取决于你的具体应用需求。 客观来讲…...
仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播
仅仅使用pytorch来手撕transformer架构(2):编码器模块和编码器类的实现和向前传播 往期文章: 仅仅使用pytorch来手撕transformer架构(1):位置编码的类的实现和向前传播 最适合小白入门的Transformer介绍 仅仅使用pytorch来手撕transformer…...
