LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

文章汇总

总体来看像是一种带权重的残差,但解决的如何高效问题的事情。
相比模型的全微调,作者提出固定预训练模型参数不变,在原本权重矩阵旁路添加低秩矩阵的乘积作为可训练参数,用以模拟参数的变化量。

模型架构

image.png
h = W 0 x + △ W x = W 0 x + B A x , B ∈ R d × r , A ∈ R r × k , r ≪ m i n ( d , k ) h=W_0x+\triangle Wx=W_0x+BAx,B\in \mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k},r \ll min(d,k) h=W0x+Wx=W0x+BAx,BRd×r,ARr×k,rmin(d,k)
可以从中看出来 B ∈ R d × r , A ∈ R r × k B\in\mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k} BRd×r,ARr×k分别是列满秩和行满秩。
因此 r a n k ( A ) = r a n k ( B ) = r , r ≪ m i n ( d , k ) rank(A)=rank(B)=r,r \ll min(d,k) rank(A)=rank(B)=r,rmin(d,k)
优点:
1:只优化注入的小得多的低秩矩阵,并且降低了过拟合的风险。
2:推理时可以将原权重与训练后权重合并,即 W = W 0 + B A W=W_0+BA W=W0+BA,因此在推理时不存在额外的开销。
3:当我们需要切换到另一个下游任务时,我们可以通过减去 B A BA BA然后添加不同的 B ′ A ′ B'A' BA来恢复 W 0 W_0 W0,这是一个内存开销很小的快速操作。

LoRA在transformer上的应用

image.png
为了简单和参数效率,我们将研究限制为仅适应下游任务的注意力权重,并冻结MLP模块(因此它们不接受下游任务的训练)

摘要

自然语言处理的一个重要范例是对一般领域数据进行大规模预训练,并适应特定的任务或领域。当我们预训练更大的模型时,重新训练所有模型参数的完全微调变得不太可行。以GPT-3 175B为例,部署独立的微调模型实例,每个实例都有175B参数,这是非常昂贵的。我们提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层,从而大大减少了下游任务的可训练参数的数量。与经过Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10,000倍,GPU内存需求减少3倍。在RoBERTa、DeBERTa、GPT-2和GPT-3上,LoRA在模型质量方面的表现与调优相当或更好,尽管具有更少的可训练参数、更高的训练吞吐量,并且与适配器不同,没有额外的推理延迟。我们还对语言模型适应中的等级缺陷进行了实证研究,从而揭示了LoRA的有效性。我们发布了一个包来促进LoRA与PyTorch模型的集成,并在https://github.com/microsoft/LoRA上为RoBERTa、DeBERTa和GPT-2提供我们的实现和模型检查点。

1介绍

