MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning

文章汇总

LoRA的问题

image.png
与FFT相比,低秩更新难以记忆新知识。虽然不断提高LoRA的秩可以缓解这一问题,但差距仍然存在

动机

尽可能地利用相同的可训练参数来获得更高的 Δ W \Delta W ΔW秩。
考虑到预训练权值 W 0 ∈ R d × k W_0\in R^{d\times k} W0Rd×k ,LoRA使用两个低秩矩阵 A A A B B B,它们有 ( d + k ) r (d+k)r (d+k)r个总可训练参数。在相同的可训练参数下,一个方阵 M ∈ R r ^ × r ^ M \in R^{\hat r \times \hat r} MRr^×r^,其中 r ^ = ⌊ ( d + k ) r ⌋ \hat r=\lfloor\sqrt{(d+k)r}\rfloor r^=(d+k)r ,由于 r ≪ m i n ( d , k ) r \ll min(d,k) rmin(d,k),因此这种做法可以获得最高秩。

方法

image.png
该图b秩的大小计算方式为 r ^ = ⌊ ( d + k ) r ⌋ \hat r=\lfloor\sqrt{(d+k)r}\rfloor r^=(d+k)r ,其中 r r r是LoRA中使用的秩,这样的目的是跟LoRA保持同样的训练参数大小
剩下一个头疼的问题是:如何将MoRA这个思路改动放在LoRA的代码里。
这里有一些符号定义,目的就是跟LoRA结合在一起
h = W 0 x + Δ W = W 0 x + f d e c o m p ( M f c o m p ( x ) ) h=W_0x+\Delta W=W_0x+f_{decomp}(Mf_{comp}(x)) h=W0x+ΔW=W0x+fdecomp(Mfcomp(x))
式中 f c o m p : R k → R r ^ f_{comp}:R^k\rightarrow R^{\hat r} fcomp:RkRr^表示将 x x x的输入维数从 k k k减小到 r ^ \hat r r^, f d e c o m p : R r ^ → R d f_{decomp}: R^{\hat r} \rightarrow R^d fdecomp:Rr^Rd表示将输出维数从 r ^ \hat r r^增大到 d d d
式中 Δ W = f d e c o m p ‾ ( f c o m p ‾ ( M ) ) \Delta W=f_{\overline{decomp}}(f_{\overline{comp}}(M)) ΔW=fdecomp(fcomp(M)) f c o m p ‾ : R r ^ × r ^ → R r ^ × k f_{\overline{comp}}:R^{\hat r \times \hat r}\rightarrow R^{\hat r \times k} fcomp:Rr^×r^Rr^×k f d e c o m p ‾ : R r ^ × k → R d × k f_{\overline{decomp}}:R^{\hat r \times k}\rightarrow R^{d\times k} fdecomp:Rr^×kRd×k
对于 f c o m p f_{comp} fcomp f d e c o m p f_{decomp} fdecomp的设计,作者探索了几种实现这些功能的方法。这里列举简单了两种。

Fcomp和Fdecomp的设计

截断维度

image.png
对应的 Δ W \Delta W ΔW为:
image.png
图解如下
f c o m p f_{comp} fcomp只取 x x x的前 r ^ \hat r r^行和前 r ^ \hat r r^列, f d e c o m p f_{decomp} fdecomp用0矩阵来增大维度到 d d d。明显这种方法在压缩过程中会导致大量的信息丢失,
image.png

共享M的行和列

f c o m p : R k → R n × r ^ , f d e c o m p : R n × r ^ → R d f_{comp}:R^k\rightarrow R^{n\times \hat r},f_{decomp}: R^{n\times \hat r} \rightarrow R^d fcomp:RkRn×r^,fdecomp:Rn×r^Rd。对应的 f c o m p , f d e c o m p , Δ W f_{comp},f_{decomp},\Delta W fcomp,fdecomp,ΔW为:
image.png
例子,当 r = 128 r=128 r=128 Δ W ∈ R d × k = R 4096 × 4096 \Delta W \in R^{d\times k}=R^{4096\times 4096} ΔWRd×k=R4096×4096时, r ^ = ⌊ ( d + k ) r ⌋ = ⌊ ( 4096 + 4096 ) × 128 ⌋ = 1024 , M ∈ R r ^ × r ^ = R 1024 × 1024 \hat r=\lfloor\sqrt{(d+k)r}\rfloor=\lfloor\sqrt{(4096+4096)\times 128}\rfloor=1024,M \in R^{\hat r\times \hat r}=R^{1024\times 1024} r^=(d+k)r =(4096+4096)×128 =1024,MRr^×r^=R1024×1024
图解如下
image.png

