在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合
文章目录
- 传统的神经网络框架存在的问题
- 一. Transformer架构综述
- 1.1 transformer的输入
- 1.1.1 词向量
- 1.1.2 位置编码(Positional Encoding)
- 1.1.3 编码器与解码器结构
- 1.1.4 多头自注意力机制
- 二.Transformer分步详解
- 2.1 传统词向量存在的问题
- 2.2 详解编解码器中自注意力机制
- 2.2.1 缩放点积注意力机制
- 计算步骤
- 矩阵形式
- 2.2.2 softmax函数
- 2.2.3 多头机制
- 三.FNN与MoE策略
- 四.论文参考
- 4.1 迈向终极专家专业化-Mixture-of-Expert 语言模型
- 4.2 模型越狱-拒绝由LLMs单一方向调解
- 4.3 LLM MOE策略的演化
文章学习b站
Transformer模型详解,Attention is all you need
【Transformer速通指南】三天掌握自注意力机制!
- Transformer 是模型架构,是 LLM 和 MoE 的基础。其核心是自注意力机制(Self-Attention),摒弃了传统 RNN 和 CNN 的序列处理方式。作用实现不同维度领域的数据归一化。
- LLM 是基于 Transformer 的大规模应用模型。
- MoE 是一种优化架构的策略,用于扩展模型规模。
传统的神经网络框架存在的问题
传统神经网络框架存在一些局限性,具体如下:
-
循环神经网络(RNN):RNN在处理序列数据时,需要按照时间顺序逐步迭代计算每个时间步的结果。这种串行处理方式限制了模型的并行化能力,导致训练和推理过程相对缓慢。此外,RNN在捕捉长距离依赖关系时面临挑战,如梯度消失或爆炸问题,这进一步限制了其性能。
-
卷积神经网络(CNN):虽然CNN在处理具有局部结构的数据(如图像)方面表现出色,但在处理序列数据时存在一定的局限性。CNN通过滑动窗口机制捕捉局部特征,但难以直接建模长距离依赖关系,因为它们本质上是基于局部感受野的设计,缺乏全局视角。尽管可以通过堆叠多层卷积层来部分缓解这一问题,但这通常伴随着计算成本的增加和参数数量的增长。
-
Transformer模型:与上述两种架构不同,Transformer通过引入自注意力机制彻底改变了序列数据的处理方式。自注意力机制允许模型直接访问输入序列中的所有位置,并为每个位置分配不同的权重,即所谓的“关注度”。这种方式使得Transformer能够高效地捕捉长距离依赖关系,同时支持高度的并行化计算,从而显著提高了训练效率。在Transformer中,每个词都通过Q(查询)、K(键)和V(值)向量来计算与其他词的相关性,进而确定在整个上下文中该词的重要性。
综上所述,每种传统的神经网络架构都有其特定的应用场景和局限性。RNN擅长处理序列数据但受限于其串行特性;CNN在图像处理领域表现优异但对长距离依赖关系的支持有限;而Transformer则通过创新的自注意力机制解决了这些问题,提供了更强大的序列建模能力和更高的计算效率。这些特点使Transformer成为现代自然语言处理和其他涉及序列数据领域的首选架构之一。
一. Transformer架构综述

图1-1 transformer整体流程图

图1-2 transformer模型子结构示意图
整体分为下方输入单元、左侧编码器、右侧解码器、上侧推演结果,其中图1-1描述了transformer大致组件。图1-2描述了每个组件中重要的核心处理方法。
- Transformer的输入和输出是什么?
输入: Inputs,Outputs(shifted right)
输出:Output Probabilities
下列以模型处理英译汉为例解释transformer模型的整体运作过程。
1.1 transformer的输入
例如Are you OK ? 待翻译句子和标注数据 你好吗?进入模型,经模型处理后输出 你干什么?,如图1-3所示。

图1-3 数据输入输出示意图
1.1.1 词向量
在 Are you OK ?和 你好吗?进入模型时,具体会被模型的第一个组件词向量处理,如图1-4所示。