自然语言处理中的许多应用依赖于将一个大规模的预训练语言模型适应多个下游应用。这种适应通常是通过微调来完成的,微调会更新预训练模型的所有参数。微调的主要缺点是新模型包含与原始模型一样多的参数。由于每隔几个月就会训练更大的模型,对于GPT-2 (Radford等人,b)或RoBERTa large (Liu等人,2019)来说,这仅仅是一个“不便”,而对于具有1750亿个可训练参数的GPT-3 (Brown等人,2020)来说,这是一个关键的部署挑战许多人试图通过调整一些参数或学习外部模块来缓解这种情况。这样,除了每个任务的预训练模型外,我们只需要存储和加载少量的特定于任务的参数,大大提高了部署时的运行效率。然而,现有的技术经常引入推理延迟(Houlsby等人,2019;Rebuffi等人,2017)通过扩展模型深度或减少模型的可用序列长度(Li & Liang, 2021;Lester等人,2021;Hambardzumyan等,2020;Liu et al ., 2021)(第3节)。更重要的是,这些方法往往无法匹配微调基线,从而在效率和模型质量之间做出权衡。
image.png
图1:我们的重新参数化。我们只训练A和B。
我们从Li等人(2018a)那里获得灵感;Aghajanyan等人(2020)的研究表明,学习到的过度参数化模型实际上存在于低内在维上。我们假设模型适应过程中的权重变化也具有较低的“内在秩”,从而提出了低秩适应(low - rank adaptation, LoRA)方法。LoRA允许我们通过优化密集层在适应过程中变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预训练的权值不变,如图1所示。以GPT-3 175B为例,我们展示了即使在全秩(即d)高达12,288时,非常低的秩(即图1中的 r r r可以是1或2)也足够了,这使得LoRA既具有存储效率又具有计算效率。
LoRA具有几个关键优势
•预先训练的模型可以共享,并用于为不同的任务构建许多小型LoRA模块。我们可以通过替换图1中的矩阵A和B来冻结共享模型并有效地切换任务,从而显著降低存储需求和任务切换开销。
•LoRA使训练更有效,并且在使用自适应优化器时将硬件进入门槛降低了3倍,因为我们不需要计算梯度或维护大多数参数的优化器状态。相反,我们只优化注入的小得多的低秩矩阵
•我们简单的线性设计允许我们在部署时将可训练矩阵与冻结权重合并,与完全微调的模型相比,通过构建不会引入推理延迟。
•LoRA与许多先前的方法正交,并且可以与其中许多方法组合,例如前缀调优。我们在附录E中提供了一个例子。
术语和约定
我们经常引用Transformer体系结构,并对其维度使用常规术语。我们将Transformer层的输入和输出维度大小称为 d m o d e l d_{model} dmodel。我们用 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo来指代自关注模块中的查询/键/值/输出投影矩阵。 W W W W 0 W_0 W0为预训练权矩阵, △ W \triangle W W为适应过程中累积的梯度更新。我们用 r r r来表示LoRA模块的秩。我们遵循(Vaswani et al ., 2017;Brown et al ., 2020),并使用Adam (Loshchilov & Hutter, 2019;Kingma & Ba, 2017)进行模型优化,并使用Transformer MLP前馈维度 f f f n = 4 × d m o d e l f_{ffn}=4\times d_{model} fffn=4×dmodel

2 问题陈述

虽然我们的建议与训练目标无关,但我们将重点放在语言建模上,作为我们的激励用例。下面是对语言建模问题的简要描述,特别是在给定特定任务提示的情况下最大化条件概率。
假设我们有一个预训练的自回归语言模型 P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(yx),参数化为 Φ \Phi Φ。例如, P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(yx)可以是通用的多任务学习器,如GPT (Radford等人,b;Brown等人,2020)基于Transformer架构(Vaswani等人,2017)。考虑将此预训练模型应用于下游条件文本生成任务,例如摘要、机器阅读理解(MRC)和自然语言转换为SQL (NL2SQL)。每个下游任务由上下文-目标对的训练数据集表示: Z = { ( x i , y i ) } i = 1 , . . . , N \mathcal{Z}=\{(x_i,y_i)\}_{i=1,...,N} Z={(xi,yi)}i=1,...,N,其中 x i x_i xi y i y_i yi都是令牌序列。例如,在NL2SQL中, x i x_i xi是一个自然语言查询, y i y_i yi是对应的SQL命令;“ x i x_i xi”是文章的内容,“ y i y_i yi”是文章的摘要。
在全微调过程中,将模型初始化为预训练的权值 Φ 0 \Phi_0 Φ0,并通过反复跟随梯度更新为 Φ 0 + △ Φ \Phi_0+\triangle \Phi Φ0+△Φ,以最大化条件语言建模目标:
image.png
完全微调的主要缺点之一是,对于每个下游任务,我们学习一组不同的参数 △ Φ \triangle \Phi △Φ,其维数 ∣ △ Φ ∣ |\triangle \Phi| ∣△Φ∣等于 ∣ Φ 0 ∣ |\Phi_0| Φ0。因此,如果预训练的模型很大(如GPT-3的 ∣ Φ 0 ∣ |\Phi_0| Φ0≈1750亿),存储和部署许多独立的微调模型实例可能是具有挑战性的,如果可行的话。
在本文中,我们采用了一种参数效率更高的方法,其中特定于任务的参数增量 △ Φ = △ Φ ( Θ ) \triangle \Phi=\triangle \Phi(\Theta) △Φ=△Φ(Θ)更小的参数集 Θ \Theta Θ ∣ Θ ∣ ≪ ∣ Φ 0 ∣ |\Theta| \ll |\Phi_0| ∣Θ∣Φ0进一步编码。因此,寻找 △ Φ \triangle \Phi △Φ的任务变成了对 Θ \Theta Θ的优化:
image.png
在随后的章节中,我们建议使用低秩表示来编码 △ Φ \triangle \Phi △Φ,这既节省计算又节省内存。当预训练模型为GPT-3 175B时,可训练参数 ∣ Θ ∣ |\Theta| ∣Θ∣的数量可小至 ∣ Φ 0 ∣ |\Phi_0| Φ0的0.01%。

