当前位置: 首页 > news >正文

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标:了解大模型理论体系

第二轮学习目标:进行具体实操进一步深入理解大模型

从大语言模型的训练过程来理解微调

大预言模型训练主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。

预训练(Pretraining)阶段需要利用海量的训练数据,完成深度神经网络参数训练,构建基础语言模型 (Base Model)。

有监督微调(Supervised Finetuning),也称为指令微调(Instruction Tuning),利用少量高质量数据集合,包含用户输入的提示词(Prompt)和对应的理想输出结果。用户输入包括问题、闲聊对 话、任务指令等多种形式和任务。得到有监督微调模型(SFT 模型)

奖励建模(Reward Modeling)阶段目标是构建一个文本质量对比模型,对于同一个提示词,SFT模型给出的多个不同输出结果的质量进行排序。如果 RM 模型的目标是针对 所有提示词系统所生成输出都能够高质量的进行判断,该问题所面临的难度在某种程度上与文本 生成等价,因此如何限定 RM 模型应用的泛化边界也是本阶段难点问题。

强化学习(Reinforcement Learning)阶段根据数十万用户给出的提示词,利用在前一阶段训练的 RM 模型,给出 SFT 模型对用户提示词补全结果的质量评估,并与语言模型建模目标综合得到更好的效果。使用强化学习,在 SFT 模型基础上调整参数,使得最 终生成的文本可以获得更高的奖励(Reward)。由于强化学习方法稳定性不高,并且超参数众多,使得模型收敛难度大,再叠加 RM 模型的准确率问题,使得在大规模 语言模型如何能够有效应用强化学习非常困难。

大模型微调步骤

数据准备、选择基础模型、设置微调参数(学习率、训练轮次(epochs)、批处理大小(batch size)等超参数)、微调(加载预训练的模型和权重、选择微调方法、选择合适的损失函数和优化器、训练)

一、按微调参数规模划分

1.1全参微调(Full Parameter Fine-Tuning,FPFT)

       用预训练权重作为初始化权重,在特定数据集上继续训练,全部参数都更新。

1.2低参微调(Parameter Efficient Fine-Tuning,PEFT)

       用更少的计算资源完成参数的更新,只更新部分参数,或者通过对参数进行某种结构化约束,例如稀疏化低秩近似解来降低微调的参数量。

      可以分为以下三类方法

  1. 增加额外参数(Additive)。又主要分为:类适配器(Adapter-like)方法、软提示(Soft prompts)
  2. 选取一部分参数更新(Selective)
  3. 重参数化(Reparametrization-based) 

         补充:

         稀疏化:稀疏化是指通过去除矩阵或向量中的大部分元素,将其变得稀疏(即非零元素较少)的过程。有阈值法、L1正则化、PCA主成分分析可以实现这些方法。

         低秩近似解:矩阵的秩代表了矩阵中线性无关的行(或列)的最大数量通过减少矩阵的秩来去除冗余信息,同时保留数据的主要特征,从而降低存储空间和计算量。应用于矩阵补全、数据压缩等问题中。可以通过凸或者非凸松弛方法实现。

请复习线性代数的相关知识

1.2.1LoRA

LoRA(Low-Rank Adaptation)是一种旨在微调大型预训练语言模型(如GPT-3或BERT)的技术。其核心理念在于,在模型的决定性层次中引入小型、低秩的矩阵来实现模型行为的微调,而无需对整个模型结构进行大幅度修改。

为了达到降秩且最小化目标矩阵与原矩阵差异的目的,常用的方法是对原矩阵进行奇异值分 解并裁去较小的奇异值。

这种方法的优势在于,在不显著增加额外计算负担的前提下,能够有效地微调模型,同时保留模型原有的性能水准。

LoRA的操作流程如下:

确定微调目标权重矩阵:首先在大型模型(例如GPT)中识别出需要微调的权重矩阵,这些矩阵一般位于模型的多头自注意力和前馈神经网络部分。

引入两个低秩矩阵:然后,引入两个维度较小的低秩矩阵A和B。

计算低秩更新:通过这两个低秩矩阵的乘积AB来生成一个新矩阵,其秩(即r)远小于原始权重矩阵的秩。这个乘积实际上是对原始权重矩阵的一种低秩近似调整。

结合原始权重:最终,新生成的低秩矩阵AB被叠加到原始权重矩阵上。因此,原始权重经过了微调,但大部分权重维持不变。这个过程可以用数学表达式描述为:新权重 = 原始权重 + AB。