图1-4 词向量层示意图
假设每个单词用4维向量表示,则["Are","you","OK","?"] 四个词的句子可以用4 * 4的词向量矩阵表示,每一行是一个词的词向量,如图1-5所示。

图1-5 待译数据词向量
同理,标注词["你","好吗","?"]也会被处理成 3* 4的词向量矩阵,如图1-6所示。

图1-6 标注数据词向量
1.1.2 位置编码(Positional Encoding)
得到Input Embedding和Output Embedding的词向量后,transformer会对其进行位置编码。目的是把位置信息附加到原始的信息上。如图1-7所示。

图1-7 从词嵌入到位置编码示意图
在没有位置编码时

图1-8 词向量示意图
即模型可能当成You are OK ?,OK ? you are等进行处理。那么这样子就可能违背本意,如图1-8所示。
对于初学者而言,下面的讨论可能会显得晦涩难懂,不清楚其目的和实施的理由。这并不意外,因为这部分内容旨在提供一个整体框架或概览,而不会深入探讨每一个细节。现阶段,您无需过分担忧具体的实现步骤或背后的原理。当前的重点在于理解这种方法的大致轮廓以及它试图达成的目标。具体的操作细节、技术术语以及每一步骤背后的原因将会在后续章节中详细展开。
为了帮助您更好地跟随学习进度,这里将给出一个高层次的概念性描述。首先,我们采取一种系统化的方法来解决问题,这种方法依赖于一系列预先设定的步骤和规则。这些步骤被设计成能够引导用户从问题的起始点顺利到达解决方案。虽然此时您可能对其中的具体操作流程感到困惑,但随着逐步深入的学习,每一个环节都将得到清晰的解释和实例说明。
位置编码会用正弦函数和余弦函数的计算实现
位置编码的正余弦公式
其中:
-
pos表示词在序列中的位置。 -
i表示编码向量中的维度索引。 -
d_model表示模型嵌入维度大小。 -
对于偶数维度(即
i是偶数),使用正弦函数:P E pos , 2 i = sin ( p o s 1000 0 2 i / d model ) PE_{\text{pos}, 2i} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PEpos,2i=sin(100002i/dmodelpos)
-
对于奇数维度(即
i是奇数),使用余弦函数:P E pos , 2 i + 1 = cos ( p o s 1000 0 2 i / d model ) PE_{\text{pos}, 2i+1} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PEpos,2i+1=cos(100002i/dmodelpos)
其中,pos 表示词语在序列中的位置,i 表示该词语向量中的第 i 维度。d_model表示总维度数
例如["Are","you","OK","?"]中, "you"的索引下标为1,且前文假设词向量有4个维度(现设4个维度分别为维度0,维度1,维度2,维度3)。因此"you"的位置编码为PE(1,0),PE(1,1),PE(1,2),PE(1,3),如图1-9所示。

图1-9 位置编码示意图
再次说明,如上你可能看不懂为什么要这么做,后续在章节2中介绍自注意力机制,你会有所理解
1.1.3 编码器与解码器结构

图1-10 输入序列经过位置编码进入编解码器图
经过位置编码后,英文的待译数据和中文的标注数据分别输入到编码器和解码器中,会经过三个计算过程。如图1-11

图1-11 编解码器整体处理流程图
-
① 编码器会基于
自注意力机制(Multi-Head Attention),前馈神经网络(Feed Forward)对"英文的待译数据"进行编码,如图1-12所示

图1-12 编码器处理流程图 -
② 解码器会基于 带有掩码的(Masked)自注意力机制(Multi-Head Attention)对"中文的标注数据"进行编码,如图1-13

图1-13 解码器处理流程图 -
③ 编码器-解码器注意力层: 对两组数据一起解码,得到解码器最终输出。如图1-14 所示。