3.现有的解决方案还不够好吗?

我们着手解决的问题绝不是什么新问题。自从迁移学习开始以来,已经有几十项工作试图使模型适应更具有参数和计算效率。关于一些著名作品的概览,见第6节。以语言建模为例,在有效适应方面有两种突出的策略:添加适配器层(Houlsby等人,2019;Rebuffi et al ., 2017;Pfeiffer等,2021;Ruckl¨e等人,2020)或优化输入层激活的某些形式(Li & Liang, 2021;Lester等人,2021;Hambardzumyan等,2020;Liu et al, 2021)。然而,这两种策略都有其局限性,特别是在大规模和对延迟敏感的生产场景中。

适配器层引入推理延迟

image.png
表1:GPT-2介质中单个正向传递的延迟时间(以毫秒为单位),平均超过100次试验。我们使用的是NVIDIA Quadro RTX8000。“ ∣ Θ ∣ |\Theta| ∣Θ∣”表示适配器层中可训练参数的数量。AdapterL和AdapterH是适配器调优的两个变体,我们将在5.1节中描述。在在线、短序列长度的场景中,适配器层引入的推理延迟可能非常大。详见附录B的完整研究。
适配器有许多变体。我们专注于Houlsby等人(2019)的原始设计,每个Transformer块有两个适配器层,Lin等人(2020)的最新设计,每个块只有一个适配器层,但有一个额外的LayerNorm (Ba等人,2016)。虽然可以通过修剪层或利用多任务设置来减少总体延迟(Ruckl¨e等人,2020;Pfeiffer等人,2021),没有直接的方法绕过适配器层中的额外计算。这似乎不是问题,因为适配器层被设计为具有很少的参数(有时<原始模型的1%),通过具有较小的瓶颈维度,这限制了它们可以添加的flop。然而,大型神经网络依赖于硬件并行性来保持低延迟,适配器层必须按顺序处理。这在批处理大小通常小于1的在线推理设置中会产生差异。在没有模型并行性的通用场景中,例如在单个GPU上运行GPT-2 (Radford et al, b)介质上的推理,我们看到使用适配器时延迟明显增加,即使瓶颈维度非常小(表1)。
当我们需要像Shoeybi等人(2020)那样对模型进行分片时,这个问题会变得更糟;Lepikhin等人(2020),因为额外的深度需要更多的同步GPU操作,如AllReduce和Broadcast,除非我们多次冗余存储适配器参数。

直接优化提示是很困难的

另一个方向,如前缀调优(Li & Liang, 2021),面临着不同的挑战。我们观察到前缀调优很难优化,其性能在可训练参数中呈非单调变化,证实了原论文的类似观察结果。更根本的是,为自适应保留一部分序列长度必然会减少用于处理下游任务的序列长度,我们怀疑与其他方法相比,这使得调整提示的性能降低。我们把对任务执行的研究推迟到第5节。