摘要

低秩自适应(Low-rank adaptation, LoRA)是一种针对大型语言模型的参数有效微调(PEFT)方法。在本文中,我们分析了在LoRA中实现的低秩更新的影响。我们的研究结果表明,低等级的更新机制可能会限制LLM有效学习和记忆新知识的能力。受此启发,我们提出了一种新的方法,称为MoRA,该方法采用方阵来实现高秩更新,同时保持相同数量的可训练参数。为了实现这一目标,我们引入了相应的非参数算子来减少方阵的输入维数和增加输出维数。此外,这些操作确保了权重可以合并回LLM,这使得我们的方法可以像LoRA一样部署。我们在五个任务中对我们的方法进行了全面的评估:指令调整、数学推理、持续预训练、记忆和预训练。我们的方法在内存密集型任务上优于LoRA,在其他任务上也达到了相当的性能。我们的代码可以在https://github.com/kongds/MoRA上找到。

1.介绍

随着语言模型规模的增加,参数有效微调(PEFT) (Houlsby等人,2019)已经成为一种流行的技术,可以使这些模型适应特定的下游任务。与更新所有模型参数的完全微调(FFT)相比,PEFT只修改了一小部分参数。例如,在某些任务中,它可以通过更新不到1%的参数来实现与FFT相似的性能(Hu et al, 2021),这大大降低了优化器的内存需求,并促进了微调模型的存储和部署。在现有的PEFT方法中,Low-Rank Adaptation (LoRA) (Hu et al ., 2021)在LLM尤为突出。LoRA通过通过低秩矩阵更新参数,提高了其他PEFT方法的性能,如提示调优(Lester等人,2021)或适配器(Houlsby等人,2019)。这些矩阵可以合并到原始模型参数中,从而避免了推理过程中额外的计算成本。有许多方法旨在改进LLM的LoRA。然而,大多数方法主要是基于GLUE验证其效率(Wang et al ., 2018),要么通过实现更好的性能,要么通过需要更少的可训练参数。最新方法(Liu et, 2024;Meng等,2024;Zhu等人,2024)利用指令调优任务如Alpaca (Wang等人,2024)或推理任务如GSM8K (Cobbe等人,2021)来更好地评估它们在LLM上的性能。然而,评估中使用的不同设置和数据集使对其进展的理解复杂化。
在本文中,我们在相同设置下对不同任务的LoRA进行了全面评估,包括指令调优、数学推理和持续预训练,,包括指令调整、数学推理和持续的预训练。我们发现,类似lora的方法在这些任务中表现出类似的性能,它们在指令调优方面的表现与FFT相当,但在数学推理和持续预训练方面存在不足。在这些任务中,指令调优主要侧重于与格式的交互,而不是获取知识和能力,这些知识和能力几乎完全是在预训练期间学习的(Zhou et al, 2024)。我们观察到,LoRA很容易适应指令调优中的响应格式,但在其他需要通过微调增强知识和能力的任务中却遇到困难。
对于LoRA观察到的这种限制,一个合理的解释可能是它依赖于低秩更新(Lialin et al, 2023)。低秩更新矩阵 Δ W \Delta W ΔW难以估计FFT中的全秩更新,特别是在需要记忆特定领域知识的持续预训练等内存密集型任务中。由于 Δ W \Delta W ΔW的秩明显小于全秩,这一限制限制了通过微调存储新信息的能力。此外,当前的LoRA变体不能改变低秩更新的固有特征。为了验证这一点,我们使用伪数据进行了一个记忆任务,以评估LoRA在记忆新知识方面的性能。我们发现LoRA的表现明显不如FFT,即使是256这样的大秩也是如此。
image.png
图1:在相同数量的可训练参数下,与LoRA相比,我们的方法的概述。 W W W为模型的冷冻重量。 A A A B B B是LoRA中可训练的低秩矩阵。 M M M是我们方法中的可训练矩阵。灰色部分是用于减少输入维数和增加输出维数的非参数算子。 r r r表示两种方法中的秩。
鉴于这些观察结果,我们引入了一种称为MoRA的方法,该方法采用与低秩矩阵相反的方阵,旨在最大化 Δ W \Delta W ΔW中的秩,同时保持相同数量的可训练参数。例如,当使用8秩,隐藏大小为4096时,LoRA使用两个低秩矩阵 A ∈ R 4096 × 8 A \in R^{4096\times 8} AR4096×8 B ∈ R 8 × 4096 B \in R^{8\times 4096 } BR8×4096 r a n k ( Δ W ) ≤ 8 rank( \Delta W)\le 8 rank(ΔW)8。在参数数相同的情况下,我们的方法使用一个方阵 M ∈ R 256 × 256 M \in R^{256\times 256} MR256×256,秩 r a n k ( Δ W ) ≤ 8 rank( \Delta W)\le 8 rank(ΔW)8,如图1所示。值得注意的是,我们的方法显示出比具有大秩的LoRA更大的容量。为了减小 M M M的输入维数,增大 M M M**的输出维数,我们开发了相应的非参数算子。**此外,这些算子和 M M M可以用 Δ W \Delta W ΔW代替,确保我们的方法可以像LoRA一样合并回LLM。
我们的贡献如下:
1.我们引入了一种新的方法MoRA,它在保持相同数量的可训练参数的情况下,在LoRA中使用方阵代替低秩矩阵来实现高秩更新。
2.我们讨论了四种MoRA的非参数算子,以降低方阵的输入维数和增加输出维数,同时保证权值可以合并回LLM。
3.我们通过五个任务评估MoRA:记忆、指令调整、数学推理、持续预训练和预训练。我们的方法在内存密集型任务上优于LoRA,在其他任务上也达到了相当的性能,这证明了高秩更新的有效性。

