【大模型】基于LoRA微调Gemma大模型(1)

大模型微调技术有很多,如P-TuningLoRA 等,我们在之前的博客中也介绍过,可以参考:大模型高效参数微调技术(Prompt-Tuning、Prefix Tuning、P-Tuning、LoRA…)

在本篇文章中,我们就 LoRA (Low-Rank Adaptation) 即低秩适应的微调方法工作原理及代码实践进行介绍。

完整的微调步骤可以参考我们的博客:【大模型】基于LoRA微调Gemma大模型(2)

一、LoRA工作原理

1.1 基本原理

LoRA 是 Low-Rank Adaptation 或 Low-Rank Adaptors的首字母缩写词,它提供了一种高效且轻量级的方法,用于微调预先训练好的的大语言模型。

LoRA的核心思想是用一种低秩的方式来调整这些参数矩阵。LoRA通过保持预训练矩阵(即原始模型的参数)冻结(即处于固定状态),并且只在原始矩阵中添加一个小的增量,其参数量比原始矩阵少很多。

例如,考虑矩阵 W,它可以是全连接层的参数,也可以是来Transformer中计算自注意力机制的矩阵之一:

显然,如果 W o r i g W_{orig} Worig 的维数为 n×m,而假如我们只是初始化一个具有相同维数的新的增量矩阵进行微调,虽然我们也实现类似的功能,但是我们的参数量将会加倍。 LoRA使用的Trick就是通过训练低维矩阵 B 和 A ,通过矩阵乘法来构造 ΔW ,来使 ΔW 的参数量低于原始矩阵。

这里我们不妨定义秩 r,它明显小于基本矩阵维度 r≪n 和 r≪m。则矩阵 B 为 n×r,矩阵 A 为 r×m。将它们相乘会得到一个维度为 nxm的W 矩阵,但构建的参数量减小了很多。

LoRA原理见下图:具体来说就是固定原始模型权重,然后定义两个低秩矩阵作为新增weight参与运算,并将两条链路的结果求和后作为本层的输出,而在微调时,只梯度下降新增的两个低秩矩阵。

此外,我们希望我们的增量ΔW在训练开始时为零,这样微调就会从原始模型一样开始。因此,B通常初始化为全零,而 A初始化为随机值(通常呈正态分布)。

1.2 实现步骤

(1)选择目标层

首先,在预训练神经网络模型中选择要应用LoRA的目标层。这些层通常是与特定任务相关的,如自注意力机制中的查询Q和键K矩阵。

值得注意的是,原则上,我们可以将LoRA应用于神经网络中权矩阵的任何子集,以减少可训练参数的数量。在Transformer体系结构中,自关注模块(Wq、Wk、Wv、Wo)中有四个权重矩阵,MLP模块中有两个权重矩阵。我们将Wq(或Wk,Wv)作为维度的单个矩阵,尽管输出维度通常被切分为注意力头。

(2)初始化映射矩阵和逆映射矩阵

为目标层创建两个较小的矩阵A和B,然后进行变换。

参数变换过程:将目标层的原始参数矩阵W通过映射矩阵A和逆映射矩阵B进行变换,计算公式为: W ′ = W + A ∗ B W' = W + A * B W=W+AB,这里W’是变换后的参数矩阵。

其中,矩阵的大小由LoRA的秩(rank)和alpha值确定。
在这里插入图片描述

(3)微调模型
使用新的参数矩阵替换目标层的原始参数矩阵,然后在特定任务的训练数据上对模型进行微调。

(4)梯度更新
在微调过程中,计算损失函数关于映射矩阵A和逆映射矩阵B的梯度,并使用优化算法(如Adam、SGD等)对A和B进行更新。

注意:在更新过程中,原始参数矩阵W保持不变。其实也就是训练的时候固定原始PLM的参数,只训练降维矩阵A与升维矩阵B (W is frozen and does not receive gradient updates, while A and B contain trainableparameters )

(5)重复更新
在训练的每个批次中,重复步骤3-5,直到达到预定的训练轮次(epoch)或满足收敛条件。

且当需要切换到另一个下游任务时,可以通过减去B A然后添加不同的B’ A’来恢复W,这是一个内存开销很小的快速操作。

When we need to switch to another downstream task, we can recover W0 by subtracting BA andthen adding a different B0A0, a quick operation with very little memory overhead.

总之,LoRA的详细步骤包括:选择目标层、初始化映射矩阵和逆映射矩阵、进行参数变换和模型微调。在微调过程中,模型会通过更新映射矩阵U和逆映射矩阵V来学习特定任务的知识,从而提高模型在该任务上的性能。

二、LoRA 实现

这里主要介绍几个与 LoRA 实现相关的类库。

2.1 PEFT库:高效参数微调

Huggingface公司推出的 PEFT (Parameter-Efficient Fine-Tuning,即高效参数微调之意) 库封装了LoRA这个方法,PEFT库可以使预训练语言模

### LoRA微调方法概述 对于大规模语言模型(LLMs),传统的全参数微调方式需要大量计算资源和训练数据,这使得其应用受到限制。为了应对这一挑战,低秩适应(LoRA, Low-Rank Adaptation)被提出作为一种高效的微调技术[^2]。 #### LoRA的核心原理 LoRA通过冻结原始模型中的大部分权重,在此基础上引入少量可训练的新参数来实现特定任务的学习目标。具体来说,它利用矩阵分解的思想,将原本高维的权重矩阵替换为两个较小维度矩阵的乘积形式。这种方法不仅显著减少了所需的训练参数数量,还保持了较高的性能表现水平。 以下是基于Keras框架下使用LoRAGemma模型进行微调的一个简单实例: ```python import tensorflow as tf from keras.layers import Dense from loralib.layers.dense import LoraDense # 假设这是支持LoRA功能的库 def create_lora_model(input_dim, output_dim, rank=4): inputs = tf.keras.Input(shape=(input_dim,)) # 使用LoRA层替代标准密集连接层 lora_layer = LoraDense(output_dim, r=rank)(inputs) predictions = Dense(output_dim, activation='softmax')(lora_layer) model = tf.keras.Model(inputs=inputs, outputs=predictions) return model model = create_lora_model(input_dim=768, output_dim=10, rank=8) model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) ``` 上述代码片段展示了如何构建一个带有LoRA机制的小型神经网络结构,并指定`r=8`作为低秩近似因子大小。实际操作过程中可以根据硬件条件调整此超参值以平衡效率与效果之间的关系。 #### 关键优势总结 - **减少内存占用**: 只需存储新增加的部分小型张量即可完成整个系统的部署工作; - **加速收敛速度**: 更少待优化变量意味着每轮迭代所需时间更短; - **维持良好泛化能力**: 即使只修改一小部分原有架构也能达到接近甚至超越传统FT的结果质量; 尽管如此,值得注意的是并非所有场景都适合采用此类简化策略——某些复杂度较高或者高度定制化的应用场景可能仍然依赖于完整的再训练流程才能获得最佳解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值