解读大型语言模型:从Transformer架构到模型量化技术

一、生成式人工智能概述

生成式人工智能(Generative Artificial Intelligence)是一种先进的技术,能够生成多种类型的内容,包括文本、图像、音频以及合成数据等。其用户界面的便捷性极大地推动了其广泛应用,用户仅需在几秒钟内即可创建出高质量的文本、图像和视频内容。生成式人工智能作为机器学习的一个重要子集,其模型通过学习海量数据中隐藏的复杂模式统计,从而实现对自然语言的深入理解。例如,研究人员在训练大型语言模型时,往往需要花费数周甚至数月的时间,借助强大的计算能力,使模型能够深入理解自然语言的内在规律和结构。

二、大型语言模型的用例

大型语言模型(LLMs)是设计用于理解和生成类似人类文本的先进人工智能模型。它们在大量文本数据上进行训练,以学习人类语言的结构和模式。LLMs的应用范围远远超出聊天任务。虽然聊天机器人已经引起了广泛关注,但LLMs在下一个词预测方面表现出色,这是各种能力的基础。LLMs的一些常见用例包括:

  1. 文本摘要:能够将长篇文本内容进行压缩,提取关键信息,生成简洁明了的摘要,广泛应用于新闻报道、学术论文等领域。
  2. 翻译文本:可以将一种语言的文本转换为另一种语言,甚至可以将文本转换为代码,为跨语言交流和编程提供了极大的便利。
  3. 文章生成:根据给定的主题或关键词,自动生成完整的文章,帮助内容创作者快速生成初稿,提高创作效率。
  4. 信息提取:从大量文本中提取特定信息,如人名、地名、日期等,为信息检索和知识管理提供了有力支持。

除了这些应用之外,增强LLMs是一个活跃的研究领域,重点是将LLMs与外部数据源连接起来并调用外部API。这种集成允许模型利用它在预训练期间可能没有学到的信息,从而进一步增强其能力。例如,通过与实时新闻数据源连接,LLMs可以生成最新的新闻报道;通过调用气象数据API,可以生成天气预报相关的文本。这些技术的应用前景广阔,我们将在后续研究中进一步探讨这些技术。

LLMs为自然语言生成提供了一个强大的工具,并有潜力通过自动化需要语言理解和生成的任务来革新各个领域。其在文本生成、信息处理和语言理解方面的卓越表现,使其成为人工智能领域的重要研究方向之一。

三、深入了解Transformer架构

3.1 为什么是Transformer?

你可能会好奇,LLMs是如何学得如此之好的?LLMs最关键的成分是什么?答案是Transformer架构,它在论文“Attention is All You Need”中被提出。当然,还有其他同样重要的元素,例如LLMs使用的海量数据和训练算法,但Transformer架构是使现代LLMs能够充分利用其他组件的关键组成部分。与之前用于生成式人工智能任务的循环神经网络(RNNs)相比,使用Transformer架构可以显著提高性能。Transformer架构之所以能够实现如此出色的性能,关键在于它能够学习句子中所有单词的相关性和上下文。

这种学习过程通过给定句子中每个单词与其他单词之间的加权连接来实现。在训练过程中,模型会学习这些连接的权重,称为注意力权重。这种能力通常被称为自注意力。自注意力机制使模型能够关注句子中不同单词之间的关系,从而更好地理解句子的语义和结构。例如,在句子“我今天感觉很好”中,模型不仅会关注“我”“今天”“感觉”“很好”这四个单词本身,还会关注它们之间的关系,如“我”和“感觉”之间的关系、“今天”和“很好”之间的关系等。通过这种方式,模型能够更准确地理解句子的含义,从而生成更自然、更准确的语言文本。

3.2 从单词到向量

在这里插入图片描述

如上图所示,Transformer架构主要由编码器和解码器组成。机器学习模型是大型统计计算器,它们使用数字进行工作。因此,在将文本传递之前,第一步是将输入序列进行分词。分词过程将每个单词映射到字典中的一个数字,有些分词器将英语字典中的单词映射为数字,而有些则将单词的一部分进行映射。关键在于,一旦为训练选择了分词器,你必须在文本生成任务中使用相同的分词器。例如,对于句子“ Live what you love”,分词器可能会将其映射为数字序列[716, 273, 328, 424]。
在这里插入图片描述