2.相关工作

2.1 LoRA

image.png
与其他方法相比,LoRA具有广泛的适用性和鲁棒性,是最流行的用于LLM微调的PEFT方法之一。为了近似FFT中更新后的权值 Δ W \Delta W ΔW, LoRA采用两个低秩矩阵进行分解。通过调整这两个矩阵的秩,LoRA可以相应地修改可训练参数。得益于此,LoRA可以在微调后合并这些矩阵,而不会产生与FFT相比的推理延迟。有许多方法可以进一步改进LoRA,特别是在LLM中的应用。DoRA(Liu et al ., 2024)进一步将原始权重分解为幅度分量和方向分量,并使用LoRA对方向分量进行更新。LoRA+(Hayou et al ., 2024)对两个低秩矩阵采用不同的学习率来提高学习效率。ReLoRA(Lialin et al, 2023)在训练期间将LoRA集成到LLM中,以提高最终 Δ W \Delta W ΔW的秩。

2.2 LLMs微调

尽管LLM在上下文学习方面的表现令人印象深刻,但某些场景仍然需要微调,大致可以分为三种类型。第一种类型,指令调优,旨在更好地将LLM与最终任务和用户偏好结合起来,而不会显着增强LLM的知识和能力(Zhou et al, 2024)。这种方法简化了处理不同的任务,理解复杂的指令的过程。第二种类型涉及复杂的推理任务,如数学问题解决(Collins et al, 2023;Imani et al ., 2023;Yu et al ., 2023),其中一般指令调优在处理复杂的、象征性的、多步骤的推理任务时往往不足。为了提高LLM的推理能力,大多数研究都集中在创建相应的训练数据集上,要么利用更大的教师模型,如GPT-4 (Fu et al ., 2023),要么沿着推理路径改写问题(Yu et al ., 2023)。第三种是持续预训练(Cheng et al ., 2023;Chen et al ., 2023;Han等,2023;Liu et al ., 2023),旨在增强LLM的特定领域能力。与指令调优不同,它需要微调以增加相应的特定领域知识和功能。
然而,LoRA的大多数变体(Kopiczko等人,2023;Lialin等,2023;Dettmers等,2024;Zhu等人,2024)主要使用GLUE中的指令调优或文本分类任务(Wang等人,2018)来验证它们在LLM上的有效性。鉴于与其他类型相比,指令调优需要的微调能力最少,因此它可能无法准确反映LoRA变体的有效性。为了更好地评估他们的方法,最近的研究(Meng et al ., 2024;Liu et al ., 2024;Shi et al ., 2024;Renduchintala等人,2023)使用推理任务来测试他们的方法。但所使用的训练集往往太小,LLM无法有效地学习推理。例如,一些方法(Meng et al, 2024;Renduchintala等人,2023)使用仅7.5K训练样本的GSM8K (Cobbe等人,2021)。与395K训练样本的SOTA方法(Yu et al ., 2023)相比,这个小的训练集在推理上的表现更差,很难评估这些方法的有效性。

