(Arxiv-2024)CLOVer:跨层正交向量自适应

news2024/12/26 13:55:36

CLOVer:跨层正交向量自适应

Paper 是北京大学发表在Arxiv 2024的工作

Paper Title:CLOVer: Cross-Layer Orthonormal Vectors Adaption

Code地址

ABSTRACT

为了将一个预训练的大型模型适配到下游任务中,通过在其原始潜在空间内利用基向量的线性组合进行学习,能够确保训练的稳定性且不会削弱模型的原有能力。然而,从矩阵中构造正交归一基通常需要一个转换矩阵,这会显著增加存储和计算开销。在本文中,我们提出了一种跨层(Cross-Layer)方法,将 W Q W_Q WQ W K W_K WK 合并为 W Q K W_{QK} WQK,将 W V W_V WV W O W_O WO 合并为 W V O W_{VO} WVO,其中 W Q K W_{QK} WQK W V O W_{VO} WVO 的秩被限制在头维度 d d d 内。通过对 W Q K W_{QK} WQK W V O W_{VO} WVO 执行奇异值分解(SVD)并移除对应于零奇异值的奇异向量,我们在不需要额外训练的情况下,成功地将 Whisper-large-v3 的编码器注意力参数减少了 46.42%。为了实现高效的微调,我们对 W Q , W K , W V , W O W_Q, W_K, W_V, W_O WQ,WK,WV,WO 执行头内或跨头 QR 分解,仅微调矩阵 R Q , R K , R V , R O R_Q, R_K, R_V, R_O RQ,RK,RV,RO。这种方法允许通过所有正交向量的线性组合实现全秩更新。我们通过在八个常识推理数据集上微调 LLaMA-2-7B 来评估我们的方法。结果表明,我们的方法比 LoRA 提高了 5.4%,比 DoRA 提高了 3.7%,突出了该方法的有效性,并在学习新知识时遗忘较少的先前知识。

图1

图 1:(a) 标准多头注意力机制。(b) 用于修剪的跨层正交向量。© 通过利用正交向量的线性组合,Head-in 和 Cross-head 分解可以实现全秩微调。

图2

图 2:头入组合和横头组合协同工作,可获得所有向量的满秩组合。

1 Introduction

微调大型语言模型(LLMs)是提升下游任务性能的有效方法。然而,对非常大的模型进行微调成本高昂。例如,GPT-3 175B 的 16-bit 微调需要 1.2 TB 的显存 [1],而 LLaMA 65B 模型则需要超过 780 GB 的 GPU 内存 [2]。为了解决这一问题,提出了参数高效微调(PEFT)方法,例如低秩适配(LoRA)[1],以降低内存占用和参数需求,同时保持性能且不会增加推理延迟。

然而,LoRA 的稳定性低于全参数微调。例如,Shuttleworth 等人 [3] 最近通过分析权重矩阵的谱属性研究了微调对预训练模型的影响。他们发现,LoRA 引入了高秩奇异向量(称为“侵入维度”),这些维度在全参数微调中不存在。与全参数微调相比,使用 LoRA 微调的模型倾向于遗忘更多的预训练分布,在持续学习中表现出较弱的鲁棒性。

PiSSA [4] 对预训练矩阵进行 SVD 分解,微调主奇异值和奇异向量。基于 PiSSA,SVFT [5] 冻结奇异向量,仅微调奇异值。这两种方法通过避免引入“侵入维度”来帮助稳定训练过程。虽然 SVFT 减少了可训练参数的数量,但它需要将矩阵 W ∈ R m × n W \in \mathbb{R}^{m \times n} WRm×n 分解为正交矩阵 U ∈ R m × min ⁡ ( m , n ) U \in \mathbb{R}^{m \times \min (m, n)} URm×min(m,n) V ∈ R min ⁡ ( m , n ) × n V \in \mathbb{R}^{\min (m, n) \times n} VRmin(m,n)×n,以及对角矩阵 S ∈ R min ⁡ ( m , n ) × min ⁡ ( m , n ) S \in \mathbb{R}^{\min (m, n) \times \min (m, n)} SRmin(m,n)×min(m,n)。这一过程引入了显著的额外参数和计算开销。相比之下,PiSSA 仅微调主奇异值和奇异向量,而冻结其余部分,从而避免了 SVFT 的高计算成本,但也限制了对正交基的调整范围。

