在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合

news2025/2/18 14:40:41

文章目录

  • 传统的神经网络框架存在的问题
  • 一. 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。这些向量通常由线性变换从原始输入嵌入得到。

计算步骤
  1. 计算点积:对于每个查询 q i ∈ Q q_i \in Q qiQ,计算它与所有键 k j ∈ K k_j \in K kjK的点积。获取当前词与每个词的相关程度。

    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

  2. 缩放分数:由于点积的结果大小与向量维度 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)=dk qiTkj

  3. 应用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(dk qiTkj)=kexp(dk qiTk)exp(dk qiTkj)

  4. 加权求和:最后,利用注意力权重对值向量 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(dk QKT)V

其中, Q ∈ R n × d k Q \in \mathbb{R}^{n \times d_k} QRn×dk K ∈ R m × d k K \in \mathbb{R}^{m \times d_k} KRm×dk V ∈ R m × d v V \in \mathbb{R}^{m \times d_v} VRm×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=1Kezjmax(z)ezimax(z)
示例代码块

import numpy as np

def 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2297751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins项目CICD流程

Jenkins项目流程:1.配置git环境 git config --...2.把前后端的目录初始化位本地工作目录 #git init3.提交到本地git #git add ./ git commit -m "" git tag v14.然后提交到远程git(通过,用户,群组,项目,管理项目)git remote add origin http://...git push -…

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构,创建类,编写main主函数,在控制台输出内容。…

Git指南-从入门到精通

代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…

Spring boot(maven) - Mybatis 超级入门版

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

Spark 性能优化 (三):RBO 与 CBO

1. RBO 的核心概念 在 Apache Spark 的查询优化过程中,规则优化(Rule-Based Optimization, RBO) 是 Catalyst 优化器的一个关键组成部分。它主要依赖于一组固定的规则进行优化,而不是基于统计信息(如 CBO - Cost-Base…

读 DeepSeek-R1 论文笔记

DeepSeek-R1:通过强化学习激发大语言模型的推理能力 DeepSeek-AI 摘要 我们推出第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero作为无需监督微调(SFT)预训练阶段、直接通过大规模强化学习(RL)训练的基础模型,展现出卓越的推理能力。…

【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪

文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理(一)光流法(二)卡尔曼滤波(三)粒子滤波 五、基于…

如何保持长久无痛苦的学英语?

“无痛苦”学英语? 听起来像天方夜谭,但并非不可能! 关键在于,把英语学习变成你生活的一部分,融入你的兴趣和目标, 这样才能摆脱痛苦,享受学习的过程。 1. 兴趣是最好的老师: 找到自…

Sequence to Sequence model

基础模型 基础模型是用RNN模型,前部分是encoder用来寻找法语输入的编码,后半部分是decoder用来生成英文翻译作为输出,每次输出一个单词,直到输出结束标志如EOS。 下面是另一个例子,在CNN模型输出层之前会输出图片的向…

6.appender

文章目录 一、前言二、源码解析AppenderUnsynchronizedAppenderBaseOutputStreamAppenderConsoleAppenderFileAppenderRollingFileAppenderFileNamePattern 三、总结 一、前言 前一篇文章介绍了appender、conversionRule、root和logger节点的解析, 为的是为本篇详细介绍它们的…

Golang的消息队列架构

一、消息队列的定义和作用 消息队列是一种在不同组件之间传递消息的通信机制。它可以解耦系统的各个部分,提高系统的可靠性和扩展性。消息队列可以在系统之间传递消息,并且在消息发送者和消息接收者之间进行异步通信,使得系统可以更加灵活和高…

GESP5级语法知识(十一):高精度算法(一)

高精度加法&#xff1a; #include<iostream> #include<string> #include<algorithm> using namespace std; const int N501;//高精度数的最长长度 //c[]a[]b[]:高精度加法方案一&#xff1a;对应位相加&#xff0c;同时处理进位 void h_add_1(int a[],int b…

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用

一、场景描述 我想写一个轮播图的程序&#xff0c;只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适&#xff0c;然后我就想自己写自动轮播&#xff0c;因此&#xff0c;这篇文章里面只是自动轮播的部分&#xff0c;没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…

PYYAML反序列化详解

前言 最近看了很多pyyaml反序列化的漏洞利用&#xff0c;但是对漏洞怎么来的&#xff0c;没有进行很详细的分析&#xff0c;所以今天刚好学习一下反序列化的原理 Yaml基本语法 一个 .yml 文件中可以有多份配置文件&#xff0c;用 --- 隔开即可对大小写敏感YAML 中的值&#x…

LeeCode题库第十八题

项目场景&#xff1a; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&…

Zookeeper 和 Redis 哪种更好?

目录 前言 &#xff1a; 什么是Zookeeper 和 Redis &#xff1f; 1. 核心定位与功能 2. 关键差异点 (1) 一致性模型 (2) 性能 (3) 数据容量 (4) 高可用性 3. 适用场景 使用 Zookeeper 的场景 使用 Redis 的场景 4. 替代方案 5. 如何选择&#xff1f; 6. 常见误区 7. 总结 前言…

公然上线传销项目,Web3 的底线已经被无限突破

作者&#xff1a;Techub 热点速递 撰文&#xff1a;Yangz&#xff0c;Techub News 今天早些时候&#xff0c;OKX 将上线 PI 的消息在圈内引起轩然大波&#xff0c;对于上线被板上钉钉为传销盘子的「项目」 &#xff0c;Techub News 联系了 OKX 公关&#xff0c;但对方拒绝置评…

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…

解锁网络安全:穿越数字世界的防护密码

个人主页&#xff1a;java之路-CSDN博客(期待您的关注) 目录 网络安全&#xff1a;数字时代的基石 网络安全面面观 &#xff08;一&#xff09;定义与范畴 &#xff08;二&#xff09;发展历程 网络安全面临的威胁 &#xff08;一&#xff09;恶意软件肆虐 &#xff08;二…

python爬虫解决无限debugger问题

方法一 关闭定时任务 关闭断点执行代码打开断点 # 无限debugger产生原因 # 1. web开发者工具打开 # 2. js代码中有debugger # 3. js有定时处理[推荐] for(let i0;i<99999;i){window.clearInterval(i)}方法二 关闭breakpoint 方法三 修改JS代码 使用fiddler&#xff0c;抓…