大模型应用开发之模型架构
一、Transformer 架构
1. 编码器Encoder(“阅读理解大师”)
1)核心任务:编码器的唯一目标就是彻底理解输入的句子。它要把输入的每个词(或者说词元 Token)都转化成一个充满上下文信息的“向量表示”(一串数字),这个向量里浓缩了这个词在整个句子里的意思
2)核心组件:Encoder由好几层完全相同的结构堆叠而成的。每一层都包含两个主要的处理单元
· 多头自注意力机制 (Multi-Head Self-Attention, MHA)
· 前馈神经网络 (Feed-Forward Network, FFN)
在每个注意力和前馈网络后,模型使用层归一化和残差连接来加强模型的训练稳定度,形式话来说,第 𝑙 层(𝑙 ∈ {1, . . . , 𝐿})的编码器的数据处理过程为:
-
X'_{l-1} = LayerNorm(MHA(X_{l-1}) + X_{l-1})
-
X_{l-1}: 第 l-1 层的输出,也是第 l 层的输入。
-
MHA(X_{l-1}): 输入经过多头自注意力处理。
-
MHA(X_{l-1}) + X_{l-1}: 第一个残差连接。
-
LayerNorm(...): 对残差连接的结果进行层归一化,得到中间表示 X'_{l-1}。
-
-
X_l = LayerNorm(FFN(X'_{l-1}) + X'_{l-1})
-
FFN(X'_{l-1}): 中间表示经过前馈网络处理。
-
FFN(X'_{l-1}) + X'_{l-1}: 第二个残差连接。
-
LayerNorm(...): 对残差连接的结果进行层归一化,得到第 l 层的最终输出 X_l。
-
最终经过所有编码器层的处理后,原始输入序列 X 中的每个词元都会得到一个最终的、深度融合了上下文信息的向量表示。这个向量集合(记为 X_L)就是编码器对输入的“理解成果”,它将被传递给解码器
2. 解码器 Decoder(“妙笔生花作家”)
1)核心任务: 解码器的目标是生成目标序列(比如翻译后的句子、问题的答案),利用encoder传来的对原始输入的理解成果和自己前面已经生成的词,一个词一个词地按顺序生成
2)核心组件:解码器也是由多层相同结构堆叠而成,但每一层比编码器多了一个处理单元,总共有三个主要单元:
· 带掩码的多头自注意力机制 (Masked Multi-Head Self-Attention)
· 多头交叉注意力机制 (Multi-Head Cross-Attention)
· 前馈神经网络 (FFN)
残差连接 (Add) 和层归一化 (Norm) 在解码器的每一层也都被广泛使用,围绕着上述三个处理单元,确保训练稳定和信息有效传递,数据流程为:
-
Y'_{l-1} = LayerNorm(MaskedMHA(Y_{l-1}) + Y_{l-1})
-
Y_{l-1}: 解码器第 l-1 层的输出,也是第 l 层的输入。
-
MaskedMHA(Y_{l-1}): 输入经过带掩码的多头自注意力处理。
-
残差连接和层归一化,得到中间表示 Y'_{l-1}。
-
-
Y''_{l-1} = LayerNorm(CrossMHA(Y'_{l-1}, X_L) + Y'_{l-1})
-
CrossMHA(Y'_{l-1}, X_L): Y'_{l-1} 作为 Query,编码器的输出 X_L 作为 Key 和 Value,进行交叉注意力处理。
-
残差连接和层归一化,得到中间表示 Y''_{l-1}。
-
-
Y_l = LayerNorm(FFN(Y''_{l-1}) + Y''_{l-1})
-
FFN(Y''_{l-1}): 中间表示经过前馈网络处理。
-
残差连接和层归一化,得到第 l 层的最终输出 Y_l
-
经过所有解码器层处理后, Y_L 会经过一个最后的线性层 (通常称为 LM Head),作用是将高维的 Y_L 向量投影到整个词汇表的大小 (V)。
O = softmax(W^L Y_L): O 就是最终的输出,代表下一个词元在词汇表上的概率分布。
W^L: 这个线性层的权重矩阵。
W^L Y_L: 得到的向量通常称为 logits,它的每个维度对应词汇表中的一个词元,值表示该词元是下一个词元的“原始得分”。 Logits 会通过一个 Softmax 函数,将其转换为一个概率分布。这个分布中,每个词元的概率值表示它作为下一个生成词元的可能性,所有概率加起来等于 1。
3. 流程总结概述
1) 首先通过输入编码输入文本,将词语和它们的位置信息结合成初始向量序列 X。
2) X 进入 Transformer 的核心层(Encoder 或 Decoder)。
3) 在每一层里,X 首先经过多头自注意力机制,实现词与词之间的信息交互和上下文理解,得到一个中间表示。
4) 然后,这个中间表示的每个位置再独立地通过前馈网络层 (FFN) 进行非线性变换和深化理解。
5) 在每一层的这两个子模块之后,通常都有残差连接和层归一化来帮助训练,整套流程(Attention + FFN + Add & Norm)重复 N 次(N 是模型的层数)。
4. 核心组件优化配置
1)输入编码(Input Encoding)
在我们把一句话喂给 Transformer 之前,需要将离散的词或字符转化为适合深度学习的向量表示,同时保留序列中的位置信息,融合语义和位置信息,将词嵌入向量 e 和对应的位置嵌入向量 P 相加生成统一的输入表示,为序列建模提供基础,过程包括:
· 词嵌入 (Token Embedding Module) :
目的:计算机无法识别单词或字,它只懂数字。所以将离散的词汇(例如“cat”、“dog”)变成连续的向量表示,使其可以被神经网络处理,捕捉词的语义信息。
作用:将输入序列(如句子或词序列) u=[u1,u2,…,ur] 中的每个词 ui 转换为一个高维向量。
具体操作:通过一个嵌入层(通常是一个查找表或神经网络层),每个词 ui 被映射为一个固定维度的向量 e,其维度为 d(例如 e∈Rd ),d 通常是模型设定的超参数(如 512 或 768)。
· 位置编码(Position Embedding, PE):
原因:Transformer 的核心(自注意力机制)在处理句子时,它通过并行处理所有词,是同时看到所有词的,本身并不直接关心词语的顺序,所以如果不加处理,“猫 在 地毯 上”和“地毯 在 猫 上”在它眼里可能差不多,因此需要额外的位置信息来区分词的前后关系。
作用:为句子中的每一个位置(第1个位置、第2个位置……第T个位置)生成一个专属的位置向量P,这个向量的维度与词嵌入向量维度相同,显式编码词在序列中的位置信息,告诉模型每个词在句子里的位置。
具体操作:通常,使用正弦和余弦函数计算(例如 P(t, 2i) = \sin(pos / 10000^{2i/d}),确保不同位置有独特的表示,且与维度 d 一致。
下面讨论几种位置编码方法:
a. 绝对位置(正余弦)编码(原始 Transformer)
使用正弦 (sin) 和余弦 (cos) 函数为每个绝对位置(0, 1, 2...)生成一个固定的向量。不同维度使用不同频率的三角函数,每个位置有固定地址。对于位置t和维度大小为d的位置嵌入:
优点: 实现简单,可以处理比训练时更长的序列(因为三角函数可以外插)。
缺点: 可能无法很好地泛化到远超训练长度的位置,对长文本能力有局限。
b. 相对位置编码
该方法不再给每个位置分配固定编码,而是在计算注意力分数时,额外考虑查询 (Query) 和键 (Key) 之间的相对距离,只关心相对距离。
Transformer-XL: 它对注意力分数的计算进行了修改,用相对位置信息替代了键的绝对位置信息。
T5:在计算注意力分数时,直接引入一个可学习的标量偏置(bias),这个偏置是基于查询和键的位置之间的距离计算的。
c. 旋转位置编码(Rotary Position Embedding, RoPE)
RoPE 是一种巧妙的相对位置编码方法,它通过对查询(Q)和键(K)向量应用旋转操作来融入位置信息。虽然旋转本身是基于绝对位置的,但其巧妙之处在于,在计算 Q 和 K 的点积(注意力核心步骤)时,位置信息会以相对的方式体现出来。
优点: 实现相对简洁,具有良好的外推性(处理长序列能力强),并且与自注意力机制结合得很好。已成为 LLaMA、PaLM 等主流大模型的标配。
d. ALiBi 位置编码
ALiBi 是一种特殊的相对位置编码方法,主要用于增强 Transformer 模型的长度外推能力。它不修改查询或键向量,也不学习位置嵌入。直接在计算注意力分数后,向注意力矩阵添加一个预设的、固定的偏置(bias)。这个偏置与查询和键之间的距离成线性关系,并且对于每个注意力头是特定的。
优点: 结构简单,不需要额外的位置编码层,并且也能很好地外推到长序列。
2)多头自注意力机制
在原始的 Transformer 模型中,注意力机制通过成对的方式进行序列数据的语义建模,充分考虑了序列中所有词元之间的相互关系。其中, 每个词元在注意力计算中都需要对于其前序的所有词元的键值对予以访问,因此 对于序列长度为 𝑇 的序列需要 𝑂(𝑇 ^2 ) 的计算复杂度。
之后,Transformer 引入多头注意力机制,通常由多个自注意力模块组成。每个自注意力模块i中,对输入的词元序列,通过不同语义空间的权重矩阵分别进行线性投影到查询(Query, 𝑸)、键(Key, 𝑲)和值(Value, 𝑽)空间:
然后计算每个模块i的注意力权重并且生成输出:
然后将每个头i的输出进行聚合并通过一个线性层融合形成最终的输出:
它解决了传统 RNN、CNN 在处理长距离依赖关系上的困难。 让模型在理解一个词的时候,能够同时关注到句子中所有其他词(包括它自己),并计算出每个其他词对理解当前词的重要性(注意力权重),直接建模任意距离的词元之间的交互关系
其他常见的注意力机制还有:
· 稀疏注意力机制:滑动窗口注意力 (Sliding Window Attention / Local Attention)是大语言模型中最长使用的一种稀疏注意力机制,完整注意力机制虽然能捕捉全局信息,但其计算复杂度是序列长度的平方级 (O(T^2)),在处理长序列时,计算和存储开销非常大。滑动窗口注意力机制旨在通过限制注意力的范围来降低这种复杂度,对每个词元只关注本身及其左右固定大小窗口内的词(比如左右各看 512 个词)。进一步,通过信息的逐层传递,模型实现了随着层数线性增长的感受野,从而获取远处词元的信息。
优点: 将注意力计算的复杂度从 O(T2) 显著降低到 O(wT),其中 w 是窗口大小,T 是序列长度。当 w 远小于 T 时,效率提升非常明显。
缺点: 丢失了全局信息,窗口外的词无法直接交互。
·多查询/分组查询注意力(Multi-Query / Grouped-Query Attention, MQA/GQA):在多头注意力中,计算量和内存的大头在于存储和计算大量的 Key (K) 和 Value (V) 向量(每个头都有一套)。MQA和GQA通过减少键值对(KV)缓存的大小和内存访问来加速,进一步提升注意力机制的效率
MQA 提出了一种简化方案,让所有的查询头共享同一组键 (K) 和值 (V) 的投影参数及计算结果。也就是说,模型仍然有多个查询头(例如 Q1,Q2,...,Qh),每个查询头负责从不同的表示子空间提问。但是,它们不再各自拥有独立的K和V,而是都使用同一套 K 和 V。
GQA 则将 Query 头分成几组,组内的头共享同一套 K 和 V。这是算是 MQA 和标准 MHA 之间的一个折衷。
·硬件优化的注意力机制(Hardware-Accelerated Attention):算法+硬件双管齐下, 进一步压榨注意力的计算和内存效率,充分利用现代硬件(如 GPU)特性。 代表:
FlashAttention: 通过优化 GPU 计算和内存访问模式(如分块计算、避免重复读写),在不改变数学结果的前提下,大幅提升标准注意力的计算速度并减少内存占用。
PagedAttention: 针对大模型推理时 KV 缓存(存储 K 和 V)的内存管理问题,借鉴操作系统分页的思想,更有效地管理 GPU 显存,减少内存碎片,支持更长的上下文和更高的并发。
3)前馈网络层
自注意力机制擅长捕捉序列中不同位置之间的依赖关系和信息流动(即“谁应该关注谁”)。它通过加权求和的方式聚合信息。虽然 softmax 本身是非线性的,但注意力机制的主要计算在很大程度上是基于线性变换和加权组合的。
如果模型中只有线性变换(或者近似线性的变换),那么无论堆叠多少层,其整体效果仍然等价于一个单一的线性变换。这会极大地限制模型的学习能力,因为它无法学习输入和输出之间复杂的、非线性的映射关系。而真实世界的数据(尤其是语言)充满了复杂的非线性模式。
目标: 对每个位置(每个词)的表示向量独立地进行一次非线性变换和特征提取,引入非线性,增强模型的表达能力, 对注意力层输出的信息进行进一步的提炼和转换。以学习更复杂的函数关系和特征。如果说自注意力是“横向”交互,那 FFN 更像是“纵向”深化。
结构 : FFN由两个线性变换(可以理解为全连接层)和一个非线性激活函数(如 ReLU)组成:
公式中 σ 代表激活函数 ReLU,W^U, b_1 是第一个线性变换的权重和偏置,W^D, b_2 是第二个线性变换的权重和偏置。
· 激活函数: 如果没有激活函数,神经网络无论多少层都只是线性变换的叠加,表达能力有限。激活函数引入非线性,使得网络能够学习和拟合复杂的数据模式。 常用激活函数:
a. ReLU (Rectified Linear Unit) -:ReLU(x) = max(0, x)。对于输入的每个神经元值,将其与“零”进行比较。如果值大于零,则输出该值本身;如果值小于或等于零,则输出零
优点: 计算非常简单,收敛速度快,是早期 Transformer 的选择。
缺点: “死亡 ReLU”问题:如果输入恒小于 0,神经元将永远不被激活,梯度为 0,无法学习。
b. GELU (Gaussian Error Linear Unit) - 平滑版 ReLU,可以理解为一种基于输入值大小进行概率性“门控”的机制。它利用了高斯误差函数,用一个服从高斯分布的随机变量乘以输入的线性变换,然后取期望。一个输入值越大,它被“激活”(乘以接近1的数)的概率就越大;输入值越小(尤其是负值),它被“抑制”(乘以接近0的数)的概率也越大,允许负值有一定程度的通过(概率性)。但这个过程是平滑的
优点: 在很多任务上表现优于 ReLU,通常能带来更好的性能和更平滑的收敛性,成为后来许多 Transformer 模型(如 BERT)的选择。
c. Swish - ReLU 的另一个改进,Swish 激活函数结合了输入的线性部分 (x) 和 Sigmoid 函数 (sigmoid(x)),具有自门控(self-gating)的特性,即函数本身会根据输入值的大小来调节输出的幅度,也是一个平滑的非线性函数。
Swish(x) = x · sigmoid(βx) (β 通常为 1)
优点: 有时性能优于 ReLU 和 GELU。
d. GLU (Gated Linear Unit) 及其变体(SwiGLU 和 GeGLU)- 其基本思路是,输入数据会经过两个独立的线性变换(即通过两个不同的线性层)。其中一个线性变换的输出会经过一个基础的激活函数(比如 Swish 或 GELU)。然后,这个经过激活的输出会与另一个线性变换的输出进行逐元素相乘 (element-wise multiplication, ⊙)。这个逐元素相乘的操作就是“门控”:一个分支的输出(经过激活)作为“门”,来动态地控制另一个分支信息流的通过程度
这些激活函数通常用在 Transformer 的前馈网络层 (FFN) 中,取代了传统的 FFN 结构。
4)归一化
深度神经网络(尤其是 Transformer )在训练时容易出现不稳定的情况,比如梯度爆炸或消失,导致模型难以收敛。 归一化层的作用就是稳定数据分布,让每一层网络的输入保持在一个相对固定的范围内,从而提升训练稳定性
· 归一化方法
a. 层归一化LayerNorm : 对每一个样本的每一层的所有神经元激活值计算均值 (μ) 和方差 (σ),然后用这两个值来归一化该层该样本的激活值。
b. 均方根层归一化RMSNorm: RMSNorm 是对 LayerNorm 的一种简化,旨在提高训练速度和效率。研究发现 LayerNorm 的成功主要归功于其重缩放的不变性,而均值归一化(即减去均值 μ 的那一步)对性能的贡献相对较小,甚至有时可以省略,然后用 RMS 省略了减去均值这一步,只做缩放。 这样计算更快,同时在很多大模型(如 Gopher, Chinchilla, LLaMA)上表现出与 LN 相当甚至更好的性能和稳定性。
c. DeepNorm : 对于极其深的 Transformer(比如上千层),即使是 LN 或 RMSNorm 也可能不够稳定。 DeepNorm通常结合特定的模型初始化策略和学习率调整,其关键思想是在 Transformer 的残差连接 (residual connection) 中,对输入到残差块的激活值 x 按照一个固定的比例常数 α 进行缩放。
· 归一化模块位置
除了选择哪种归一化方法外,将归一化层放置在 Transformer 子模块(如自注意力层和前馈网络层)的哪个位置,对模型的训练稳定性和最终性能也有显著影响。
a. Post-Norm (原始 Transformer): 先进行子层操作(Attention 或 FFN),然后做 Add & Norm。
优点: 梯度路径更直接,训练初期可能收敛更快。
缺点: 训练过程对学习率等超参数更敏感,容易发散,需要精心的 warmup 策略。
b. Pre-Norm: 先做 Norm,再进行子层操作,最后做 Add。
优点: 训练过程更稳定,对超参数不那么敏感,可以支持更大的学习率。这是目前大语言模型的主流选择。
缺点: 需要更长的 warmup 或者训练初期性能提升稍慢。
c. Sandwich-Norm: 结合两者,在子层操作前后各加一次 Norm,并在残差连接前再加一个 Norm。试图获得 Pre-Norm 的稳定性和 Post-Norm 的某些性能优势。
5. LLaMA 的详细配置举例
1)整体架构—Decoder-Only,架构通过带掩码的自注意力机制(因果注意力),使得每个词元在生成时只能关注到其前面的词元,天然符合语言生成的从左到右的特性
2)位置编码—RoPE,将相对位置信息通过向量旋转的方式融入到 Query 和 Key 向量中
3)激活函数—SwiGLU,一部分经过一个非线性变换(如 Swish),另一部分经过一个线性变换后通过 Sigmoid 函数形成“门”,两者相乘得到最终输出
4)归一化方法—Pre&RMSNorm,将归一化操作放在每个子模块之前,RMSNorm 省略了标准 LayerNorm 中的减去均值这一步,只进行基于均方根的缩放。这在计算上更高效
二、大模型主流架构
1. 编码器-解码器架构
编码器-解码器架构是自然语言处理领域里一种经典的模型结构,广泛应用于如机器翻译等多项任务。此架构在编码器端采用了双向自注意力机制对输入信息进行编码处理,而在解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输出进行生成。
基于编码器-解码器设计的预训练语言模型(如 T5 等)在众多自然语言理解与生成任务中展现出了优异的性能,但是目前只有如 FLAN-T5等少数大语言模型是基于编码器-解码器架构构建而成的
2. 因果解码器架构
当前,绝大部分主流的大语言模型采用了因果解码器架构。因果解码器采用了 Transformer 中的解码器组件,同时做出了几点重要改动。首先,因果解码器没有显式地区分输入和输出部分。该架构采用了单向的掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元。此外,由于不含有编码器部分,经过自注意力模块后的词元表示将直接送入到前馈神经网络中。
在因果解码器架构中,最具有代表性的模型就是 OpenAI 推出的 GPT系列。其中,GPT-3 将模型参数拓展到了 100B 级别,并展现出了强大的零样本和 少样本学习能力。伴随着 GPT-3 的成功,因果解码器被广泛采用于各种大语言模型中,包括 BLOOM、LLaMA 和 Mistral 等
3. 前缀解码器架构
前缀解码器对于输入部分使用双向注意力进行编码,而对于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。与编码器-解码器不同的是,前缀解码器在编码和解码过程中是共享参数的,并没有划分为独立的解码器和编码器。
相关文章:
大模型应用开发之模型架构
一、Transformer 架构 1. 编码器Encoder(“阅读理解大师”) 1)核心任务:编码器的唯一目标就是彻底理解输入的句子。它要把输入的每个词(或者说词元 Token)都转化成一个充满上下文信息的“向量表示”&#…...
敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
汽车紧固件低能耗涂装 在汽车工业体系中,紧固件承担着连接关键部件的重任。螺栓的抗拉强度、螺母的锁紧力矩,直接决定着整车的可靠性。当前,传统涂层技术始终面临一道难题:如何在保障防锈性能的同时,实现真正的环保无有…...
基环树(模板) 2876. 有向图访问计数
对于基环树,我们可以通过拓扑排序去掉所有的树枝,只剩下环,题目中可能会有多个基环树 思路:我们先利用拓扑排序将树枝去掉,然后求出每个基环树,之后反向dfs求得所有树枝的长度即可 class Solution { publi…...
26考研——中央处理器_指令执行过程(5)
408答疑 文章目录 二、指令执行过程指令周期定义指令周期的多样性指令执行的过程注意事项 指令周期的数据流取指周期间址周期执行周期中断周期 指令执行方案单周期处理器多周期处理器流水线处理器 八、参考资料鲍鱼科技课件26王道考研书 九、总结 二、指令执行过程 指令周期 …...
Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制
目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 (1) 基础参数 (2)按键绑定参数 (3)输入响应参数 (4)输入类型与设备参数 (5)不同类型轴的参…...
如何清除windows 远程桌面连接的IP记录
问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…...
C#参数数组全解析
在C#编程中,参数数组是一个重要的概念,它为方法调用提供了更大的灵活性。下面我们将详细介绍参数数组的相关内容。 参数数组的基本规则 在本书所述的参数类型里,通常一个形参需严格对应一个实参,但参数数组不同,它允…...
设计模式-策略模式(Strategy Pattern)
设计模式-策略模式(Strategy Pattern) 一、概要 在软件设计中,策略模式(Strategy Pattern)是一种非常重要的行为型设计模式。它的核心思想是将算法或行为封装在不同的策略类中,使得它们可以互换ÿ…...
LeetCode面试题 17.21 直方图的水量
题目 解答 package leetcode.editor.cn;//leetcode submit region begin(Prohibit modification and deletion) class Solution {public int trap(int[] height) {int length height.length;if (length 0) {return 0;}int[] leftMax new int[length];leftMax[0] 0;for (i…...
数据库系统概论(七)初识SQL与SQL基本概念
数据库系统概论(七)初识SQL与SQL基本概念 前言一、什么是SQL语言?1.1 SQL的产生和发展1.2 SQL的特点1.3 SQL的基本概念1.3.1 数据库相关“术语”(类比Excel表格)1.3.2 四大类核心语句(后面会详细讲…...
Jenkins Maven 带权限 搭建方案2025
1、使用docker搭建jenkins version: 3.8services:jenkins:image: jenkins_lzh:1.0container_name: jenkinsports:- "8080:8080" # Jenkins Web UI- "50000:50000" # Jenkins Agent通信端口volumes:- ./jenkins_home:/var/jenkins_home # 持久化Jenkins…...
服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?
SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型 弱加密算法与密钥问题 使用弱密码套件(如DES、RC4)或密钥长度不足(如RSA密钥长度<2048位),导致加密强度不足。 密钥管理不当(如私钥未加密存…...
【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发
线程池处理OCR仍然会阻塞请求的原因主要有以下几点,以及为什么CeleryRedis是更好的解决方案: 1. 线程池的阻塞本质 请求-响应周期未分离:即使使用线程池,HTTP请求仍需要等待线程池任务完成才能返回响应。当所有线程都繁忙时&#…...
c/c++的Libevent 和OpenSSL构建HTTPS客户端详解(附带源码)
使用 Libevent 和 OpenSSL 构建 HTTPS 客户端详解 在现代网络应用中,HTTPS 协议的普及使得安全通信成为标配。Libevent 是一个功能强大且广泛应用的事件通知库,能够帮助开发者编写高性能、可移植的网络程序。然而,libevent 本身并不直接处理…...
关于fastjson与fastjson2中toJava操作的区别
关于fastjson与fastjson2中toJava操作的区别 一、场景二、 区别1、前置条件2、对比1. fastjson2. fastjson2 三、解决方案 一、场景 在Java中会有将json转为实体类的需求,其中fastjson是一个常用的选择,今天在升级项目依赖的过程中,将fastjs…...
PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信
核心知识点:通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下,MAVLink 就像是无人机(飞控)和地面站(QGroundControl)之间约定好的一种“语言”。这种语言有很多标准的“…...
Docker组件详解:核心技术与架构分析
Docker详解:核心技术与架构分析 Docker作为一种容器化技术,已经彻底改变了软件的开发、交付和部署方式。要充分理解和利用Docker的强大功能,我们需要深入了解其核心组件以及它们如何协同工作。本文将详细介绍Docker的主要组件、架构设计以及…...
uni-app,小程序中的addPhoneContact,保存联系人到手机通讯录
文章目录 方法详解简介 基本语法参数说明基础用法使用示例平台差异说明注意事项最佳实践 方法详解 简介 addPhoneContact是uni-app框架提供的一个实用API,用于向系统通讯录添加联系人信息。这个方法在需要将应用内的联系人信息快速保存到用户设备通讯录的场景下非…...
uniapp小程序轮播图高度自适应优化详解
在微信小程序开发过程中,轮播图组件(swiper)是常用的UI元素,但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程,特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…...
赛季7靶场 - Environment
本系列仅说明靶场的攻击思路,不会给出任何的详细代码执行步骤,因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。 1.Nmap扫描发现80和22端口 2.访问80端口,使用katana查看js代码,快速发现laravel框架。 【*】希望知道…...
JVM——即时编译
分层编译模式:动态平衡启动速度与执行效率 分层编译是现代JVM(如HotSpot、GraalVM)实现高性能的核心策略之一,其核心思想是根据代码的执行热度动态选择不同的编译层次,实现启动速度与运行效率的最佳平衡。以HotSpot虚…...
武汉火影数字|数字科技馆打造:开启科技探索新大门
足不出户,就能畅游科技的奇幻世界,你相信吗?数字科技馆就能帮你实现!在这个数字化的时代,数字科技馆如同一颗璀璨的新星,照亮了我们探索科学的道路。 那么,数字科技馆究竟是什么呢? …...
升级 Azure Kubernetes 服务群集的关键注意事项
升级 Azure Kubernetes 服务 (AKS) 集群不仅是为了保持最新状态,更是为了保护您的工作负载、提升性能并降低运营风险。但如果操作不当,可能会导致停机、工作负载中断,甚至访问问题。 在本指南中,我们将介绍: 生产环境…...
数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
Go语言是一门静态强类型语言,所有变量在编译时必须明确其数据类型。本章将详细介绍Go的基础数据类型,帮助你理解并正确使用它们。 一、数据类型分类总览 Go 的基础数据类型可以分为以下几类: 类型分类代表类型示例布尔类型booltrue, false整…...
单片机-STM32部分:9-1、触控检测芯片
飞书文档https://x509p6c8to.feishu.cn/wiki/ILBsw4EaQiWaUukWrxEcO4XZnXc 传统物理按键 原理 玻璃盖板下通过一个触摸PAD连接到触摸芯片中,触摸PAD可以用PCB铜箔、金属片、平顶圆柱弹簧、导电棉、导电油墨、导电橡胶、导电玻璃的ITO层等。 当有人体手指靠近触摸按…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)
(三)消息结构与 API 操作 JMS 消息结构:JMS 消息主要由消息头(Header)、属性(Properties)和消息体(Body)三部分组成。消息头包含了许多预定义的字段,用于标识…...
CSS display: none
在 CSS 中,display: none; 是一个用于控制元素显示与隐藏的属性值,其核心作用是完全从文档流中移除元素,使元素在页面中不占据任何空间,也不会被渲染。以下是详细解释: 核心作用 隐藏元素:使元素在页面中…...
vison transformer vit 论文阅读
An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...
dropout层
从你提供的图片来看,里面讨论了 Dropout 层,让我为你解释一下它的工作原理和作用。 Dropout 层是什么? Dropout 是一种常用的正则化技术,用于避免神经网络的 过拟合(overfitting)。过拟合是指模型在训练数…...
openssl中BIO的使用
BIO是OpenSSL的一个重要的结构和概念,是对数据IO与传递处理的一种类型抽象和功能封装,这里所说的数据IO与传递的“介质”包括:内存、文件、日志、标准设备、网络socket等,“处理”包括简单、加/解密、摘要、ssl协议下的读/写等的数…...
电动汽车充电设施可调能力聚合评估与预测
电动汽车充电设施可调能力聚合评估与预测 项目概述 本项目基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远,胡泽春),实现了电动汽车充电设施可调能力的聚合评估与预测方法。 主要文件 real_data_model.m: 使用真实数据实现LSTM线…...
Git clone时出现SSL certificate problem unable to get local issuer certificate
正确解决方法 git config --global http.sslVerify false错误解决方法:(主要是看错了嘿嘿,但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…...
requests库
模拟请求获取网页源代码 如下 import requestsr requests.get(https://spa1.scrape.center/page/1) print(r.text) 源码如下 GET请求 示例网站为 https://httpbin.org import requests r requests.get(https://httpbin.org/) print(r.text) 所显示的结果如下 {"a…...
基于springboot的海洋环保知识分享系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表
1 概述 ADL3000-E-A 是一款为供电系统、工矿企业以及公用事业单位设计的智能电表,用于计算耗电量并管理用电需求。它具备高精度、体积小以及安装简便的特点。它将所有电气参数的测量与综合电能计量及管理功能集成在一起,可提供过去 12 个月的各类数据&a…...
红黑树算法笔记
文章目录 红黑树 (Red-Black Tree) 学习笔记0. 节点结构与哨兵节点1. 什么是红黑树?2. 红黑树的五个核心性质3. 为什么需要红黑树?4. 红黑树的基本操作a. 查找 (Search)b. 插入 (Insert)c. 删除 (Delete) 5. 维护平衡的关键操作a. 变色 (Recoloring)b. 旋…...
【Axios】解决Axios下载二进制文件返回空对象的问题
【Axios】解决Axios下载二进制文件返回空对象的问题 问题背景 在一个基于Vue 3的项目中,我们使用Axios下载Excel文件,但遇到了一个奇怪的问题:文件能成功下载下来,但打开时显示内容为[object Object]无法使用。 当我们执行下载代码: const response = await downloadT…...
2.MySQL数据库操作
一.MySQL数据库介绍 数据库目前标准指令集是SQL,即结构化查询语言。SQL语言主要由以下几部分组成 DDL(数据定义语言):用来建立数据库、数据库对象和定义字段,如create、alter、drop。 DML(数据操纵语言&…...
01.three官方示例+编辑器+AI快速学习webgl_animation_keyframes
实例:examples/webgl_animation_keyframes.html 在这里插入图片描述 重点关注: AnimationMixer:管理模型的所有动画AnimationClip:表示一个完整的动画ClipAction:控制动画的播放状态(播放、暂停、速度等&am…...
在 Spring Boot 中实现动态线程池的全面指南
动态线程池是一种线程池管理方案,允许在运行时根据业务需求动态调整线程池参数(如核心线程数、最大线程数、队列容量等),以优化资源利用率和系统性能。在 Spring Boot 中,动态线程池可以通过 Java 的 ThreadPoolExecut…...
餐饮行业新风口:上门厨师服务系统的技术实现路径
上门做饭正在成为下一个万亿级风口!当外卖平台被预制菜攻陷,当年轻人对着料理包无可奈何,一个全新的餐饮模式正在悄然崛起。 我们的市场调研显示,83%的消费者无法分辨外卖是否使用预制菜,76%的年轻人愿意为透明烹饪过程…...
odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
文章目录 问题描述解决思路正确的去除 git 跟踪 pyc文件的做法 问题描述 查看本地 stash 列表 stash 后有很多 pyc 文件都被 git 追踪了,这样不合理,而且等 unstash 的时候就会有问题 解决思路 尝试方法: 递归地删除指定文件夹及其子目录中…...
线程同步机制
synchronized 实现线程同步的关键字,用来防止多个线程同时访问某个代码块或方法,避免并发冲突和数据不一致。通过持有一把唯一的对象锁,谁拿到了谁就能执行,谁没拿到只能等待锁释放。 1. 修饰实例方法(锁当前实例&…...
YOLO目标检测算法
文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…...
【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
比赛传送门: 本场比赛开始时题面存在一些问题,私密马赛! A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
1.3.2 linux音频PulseAudio详细介绍
PulseAudio 是一个在 Linux 及其他类 Unix 操作系统中广泛使用的声音服务器(Sound Server),它为不同的音频应用程序提供了一种中间层,以方便管理和控制音频流。下面将详细介绍 PulseAudio 的相关内容,包括其基本概念、…...
8.1.Kubernetes进阶
目录 一、Kubernetes核心原理深度解析 架构设计精髓 • 控制平面组件(API Server、etcd、Controller Manager、Scheduler)协作流程 • 数据平面(kubelet、容器运行时、CNI/CSI插件)核心工作机制 API对象与声明式模型 • CRD&…...
electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
我说一下 react 结合 electron 如果打包和使用,以及其中可能会遇到的问题,这里只做简单功能的演示 我们先通过 cra 创建一个 react 项目,然后安装相关依赖,之后启动 npx create-react-app react_electron cd react_electron np…...
C++23 views::chunk_by (P2443R1) 详解
文章目录 引言C23 范围库概述范围视图(Range Views)范围算法(Range Algorithms)范围适配器(Range Adapters) std::views::chunk_by 介绍基本概念特性使用场景 示例代码简单示例自定义谓词示例 总结 引言 在…...