以一个具体实例来说,假设我们手头有一个大型语言模型,它通常用于执行广泛的自然语言处理任务。现在,我们打算将其微调,使其在处理医疗健康相关的文本上更为擅长。

AdaLoRA :LoRA 算法给所有的低秩矩阵指定了唯一的秩,从而忽略了不同模块、不同层的参数对于微调 特定任务的重要性差异。因此,文献 [147] 提出了 AdaLoRA(Adaptive Budget Allocation forParameterEfficient Fine-Tuning)算法,在微调过程中根据各权重矩阵对下游任务的重要性动态调整秩的大 小,用以进一步减少可训练参数量的同时保持或提高性能。

1.2.2QLoRA

QLoRA(Quantized Low-Rank Adaptation)是一种结合了LoRA(Low-Rank Adaptation)方法与深度量化技术的高效模型微调手段。

QLoRA的核心在于量化技术:QLoRA采用创新的技术将预训练模型量化为4位。这一技术包括低精度存储数据类型(4-bit NormalFloat,简称NF4)和计算数据类型(16-bit BrainFloat)。这种做法极大地减少了模型存储需求,同时保持了模型精度的最小损失。

补充:

量化是一个将连续信号转换为离散信号的过程

1Byte=8bit

32位浮点数占用4个字节的存储空间。量化后的表示将原始的32位浮点数转换为4位,也就是0.5个字节。新的集合由16个不同的值组成(因为2^4=16)。

微调阶段:在训练期间,QLoRA先以4-bit格式加载模型,训练时将数值反量化到bf16进行训练,这样大幅减少了训练所需的显存。例如,33B的LLaMA模型可以在24 GB的显卡上进行训练。

量化过程的挑战在于设计合适的映射和量化策略,以最小化精度损失对性能的影响。在大型模型中,这种方法可以显著减少内存和计算需求,使得在资源有限的环境下部署和训练成为可能。

1.2.3适配器调整(Adapter Tuning)

适配器调整的方法是在模型的每个层或选定层之间插入小型神经网络模块,称为“适配器”。这些适配器是可训练的,而原始模型的参数则保持不变。

适配器调整的关键步骤包括:

以预训练模型为基础:初始阶段,我们拥有一个已经经过预训练的大型模型,如BERT或GPT,该模型已经学习了丰富的语言特征和模式。

插入适配器:在预训练模型的每个层或指定层中,我们插入适配器。适配器是小型的神经网络,一般包含少量层次,并且参数规模相对较小。

维持预训练参数不变:在微调过程中,原有的预训练模型参数保持不变。我们不直接调整这些参数,而是专注于适配器的参数训练。

训练适配器:适配器的参数会根据特定任务的数据进行训练,使适配器能够学习如何根据任务调整模型的行为。

针对任务的调整:通过这种方式,模型能够对每个特定任务进行微调,同时不影响模型其他部分的通用性能。适配器有助于模型更好地理解和处理与特定任务相关的特殊模式和数据。

高效与灵活:由于只有部分参数被调整,适配器调整方法相比于全模型微调更为高效,并且允许模型迅速适应新任务。

1.2.4前缀调整(Prefix Tuning)

在每一层Transformer结构的输入前都添加可训练的Token,使得模型在更深层次上能够捕捉到任务相关的信息。但这也增加了参数的数量和计算成本。

前缀实际上是一种连续可微的虚拟标记(Soft Prompt/Continuous Prompt),与离散的Token相比,它们更易于优化并且效果更佳。这种方法的优势在于不需要调整模型的所有权重,而是通过在输入中添加前缀来调整模型的行为,从而节省大量的计算资源,同时使得单一模型能够适应多种不同的任务。

在Prefix Tuning中,假设你希望模型能够更准确地翻译医学领域的句子,你可以在每一层Transformer的输入前都添加一些与医学相关的Token,如“[MEDICAL]”。然后,通过训练这些Token,模型能够更好地理解并翻译医学领域的句子。

1.2.5 提示调整(Prompt Tuning)

通过在输入层添加prompt tokens来为每个任务定制模型。这些prompt tokens可以看作是模型的一种“提示”,它们被添加到输入序列的开头或结尾,以引导模型更好地适应不同任务。

提示调整与前缀调整都涉及在输入数据中添加可学习的向量,这些向量是在输入层添加的,但两者的策略和目的不同:

提示调整主要通过引入任务指导信息来引导模型生成特定类型的输出,而前缀调整则通过提供输入数据的上下文信息来影响模型的行为。