因此,关键问题在于:如何高效地正交化矩阵,并在预训练模型的潜在空间内对其进行微调?

在本文中,我们观察到,每个注意力层天然包含两对矩阵: W Q W_Q WQ W K T W_K^T WKT,以及 W V W_V WV W O W_O WO。这些矩阵可以吸收到头内的低秩矩阵 W Q K ∈ R h × D × D W_{QK} \in \mathbb{R}^{h \times D \times D} WQKRh×D×D W V O ∈ R h × D × D W_{VO} \in \mathbb{R}^{h \times D \times D} WVORh×D×D 中,其中秩满足 r q k ≤ d r_{qk} \leq d rqkd r v o ≤ d r_{vo} \leq d rvod。通过对 W Q K W_{QK} WQK W V O W_{VO} WVO 进行 SVD 分解,并移除与零奇异值对应的奇异向量,我们可以在不增加甚至减少冻结参数数量的情况下获得正交基。这些冻结的正交基在微调过程中保持稳定性,而对应的奇异值则以最小的参数开销实现高效微调。

贡献总结:

  • 我们发现注意力机制中的 W Q , W K W_Q, W_K WQ,WK W V , W O W_V, W_O WV,WO 矩阵可以进行跨层正交化。这一变换有效地移除了冗余向量,在不损失性能、且无需额外训练的情况下,将 Whisper-large-v3 编码器中 W Q W_Q WQ W K W_K WK 的参数减少了 56.01 % 56.01\% 56.01% W V W_V WV W O W_O WO 的参数减少了 36.82 % 36.82\% 36.82%
  • 通过在注意力层中执行头内和跨头的正交归一化,并仅微调它们的线性组合,我们提出了一种全秩微调方法。使用该方法对 LLaMA-2-7B 进行微调,在 8 个常识推理任务上,性能相比 LoRA 平均提升了 5.4 % 5.4\% 5.4%,相比 DoRA 提升了 4.4 % 4.4\% 4.4%,同时在学习新任务时更好地保留了先验知识。

2 Related Works

LoRA [1] 将可训练的适配器集成到线性层中,使这些适配器在微调后可以重新参数化回标准模型结构。由于其能够在保持模型原始架构的同时实现高效微调,这种方法被广泛采用。基于 LoRA,AdaLoRA [6] 动态学习每层模型所需的秩大小,以优化参数效率。DeltaLoRA [7] 通过使用适配器层的参数直接更新模型的原始权重,增强了 LoRA 的表示能力。LoSparse [8] 结合 LoRA 来减轻剪枝过于表达性神经元的风险。DoRA [9] 引入了幅值组件来学习 Δ W \Delta W ΔW 的尺度,同时使用原始的 AB 作为 Δ W \Delta W ΔW 的方向组件。

PiSSA [4] 关注初始化对梯度方向的影响,首先对原始矩阵应用奇异值分解(SVD),然后微调主奇异值及其对应的奇异向量。这种初始化方法带来了更快的收敛速度、更高的性能以及更低的量化误差。在 PiSSA 的基础上,LoRA-XS [10]、LaMDA [11] 和 SVFT [5] 对原始矩阵进行奇异值分解,冻结奇异向量,仅微调奇异值,以减少可训练参数数量。其中,LoRA-XS 和 LaMDA 仅微调部分奇异值,而 SVFT 调整所有奇异值。OLoRA [12] 通过 QR 分解利用正交矩阵进行初始化。CorDA [13]、MiLoRA [14]、LoRA-GA [15]、LoRA-Pro [16] 和 EVA [17] 以不同方式利用 SVD 来初始化适配器。CorDA 和 EVA 分解数据以进行初始化,MiLoRA 利用矩阵较小的奇异值,而 LoRA-GA 和 LoRA-Pro 分解了全参数微调中的更新方向。SVDQuant [18] 通过将离群点从激活迁移到权重上来处理它们,并使用高精度低秩分支通过 SVD 集成权重离群点。

3 CLOVer: Cross-Layer Orthonormal Vectors

3.1 CLOVer for Pruning


与传统剪枝不同,传统剪枝允许在有损剪枝后通过重新训练恢复模型精度,但对大型预训练模型的剪枝带来了独特的挑战。这类模型的预训练依赖于庞大且通常无法访问的数据集。因此,尽管重新训练可能在某些基准上表现良好,但可能会在其他任务上失败,甚至引入安全风险。这使得无需训练的剪枝(training-free pruning)尤为重要。