图1-14 从编码器-解码器注意力层到解码器最终输出图
总体来说编解码器通过自注意力机制,和前馈神经网络将输入数据中的全局信息附加到解码结果并最终输出。如图1-15所示。

1.1.4 多头自注意力机制

图1-16 多头自注意力机制整体示意图
其中自注意力机制(Muti Head Self Attention)会分别使用多个自注意力机制对Q,K,V 三个线性层(Linear)对输入数据进行线性变换并使用缩放点积注意力机制(Scaled Dot Product Attention)将特征变换后的Q,K,V进行结合,最后使用fc线形层整合多头结果。 如图1-17所示。

图1-17 自注意力机制计算流程图

图1-18 自注意力机制源码实现图
在章节2,我们会详细介绍Q,K,V参数的作用,为什么是这样搞。
以编码器中的自注意力机制层,说明自注意力机制是如何工作的。首先输入的数据是经过位置编码后的["Are","you","ok","?"],其黄色表示["Are","you","ok","?"]的词向量矩阵,分别于Q,K,V进行线性变换得到,三组结果qx,kx,vx。如图1-19所示。

图1-19 举例说明自注意力机制计算流程图
接着将三组结果交给缩放点积注意力机制整合成最终结果。
关于自注意力机制和缩放点积注意力机制将在第二章详细介绍。
二.Transformer分步详解
在之前的概述中,您可能对编码器与解码器之间的映射关系感到困惑,不明白为何需要通过Q(查询)、K(键)和V(值)来进行信息处理和统一归一化为啥是softmax函数处理,以及为何位置编码采用了正余弦函数的形式,。接下来,我们将详细探讨这些问题,以期为您提供清晰的理解。
首先,让我们明确编码器和解码器在序列到序列(Seq2Seq)任务中的角色。编码器的任务是将输入序列转换为一个固定长度的内部表示形式,通常称为上下文向量或特征向量。这个内部表示捕捉了输入序列的关键信息,并将其压缩成一个抽象表达。而解码器则接收这个内部表示,并逐步生成输出序列,每一步都可能依赖于前一步的输出以及从编码器传递过来的上下文信息。这种结构使得模型能够处理不同长度的输入和输出序列,适用于如机器翻译、文本摘要等任务。
接下来,讨论Q、K、V的概念及其在自注意力机制中的应用。在Transformer架构中,为了有效处理输入序列中不同位置之间的关系,每个输入都需要经过线性变换,从而生成Q、K、V三个不同的向量。这些向量分别代表查询、键和值,它们的作用在于计算序列中元素间的相似度并确定权重,以便实现对不同位置信息的有效区分。
最后,我们来解释为什么位置编码采用正余弦函数。由于Transformer模型缺乏像循环神经网络(RNNs)那样的递归结构或卷积神经网络(CNNs)那样的卷积结构,它无法直接识别序列中元素的位置信息。因此,位置编码被引入,其目的是赋予模型关于序列中各元素相对位置的知识。位置编码通常由正弦和余弦函数生成,确保每个位置都有独特的表示。选择正余弦函数的原因在于,这种方法可以保证对于任何给定的位置偏移,都可以通过固定的数学运算获得对应的编码,这有助于模型学习到位置间的相对距离关系。此外,正余弦函数的周期性特性允许模型处理任意长度的序列,而不会因为位置过远而导致位置信息丢失或混淆。
综上所述,通过对编码器和解码器的工作原理、QKV在自注意力机制中的作用以及位置编码为何采用正余弦函数的深入解析,希望能帮助您更准确地理解这些概念背后的逻辑和技术细节。
2.1 传统词向量存在的问题
预训练好的词向量一旦生成就保持不变,这意味着它们无法根据不同的语境灵活调整。例如:
- “它无法通过这条河,因为它太累了。” 在这句话中,“它”指的是某个行动者,比如一个人或动物,表明是由于疲劳导致无法过河。
- “它无法通过这条河,因为它太窄了。” 而在这句话里,“它”指的是河流本身,表示由于河道狭窄而不能通过。
如果词向量固定不变,那么在处理这两个句子时就会遇到问题,因为“它”这个词在两个句子中的含义完全不同。第一个句子中的“它”指的是执行动作的主体,而在第二个句子中则是指物体(河流)的一个属性(宽度)。这种情况下,固定的词向量无法准确捕捉到“它”在不同语境下的具体含义。
因此,虽然预训练词向量能够提供一个良好的起点,为词汇赋予基于大规模文本数据学习得到的通用意义,但它们并不足以应对所有情况。为了更好地理解和区分词语在不同上下文中的意义,我们需要采用更先进的模型,如ELMo、BERT等,这些模型可以根据词语所在的特定环境动态调整词向量,从而更加精准地反映词语的实际用法和意义。这样,即使是像“它”这样的代词,在不同的句子中也能被正确理解。
2.2 详解编解码器中自注意力机制
主要目标是使计算机能够在处理文本时,从上下文语句中识别并关注最关键的信息。Transformer模型通过其自注意力机制实现了这一目标,该机制允许模型根据输入序列的上下文动态地为每个词分配相应的权重。这意味着在解析一个句子或段落时,Transformer能够自动判断哪些词语对于理解整体意义最为重要,并给予这些词语在上下文词语中的关注度。如图2-1所示。