例子:原始输入句子是:“What is the best place to visit in summer?”(夏天最好的旅游地点是哪里?)。在Prompt Tuning中,你会在输入句子前添加一些额外的Token,比如[TRAVEL],让输入变成:[TRAVEL] What is the best place to visit in summer? 这些[TRAVEL] Token是可训练的,通过训练这些Token,你可以让模型更好地理解这是一个关于旅游的问题。

1.2.6 P-Tuning

核心思想是在特定位置插入可训练的Token,使模型能够更好地理解下游任务的需求。

假设你有一个已经训练好的模型,可以生成文章。现在你希望它能够生成关于科技的文章。原始输入句子是:“Artificial intelligence is transforming the world.”(人工智能正在改变世界。)在P-Tuning中,你会在输入序列中间插入一些Token,比如[TECH],让输入变成:“Artificial intelligence [TECH] is transforming the world.” 这些[TECH] Token是可训练的,通过训练这些Token,你可以让模型更好地理解这是一个关于科技的文章。

1.2.7. P-Tuning v2

P-Tuning v2的改进在于,不仅在第一层插入连续提示,而是在多层都插入连续提示,且层与层之间的连续提示是相互独立的。

二、按训练流程划分

LLM训练流程

 2.1上下文学习(In-Context learning,ICL)

 不对 LLMs 执行任何的微调,直接将模型的输入输出拼接起来作为一个prompt,引导模型根据输入的数据结构demo,给出任务的预测结果。提示微调(Prompt Tuning)属于ICL的方式之一。

2.1.1语境学习(Incontext Learning, ICL)

是指模型可以从上下文中的几个例子中学习:向模型输入特定任务的一些具体例子(也称示例(Demonstration))以及要测试的样例,模型可以根据给定的示例续写出测试样例的答案。语境学习的关键思想是从类比中学习,整个过程并不需要对模型进行参数更新,仅执行向前的推理。

2.1.2模型上下文窗口扩展

上下文窗口(context window)是指语言模型在进行预测或生成文本时,所考虑的前一个词元(token)或文本片段的大小范围。

2.2有监督微调(Supervised Fine-Tuning,SFT)

又称指令微调,使用标记数据对预训练模型进行微调的过程

2.3RLHF(Reinforcement Learning from Human Feedback)

还没学完这部分单独写一篇文章

强化学习(Reinforcement Learning)结合人类反馈(Human Feedback)来微调大语言模型 

2.3.1强化学习基本概念

智能体在环境中获取某个状态后,会根据该状态输出一个动作,也称为决策。 动作会在环境中执行,环境会根据智能体采取的动作,给出下一个状态以及当前动作所带来的奖励。智能体的目标就是尽可能多地从环境中获取奖励。

从机器狗学习抓飞盘的深入理解强化学习的概念

机器狗扔飞盘,机器狗形成了一个智能体。它会执行动作。飞盘的轨迹、速度构成了环境。机器狗根据当前环境反馈的关于飞盘的状态来决定采取什么动作。同时,根据机器狗所执行的动作,环境随后会给出一个反馈即奖励

机器狗根据不同的环境状态采取不同的动作的过程就是学习策略的过程,同时它会根据价值函数来预测自己所采取的行为可能带来的奖励是多少。

总体来说,强化学习的目标就是让智能体通过与环境的互动,学习到一个策略,使其能够在将来获得的奖励最大化。这使得强化学习不总是关注近期奖励,而是在短期的奖励与远期奖励之间找到平衡。

动作分类:离散动作空间、连续动作空间

策略:将输入的状态变成动作。随机性策略:根据输入的状态利用概率分布采样一个动作,确定性策略:智能体直接采取最有可能的动作。

价值函数:对未来奖励的预测。

智能体分类:基于价值的智能体(Value-based Agent)显式地学习价值函数,隐式地学习策略。基于策略的智能体(Policy-based Agent)则 是直接学习策略函数。策略函数的输入为一个状态,输出为对应动作的概率。演员-评论员智能体(Actor-critic Agent)则 是把基于价值的智能体和基于策略的智能体结合起来。

在LLM中智能体是模型,动作是它输出的结果

2.3.2基于人类反馈的强化学习

步骤1:预训练语言模型+有标签数据微调

步骤2:训练奖励模型