本文提出的 CLOVer 操作(Cross-Layer Orthonormal Vectors)能够有效减少 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV W O W_O WO 中的线性依赖性。在对 W Q K W_{Q K} WQK W V O W_{V O} WVO 的分解过程中,生成的向量维度小于头维度,从而实现了一种无需训练的剪枝过程。

对于多头自注意力机制,定义如下:

  • X ∈ R b × n × D X \in \mathbb{R}^{b \times n \times D} XRb×n×D W Q ∈ R D × h × d W_Q \in \mathbb{R}^{D \times h \times d} WQRD×h×d W K ∈ R D × h × d W_K \in \mathbb{R}^{D \times h \times d} WKRD×h×d W V ∈ R D × h × d W_V \in \mathbb{R}^{D \times h \times d} WVRD×h×d W O ∈ R h × d × D W_O \in \mathbb{R}^{h \times d \times D} WORh×d×D
  • 其中, b , n , D b, n, D b,n,D 分别表示批大小、序列长度和 X X X 的维度。 h , d h, d h,d 表示多头注意力中的头数量和头维度。

W Q W_Q WQ W K W_K WK 的跨层正交向量(Cross-Layer Orthonormal Vectors)操作过程如下:

attn ⁡ ( Q ,   K ) = softmax ⁡ ( Q K T d ) , Q = X W Q ∈ R b × h × n × d , K = X W K ∈ R b × h × n × d . = softmax ⁡ ( X W Q W K T X T d ) , W Q W K T = W Q K = U S V ∈ R h × D × D = softmax ⁡ ( X U S V X T d ) , S [ : , r q k : , r q k : ] = S Q K ∈ R h × r q k × r q k = 0 , r q k ≤ d = softmax ⁡ ( X U Q K S Q K V Q K X T d ) , U Q K ∈ R D × h × r q k , V Q K ∈ R h × r q k × D . \begin{aligned} \operatorname{attn}(\mathrm{Q}, \mathrm{~K}) & =\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d}}\right), \quad Q=X W_Q \in \mathbb{R}^{b \times h \times n \times d}, K=X W_K \in \mathbb{R}^{b \times h \times n \times d} . \\ & =\operatorname{softmax}\left(\frac{X W_Q W_K^T X^T}{\sqrt{d}}\right), \quad W_Q W_K^T=W_{Q K}=U S V \in \mathbb{R}^{h \times D \times D} \\ & =\operatorname{softmax}\left(\frac{X U S V X^T}{\sqrt{d}}\right), \quad S_{\left[:, r_{q k}:, r_{q k}:\right]}=S_{Q K} \in \mathbb{R}^{h \times r_{q k} \times r_{q k}}=0, r_{q k} \leq d \\ & =\operatorname{softmax}\left(\frac{X U_{Q K} S_{Q K} V_{Q K} X^T}{\sqrt{d}}\right), \quad U_{Q K} \in \mathbb{R}^{D \times h \times r_{q k}}, V_{Q K} \in \mathbb{R}^{h \times r_{q k} \times D} . \end{aligned} attn(Q, K)=softmax(d QKT),Q=XWQRb×h×n×d,K=XWKRb×h×n×d.=softmax(d XWQWKTXT),WQWKT=WQK=USVRh×D×D=softmax(d XUSVXT),S[:,rqk:,rqk:]=SQKRh×rqk×rqk=0,rqkd=softmax(d XUQKSQKVQKXT),UQKRD×h×rqk,VQKRh×rqk×D.

通过上述变换, W Q W_Q WQ W K W_K WK 可以等效地被正交向量 U Q K U_{Q K} UQK V Q K V_{Q K} VQK 以及对角矩阵 S Q K S_{Q K} SQK 替代。由于 r q k ≤ d r_{q k} \leq d rqkd,对应于零奇异值的奇异向量可以被安全剪枝。在引导剪枝后, S Q K S_{Q K} SQK 可以合并到 U Q K U_{Q K} UQK V Q K V_{Q K} VQK 中,从而不会引入额外的计算开销。

W V W_V WV W O W_O WO 的跨层正交向量(Cross-Layer Orthonormal Vectors)操作过程可以表示如下:

