如何做大模型的微调实验,记录一次基于ChatGLM-6B 大模型微调实验过程。

大模型微调实验的核心目标的通过实验找到最佳的优化方法,来提升大模型的正向收益。

本文通过记录一次基于ChatGLM-6B 大模型微调实验,验证对话场景中历史对话轮次是否越长越好,来说明如何做大模型的微调实验,给大家一些参考。‍‍‍‍‍

如何做大模型的微调实验,其实每次实验都需要有明确的实验目的,算法的优化方法有很多,如数据样本质量优化,模型参数优化、损失函数优化、模型网络结构优化等等。但是,每次优化迭代的效果怎么样,需要设计对比实验来验证,验证实验目的是否符合预期。下面看看,一次大模型的微调实验的实验报告。

一、背景与实验目的

验证历史对话轮次是否越长越好,通过训练两个模型,控制变量max_source_length|max_target_length,对训练好之后的模型从Loss、Bleu指标、离线人工评估等角度进行对比分析。

二 、数据样本

全量数据经过降采样后,从中随机10w样本进行测试。

三、 模型优化

关注对比参数:

512-10w-模型

1024-10w-模型

max_source_length

512

1024

max_target_length

128

256

lr

1e-5

1e-5

num_train_epochs

5

5

per_device_train_batch_size

2

1

四、离线效果

Loss情况:

1024-10w-模型loss下降得更低,到0.5x,512-10w模型loss到0.9x。说明在训练集上1024拟合更好。

         a9ad0a49b19f91fee148f02118bb355b.png

7b6a4e4134bc095fd42c16556cf5e3c3.png

Loss指标说明:‍‍

在机器学习中,Loss是损失函数,它衡量模型的预测输出和真实目标值之间的差距,用来评估模型的预测性能。

常见的Loss函数包括:

- Mean Squared Error(MSE):均方误差,用于回归问题,计算预测值和目标值差的平方和的平均数。

- Cross Entropy:交叉熵,用于分类问题,计算预测概率分布和真实概率分布之间的距离。

- Hinge Loss:合页损失,用于分类问题,计算预测值和目标值之间的最大边界距离。

- Kullback-Leibler Divergence:KL散度,计算两个概率分布之间的距离。

Loss值越低,表示模型预测效果越好。所以训练过程中要不断通过优化算法(梯度下降等)来最小化Loss,使模型预测结果不断接近目标

Bleu情况:‍‍‍‍

bleu指标1024比512低0.1%。

评测集:1043个样本

512-模型:

45fad2cbcfb26a4d4801da54a178aeae.png

1024-模型,推理使用512-128长度:

fa5293922ea0e38b29c589a5da600ef5.png

1024-模型,推理使用1024-256长度:

66fcab801c5b0ab37da7f7983c4ed2b1.png

BLEU指标说明:‍‍

BLEU(Bilingual Evaluation Understudy)是一种用于评估机器翻译输出质量的自动评测算法。

BLEU的基本思想是:将机器翻译系统输出的翻译结果与人工参考翻译进行比较,计算两者的相似度,来评估机器翻译的质量。BLEU计算方法主要有:

1. n-gram精度:计算机器翻译输出中的n-gram(一串n个词)与参考译文的匹配程度。

2. 修正的精度:对长度过短的句子进行惩罚,防止只输出短小句子来获得高分。

3. BLEU得分:综合N-gram精度和修正的精度,得到0-100分的BLEU评测分数。分数越高表示翻译结果越好。

4. 对多参考译文取平均:使用多份参考译文来获得更准确的评测结果。

人工评估:

评估样本量较少。从少量样本上看1024全量是有优势的!         

五、实验结论

结论:从人工评估少量样本以及loss下降来看,历史对话长度1024比512长度好,后续模型训练可以扩大到1024长度。

感谢关注“余生不设限”,陪您一起成长!

### 如何使用LoRA对ChatGLM-6B大模型进行微调 #### 准备工作 为了利用低秩适配器(LoRA) 对 ChatGLM-6B 进行微调,需先安装必要的库文件。这通常涉及 `transformers` 和特定于 LoRA 的包如 `peft`。 ```bash pip install transformers peft ``` #### 加载预训练模型与Tokenizer 加载 ChatGLM-6B 预训练模型及其对应的分词工具是首要步骤。通过 Hugging Face 提供的接口可以直接获取这些资源[^2]。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_name_or_path = "THUDM/chatglm-6b" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True).half().cuda() ``` #### 初始化LoRA配置并应用至模型 定义 LoRA 参数设置,并将其应用于目标 Transformer 模型中。这里会用到之前提到过的 PeftModel 抽象来简化操作过程[^1]。 ```python from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, # 秩大小 lora_alpha=32, target_modules=["q", "v"], # 调整哪些模块 lora_dropout=0.05, ) # 将LoRA配置附加给原始模型 peft_model = get_peft_model(model, lora_config) ``` #### 数据准备与Fine-tune流程 准备好用于微调的数据集之后,就可以按照常规方式编写训练循环逻辑了。注意要确保输入数据已经被正确编码成适合传递给模型的形式。 ```python import torch from datasets import load_dataset dataset = load_dataset("path_to_your_data") # 替换为实际路径 train_dataloader = ... # 创建DataLoader对象 optimizer = torch.optim.AdamW(peft_model.parameters(), lr=5e-5) for epoch in range(num_epochs): # 设定迭代次数 for batch in train_dataloader: inputs = tokenizer(batch["text"], return_tensors="pt").to('cuda') outputs = peft_model(**inputs, labels=inputs.input_ids) loss = outputs.loss optimizer.zero_grad() loss.backward() optimizer.step() ``` 完成上述步骤后即实现了基于LoRA技术对大型语言模型ChatGLM-6B的有效微调,在保持原有性能的同时降低了计算成本和内存占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值