3.分析低秩更新的影响

LoRA的关键思想(Hu et al, 2021)涉及使用低秩更新来估计FFT中的全秩更新。形式上,给定一个预训练的参数矩阵 W 0 ∈ R d × k W_0 \in R^{d\times k} W0Rd×k, LoRA采用两个低秩矩阵计算权值更新 Δ W \Delta W ΔW:
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)
其中, A ∈ R r × k , B ∈ R d × r A \in R^{r\times k},B\in R^{d \times r} ARr×k,BRd×r表示LoRA中的低秩矩阵。确保 Δ W = 0 \Delta W=0 ΔW=0在训练开始时,LoRA用高斯分布初始化 A A A,用零初始化 B B B。由于 Δ W \Delta W ΔW分解为 B A BA BA r a n k ( Δ W ) ≤ r rank( \Delta W)\le r rank(ΔW)r。与FFT中的全秩更新相比,LoRA中的权重更新的秩明显较低, r ≪ m i n ( d , k ) r \ll min(d,k) rmin(d,k)。LoRA的低秩更新在文本分类或指令调优等任务中表现出与全秩更新相当的性能(Liu et al ., 2024;Meng et al, 2024)。然而,对于复杂推理或持续预训练等任务,LoRA往往表现出更差的性能(Liu et al ., 2023)。
基于这些观察,我们提出了一个假设,即低秩更新容易利用LLM原有的知识和能力来解决任务,但很难处理需要提高LLM知识和能力的任务。
为了证实这一假设,我们研究了LoRA和FFT在通过微调记忆新知识方面的差异。为了避免利用LLM的原始知识,我们随机生成10K对通用唯一标识符(uuid),每对包含两个具有32个十六进制值的uuid。该任务要求LLM根据输入的UUID生成相应的UUID。例如,给定一个UUID,如“205f3777-52b6-4270-9f67-c5125867d358”,模型应该基于10K对训练对生成相应的UUID。这个任务也可以被看作是一个问答任务,而完成它所必需的知识完全来自训练数据集,而不是LLM本身
对于训练设置,我们使用LLaMA-27B为基础模型,每批使用1000对,进行100次epoch。对于LoRA,我们将低秩矩阵应用于所有线性层,并从{1e-4,2e-4,3e-4}搜索学习率以提高性能。我们使用不同秩 r ∈ { 8 , 16 , 32 , 64 , 128 , 256 } r \in \{8,16,32,64,128,256\} r{8,16,32,64,128,256}对LoRA进行实验。对于FFT,我们直接使用3e-5的学习率。
image.png
图2:使用FFT和LoRA进行微调来记忆UUID对的性能。
根据图2,我们观察到与FFT相比,低秩更新难以记忆新知识。虽然不断提高LoRA的秩可以缓解这一问题,但差距仍然存在。与内存任务相比,我们还评估了LoRA和FFT在指令调优方面的性能差距,这只是引入了新的知识。与之前的结果相似(Meng et al ., 2024;Zhu et al ., 2024),我们也发现LoRA与表1中 r = 8 r=8 r=8的小秩FFT的性能相匹配。这表明LoRA可以通过像FFT一样的微调轻松地利用LLM的原始知识。

4.方法