评判模型输出的回答在人类看来是否质量不错,即输入 [提示(prompt),模型生成的回答] ,奖励模型输出一个能表示回答质量的标量数字。这些不同的排序结果会通过某种归一化的方式变成定量的数据丢给模型训练,从而获得一个奖励模型。也就是一个裁判员。

步骤3:通过强化学习微调语言模型

近端策 略优化的实施流程如下:

(1) 环境采样:策略模型基于给定输入生成一系列的回复,奖励模型则对这些回复进行打分获得奖励。

(2) 优势估计:利用评论模型预测生成回复的未来累积奖励,并借助广义优势估计(Generalized Advantage Estimation,GAE)算法来估计优势函数,能够有助于更准确地评估每次行动的 好处。

(3) 优化调整:使用优势函数来优化和调整策略模型,同时利用参考模型确保更新的策略不会有 太大的变化,从而维持模型的稳定性。

三 总结

3.1Prompt-based Learning、Prompt tuning、Prompt engineering的区别

提示学习(Prompt-based Learning)

以下图为例包括三个步骤:提示添加、答案搜索、答案映射。

  • Prompt-based Learning是一种更广泛的概念,它涵盖了利用预训练语言模型处理各种下游任务的方法,而Prompt Tuning和Prompt Engineering则是这种方法的两种具体实现。
  • Prompt Tuning侧重于通过修改输入提示来引导模型生成符合特定任务或情境的输出,而无需对模型的全量参数进行微调。它更关注于提示的修改和模型输出的引导。
  • Prompt Engineering则更侧重于对输入文本的精心设计,包括选择适当的词汇、语法结构和上下文等,以生成能够引导模型产生期望输出的提示。它更关注于提示的优化和模型表现的提升。
  • Prompt-based Learning、Prompt Tuning和Prompt Engineering都旨在利用预训练语言模型处理各种下游任务,并通过优化输入端的提示来提高模型的准确性和效率。
  • 在实际应用中,Prompt Tuning和Prompt Engineering可以相互补充。通过Prompt Tuning对输入提示进行微调,可以进一步优化Prompt Engineering中设计的提示,从而提高模型的表现。

3.2提示工程,RAG和微调

提示工程(Prompt Engineering):构建文本,然后把它输入给large language model,得出我们想要的结果。

RAG(Retrieval Augmented Generation):拿到用户的question之后,先在我们的知识库中去检索和用户的query相关的内容,再基于这些检索的结果,用它来组织prompt,提示给大模型得出我们希望能够得到的那种高质量的准确的响应。

微调(Fine-tuning):它和前两个不同的地方在于,前面两种技术,不管是提示工程还是RAG,大模型本身是没有任何的变化的,但是如果做微调,其实是要去通过一个训练的过程来修改大模型它本身的参数。

参考说明

1.【大模型微调】一文掌握7种大模型微调的方法-CSDN博客

2.大模型学习路线(4)——大模型微调_p-tuning v2是全参微调吗-CSDN博客

3.五万字综述!Prompt-Tuning:深度解读一种新的微调范式 - 知乎 (zhihu.com)

4.【大模型开发 】 一文搞懂Fine-tuning(大模型微调)_finetuning大模型-CSDN博客

5. 《大规模语言模型从理论到实践》书第5、6章

6.大语言模型上下文窗口初探(上)-CSDN博客

7.五分钟弄清楚爆火的提示工程,RAG和微调-CSDN博客