4.我们的方法

我们描述了LoRA的简单设计及其实际效益。这里概述的原则适用于深度学习模型中的任何密集层,尽管在我们的实验中,我们只关注Transformer语言模型中的某些权重,作为激励用例。

4.1低秩参数化更新矩阵

神经网络包含许多执行矩阵乘法的密集层。这些层中的权矩阵通常是全秩的。当适应一个特定的任务时,Aghajanyan等人(2020)表明,预训练的语言模型具有较低的“内在维度”,尽管随机投影到较小的子空间,但仍然可以有效地学习。受此启发,我们假设权重的更新在适应过程中也具有较低的“内在秩”。对于预训练的权重矩阵 W 0 ∈ R d × k W_0\in \mathbb{R}^{d\times k} W0Rd×k,我们通过用低秩分解 W 0 + △ W = W 0 + B A W_0+\triangle W=W_0+BA W0+W=W0+BA来约束其更新,其中 B ∈ R d × r , A ∈ R r × k B\in \mathbb{R}^{d\times r},A\in \mathbb{R}^{r\times k} BRd×r,ARr×k,秩 r ≪ m i n ( d , k ) r \ll min(d,k) rmin(d,k)。在训练过程中, W 0 W_0 W0被冻结,不接受梯度更新,而 A A A B B B包含可训练参数。注意, W 0 W_0 W0 △ W = B A \triangle W= BA W=BA都用相同的输入相乘,它们各自的输出向量按坐标求和。当 h = W 0 x h=W_0x h=W0x时,修正后的正向传递收益率为:
h = W 0 x + △ W x = W 0 x + B A x h=W_0x+\triangle Wx=W_0x+BAx h=W0x+Wx=W0x+BAx
我们在图1中说明了我们的重新参数化。我们对 A A A使用随机高斯初始化,对 B B B使用零初始化,因此 △ W = B A \triangle W=BA W=BA在训练开始时为零。然后,我们将 △ W x \triangle W x Wx乘以 α r \frac{\alpha}{r} rα,其中 α \alpha α r r r中的常数。当使用Adam进行优化时,如果我们适当地缩放初始化,则调整 α \alpha α与调整学习率大致相同。因此,我们简单地将 α \alpha α设置为我们尝试的第一个 r r r,而不调整它。当我们改变 r r r时,这种缩放有助于减少重新调整超参数的需要(Yang & Hu, 2021)。
全微调的推广。更一般的微调形式允许训练预训练参数的子集。LoRA更进一步,在适应过程中不要求权重矩阵的累积梯度更新具有全秩。这意味着当将LoRA应用于所有权重矩阵并训练所有偏差时,通过将LoRA秩 r r r设置为预训练的权重矩阵的秩,我们大致恢复了完全微调的表达性。换句话说,当我们增加可训练参数的数量时,训练LoRA大致收敛于训练原始模型,而基于适配器的方法收敛于MLP,基于前缀的方法收敛于不能接受长输入序列的模型。
**没有额外的推理延迟。当部署到生产环境中时,我们可以显式地计算和存储 W = W 0 + B A W=W_0+BA W=W0+BA,并像往常一样执行推理。注意 W 0 W_0 W0 B A BA BA都在 R d × k \mathbb{R}^{d\times k} Rd×k中。当我们需要切换到另一个下游任务时,我们可以通过减去 B A BA BA然后添加不同的 B ′ A ′ B'A' BA来恢复 W 0 W_0 W0,这是一个内存开销很小的快速操作。**至关重要的是,这保证在推理期间,与通过构造进行微调的模型相比,我们不会引入任何额外的延迟。

4.2 LoRA在transformer上的应用