图2-1 transformer的自注意力词热度权重图
具体来说,在Transformer架构中,每个词首先被转化为三个向量:查询(Query)、键(Key)和值(Value)。通过计算查询向量与所有键向量之间的相似度得分,模型可以确定当前词与其他词的相关性,从而形成一个注意力分布。这个分布随后用于加权求和所有值向量,生成一个反映整个上下文中关键信息的新表示形式。这样,Transformer不仅能够捕捉到词汇间的直接联系,还能够理解更为复杂的依赖关系,确保了对文本深层次含义的准确把握。因此,借助于这种机制,Transformer可以在各种自然语言处理任务中更有效地利用信息,提高理解和生成文本的能力。
2.2.1 缩放点积注意力机制
Q用于“查找”,即寻找与当前位置相关的信息;K存储序列中每个位置的信息,供Q进行查询时使用(每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征,如图2-2);V包含了实际的信息内容,根据Q和K的相似度(即注意力权重)进行加权求和。通过这种方式,模型能够动态地聚焦于输入序列中最相关的部分,从而更好地捕捉序列数据中的复杂依赖关系。

图2-2 与Q,K,V线性变换的关系图
假设我们有一个输入序列,其对应的查询向量为 Q Q Q,键向量为 K K K,值向量为 V V V。这些向量通常由线性变换从原始输入嵌入得到。
计算步骤
-
计算点积:对于每个查询 q i ∈ Q q_i \in Q qi∈Q,计算它与所有键 k j ∈ K k_j \in K kj∈K的点积。获取当前词与每个词的相关程度。
score ( q i , k j ) = q i T k j \text{score}(q_i, k_j) = q_i^T k_j score(qi,kj)=qiTkj
-
缩放分数:由于点积的结果大小与向量维度 d k d_k dk有关,为了防止梯度消失或爆炸,我们需要将得分除以 d k \sqrt{d_k} dk进行缩放。
scaled score ( q i , k j ) = q i T k j d k \text{scaled score}(q_i, k_j) = \frac{q_i^T k_j}{\sqrt{d_k}} scaled score(qi,kj)=dkqiTkj
-
应用softmax函数:对每个查询 q i q_i qi对应的键分数应用softmax函数,以获得最终的注意力权重 α i j \alpha_{ij} αij。
α i j = softmax j ( q i T k j d k ) = exp ( q i T k j d k ) ∑ k exp ( q i T k d k ) \alpha_{ij} = \text{softmax}_j\left(\frac{q_i^T k_j}{\sqrt{d_k}}\right) = \frac{\exp\left(\frac{q_i^T k_j}{\sqrt{d_k}}\right)}{\sum_{k}\exp\left(\frac{q_i^T k}{\sqrt{d_k}}\right)} αij=softmaxj(dkqiTkj)=∑kexp(dkqiTk)exp(dkqiTkj)
-
加权求和:最后,利用注意力权重对值向量 V V V进行加权求和,得到上下文向量 c i c_i ci。
c i = ∑ j α i j v j c_i = \sum_{j} \alpha_{ij} v_j ci=j∑αijvj
矩阵形式
在实践中,我们通常会同时处理多个查询,因此上述操作可以表示为矩阵运算的形式:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中, Q ∈ R n × d k Q \in \mathbb{R}^{n \times d_k} Q∈Rn×dk, K ∈ R m × d k K \in \mathbb{R}^{m \times d_k} K∈Rm×dk, V ∈ R m × d v V \in \mathbb{R}^{m \times d_v} V∈Rm×dv分别是查询、键和值的矩阵, n n n是查询的数量, m m m是键/值的数量, d k d_k dk和 d v d_v dv分别是键和值的维度。
2.2.2 softmax函数
Softmax函数是一种归一化指数函数,它能够将一个K维向量z“压缩”到另一个K维实向量σ(z),使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1。这样,输出就可以被解释为概率分布 1,即百分率占比,可以得出当前词与其余词的关系热度占比。
对于输入向量 Z = [ z 1 , z 2 , z 3 . . . . . z k ] Z = [z_1,z_2,z_3.....z_k] Z=[z1,z2,z3.....zk],Softmax函数定义如下
σ ( z ) i = e z i ∑ j = 1 K e z j \sigma(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} σ(z)i=∑j=1Kezjezi
数值稳定性的改进
为了避免数值溢出问题(例如上溢或下溢),通常会对输入进行平移操作,即从每个 z i z_i zi中减去最大值 max ( z ) \max(z) max(z):
σ ( z ) i = e z i − max ( z ) ∑ j = 1 K e z j − max ( z ) \sigma(\mathbf{z})_i = \frac{e^{z_i - \max(\mathbf{z})}}{\sum_{j=1}^{K} e^{z_j - \max(\mathbf{z})}} σ(z)i=∑j=1Kezj−max(z)ezi−max(z)
示例代码块
import numpy as npdef softmax(x):"""Compute softmax values for each sets of scores in x."""e_x = np.exp(x - np.max(x)) # 防止溢出return e_x / e_x.sum()# 测试数据
x = np.array([-3, 2, -1, 0])
print(softmax(x))
2.2.3 多头机制
在Transformer架构中,为了模拟CNN能够从不同角度提取多种特征的能力,采用了“多头注意力机制”(Multi-Head Attention)。这一机制通过不同的注意力头(Attention Head)并行地执行多个独立的自注意力过程。每个头都使用各自的学习参数来处理输入数据的不同子空间,从而允许模型捕捉到输入序列内的各种复杂依赖关系 。通常情况下,设置8个这样的头已经足够有效。
在完成多头注意力计算后,每个头会输出一个特征表示。这些独立的特征表示随后会被拼接在一起,形成一个综合的特征表示。接下来,为了整合这些信息并减少维度,通常会在拼接后的特征上应用一个全连接层(Fully Connected Layer),这一步骤有时也被称为降维处理。这样做的目的是将多头注意力机制得到的高维特征映射回模型需要的较低维度,以便后续处理或预测任务的执行。
三.FNN与MoE策略
MoE模型中的每个专家(Expert)通常采用前馈神经网络结构( FeadFoward Network 如全连接网络或卷积网络)。例如,在Transformer模型中,MoE层替换了传统的前馈子层,每个专家独立处理输入数据的子集,通过并行计算提升模型容量。门控网络(Gating Network)负责动态分配输入到不同专家,其本身也是一个前馈网络,通常包含Softmax或Gating Tree结构,用于生成专家选择的概率分布。
混合专家模型(Mixture of Experts,MoE)是一种先进的机器学习策略,它通过将多个专门训练的子模型(称为“专家”)结合起来,并使用一个或多个门控网络来控制这些专家输出的权重。这种方法旨在提高模型性能和效率,特别是在处理复杂数据模式时的大模型训练。
在MoE架构中,有三个关键组件:专家、门控网络和稀疏激活。每个专家都是针对特定任务或数据特征而训练的子模型。例如,在图像分类任务中,一个专家可能专门识别纹理,而另一个专家可能识别边缘或形状。这种分工有助于整个模型更高效地处理问题,因为每个专家只处理它最适合的数据类型。