3.2.1 输入部分

  • Token IDs:文本首先要进行分词处理,将文本中的单词或子词转换为对应的数字标识,即Token IDs 。图中“Live what you love”这句话被转换成了716、273、328、424这样的数字,这些数字代表了词汇表中相应单词或子词的索引。
  • Inputs:这些Token IDs组成的序列作为模型的输入,进入后续的处理环节。

3.2.2 位置嵌入(Position Embedding)

  • 输入的Token IDs序列分别进入两个“Position Embedding”模块。由于Transformer架构本身不具备对单词位置的感知能力,位置嵌入的作用就是为模型提供单词在句子中的位置信息 ,帮助模型理解单词间的顺序关系。

3.2.3 编码 - 解码结构(Encoder - Decoder)

  • Encoder(编码器):经过位置嵌入后的输入进入粉红色的Encoder模块。编码器的主要功能是对输入序列进行特征提取和编码,将输入信息转换为更适合后续处理的隐藏表示 ,可以理解为对输入文本进行深层次的理解和特征抽取,以便后续解码阶段使用。
  • Decoder(解码器):编码器的输出会作为解码器的输入之一。解码器接收编码器的输出以及自身的位置嵌入信息,进一步处理这些信息 。在诸如机器翻译、文本生成等任务中,解码器负责生成最终的输出,例如生成翻译后的文本或者续写的文本内容。

3.2.4 Softmax层

  • 解码器的输出最终进入蓝色的Softmax层。Softmax函数的主要作用是将解码器输出的数值转换为概率分布 。在文本分类等任务中,这些概率代表了输入文本属于不同类别的可能性;在文本生成任务中,它可以表示生成下一个单词的概率分布,从而确定最终的输出类别或生成文本中的下一个单词等。
    在这里插入图片描述

3.3 自注意力:理解文本中的关系

如前面所见,自注意力层学习输入序列中一个单词与其他所有单词之间的关系。这是通过为输入序列各部分之间的所有连接分配注意力权重来实现的。编码器和解码器都包含多个自注意力头,每个头独立学习输入序列中不同单词之间的注意力权重。这里的直觉是每个头可能会学习语言的不同方面。例如,一个头可能关注句子中的情感,而另一个头可能关注句子中命名实体之间的关系。这些权重在训练过程中由模型学习。最初,权重是随机分配的,只要有足够的数据和时间,这些权重就会学会语言的不同方面。

经过多头自注意力层后,将注意力权重应用于输入序列。随后,序列经过一个前馈网络层进行处理,该层生成一个包含词汇表中每个单词概率的向量。这个向量可以传递到softmax层以获得每个单词的概率分数,有多种方法可以选择最终输出。
在这里插入图片描述

3.3.1 输入部分

  • Token IDs:文本首先要进行分词处理,将文本中的单词或子词转换为对应的数字标识,即Token IDs 。图中“Live what you love”这句话被转换成了716、273、328、424这样的数字,这些数字代表了词汇表中相应单词或子词的索引。

3.3.2 嵌入层(Embeddings)

  • Token Embeddings:Token IDs进入Token Embeddings层。该层的作用是将离散的Token IDs映射到一个连续的向量空间中,每个Token ID都被转换为一个固定维度的向量,这些向量能够捕捉单词的语义信息。例如,不同的单词通过Token Embeddings会得到不同的向量表示,语义相近的单词其向量在空间中的位置也较为接近。
  • Positional Embeddings:同时,输入还会进入Positional Embeddings层。由于Transformer架构本身不具备对单词位置的感知能力,Positional Embeddings层为模型提供单词在句子中的位置信息。它生成的向量表示了单词在句子中的顺序,帮助模型理解单词间的先后关系。
  • 求和操作:Token Embeddings和Positional Embeddings生成的向量会进行相加操作(图中的“+”符号)。这样做是为了将单词的语义信息和位置信息融合在一起,得到包含语义和位置信息的输入向量,作为后续Encoder的输入。