image.png
原则上,我们可以将LoRA应用于神经网络中权矩阵的任何子集,以减少可训练参数的数量。在Transformer体系结构中,自关注模块 ( W q , W k , W v , W o ) (W_q,W_k,W_v,W_o) (Wq,Wk,Wv,Wo)和2个在MLP模块。我们将 W q W_q Wq(或 W k , W v W_k,W_v Wk,Wv)视为维度 d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel的单个矩阵,尽管输出维度通常被分割成注意头。为了简单和参数效率,我们将研究限制为仅适应下游任务的注意力权重,并冻结MLP模块(因此它们不接受下游任务的训练)。在7.1节中,我们进一步研究了在Transformer中适应不同类型的注意力权重矩阵的影响。我们把适应MLP层、LayerNorm层和偏差的实证调查留给未来的工作。
实际的好处和局限性
最大的好处来自内存和存储使用的减少。对于亚当训练的大型Transformer,如果 r ≪ d m o d e l r \ll d_{model} rdmodel ,我们将VRAM使用量减少2/3,因为我们不需要存储冻结参数的优化器状态。在GPT-3 175B上,我们将训练期间的VRAM消耗从1.2TB减少到350GB。当 r = 4 r=4 r=4并且只调整查询和值投影矩阵时,检查点大小减少了大约10,000倍(从350GB减少到35MB)4。这使我们能够使用更少的gpu进行训练,并避免I/O瓶颈。另一个好处是,我们可以在部署时以低得多的成本在任务之间切换,只需交换LoRA权重,而不是所有参数。这允许创建许多定制模型,这些模型可以在将预训练的权重存储在VRAM中的机器上动态交换。我们还观察到,在GPT-3 175B的训练过程中,与完全微调相比,速度提高了25%,因为我们不需要计算绝大多数参数的梯度。
LoRA也有其局限性。例如,如果选择将 A A A B B B吸收到 W W W中以消除额外的推理延迟,则在单个前向传递中批量处理具有不同 A A A B B B的不同任务的输入是不直接的。尽管对于延迟不重要的场景,可以不合并权重并动态选择用于批量示例的LoRA模块。

5 实证实验

在扩展到GPT-3 175B (Brown等人,2020)之前,我们评估了LoRA在RoBERTa (Liu等人,2019)、DeBERTa (He等人,2021)和GPT-2 (Radford等人,b)上的下游任务性能。我们的实验涵盖了广泛的任务,从自然语言理解(NLU)到生成(NLG)。具体来说,我们对RoBERTa和DeBERTa的GLUE (Wang et al ., 2019)基准进行了评估。我们遵循Li & Liang(2021)在GPT-2上的设置进行直接比较,并添加了WikiSQL (Zhong等人,2017)(NL到SQL查询)和SAMSum (Gliwa等人,2019)(对话摘要)在GPT-3上进行大规模实验。有关我们使用的数据集的更多细节,请参阅附录C。我们使用NVIDIA Tesla V100进行所有实验。
image.png
image.png

8 结论与未来工作

就所需的硬件和为不同任务托管独立实例的存储/切换成本而言,对庞大的语言模型进行微调是非常昂贵的。我们提出LoRA,一种有效的自适应策略,既不引入推理延迟,也不减少输入序列长度,同时保持高模型质量。重要的是,通过共享绝大多数模型参数,它允许在作为服务部署时快速切换任务。虽然我们关注的是Transformer语言模型,但所提出的原则通常适用于任何具有密集层的神经网络。
未来的工作有很多方向。1) LoRA可以与其他有效的自适应方法相结合,有可能提供正交改进。2)微调或LoRA背后的机制尚不清楚——**如何将预训练期间学习到的特征转化为下游任务?我们相信LoRA比全微调更容易回答这个问题。**3)我们主要依靠启发式方法来选择应用LoRA的权重矩阵。有没有更有原则的方法?4)最后, △ W \triangle W W的rank-deficient表明 W W W也可能是rank-deficient,这也可以作为未来作品的灵感来源。

参考资料

论文下载(2021年)

https://arxiv.org/abs/2106.09685v2

代码地址