Y = attn ⁡ ( Q ,   K ) V W O , V = X W V ∈ R b × h × n × d = attn ⁡ ( Q ,   K ) X W V W O , W V W O = W V O = U S V ∈ R h × D × D = attn ⁡ ( Q ,   K ) X U S V , S [ ; , r v o : , r v o ] = S V O ∈ R h × r v o × r v o = 0 , r v o ≤ d . = attn ⁡ ( Q ,   K ) X U V O S V O V V O , U V O ∈ R D × h × r v o , V V O ∈ R h × r v o × D . \begin{aligned} Y & =\operatorname{attn}(\mathrm{Q}, \mathrm{~K}) V W_O, \quad V=X W_V \in \mathbb{R}^{b \times h \times n \times d} \\ & =\operatorname{attn}(\mathrm{Q}, \mathrm{~K}) X W_V W_O, \quad W_V W_O=W_{V O}=U S V \in \mathbb{R}^{h \times D \times D} \\ & =\operatorname{attn}(\mathrm{Q}, \mathrm{~K}) X U S V, \quad S_{\left[;, r_{v o}:, r_{v o}\right]}=S_{V O} \in \mathbb{R}^{h \times r_{v o} \times r_{v o}}=0, r_{v o} \leq d . \\ & =\operatorname{attn}(\mathrm{Q}, \mathrm{~K}) X U_{V O} S_{V O} V_{V O}, \quad U_{V O} \in \mathbb{R}^{D \times h \times r_{v o}}, V_{V O} \in \mathbb{R}^{h \times r_{v o} \times D} . \end{aligned} Y=attn(Q, K)VWO,V=XWVRb×h×n×d=attn(Q, K)XWVWO,WVWO=WVO=USVRh×D×D=attn(Q, K)XUSV,S[;,rvo:,rvo]=SVORh×rvo×rvo=0,rvod.=attn(Q, K)XUVOSVOVVO,UVORD×h×rvo,VVORh×rvo×D.

通过这一系列变换, W V W_V WV W O W_O WO 可以等效地被正交向量 U V O U_{V O} UVO V V O V_{V O} VVO 以及对角矩阵 S V O S_{V O} SVO 替代。由于 r v o ≤ d r_{v o} \leq d rvod,与零奇异值对应的奇异向量可以被安全剪枝。在引导剪枝后, S V O S_{V O} SVO 可以合并到 U V O U_{V O} UVO V V O V_{V O} VVO 中,从而不会引入额外的计算开销。

3.2 CLOVer for Fine-Tuning


跨层正交微调(Cross-layer orthonormal fine-tuning)的过程非常简单:直接对 W K , W V W_K, W_V WK,WV 的每头向量,以及在所有头中同一通道的 W Q , W O W_Q, W_O WQ,WO 进行 Q R QR QR 分解即可。此过程可以应用于任何线性层。

W Q = Q Q R Q ∈ R D × h × d , Q Q ∈ R D × h × d , R Q ∈ R h × h × d W K = Q K R K ∈ R D × h × d , Q K ∈ R D × h × d , R K ∈ R h × d × d W V = Q V R V ∈ R D × h × d , Q V ∈ R D × h × d , R V ∈ R h × d × d W O = Q O R O ∈ R h × d × D , Q O ∈ R h × d × D , R O ∈ R h × h × d \begin{array}{ll} W_Q=Q_Q R_Q \in \mathbb{R}^{D \times h \times d}, & Q_Q \in \mathbb{R}^{D \times h \times d}, R_Q \in \mathbb{R}^{h \times h \times d} \\ W_K=Q_K R_K \in \mathbb{R}^{D \times h \times d}, & Q_K \in \mathbb{R}^{D \times h \times d}, R_K \in \mathbb{R}^{h \times d \times d} \\ W_V=Q_V R_V \in \mathbb{R}^{D \times h \times d}, & Q_V \in \mathbb{R}^{D \times h \times d}, R_V \in \mathbb{R}^{h \times d \times d} \\ W_O=Q_O R_O \in \mathbb{R}^{h \times d \times D}, & Q_O \in \mathbb{R}^{h \times d \times D}, R_O \in \mathbb{R}^{h \times h \times d} \end{array} WQ=QQRQRD×h×d,WK=QKRKRD×h×d,WV=QVRVRD×h×d,WO=QORORh×d×D,QQRD×h×d,RQRh×h×dQKRD×h×d,RKRh×d×dQVRD×h×d,RVRh×d×dQORh×d×D,RORh×h×d

