LoRA基于BERT模型微调实践

前言

之前写三篇关于LoRA微调的一些基础知识,分别如下:
LoRA微调基础知识点
LoRA微调模型结构可训参数和配置详解
LoRA训练推理部署流程

本文主要是基于bert-chinese-base模型采用LoRA微调技术,进行10分类的一个微调过程。
由于LoRA是一种高效的预训练大模型微调技术,在模型选择方面BERT显然算不上什么大模型,但是可以学习LoRA微调的整个过程,BERT也可以进行全量的参数训练,便于比较微调和重训练的区别。

完整代码
如果对你有烦请帮我点个star,非常感谢~~

LoRA微调核心代码

LoRA微调的代码还是很简洁的,只需要在原始模型的某层(Linear层)增加额外的配置即可。

config = LoraConfig(
    task_type=TaskType.SEQ_CLS, 
    target_modules=["query", "key", "value"],
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1
)
model = get_peft_model(model, config)

核心超参数如下:
task_type:任务类型,例如序列分类(SEQ_CLS)。
r: LoRA模型中新增加的权重矩阵的秩。
lora_alpha:控制LoRA模块中缩放因子的大小,default=8 (peft==0.5.0)。
lora_dropout:LoRA模块中的dropout。
inference_mode:False为模型处于训练模式,LoRA 层会进行更新,反之LoRA层不更新(推理使用)。

完整训练代码如下:

import pandas as pd
from transformers import BertTokenizerFast, BertForSequenceClassification, Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset
import model_config
from peft import get_peft_model, LoraConfig, TaskType
import time

train_data_path = model_config.train_data_path
dev_data_path = model_config.dev_data_path

train_data = pd.read_csv(train_data_path)
train_texts = train_data["0"].tolist()
train_labels = train_data["1"].tolist()

dev_data = pd.read_csv(dev_data_path)
eval_texts = dev_data["0"].tolist()
eval_labels = dev_data["1"].tolist()

# 分类标签数
num_labels = len(set(train_labels))

# 预训练模型,加载原始bert模型
model_name = model_config.model_name_tokenizer_path
tokenizer = BertTokenizerFast.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)

# 对文本进行编码
# 入参详解 请参考 https://blog.csdn.net/weixin_42924890/article/details/139269528
train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=64)
eval_encodings = tokenizer
### 关于LoRA模型微调的代码示例 对于希望了解如何利用低秩适应(Low-Rank Adaptation, LoRA)技术来优化大型预训练模型的学习者而言,存在多种资源可以提供帮助。一种方法是在Keras框架下通过LoRA实现Gemma模型的精调[^1]。 #### 利用Hugging Face Transformers库进行LoRA微调的例子 下面展示了一个基于Python和Transformers库的具体实例,该实例展示了怎样应用LoRA策略对BERT这样的大型语言模型执行参数高效的迁移学习: ```python from transformers import BertForSequenceClassification, Trainer, TrainingArguments import torch from peft import get_peft_model, LoraConfig, TaskType model_name_or_path = "bert-base-uncased" tokenizer_name = model_name_or_path output_dir = "./results" peft_config = LoraConfig( task_type=TaskType.SEQ_CLS, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1 ) training_args = TrainingArguments( output_dir=output_dir, learning_rate=5e-5, per_device_train_batch_size=8, num_train_epochs=3, weight_decay=0.01, logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, ) model = BertForSequenceClassification.from_pretrained(model_name_or_path) model = get_peft_model(model, peft_config) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, tokenizer=tokenizer, ) trainer.train() ``` 此段代码首先定义了一些必要的配置选项以及训练参数设置;接着加载了基础的大规模预训练模型并将其转换成支持LoRA调整的形式;最后创建Trainer对象来进行实际的数据集上的训练过程[^4]。 上述例子中的`LoraConfig`类允许指定用于控制LoRA行为的关键超参,比如矩阵分解后的维度大小(`r`)、缩放因子(`lora_alpha`)等。这些设定有助于减少额外引入的新参数数量从而提高计算效率的同时保持良好的泛化性能[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值