基于以上分析,我们提出了一种新的方法来缓解低秩更新的负面影响。我们的方法的主要思想是尽可能地利用相同的可训练参数来获得更高的 Δ W \Delta W ΔW秩。考虑到预训练权值 W 0 ∈ R d × k W_0\in R^{d\times k} W0Rd×k ,LoRA使用两个低秩矩阵 A A A B B B,它们有 ( d + k ) r (d+k)r (d+k)r个总可训练参数。在相同的可训练参数下,一个方阵 M ∈ R r ^ × r ^ M \in R^{\hat r \times \hat r} MRr^×r^,其中 r ^ = ⌊ ( d + k ) r ⌋ \hat r=\lfloor\sqrt{(d+k)r}\rfloor r^=(d+k)r ,由于 r ≪ m i n ( d , k ) r \ll min(d,k) rmin(d,k),因此可以获得最高秩。
为了实现这一点,我们需要减少 M M M的输入维数,增加 M M M的输出维数。
image.png
式中, f c o m p : R k → R r ^ f_{comp}:R^k\rightarrow R^{\hat r} fcomp:RkRr^表示将 x x x的输入维数从 k k k减小到 r ^ \hat r r^, f d e c o m p : R r ^ → R d f_{decomp}: R^{\hat r} \rightarrow R^d fdecomp:Rr^Rd表示将输出维数从 r ^ \hat r r^增大到 d d d。此外,这两个函数应该是非参数化的运算符,并期望在相应维度的线性时间内执行。它们还应具有相应的功能, f c o m p ‾ : R r ^ × r ^ → R r ^ × k f_{\overline{comp}}:R^{\hat r \times \hat r}\rightarrow R^{\hat r \times k} fcomp:Rr^×r^Rr^×k f d e c o m p ‾ : R r ^ × k → R d × k f_{\overline{decomp}}:R^{\hat r \times k}\rightarrow R^{d\times k} fdecomp:Rr^×kRd×k,将 M M M转化为 Δ W \Delta W ΔW。对于任意 x x x,下列条件都成立:
image.png
式中 Δ W = f d e c o m p ‾ ( f c o m p ‾ ( M ) ) \Delta W=f_{\overline{decomp}}(f_{\overline{comp}}(M)) ΔW=fdecomp(fcomp(M))。若Eq. 3成立,则 M M M可根据 f c o m p f_{comp} fcomp f d e c o m p f_{decomp} fdecomp无损展开为 Δ W \Delta W ΔW。这允许我们的方法像LoRA一样合并回LLM。
对于 f c o m p f_{comp} fcomp f d e c o m p f_{decomp} fdecomp的设计,我们探索了几种实现这些功能的方法。一种简单的方法是截断维度,然后将其添加到相应的维度中。在形式上,这可以表示为:
image.png
对应的 Δ W \Delta W ΔW为:
image.png
然而,这种方法在压缩过程中会导致大量的信息丢失,并且在解压缩过程中只通过附加零向量来修改输出的一部分。为了改进它,我们可以共享M的行和列,以实现更有效的压缩和解压缩。在形式上,这可以表示为:
image.png
这里, g g g g ′ g' g分别表示 M M M中共享同一行和同一列的预定义组。 j ∈ g i j \in g_i jgi表示第 j j j维属于 g g g中的第 i i i个组。 g ~ i ′ \tilde{g}'_i g~i g i ′ {g}'_i gi的反转,表示与 g ′ g' g中的第 g ~ i ′ \tilde{g}'_i g~i个组相关的第 i i i维。对应的 Δ W \Delta W ΔW为:
image.png
对于较大的秩(如 r = 128 r=128 r=128 r = 256 r=256 r=256),共享行和列可能是有效的,因为 Δ W \Delta W ΔW中只有少数行或列共享公共行或列。例如,考虑 r = 128 r=128 r=128时, Δ W ∈ R 4096 × 4096 \Delta W \in R^{4096\times 4096} ΔWR4096×4096,其中, r ^ = 1024 , M ∈ R 1024 × 1024 \hat r=1024,M \in R^{1024\times 1024} r^=1024,MR1024×1024。在这种情况下,只有4行或4列共享同一行或列。相反,对于较小的秩,如 r = 8 r=8 r=8,其中 r ^ = 256 \hat r=256 r^=256,则平均需要16行或列在一组中共享 M M M中的同一行或列,这可能导致效率低下,因为在Eq. 6中压缩过程中存在显着的信息丢失。
为了提高较小秩的性能,我们重塑 x x x而不是直接压缩它,以保留输入信息。在这种情况下, f c o m p : R k → R n × r ^ , f d e c o m p : R n × r ^ → R d f_{comp}:R^k\rightarrow R^{n\times \hat r},f_{decomp}: R^{n\times \hat r} \rightarrow R^d fcomp:RkRn×r^,fdecomp:Rn×r^Rd。对应的 f c o m p , f d e c o m p , Δ W f_{comp},f_{decomp},\Delta W fcomp,fdecomp,ΔW为:
image.png
其中 c o n c a t ( x ) concat(x) concat(x)指的是将 x x x的行连接成一个向量。为了简单起见,我们省略了上述函数中的填充和截断操作符,并将重点放在 d = k d = k d=k的情况下。与共享列和行相比,该方法通过将 x x x重塑为 R n × r ^ R^{n\times \hat r} Rn×r^而不是 R r ^ R^{ \hat r} Rr^来增加额外的计算开销。然而,考虑到 M M M的大小明显小于 W 0 W_0 W0,这个额外的计算对于像8这样的秩来说是非常小的。例如,当对 r a n k rank rank为8 ( r ^ = 256 ) (\hat r = 256) (r^=256)的7B模型进行微调时,该方法仅比以前的方法慢1.03倍。
受RoPE (Su等人,2024)的启发,我们可以进一步改进该方法,通过将旋转算子合并到 f c o m p f_{comp} fcomp中来增强 M M M的表达性,使其能够通过旋转来区分不同的 x i r ^ : ( i + 1 ) r ^ x_{i\hat r:(i+1)\hat r} xir^:(i+1)r^。我们可以将Eq. 8修改为:
image.png
其中, a i a^i ai P i P^i Pi分别表示旋转后 x i r ^ : ( i + 1 ) r ^ x_{i\hat r:(i+1)\hat r} xir^:(i+1)r^ M M M的对应值。在RoPE之后,我们使用 r ^ × r ^ \hat r\times \hat r r^×r^块对角矩阵来实现旋转。然而,我们的方法使用旋转信息使M能够区分 x i r ^ : ( i + 1 ) r ^ x_{i\hat r:(i+1)\hat r} xir^:(i+1)r^,而不是RoPE中的标记位置。我们可以定义 a i a^i ai P i P^i Pi如下:
image.png
其中 θ j = 1000 0 − 2 ( j − 1 ) / r ^ , R θ j , i ∈ R 2 × 2 \theta_j=10000^{-2(j-1)/\hat r},R_{\theta_j,i}\in R^{2\times 2} θj=100002(j1)/r^,Rθj,iR2×2为旋转矩阵:
image.png