https://github.com/microsoft/LoRA

参考资料

《大规模语言模型从理论到实践》张奇 桂韬 郑锐 ⻩萱菁 著

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

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

相关文章

游戏开发求职面试宝典:如何做好面试准备

面试的时候&#xff0c;你是否也遇到or担心会面临如下的问题: “哎,今天的面试又没有拿到offer”。 ”面试了好多回了&#xff0c;还是没有好的offer,算了随便找个工作先干着吧”。 “今年的市场行情真不行啊&#xff0c;早知道就不离职了”。 …… 出现以上的情况&#x…

趣谈网络协议

趣谈网络协议 原文链接:https://time.geekbang.org/column/intro/100020901?tabcatalog 第3讲 | ifconfig&#xff1a;最熟悉又陌生的命令行如何理解 ip addr &#xff1f;如果理解32位IP地址的5个分类&#xff1f;如何理解A&#xff0c;B&#xff0c;C三类地址的最大主机数和…

Mybatis和Hibernate的作用区别及底层原理分析

目录 Mybatis的作用及底层原理 Hibernate的作用及底层原理 Mybatis与Hibernate的主要区别 Mybatis和Hibernate都是Java应用程序中常用的ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它们的主要作用是简化数据库访问层的开…

XXE漏洞详解:从基础到防御

引言 在网络安全领域&#xff0c;XXE&#xff08;XML External Entity&#xff09;漏洞是一种常见的安全风险&#xff0c;它允许攻击者通过XML文档读取服务器上的文件&#xff0c;甚至执行远程服务器请求。本文将深入探讨XXE漏洞的基本概念、攻击手段以及如何有效防御。 XXE漏…

31、shell循环

一、循环 循环&#xff1a;循环是一种重复执行一段代码的结构。只要满足循环的条件&#xff0c;会一直执行这个代码。 循环条件&#xff1a;在一定范围之内&#xff0c;按照指定的次数来执行循环。 循环体&#xff1a;在指定的次数内&#xff0c;执行的命令序列。只要条件满…

深入解析 Spring Cloud Seata:分布式事务的全面指南

&#x1f9e8;&#x1f9e8;&#x1f9e8;深入解析 Spring Cloud Seata&#xff1a;分布式事务的全面指南 在微服务架构中&#xff0c;分布式事务的处理是一项复杂而重要的任务。Spring Cloud Seata 是一款专为分布式事务而设计的解决方案&#xff0c;它由阿里巴巴开源&#x…

记录一次网络延迟的事件分析

场景&#xff1a;几天前&#xff0c;某资源池的服务器ping 延迟500ms以上&#xff0c;感觉网络有问题&#xff0c;同时查看服务器的负载&#xff0c;发现不高&#xff0c;带宽也没有超限。 排查经过&#xff1a;仔细分析&#xff0c;查看日志&#xff0c;发现是一些延迟的信息…

宏电“灌区哨兵”助力灌区信息化建设,开启灌区“智水”时代

灌区是保障国家粮食安全的重要水利设施。“十四五”提出&#xff0c;要推进大中型灌区节水改造和精细化管理。灌区信息化是建设智慧水利、深化行业监管、提升灌区科学管理水平的基础支撑&#xff0c;也是“十四五”期间灌区现代化改造的重点内容之一。 宏电智慧灌区信息化解决方…

2024脑卒中评估量表分享

常笑医学整理了5个常用的脑卒中评估量表&#xff0c;供临床医护工作人员参考。 Essen脑卒中风险评分量表-常笑医学网​ &#xff08;完整量表请点击量表名称查看&#xff09; Essen脑卒中风险评估量表&#xff0c;是一个简便、易于临床操作的9分量表&#xff0c;是根据氯吡格雷…

k8s nginx.conf配置文件配置

无状态nginx配置nginx.conf覆盖容器配置nginx.conf 代码&#xff1a;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$request&q…

什么是JWT?为什么用JWT?JWT的实战案例

