大语言模型微调实践——LoRA 微调细节

本文介绍了LoRA微调方法在大语言模型中的应用,以StarCoder模型为例,详细阐述了LoRA的原理和实践过程,包括环境配置、模型加载、训练、权重合并和模型推理。LoRA利用低秩矩阵适应大模型,减少训练参数,保持甚至提高模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 引言

近年来人工智能领域不断进步,大语言模型的崛起引领了自然语言处理的革命。这些参数量巨大的预训练模型,凭借其在大规模数据上学习到的丰富语言表示,为我们带来了前所未有的文本理解和生成能力。然而,要使这些通用模型在特定任务上发挥出色,还需借助微调技术。大语言模型的微调技术已经成为自然语言处理领域的一个焦点,其不断的演化和创新正引领着我们进入一个更加精细、个性化的文本处理时代。

在本文中,我们将选取目前大语言模型热点任务——代码生成,结合 StarCoder 模型微调实践介绍高效微调方法——LoRA。

2. LoRA 微调原理

论文:LoRA: Low-Rank Adaptation of Large Language Models

LoRA 基于大模型的内在低秩特性,增加旁路矩阵来模拟全参数微调,是目前最通用、效果最好的微调方法之一,而且能和其它参数高效微调方法有效结合。利用该方法对 175B GPT-3 微调,需要训练更新的参数量可以小到全量微调参数量的 0.01%。

5d47c73d7558e8fb66415ac0d8aa5628.png

图1. LoRA原理   

上图为 LoRA 的实现原理,其实现流程为:

  1. 在原始预训练语言模型旁边增加一个旁路,做降维再升维的操作来模拟内在秩;

  2. 用随机高斯分布初始化 A,用零矩阵初始化B,训练时固定预训练模型的参数,只训练矩阵 A 与矩阵 B ;

  3. 训练完成后,将 B 矩阵与 A 矩阵相乘后合并预训练模型参数作为微调后的模型参数。

研究表明,Transformer 等神经网络包含许多执行矩阵乘法的密集层,这些权重通常具有满秩。预训练的语言模型具有较低的“本征维度(Instrinsic Dimension)”,并且可以和完整参数空间一样进行有效学习。受此启发,本文在微调过程中假设权重的更新也具有较低的“本征维度”。对于预训练模型的权重矩阵 ,通过低秩分解(Low-Rank Decomposition)来表示约束其更新。训练过程中 被固定不再进行梯度更新,只训练 和 ,其中 。训练结束后,更新参数为 。对于输入 ,模型的前向传播过程更新为 。

由于模型整体参数量不变,所以不会降低推理时的性能。作者通过实验比较了在内容理解任务、生成任务上的效果,相比全量微调参数量显著降低,性能上持平甚至超过,相比其他高效微调方法,增加参数量不会导致性能下降。需要注意的是此方法对低秩矩阵的秩数和目标模块的选择比较敏感,可能影响模型的性能和稳定性。使用LoRA微调有以下几个细节:

  1. 对哪些参数进行微调:基于 Transformer 结构,LoRA 只对每层的 Self-Attention 的部分进行微调,有 四个映射层参数可以进行微调。需要注意不同模型参数名称不同,像 StarCoder 模型 Multi-query 结构的 attention 层对应的参数名称是 attn.c_attn, attn.c_proj

  2. Rank(r) 的选取:Rank 的取值作者对比了 1-64,效果上 Rank 在 4-8 之间最好,再高并没有效果提升。不过论文的实验是面向下游单一监督任务的,因此在指令微调上根据指令分布的广度,Rank选择还是需要在 8 以上的取值进行测试。

  3. alpha 参数选取:alpha 其实是个缩放参数,训练后权重 merge 时的比例为 alpha/r

  4. 初始化:矩阵A是 Uniform 初始化,B 是零初始化,这样最初的 lora 权重为 0,所以 lora 参数是从头学起,并没有那么容易收敛。

3. LoRA 微调实践

本节以 StarCoder 微调为例,介绍使用 LoRA 微调的实践过程。

首先,StarCoder 是使用 86 种编程语言的 1 万亿个 token 训练,并在另外 35billion Python token 上微调出的模型,专注于解决编程问题,模型结构为:"GPTBigCodeForCausalLM",40层      decoder-only Transformer,Attention 层结构为 Multi-query,参数量约 15.5B。

3.1 环境配置

### 大语言模型微调与 Adapter 方法 #### 微调概述 微调是一种迁移学习方法,允许在预训练的大语言模型基础上,通过特定任务的数据集对其进行进一步训练,从而适应具体应用场景的需求。这种方法充分利用了预训练模型所学到的知识和表示能力,并针对目标任务进行了优化[^4]。 #### Adapter 的概念及其优势 Adapter 是一种参数高效化的方法,旨在减少微调过程中所需的额外参数量。相比于传统的全模型微调方式,Adapter 只更新一小部分新引入的模块中的参数,而保持原始预训练模型权重不变。这种方式不仅显著降低了计算成本和存储需求,还有效缓解了灾难性遗忘问题(即模型忘记其在预训练阶段习得的知识)。Ding 等人在研究中全面探讨了多种高效的参数调整技术,其中就包含了 Adapter 方法的应用场景和技术细节[^2]。 #### 实现流程 以下是采用 Adapter 进行大语言模型微调的一个典型实现框架: 1. **加载预训练模型** 首先需要获取一个已经完成大规模语料训练的基础模型实例。例如可以选用 Hugging Face 提供的各种开源版本如 BERT 或 GPT 系列。 2. **插入 Adapter 层** 在选定层之间加入轻量化网络结构——Adapters。这些小型子网由下投射(Down Projection),非线性激活函数以及上投射(Up Projection)组成。它们被设计成能捕捉目标任务特有的特征模式而不干扰原有架构的核心功能。 3. **冻结大部分原生参数** 将除了新增加 Adapters 之外的所有其他部分设定为不可训练状态,仅允许 Adapter 参数参与反向传播过程的学习。 4. **定义损失函数并执行梯度下降** 基于具体的 NLP 下游任务设置相应的评价指标体系比如分类交叉熵或者回归均方误差等作为指导信号驱动整个系统的迭代改进直至收敛满足预期精度水平为止。 下面给出一段 Python 示例代码展示如何使用 Transformers 库配合 PEFT 工具包快速搭建基于 Adapter 的 Finetune 流程: ```python from transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import get_peft_config, PeftType, LoraConfig, get_peft_model, prepare_model_for_int8_training model_name_or_path = "bert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) peft_config = LoraConfig( task_type="SEQ_CLS", inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1 ) model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path) model = get_peft_model(model, peft_config) print(model.print_trainable_parameters()) ``` 此脚本片段展示了怎样配置 LoRA (Low-Rank Adaptation), 它属于更广泛的 Adapter 类型之一,在实际操作中有助于提升效率同时维持良好效果表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux基金会AI&Data基金会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值