5.实验

image.png
image.png

参考资料

论文下载

https://arxiv.org/abs/2405.12130
image.png

代码地址(286 stars)

https://github.com/kongds/MoRA

参考文章

https://mp.weixin.qq.com/s/OxYNpXcyHF57OShQC26n4g

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HTML入门】第五课 - 加粗和倾斜的字体们

这一小节,我们说一些常用的HTML文本格式化的标签知识。可能你会觉得HTML知识比较零散,有好多标签。没错,就是比较零散,标签比较多。正式这些形形色色的HTML标签们,组成了丰富多彩的网页元素。 但是在刚学习的时候&…

Linux-gdb

目录 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 4.快速跳出函数体 5.其他 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 断点的本质是帮助我们缩小出问题的范围 比如,…

three-platformize 微信小程序 uniapp 使用截图功能

最近需要将3d场景进行截图,但是网上的各种各样,看的我一团乱麻,因此在解决完后就将这些简单的分享一下; 原理:将3维场景的那个canvas中的像素提取出来,找一个空的canvas二维画布放上去,然后用二…

剪映PC电脑版开心版5.5.0免VIP导出补丁下载_替换一次即可长期使用

剪映5.5.0免VIP导出补丁来了,可以使用VIP特效,文字转语音声效,滤镜,等全部需要VIP的素材,都可以直接导出,不需要VIP 并且是需要替换一次,每次启动软件都是可以直接导出的,只要不重新…