3.3.3 编码 - 解码结构(Encoder - Decoder)

  • Encoder(编码器):融合后的输入向量进入粉红色的Encoder模块。编码器的主要功能是对输入序列进行特征提取和编码,通过自注意力机制等操作,将输入信息转换为更适合后续处理的隐藏表示 ,可以理解为对输入文本进行深层次的理解和特征抽取,以便后续解码阶段使用。
  • Decoder(解码器):编码器的输出会作为解码器的输入之一。解码器接收编码器的输出以及自身的位置嵌入信息,进一步处理这些信息 。在诸如机器翻译、文本生成等任务中,解码器负责生成最终的输出,例如生成翻译后的文本或者续写的文本内容。

四、综合概述:Transformer架构

现在我们已经了解了各个组件,让我们看看端到端的预测过程。以翻译任务为例,输入序列中的每个单词都被分词并通过编码器的多头自注意力层进行处理。编码器的输出影响解码器的自注意力机制。添加一个序列开始标记以触发下一个标记的预测。该过程持续进行,直到满足停止条件,从而生成一个可以解码为输出单词序列的标记序列。

总结一下架构的高级别内容,编码器将输入(提示)编码为对输入结构和含义的深入理解,并为每个输入标记生成一个向量,解码器接受输入标记并使用编码器提供的理解生成新标记。例如,在将英语句子“I love natural language processing”翻译为中文时,编码器会将该句子编码为一个向量序列,解码器会根据这些向量生成中文句子“我爱自然语言处理”。Transformer架构通过这种方式实现了高效的文本生成和翻译,其在自然语言处理领域的广泛应用也证明了其强大的性能和优越性。

四、微调技术

4.1 指令微调

与预训练(通过自监督学习在大量非结构化文本数据上训练LLM)不同,微调是一个监督学习过程,通过使用带有标记示例的数据集更新权重来实现。这有助于你在特定任务上提高模型的性能。标记示例可以是情感分析任务、翻译任务、摘要任务或其他任务的示例,也可以是上述任务的组合。标记示例包含两部分:

  1. 提示:例如,在情感分析任务中,提示可以是“我今天感觉很好”。
  2. 完成:对于上述提示,完成可以是“积极的”。

许多公开可用的数据集可用于训练语言模型,但其中大多数都没有格式化为指令。幸运的是,有几个提示模板库为各种任务和各种数据集提供模板。这些库可以处理流行的数据集,以创建可用于指令微调的数据。所有模型权重都在指令微调中更新,这被称为全微调。像这样的微调需要你存储所有模型权重,因此这需要与预训练期间相同的计算能力。你可以通过相关研究深入了解这种方法,并通过构建一些有趣的应用程序来实践。

4.2 多任务微调

在多任务微调中,我们本质上是同时在多个任务上对模型进行微调。这需要大量的示例来进行训练。适合多任务微调的任务包括情感分析、文本摘要、问答、机器翻译等。多任务微调允许模型在一系列挑战中学习和泛化,最终提高其整体性能。例如,一个经过多任务微调的模型可以在情感分析任务中准确判断文本的情感倾向,同时在文本摘要任务中生成高质量的摘要。这种多任务学习方式使模型能够更好地适应不同的应用场景,提高其在实际应用中的通用性和适应性。

4.3 参数高效微调(PEFT)

4.3.1 什么是PEFT?

LLMs可能非常庞大,最大的LLMs需要数百GB的存储空间。而且,要对LLM进行全微调,你不仅需要存储所有模型权重,还需要存储梯度、优化器状态、前向激活以及训练过程中所需的临时状态。这需要大量的计算能力,获取这些资源可能相当困难。与全微调(在训练期间更新每个权重)不同,参数高效方法专注于一个小的子集。这可以通过以下方式实现:

  1. 微调特定层或组件:只调整相关部分,而不是重新训练整个模型。例如,只对模型的解码器部分进行微调,以提高其在特定文本生成任务中的性能。
  2. 冻结LLM权重并添加新组件:原始模型变为只读,同时引入并训练特定于任务的额外层或参数。例如,在模型中添加一个情感分析模块,只对该模块进行训练,而保持原始模型的权重不变。