图3-1 Figure 2 | DeepSeekMoE的示意图
由于论发表已经非常详尽,因此不再赘述。以下将会给出论文地址
四.论文参考
4.1 迈向终极专家专业化-Mixture-of-Expert 语言模型
DeepSeekMoE: Towards Ultimate Expert Specialization in
Mixture-of-Experts Language Models
4.2 模型越狱-拒绝由LLMs单一方向调解
Refusal in LLMs is mediated by a single direction
4.3 LLM MOE策略的演化
LLM MOE的进化之路,从普通简化 MOE,到 sparse moe,再到 deepseek 使用的 share_expert sparse moe
相关文章:
在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合
文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码(Positional Encoding)1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…...
Selenium WebDriver自动化测试(扩展篇)--Jenkins持续集成
文章目录 一、引言二、Jenkins简介三、安装部署Jenkins安装部署 四、集成Git与Maven安装必要的插件配置Git配置Maven 五、创建Job创建自由风格的项目配置源码管理配置构建触发器配置构建环境配置构建步骤配置Post-build Actions 六、触发构建示例:GitHub Webhook触发…...
Wiki文档转换为Word技术
一、技术背景与目标 Wiki系统导出的文档通常以HTML格式存在,且内容分散在多个文件中,每个页面对应一个HTML文件。然而,Microsoft Word(Word)在处理HTML文件时,仅支持单个HTML文件的导入。因此,为了将Wiki导出的内容转换为Word可识别的格式,必须将分散的HTML文件整合为一…...
1.【线性代数】——方程组的几何解释
一 方程组的几何解释 概述举例举例一1. matrix2.row picture3.column picture 概述 三种表示方法 matrixrow picturecolumn picture 举例 举例一 { 2 x − y 0 − x 2 y 3 \begin{cases} 2x - y 0 \\ -x 2y 3 \end{cases} {2x−y0−x2y3 1. matrix [ 2 − 1 − 1 …...
力扣1448. 统计二叉树中好节点的数目
Problem: 1448. 统计二叉树中好节点的数目 文章目录 题目描述思路复杂度Code 题目描述 思路 对二叉树进行先序遍历,边遍历边对比并更新当前路径上的最大值pathMax,若当pathMax小于等于当前节点值,则好节点的数目加一 复杂度 时间复杂度: O (…...
【C#零基础从入门到精通】(二)——C#注释和命名法详解
【C#零基础从入门到精通】(二)——C#注释和命名法详解 C# 中的注释 定义 在 C# 里,注释是一种特殊的代码文本,它不会被编译器执行,主要用于对代码进行解释、说明,帮助开发者更好地理解代码的功能、用途、实现思路以及注意事项等,提升代码的可读性和可维护性。 注释类型…...
SQLServer的创建,表创建,主键,约束,模糊查询
设置 注意: 设置完成之后 重新启动 创建数据库 注意: 这个目标路径必须要有该文件名的文件夹 -- 指向 master 数据库,告诉它我们要创建一个新的数据库操作了 use master go-- 创建数据库 create database StudentManageDB on primary (-- 以下四个组成部分缺一不可…...
DeepSeek深度思考:客户端(Android/iOS)架构设计指南
目标读者:中高级开发者、架构师 适用场景:大型复杂应用开发、跨团队协作、长期维护迭代 一、架构设计核心原则 1.模块化(Modularization) 横向拆分:按功能边界划分(如登录、支付、消息模块)纵向…...
亚远景-精通ASPICE:专业咨询助力汽车软件开发高效合规
在竞争日益激烈的汽车行业,软件开发已成为决定成败的关键因素。ASPICE(汽车软件过程改进和能力确定) 作为行业公认的软件开发框架,为汽车制造商和供应商提供了实现高效、合规开发的路线图。 然而,ASPICE 的实施并非易…...
OpenCV 相机标定流程指南
OpenCV 相机标定流程指南 前置准备标定流程结果输出与验证建议源代码 OpenCV 相机标定流程指南 https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html https://learnopencv.com/camera-calibration-using-opencv/ 前置准备 制作标定板:生成高精度棋…...
项目场景拷打
补偿事务解决超卖 通过补偿事务避免超卖问题,可以通过以下几种方式实现: 1. 使用数据库事务与锁机制 事务管理:将库存扣减和订单生成操作放在同一个数据库事务中,确保操作的原子性。如果事务中任何一个步骤失败,则整…...
Vue2生命周期面试题
在 Vue 2 中,this.$el 和 this.$data 都是 Vue 实例的属性,代表不同的内容。 1. this.$el this.$el 是 Vue 实例的根 DOM 元素,它指向 Vue 实例所控制的根节点元素。在 Vue 中,el 是在 Vue 实例创建时,指定的根元素&…...
【每日一题 | 2025】2.3 ~ 2.9
个人主页:GUIQU. 归属专栏:每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…...
使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
button需要有一个外观 外观 大小跟随窗口改变,采用纯色背景、纯色文字 文字 大小跟随窗口改变 button需要获得鼠标消息 掠过 鼠标掠过时 button 出现阴影,鼠标掠过后 button 阴影消失 点击 点击后进入相应事件 拖动 改变图标所在位置 需要在g…...
C# 上位机--变量
C# 上位机--变量 在 C# 上位机开发领域,变量是构建程序逻辑的基础元素之一。它就像是一个容器,用于存储各种类型的数据,从简单的数值到复杂的对象。正确理解和使用变量,对于开发出高效、稳定且易于维护的上位机程序至关重要。本文…...
网络安全检查漏洞内容回复 网络安全的漏洞
的核心目标是保障业务系统的可持续性和数据的安全性,而这两点的主要威胁来自于蠕虫的暴发、黑客的攻击、拒绝服务攻击、木马。蠕虫、黑客攻击问题都和漏洞紧密联系在一起,一旦有重大安全漏洞出现,整个互联网就会面临一次重大挑战。虽然传统木…...
【GIS】本地部署nominatim地理编码服务
参考:https://www.cnblogs.com/nonkicat/p/17222677.html docker 部署命令 4.5 版本 docker 用不了,需要用 4.0 版本 docker run -it -e PBF_PATH/data/你的osm文件.osm.pbf -e FREEZEtrue -e POSTGRES_MAX_CONNECTIONS100 -p 6666:8080 --…...
HTML之JavaScript对象声明
HTML之JavaScript对象声明 常用:方式1:new Object() 创建一个空对象方式2:{属性名:属性值,属性名:属性值,...函数名:function(){}} 创建一个对象<!DOCTYPE html> <html lang"en"> <head><meta charset&quo…...
PyCharm结合DeepSeek-R1
PyCharm结合DeepSeek-R1,打造专属 AI 编程助手 在程序员的日常工作中,提高编程效率、快速解决代码问题是重中之重。今天给大家分享一个强强联合的组合 ——PyCharm 插件 Continue 与 DeepSeek-R1,它们能帮你打造出强大的个人 AI 编程助手。 …...
innovus如何分步长func和dft时钟
在Innovus工具中,分步处理功能时钟(func clock)和DFT时钟(如扫描测试时钟)需要结合设计模式(Function Mode和DFT Mode)进行约束定义、时钟树综合(CTS)和时序分析。跟随分…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