vue学习day02-Vue指令-v-html、v-show与v-if、v-else与v-else-if、v-on、v-bind、v-for、v-model

6、Vue指令 指令:带有v-前缀的特殊标签属性 (1)v-html 作用:设置元素的innerHTML 语法:v-html“表达式” 示例: 提供一个地址,这里是百度的地址,通过v-html渲染 结果&#xff…

【C语言】auto 关键字详解

在C语言中,auto关键字用于声明局部变量,但它的使用已经变得很少见。事实上,从C99标准开始,auto关键字的默认行为就是隐含的,因此在大多数情况下无需显式使用它。 基本用法 在C语言中,auto关键字用于指定变…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议(ICBAIE 2024)定于2024年10月25-27号在中国深圳隆重举行。…

大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践

直接偏好优化(Direct Preference Optimization,DPO)算法是大语言模型对齐的经典算法之一,它巧妙地将奖励模型(Reward Model)训练和强化学习(RL)两个步骤合并成了一个,使得训练更加快…

绝区柒--LLM简史

这是一系列LLM介绍的可成,分以下五个不分 序言:大型语言模型LLM简史第一部分:代币化——完整指南第 2 部分:使用 Python 中的 Scratch 从零开始使用 word2vec 进行词嵌入第 3 部分:用代码解释自注意力机制第 4 部分&a…

uniapp easycom组件冲突

提示信息 ​easycom组件冲突:[/components/uni-icons/uni-icons.vue,/uni_modules/uni-icons/components/uni-icons/uni-icons.vue]​ 问题描述 老项目,在uniapp插件商城导入了一个新的uniapp官方开发的组件》uni-data-picker 数据驱动的picker选择器 …

关于嵌入式系统中的LED控制程序的一篇爽文

嵌入式系统中的LED控制程序 在嵌入式系统中控制LED是一个很常见的任务,可以用于指示状态、显示信息等。我们将使用C语言编写一个简单的LED控制程序,该程序将控制一个虚拟的LED,但可以根据需要将其扩展到实际的硬件上。 准备工作 在开始之前…

centos7升级到欧拉openeule

centos7升级到欧拉openeule 一、准备工作 1、安装迁移工具(安装迁移工具的机器不能给自己升级,请用其他机器作为迁移母机) wget https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/x2openEuler/x86_64/Packages/x2…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…

python调用串口收发数据

1、确认串口信息 2、安装pyserial库 打开终端或命令行&#xff0c;敲入这行命令&#xff1a;pip install pyserial 3、python编程 import serial def main(): #创建串口对象 ser serial.Serial(COM4, 9600, timeout1) if not ser.isOpen(): print("串…

vue缓存页面,当tab切换时保留原有的查询条件

需求&#xff1a; 切换tab时&#xff0c;查询条件不变 路由页面&#xff1a; 单个页面上加这句话&#xff1a;

侯捷C++面向对象高级编程(上)-7-堆、栈与内存管理

1.output函数&#xff08;其中operator必须做为全局函数&#xff0c;不可做为成员函数&#xff09; 2.栈与堆定义 3.stack objects的生命期 4.static local objects的生命期 5.global objects的生命期 6.heap objects的生命期 7.new 8.delete 9.内存块 10.array 11.搭配

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…

轻松Get苹果手机输入法手写怎么设置!

在使用苹果手机的过程中&#xff0c;许多用户希望能够使用手写输入法进行文字输入。手写输入法不仅可以提供更加自然的输入体验&#xff0c;还特别适合习惯用手写的用户。 无论您是需要快速记录笔记&#xff0c;还是想体验不一样的输入方式&#xff0c;手写输入法都能为您带来…

Kimi又悄悄搞了件大事!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 最近公众号好像被限流了。 5000 多粉的公众号&#xff0c;两…

NAT技术及其应用

网络地址转换&#xff08;NAT&#xff0c;Network Address Translation&#xff09;是一种广泛应用于现代网络中的技术&#xff0c;旨在解决IP地址短缺问题&#xff0c;同时增强网络的安全性和灵活性。本文将详细解释NAT技术的工作原理&#xff0c;并探讨其在家庭及企业网络中的…