总体而言,只更新大约15% - 20%的原始参数,这使得参数高效微调即使在单个GPU上也可以使用较少的计算资源进行。由于大多数LLM权重只被轻微修改或保持不变,因此显著降低了灾难性遗忘的风险。灾难性遗忘是指模型在学习新任务时,忘记了之前学到的知识。通过参数高效微调,可以在一定程度上避免这种问题,使模型在学习新任务的同时,保留之前学到的知识。

4.3.2 PEFT的类别

PEFT方法主要有以下3个类别:

  1. 选择性方法:这些方法专门对初始LLM参数的一部分进行微调。你可以选择要修改哪些参数。例如,你可以选择训练模型的特定组件、特定层,甚至特定类型的参数。这种方法可以根据具体任务的需求,有针对性地调整模型的参数,从而提高模型在该任务上的性能。
  2. 重参数化方法:这些方法通过创建原始网络权重的低秩变换来减少需要训练的参数数量。在这些方法中,常用的一种技术是LoRA(Low-Rank Adaptation)。LoRA通过在原始权重矩阵中添加一个低秩矩阵来实现参数的调整,从而减少需要训练的参数数量。这种方法可以在保持模型性能的同时,显著降低训练所需的计算资源。
  3. 加性方法:这些方法通过保持原始LLM权重不变并引入新的可训练组件来进行微调。在这方面主要有两种方法。适配器方法在模型架构中引入新的可训练层,通常位于编码器或解码器组件中,跟随注意力层或前馈层。相反,软提示方法保持固定且冻结的模型架构,专注于通过操纵输入来提高性能。这可以通过向提示嵌入添加可训练参数或保持输入不变并重新训练嵌入权重来实现。例如,在适配器方法中,可以在模型的编码器部分添加一个适配器层,该层专门用于处理特定任务的输入数据,从而提高模型在该任务上的性能。

五、评估方法

在传统机器学习方法中,我们可以在训练集或验证集上评估模型的性能,因为输出是确定性的。我们可以使用准确率、精确率、召回率、F1分数等指标来确定模型的性能。然而,在LLMs的情况下,这可能很困难,因为输出是非确定性的,基于语言的评估可能相当具有挑战性。例如,考虑以下句子,“今天的天气很好”和“今天的天气很棒”。上述两个句子的含义相似,但如何衡量这种相似性呢?例如,考虑以下句子,“今天的天气很糟糕”,这个句子与其他两个句子的含义相反。然而,所有三个句子只有一个词的差异。我们人类可以轻松区分这些句子,但我们需要一个结构化且明确定义的方法来衡量不同句子之间的相似性,以便训练LLMs。ROUGE和BLEU是两种广泛用于不同任务的评估指标。

5.1 ROUGE(Recall-Oriented Understudy for Gisting Evaluation)分数

ROUGE分数通常用于文本摘要任务。它用于客观评估机器生成摘要与人类为较长文本提供的参考摘要之间的相似性。让我们看看一些ROUGE分数的类型。

  1. ROUGE-1分数:它衡量机器生成文本和参考文本中单个单词的重叠情况。它根据重叠单词的数量计算精确率、召回率和F1分数等指标。尽管这种方法可以衡量两个文本的相似性,但它可能会有点误导。例如,考虑以下参考句子“这里很冷”,然后,考虑以下两个机器生成的句子,“这里非常冷”和“这里不冷”,这两个句子的测量值将相同,然而,其中一个句子与参考文本的含义相反。
  2. ROUGE-N分数:它衡量机器生成文本和参考文本中n-gram(给定句子中的n个连续单词)的重叠情况。它根据重叠n-gram的数量计算精确率、召回率和F1分数等指标。由于这个指标在计算中考虑了二元组和n-gram,直观上可以看出它也考虑了单词的位置。例如,在句子“我爱自然语言处理”中,二元组“我爱”“爱自然”“自然语言”“语言处理”等的重叠情况可以更好地反映两个句子之间的相似性。
  3. ROUGE-L分数:这是另一种常见的ROUGE分数,我们使用最长公共子序列的长度(不考虑顺序)来计算精确率、召回率和F1分数等指标,这些指标统称为ROUGE分数。例如,对于句子“我爱自然语言处理”和“自然语言处理我爱”,它们的最长公共子序列长度为4,因此ROUGE-L分数会相对较高,从而更好地反映两个句子之间的相似性。