相关文章:

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标:了解大模型理论体系 第二轮学习目标:进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。 预训练(Pretraining&…...

XGBoost回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出

回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出 目录 回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、…...

【翻译】在 Python 应用程序中使用Qt Designer的UI文件

原文地址:Using a Designer UI File in Your Qt for Python Application 直接上图,上代码 将UI文件转为Python 为了演示,我们使用 Qt Widgets 简单示例说明。 这个应用程序由一个源文件 easing.py、一个 UI 文件 form.UI、一个资源文件 ea…...

002-Html

Html 一、常用样式1.设置滚动条2.设置省略号3.设置高度自适应4.高度算法5.按钮样式6.按钮颜色 二、DIV1.并排显示 三、Input1.漂浮显示 一、常用样式 1.设置滚动条 <html> <!--滚动条-->overflow: auto; // x 和 yoverflow-x: auto; // xoverflow-y: auto; // y …...

微知-Mellanox提供的一个不错的测试rdma_cm方式建链的工具软件ucmatose?(ucmatose; ucmatose -s 1.1.1.1)

文章目录 快速命令获取背景实验server端客户端一个错误的情况无法建链&#xff1a; rpm安装包&#xff1a;librdmacm-utils-48.0-1.0.1.an8.x86_64详细介绍综述 快速命令获取 #server端 ucmatose# client端 ucmatose -s 1.1.1.1背景 平时使用rdma cm建链的测试一般使用ib_wri…...

Vivado HLS C/RTL 联合仿真时间

简单的led.cpp,led.h,还有一个test bench文件xxxx.cpp source D:/Vivado_HLS_project/RGB_YCBCR_RGB/solution1/sim/verilog/xsim.dir/flash_led/webtalk/xsim_webtalk.tcl -notraceINFO: [Common 17-206] Exiting Webtalk at Tue Oct 15 18:51:42 2024... INFO: [Common 17-2…...

Python实现图像加密与解密工具

Python实现图像加密与解密工具 一、整体思路 加密思路 读取图像文件&#xff0c;将图像数据转换为可以处理的格式&#xff08;例如字节流&#xff09;。选择一种加密算法&#xff0c;如AES&#xff08;Advanced Encryption Standard&#xff09;对称加密算法。生成加密密钥&a…...

《RabbitMQ篇》消费者轮询消费消息

当有多个消费者都在同一个队列中拿取消息时&#xff0c;会轮询从队列中拿取消息消费。 RabbitMQUtil类为工具类&#xff0c;获取Channel。 import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;public…...

mongodb导入导出

分享自己mongodb导出导入经验。将一个数据库数据备份&#xff0c;导入到另一个数据库。 mongodb的导入导出工具有版本限制&#xff0c;过旧的版本是不支持导入导出的。mongodb 4.2以后版本支持比较好。mongodb 3.4以前完全不支持。 1&#xff0c;下载 mongodb的导入导出需要自…...

判断 HTTP/2 多路复用是否在服务器上实现

要判断 HTTP/2 多路复用是否在服务器上实现&#xff0c;并确保浏览器正在使用多路复用来加载资源&#xff0c;您可以使用以下几种方法进行验证&#xff1a; 1. 使用浏览器开发者工具 大多数现代浏览器&#xff08;如 Chrome、Firefox、Edge&#xff09;提供了开发者工具&…...

(已解决)vscode使用launch.json进行debug调试报错:Couldn‘t spawn debuggee:embedded null byte

Launch.json 进行debug时报错&#xff1a; 主要原因是vscode全局配置被整乱了&#xff0c;下面是个人解决的方法&#xff0c;以供参考. 在网上也寻找过解决方法&#xff0c;有的说是&#xff0c;在launch.json中&#xff0c;添加一行"python":"/root/miniconda3…...

windows桌面便签小工具,便签软件哪个好用?

我们都知道&#xff0c;Windows桌面便签小工具可以极大地提高工作效率&#xff0c;帮助我们快速记录重要信息或待办事项。至于便签软件哪个好用&#xff0c;在选择便签软件时&#xff0c;我们可以从以下几个方面来考量&#xff1a;易用性、功能性、安全性以及是否支持跨平台同步…...

【Linux】C文件头文件数裁剪前58644个,裁剪后9373个

裁剪后可以访问网络和从Windows共享的文件夹&#xff1a; 纯C代码编译&#xff08;不包含打包&#xff09;时长比较&#xff1a;未裁剪前&#xff1a;大约5.5小时&#xff0c;裁剪后大约35分钟。 C文件和头文件数量比较&#xff08;目录里边实际还有tools和scripts目录&#xf…...

线性自抗扰控制(LADRC)系统算法框图

非线性ADRC(NLADRC)详细算法框图和源代码请参考专栏系列文章,常用链接如下: 1、NLADRC自抗扰控制 NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-CSDN博客文章浏览阅读1.6k次,点赞2次,收藏7次。本文介绍了如何将ADRC自抗扰控制算法从Simulink…...

基于SSM的微信小程序博客管理系统(博客1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM的微信小程序博客管理系统实现与设计&#xff0c;实现了管理员与用户&#xff0c;管理员实现了用户管理、博文信息管理、博文类型管理、我的博文管理、个人名片分享管理、签到管理…...

text-behind-image:轻松创建文字背景图片设计

在网页设计中&#xff0c;视觉效果往往能够极大地提升用户体验。其中&#xff0c;将文字置于图片背后是一种常见的设计手法&#xff0c;可以增加页面的层次感和视觉吸引力。今天&#xff0c;我将向你介绍一个名为 text-behind-image 的JavaScript库&#xff0c;它可以让你轻松实…...

前端reactvue3——实现滚动到底加载数据

文章目录 ⭐前言⭐react 实现滚动加载⭐vue3 实现滚动加载⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端react&vue3——实现滚动加载&#xff08;到底部加载&#xff09; scrollTop 属性 一个双精度浮点值&#xff0c;表示元素当前从原点垂直…...

qt 安装提示 无法定位程序输入点 systemparametersinfofordpi于动态链接库

安装 qt-creator-opensource-windows-x86_64-14.0.2.exe 有以下提示 无法定位程序输入点 systemparametersinfofordpi于动态链接库 路径 qt-creator-opensource-windows-x86_64-14.0.2.exe 更新系统 平台win10 很久之前的版本&#xff0c;关闭了更新&#xff0c;更新到 Win…...

算法笔记day04

目录 1. 在字符串中找出连续最长的数字串 2.岛屿数量 3.拼三角 1. 在字符串中找出连续最长的数字串 字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com) 算法思路&#xff1a; 这是一道简单的双指针题目&#xff0c;首先用i遍历数组&#xff0c;当遍历到数字的时…...

实战篇:(四)Vue2 + Three.js 创建可交互的360度全景视图,可控制旋转、缩放完整代码

Vue2 Three.js 创建可交互的360度全景视图&#xff0c;可控制旋转、缩放 引言 在现代网页开发中&#xff0c;三维图形技术已经成为提升用户体验的重要工具。本文将展示如何使用 Three.js 创建一个简单的可交互360度全景视图。通过这一项目&#xff0c;你将能够学习到基本的场…...

【load_file读文件】

一、文件操作基础 show 先试试 show variables;发现显示了三百多行的系统变量: 这是数据库的目录&#xff1a; mysql有多种编码方式&#xff0c;有数据库编码、连接时的编码、还有客户端的编码&#xff1a; 这里还有一个日志路径&#xff0c;这个日志是需要手动打开的&#…...

JavaScript object(2)

这样的话&#xff0c;就变成只读了。...

Acwing 排序

1.快速排序 主要思想&#xff1a;基于分治思想。通过选择一个基准元素&#xff0c;将数组分为两部分&#xff0c;左边部分元素都小于等于基准&#xff0c;右边部分元素都大于等于基准。然后对这两部分分别递归地进行排序。 分区逻辑&#xff1a;双指针算法 左指针i从左往右找…...

分布式环境下验证码登录的技术实现

分布式环境下验证码登录的技术实现 在分布式系统中&#xff0c;实现验证码登录是一个复杂但至关重要的任务。它不仅能防止暴力破解和自动化攻击&#xff0c;还能提高系统的安全性和用户体验。本文将详细介绍在分布式环境下如何实现验证码登录&#xff0c;涵盖验证码的生成、存…...

数据结构-5.9.树的存储结构

一.树的逻辑结构&#xff1a; 二.双亲表示法(顺序存储)&#xff1a; 1.树中除了根结点外每一颗树中的任意一个结点都只有一个父结点(双亲结点)&#xff1b; 2.结点包括结点数据和指针&#xff1b; 3.上述图片中右边的顺序存储解析&#xff1a;比如A结点左边的0&#xff0c;就…...

【Linux】解锁线程基本概念和线程控制,步入多线程学习的大门

目录 1、线程初识 1.1线程的概念 1.2.关于线程和进程的进一步理解 1.3.线程的设计理念 1.4.进程vs线程&#xff08;图解&#xff09; 1.5地址空间的第四谈 2.线程的控制&#xff1a; 2.1.关于线程控制的前置知识 2.2创建线程的系统调用&#xff1a; 这个几号手册具体…...

uniapp学习(005-2 详解Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第41p-第p47的内容 文章目录 mainifest.json文件配置获取微信小程序appid注册微信小程序微信小程序控制台图形界…...

深度学习的关键概念和术语

特征 特征是图像上可进行视觉辨识的区域。特征通常代表对应用相关的内容&#xff08;缺陷、对象、对象的特定部分&#xff09;。 特征尺寸 仅用于聚焦模式下的绿色分类、红色、蓝色定位和蓝色读取工具。 您认为对分析图像内容最重要的图像特征的主观大小。该特征尺寸确定用于…...

navicate可视化数据库操作-cnblog

1 连接数据库 点击链接&#xff0c;自定义名称&#xff0c;输入root密码 2 准备按照图例创建数据库demo 3 新建数据库...

kubernetes中的微服务

目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…...