通过在注意力头内和跨注意力头分解 W K W_K WK W Q W_Q WQ,可以得到正交基 Q K Q_K QK Q Q Q_Q QQ。这些基向量是固定的,而 R K R_K RK R Q R_Q RQ 则通过微调来学习如何组合它们。分别来看, R K R_K RK R Q R_Q RQ 只能在头内或跨头组合基向量,但它们协同工作时可以利用所有基向量。同样的过程可以应用于 W V W_V WV W O W_O WO

如图2所示,将头内和跨头组合矩阵相乘即可得到一个能够线性组合任何向量的矩阵。通过微调跨层的正交基线性组合,该方法能够实现学习全秩 Δ W \Delta W ΔW。相比于低秩微调方法(如 LoRA 和 PiSSA),它显著提高了学习能力。

CLOVer 的参数效率

CLOVer 保持了适中的参数量。相比之下,SVFT [1] 对整个矩阵进行分解,导致参数量约为原来的三倍,包括奇异向量 U ∈ R m × min ⁡ ( m , n ) U \in \mathbb{R}^{m \times \min (m, n)} URm×min(m,n) V ∈ R min ⁡ ( m , n ) × n V \in \mathbb{R}^{\min (m, n) \times n} VRmin(m,n)×n 和奇异值 S ∈ R min ⁡ ( m , n ) × min ⁡ ( m , n ) S \in \mathbb{R}^{\min (m, n) \times \min (m, n)} SRmin(m,n)×min(m,n)。若将 S S S 视为向量,可以减少参数量,但该方法限制了表达能力,因为只能对奇异向量进行缩放,无法学习它们的线性组合。另一方面,将 S S S 视为完整矩阵提供了更大的灵活性,但在 m = n m=n m=n(如注意力层)的情况下,参数大小与原始矩阵相当,使其不实用。为了解决这一问题,SVFT 采用了稀疏表示,仅微调其对角元素、小范围边界宽度以及固定的稀疏模式。虽然提高了效率,但灵活性仍低于结构化格式。

CLOVer 在头内和跨头的线性组合中实现了结构化学习,平衡了这些权衡。具体而言,它学习了 R K , R V ∈ R h × d × d R_K, R_V \in \mathbb{R}^{h \times d \times d} RK,RVRh×d×d R Q , R O ∈ R h × h × d R_Q, R_O \in \mathbb{R}^{h \times h \times d} RQ,RORh×h×d,其中 h h h 是注意力头数, d d d 是每头的维度。例如,在 LLaMA-2-7B 中, h = 32 \mathrm{h}=32 h=32 d = 128 \mathrm{d}=128 d=128,其参数量与 rank-40 的 LoRA 配置相当。CLOVer 的设计允许正交向量自由组合,大幅提升了表达能力,同时保持了实际可行的参数量。

推理高效性

使用 CLOVer 进行微调仅需在开始时重新初始化模型。在训练完成后, R Q , R K , R V , R O R_Q, R_K, R_V, R_O RQ,RK,RV,RO 可以被重新合并到 Q Q , Q K , Q V , Q O Q_Q, Q_K, Q_V, Q_O QQ,QK,QV,QO 中,确保在推理过程中没有额外的计算开销。

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

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

相关文章

下划线表示任意单个字符引发的bug

遇到一个奇葩的bug!!! 功能是模糊搜索:列表中有一条数据“IMSCM-CM_PMS_ORDER” 使用“IMSCM_”(这里是下划线,数据为中划线)进行搜索,竟然可以搜索出这条数据!&#x…

前端编程图表化助手!Echarts入门

Echarts-一个基于javaScript的开源可视化图表库 在日常编程中,我们经常会用到类似饼图、柱状图等,而在网页中使用原生html和css很难做到类似效果。那么作为前端工程师,我们如何做出来一份好看而且实用的图标呢? 那么接下来&…

【论文阅读笔记】IC-Light