5.2 BLEU(Bilingual Evaluation Understudy)分数

BLEU分数是一种用于自动评估机器翻译文本的指标。BLEU分数是一个介于零和一之间的数字,用于衡量机器翻译文本与一组参考翻译之间的相似性。简单来说,你可以认为它是不同n-gram大小的精确率值的几何平均值。例如,在将英语句子“I love natural language processing”翻译为中文时,如果机器生成的翻译是“我爱自然语言处理”,而参考翻译是“我爱自然语言处理技术”,那么BLEU分数会根据这两个句子之间的n-gram重叠情况来计算它们的相似性。

5.3 一些定性见解

现在,让我们定量地看看这些指标如何随着不同文本对的变化而变化。考虑以下参考文本、机器生成文本以及相应的指标:

参考文本人工智能正在改变包括医疗和金融在内的各个行业。
预测1AI正在革新不同领域,如医疗和金融。
预测2人工智能正在改变如医疗和金融等行业。
预测3人工智能正在改变包括医疗和金融在内的各个行业。
预测BLEU分数ROUGE-1分数ROUGE-2分数ROUGE-L分数
预测10.237080.421050.235290.42105
预测20.441270.80.55550.8
预测31.01.01.01.0

可以看到,随着我们越来越接近参考文本,BLEU分数和ROUGE分数都在提高。这表明这些指标能够较好地反映机器生成文本与参考文本之间的相似性。你可以下载下面的代码,自己尝试不同的参考文本和预测文本,看看这些指标是如何变化的。

六、量化

6.1 为什么需要量化?

LLMs拥有数百万甚至数十亿个参数,每个参数通常使用32位或16位来表示。例如,假设一个模型有10亿个参数,所有参数都使用32位浮点数存储。该模型中的每个参数将占用4字节的内存。因此,总共需要4×10^9字节的内存,相当于4GB的内存。这意味着,要存储一个具有10亿个参数的32位模型,你需要4GB的内存。如果你想训练这样一个模型,那么你需要额外的内存来存储梯度、激活、优化器状态以及函数所需的其他临时变量。这很容易导致每个模型参数大约需要20字节的额外内存。在考虑了所有这些额外的内存需求之后,训练这样一个模型大约需要6倍的GPU内存(大约24GB),此外,你还需要一些内存来存储数据。这对于边缘设备来说太多了。

6.2 量化的权衡

那么,你有什么选择来减少训练所需的内存呢?一种可以减少内存的技术称为量化。通过将32位浮点数替换为16位甚至8位整数,量化显著减少了大型语言模型和神经网络的内存需求。为了确保准确性和灵活性,默认情况下,模型权重、激活和参数通常以32位浮点格式存储。量化将原始的32位浮点数投影到低精度空间,使用缩放因子。然而,这种技术的缺点是通过降低原始参数的精度,你会失去性能。你降低的精度越多,你失去的性能就越多。例如,将32位浮点数量化为8位整数时,虽然内存需求大幅减少,但模型的性能可能会受到较大影响,导致生成文本的质量下降。

6.3 流行的量化技术

现在,让我们尝试了解如何以32位浮点表示法存储一个数字,以及如何将其量化为16位浮点表示法。在深度学习中,由于浮点数能够表示广泛范围的值且具有高精度,因此通常使用浮点数。通常,浮点数使用_n_位来存储一个数值。这些_n_位进一步划分为三个不同的部分:

  1. 符号:该位指示数字的正负。它使用一个位,其中0表示正数,1表示负数。
  2. 指数:指数是一段位,表示基数(在二进制表示中通常是2)的幂。指数可以是正数或负数,允许数字表示非常大或非常小的值。
  3. 尾数/有效数字:剩余的位用于存储尾数,也称为有效数字。它表示数字的有效数字。数字的精度在很大程度上取决于尾数的长度。