JWT学习资料 1.什么是JWT?【头部(Header)、载荷(Payload)和签名(Signature)】2.为什么要用JWT?3.JWT 使用全局变量JWT 创建JWT的应用&#xff08;token放在返回信息中&#xff09;JWT验证 4.JWT 原理 1.什么是JWT?【头部(Header)、载荷(Payload)和签名(Signature)】 JWT(JS…

reGeorg隐秘隧道搭建

reGeorg隐秘隧道搭建 【实验目的】 通过学习reGeorg与Proxifier工具使用&#xff0c;实现外网攻击端连接内网主机远程桌面。 【知识点】 python、reGeorg、proxifier。 【实验原理】 在内网渗透中&#xff0c;由于防火墙的存在&#xff0c;导致无法对内网直接发起连接&#xff…

【康复学习--LeetCode每日一题】2786. 访问数组中的位置使分数最大

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的…

Linux多线程编程中的同步与互斥

文章目录 一、线程同步与互斥1、理解线程同步2、互斥的概念3、小结 二、互斥锁&#xff08;Mutex&#xff09;1、互斥锁的定义和作用2、pthread库中的互斥锁3、互斥锁的实现原理4、示例代码演示互斥锁的基本用法 三、条件变量&#xff08;Condition Variable&#xff09;1、条件…

IDEA 配置方法模板无法获取到参数值和返回值(methodParameters()、methodReturnType()获取不到值)

问题现象&#xff1a; 我在 review 同事代码时候&#xff0c;发现方法上有注释&#xff0c;但是注释上又没有方法参数和返回值&#xff0c;这不是IDEA 配置了方法模板就可以自动生成的嘛&#xff0c;我出于好奇去问了下该同事是怎么回事&#xff0c;该同事有点不好意思的说我配…

Nginx正向代理配置示例与说明

Nginx的正向代理配置示例和说明如下&#xff1a; 配置示例 配置文件&#xff08;nginx.conf&#xff09; server {resolver 114.114.114.114; # 指定DNS服务器IP地址resolver_timeout 5s; # 设置DNS服务器域名解析超时时间listen 80; # 监听HTTP的80端口…

【JAVA】Java中Spring Boot如何设置全局的BusinessException

文章目录 前言一、函数解释二、代码实现三、总结 前言 在Java应用开发中&#xff0c;我们常常需要读取配置文件。Spring Boot提供了一种方便的方式来读取配置。在本文中&#xff0c;我们将探讨如何在Spring Boot中使用Value和ConfigurationProperties注解来读取配置。 一、函数…

昂辉科技EasySAR-BootLoader上位机产品

近年来&#xff0c;硬件标准化、同质化和软件差异化、复杂化成为了汽车产品研发的重要趋势。与此同时&#xff0c;大量的智能化功能和快速上车的节奏&#xff0c;对软件开发提出了更高的要求。在软硬件解耦的大背景下&#xff0c;建立统一的软件体系和开发工具以紧跟硬件更新迭…

Linux怎么编辑所有行行尾内容

Linux怎么编辑所有行行尾内容 1. sed2. Visual Block 模式 ctrlv 1. sed sed 是一个流编辑器&#xff0c;它可以逐行处理文本文件。要在所有行的行尾添加内容&#xff0c;可以使用 sed 的替换功能。 想在每一行的行尾添加一些内容&#xff0c;例如添加字符串 "END"。…

【NOI-题解】1389 - 数据分析1750 - 有0的数1457 - 子数整除1121 - “倒”数1962. 数值计算

文章目录 一、前言二、问题问题&#xff1a;1389 - 数据分析问题&#xff1a;1750 - 有0的数问题&#xff1a;1457 - 子数整除问题&#xff1a;1121 - “倒”数问题&#xff1a;1962. 数值计算 三、感谢 一、前言 本章节主要对循环中带余除法部分题目进行讲解&#xff0c;包括…