SCALING IN-THE-WILD TRAINING FOR DIFFUSION-BASED ILLUMINATION HARMONIZATION AND EDITING BY IMPOSING CONSISTENT LIGHT TRANSPORT 通过施加一致的光线传输来扩展基于扩散模型的真实场景光照协调与编辑训练 前言摘要引言相关工作基于学习的基于扩散模型的外观和光照操纵光…

开发微信小程序的过程与心得

起因 作为家长,我近期参与了学校的护学岗工作。在这个过程中,我发现需要使用水印相机来记录护学活动,但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员,我决定利用自己的技术背景,开发一个…

前端样式练手:阴阳图+时钟的组合

开篇 今天的小作品是突然脑子灵光一闪写出来的&#xff0c;代码不多&#xff0c;就不过多赘述了。 代码实现 <template><div class"clock-container"><!-- 八卦图 --><!-- <div class"bagua"><divv-for"(trigram, ind…

LabVIEW软件项目设计方案如何制定

制定LabVIEW软件项目设计方案需要综合考虑需求分析、架构设计、功能模块划分和时间预算等多个方面&#xff0c;确保项目开发过程高效、可控且最终满足目标要求。以下是一个详细的制定流程&#xff1a; ​ 1. 需求分析 目标定义&#xff1a;明确项目的目标&#xff0c;例如数据采…

IMX芯片启动方式

一、启动方式选择 a)概述 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次…

Pyside6 在 pycharm 中的配置

打开文件->设置 找到 工具->外部工具 点击 号 创建一个外部工具 QtDesigner 名称:QtDesigner 程序&#xff1a;D:\miniconda\envs\ergoAI-qt\Lib\site-packages\PySide6\designer.exe 实参&#xff1a;$FileName$ 工作目录&#xff1a;$FileDir$ PyUIC 名称&#xf…

Elasticsearch:什么是提示工程 - prompt engineering?

提示工程流程定义 提示工程是一种工程技术&#xff0c;用于设计生成式 AI 工具&#xff08;generative AI tools&#xff09;的输入&#xff0c;以调整大型语言模型并优化输出。 提示&#xff08;prompts&#xff09;被称为输入&#xff0c;而由生成性 AI 工具生成的答案是输…

金融租赁系统的发展与全球化战略实施探讨

内容概要 金融租赁系统的演变并非一帆风顺&#xff0c;像一场跌宕起伏的电影。首先&#xff0c;咱们得看看它的起源及现状。随着经济的快速发展&#xff0c;金融租赁逐渐作为一种灵活的融资手段崭露头角。在中国市场中&#xff0c;企业对设备和技术更新换代的需求日益迫切&…

1.flask介绍、入门、基本用法

flask与djiango的区别 djiango是一个大而全的框架。 djiango内部为我们提供了非常多的组件: orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接 flask 是一个轻量级的框架&#xff0c;本身没有什么太多的功能&a…

【vue2父组件调用子组件方法之slot的使用】

父组件调用子组件方法之slot的使用 具体功能需求&#xff1a; 一个页面&#xff0c;点击按钮&#xff0c;打开一个弹窗。弹窗有自定义表单和公共表单&#xff0c;提交的时候要获取两个表单的数据以及复显表单数据 为什么使用插槽了&#xff0c;因为我需要在弹窗中复用公共表单…

认识计算机网络

单单看这一个词语&#xff0c;有熟悉又陌生&#xff0c;让我们来重新认识一下这位大角色——计算机网络。、 一、是什么 以及 怎么来的 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路和通信设备连接起来&#xff0c;在网络操…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…

windows nacos安装配置

GitHub下载压缩包 解压目录&#xff08;注意不要用中文路径&#xff09; 在mysql先创建数据库nacos&#xff0c;再执行sql脚本 配置数据库 #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated conf…

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日&#xff0c;由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛&#xff0c;包括上海幸运星足球俱乐部旗下的明星球队&#xff0c;以及其他青少年俱乐部的优秀队伍&…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…

探索Flink动态CEP:杭州银行的实战案例

摘要&#xff1a;本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容&#xff1a; Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

Git多人协作流程与git命令

目录 一、拉取&#xff1a;从仓库到本地1、第一次拉取2、后续的拉取 二、上传&#xff1a;从本地到仓库三、git commit版本信息标注 一、拉取&#xff1a;从仓库到本地 1、第一次拉取 # clone项目 git clone xxx2、后续的拉取 第一次拉取是指本地为空&#xff0c;如果本地已…