这种设计允许浮点数以不同的精度覆盖广泛的值。该表示法使用的公式为:
( ( − 1 ) s i g n × b a s e e x p o n e n t × m a n t i s s a ((-1)^{sign} \times base^{exponent} \times mantissa ((1)sign×baseexponent×mantissa

  1. FP32使用32位来表示一个数字:1位用于符号,8位用于指数,剩余的23位用于尾数。尽管它提供了高度的精度,但FP32的缺点是其高计算和内存占用。考虑以下FP32表示的2.71828:
    在这里插入图片描述
    (−1)0 ∗ 2^(128−127) ∗ 1.35914003 = 2.71828007

  2. FP16使用16位来存储一个数字:1位用于符号,5位用于指数,10位用于尾数。尽管这使其更加内存高效并加速了计算,但减少的范围和精度可能会引入数值不稳定,从而影响模型的准确性。看看2.71828的量化FP16表示:
    在这里插入图片描述
    (−1)0 ∗ 2^(128−127) ∗ 1.358398 = 2.716796

  3. BF16也是一种16位格式,但有1位用于符号,8位用于指数,7位用于尾数。与FP16相比,BF16扩展了可表示的范围,从而减少了下溢和上溢的风险。尽管由于有效数字位数减少,精度有所降低,但BF16通常不会显著影响模型性能,是深度学习任务的一个有用折衷方案。看看2.71828的量化float16表示:
    在这里插入图片描述
    (−1)0 ∗ 2^(128−127) ∗ 1.3515625 = 2.703125

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

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

相关文章

JSON实现动态按钮管理的Python应用

在开发桌面应用程序时,动态生成用户界面元素并根据配置文件灵活管理是一项常见需求。本文将介绍如何使用Python的wxPython库结合JSON配置文件,开发一个支持动态按钮创建、文件执行和配置管理的桌面应用程序。该应用允许用户通过设置界面配置按钮名称和关…

序章:写在前面

目录 为什么要学习 Python?那么,Python 到底是什么呢?Python 的用户多吗?Python 的语法究竟是怎样的?C 语言JavaPython Python 好学吗? 为什么要学习 Python? 这个问题或许会让不少人感到不解。…

onlyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 oonlyoffice历史版本功能实现 (编辑器功能实现)springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址1. onloyoffice 服务器部署 搜索其他文章2. 前段代码 vue 22.1 需要注意把这个 (改成自己服务器…

解决ubuntu server修改为中文后乱码问题(改回英文)

操作步骤 1.安装英文语言包 sudo apt-get install language-pack-en2.编辑/etc/default/locale文件 sudo vim /etc/default/locale修改为以下内容: LANG"en_US.UTF-8" LANGUAGE"en_US:en" LC_ALL"en_US.UTF-8"3.应用配置 sudo l…

安卓的Launcher 在哪个环节进行启动

安卓Launcher在系统启动过程中的关键环节启动,具体如下: 内核启动:安卓设备开机后,首先由引导加载程序启动Linux内核。内核负责初始化硬件设备、建立内存管理机制、启动系统进程等基础工作,为整个系统的运行提供底层支…

数据通信学习笔记之OSPF其他内容2

OSPF 与 BFD 联动 网络上的链路故障或拓扑变化都会导致设备重新进行路由计算,所以缩短路由协议的收敛时间对于提高网络的性能是非常重要的。 OSPF 与 BFD 联动就是将 BFD 和 OSPF 关联起来,一旦与邻居之间的链路出现故障,BFD 对完品以&…

数据库原理及应用mysql版陈业斌实验四

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表(学生表&…

[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)

[密码学实战]密评考试训练系统v1.0程序及密评参考题库 引言:密评考试的重要性与挑战 商用密码应用安全性评估(简称"密评") 作为我国密码领域的重要认证体系,已成为信息安全从业者的必备技能。根据国家密码管理局最新数据,截至2024年6月,全国仅有3000余人持有…

蓝桥杯练习题2

动态规划 动态规划三大题型:计数问题、最值问题、存在性问题; 【最小权值】-- 最值问题 【题目分析】 import java.util.Arrays; Arrays类中的一个方法:Arrays.fill(int[] m,int n) //给 int 类型(或者char类型/Long类型...)的数组全部空间…

【集群IP管理分配技术_DHCP】二、DHCP核心功能与技术实现

一、智能 IP 地址分配功能与技术实现​ 1.1 功能概述​ 智能 IP 地址分配是 DHCP 中间件的核心功能之一,它打破了传统 DHCP 固定的分配模式,能够根据网络的实时状态、客户端类型、接入位置等多种因素,动态且合理地分配 IP 地址。例如&#…

实现AWS Lambda函数安全地请求企业内部API返回数据

需要编写一个Lambda函数在AWS云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Lambda函数访问Secret Manager,来获取账号密码,然后通过配置访问公司内部A…

子网划分的学习

定长子网划分(Fixed-length Subnetting) 也叫做固定长度子网划分,是指在一个IP网络中,把网络划分成若干个大小相等的子网,每个子网的子网掩码长度是一样的。 一、定长子网划分的背景 在早期的IP地址分配中&#xff0…

3.QT-信号和槽|自定义槽函数|自定义信号}自定义的语法}带参数的信号和槽(C++)

信号和槽 Linux信号 Signal 系统内部的通知机制. 进程间通信的方式. 信号源:谁发的信号.信号的类型:哪种类别的信号信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行. Qt中的信号和Linux中的信号,虽…

如何在 Element UI 中优雅地使用 `this.$loading` 显示和隐藏加载动画

如何在 Element UI 中优雅地使用 this.$loading 显示和隐藏加载动画 在现代 Web 应用开发中,用户体验至关重要。当执行耗时操作(如网络请求或数据处理)时,显示一个友好的加载动画可以让用户知道系统正在工作,而不是卡…

动态加载内容时selenium如何操作?

当处理动态加载的内容时,Selenium 是一个非常强大的工具,因为它可以模拟真实用户的浏览器行为,等待页面元素加载完成后再进行操作。以下是使用 Selenium 获取动态加载内容的详细步骤和代码示例。 一、安装 Selenium 和 ChromeDriver &#…

力扣第446场周赛

有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下:力扣 给你两个数组:instructions 和 values,数组的长度均为 n。 你需要根据以下规则模拟一个过程: 从下标 i 0 的第一个指令开…

三维点拟合平面ransac c++

理论 平面的一般定义 在三维空间中,一个平面可以由两个要素唯一确定: 法向量 n(a,b,c):垂直于平面的方向 平面上一点 平面上任意一点 p(x,y,z) 满足: ( p − p 0 ) ∗ n 0 (p - p0) * n 0 (p−p0)∗n0 即 a ( x − x 0 ) …

基于LSTM-AutoEncoder的心电信号时间序列数据异常检测(PyTorch版)

心电信号(ECG)的异常检测对心血管疾病早期预警至关重要,但传统方法面临时序依赖建模不足与噪声敏感等问题。本文使用一种基于LSTM-AutoEncoder的深度时序异常检测框架,通过编码器-解码器结构捕捉心电信号的长期时空依赖特征&#…

Docker 部署 PostgreSQL 数据库

Docker 部署 PostgreSQL 数据库 基于 Docker 部署 PostgreSQL 数据库一、拉取 PostgreSQL 镜像二、运行 PostgreSQL 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 PostgreSQL 数据库 一、拉取 PostgreSQL 镜像 首先,确保你的 Docker 环境已正确…

MySQL性能调优(四):MySQL的执行原理(MYSQL的查询成本)

文章目录 MySQL性能调优数据库设计优化查询优化配置参数调整硬件优化 1.MySQL的执行原理-21.1.MySQL的查询成本1.1.1.什么是成本1.1.2.单表查询的成本1.1.2.1.基于成本的优化步骤实战1. 根据搜索条件,找出所有可能使用的索引2. 计算全表扫描的代价3. 计算使用不同索…