LLM大模型技术实战6:一文总结大模型微调方法

大模型会成为AI时代的一项基础设施。作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术实力强、财力雄厚的公司去做。绝大多数人,是水、电的应用者。对这部分人来说,掌握如何用好大模型的技术,更加重要。

用好大模型的第一个层次,是掌握提示词工程(Prompt Engineering)

用好大模型的第二个层次,是大模型的微调(Fine Tuning),这也是今天这篇文章的主题。

为什么要对大模型进行微调

通常,要对大模型进行微调,有以下一些原因:

第一个原因是,因为大模型的参数量非常大,训练成本非常高,每家公司都去从头训练一个自己的大模型,这个事情的性价比非常低;

第二个原因是,Prompt Engineering的方式是一种相对来说容易上手的使用大模型的方式,但是它的缺点也非常明显。因为通常大模型的实现原理,都会对输入序列的长度有限制,Prompt Engineering 的方式会把Prompt搞得很长。

越长的Prompt,大模型的推理成本越高,因为推理成本是跟Prompt长度的平方正向相关的。

另外,Prompt太长会因超过限制而被截断,进而导致大模型的输出质量打折口,这也是一个非常严重的问题。

对于个人使用者而言,如果是解决自己日常生活、工作中的一些问题,直接用Prompt Engineering的方式,通常问题不大。

但对于对外提供服务的企业来说,要想在自己的服务中接入大模型的能力,推理成本是不得不要考虑的一个因素,微调相对来说就是一个更优的方案。

第三个原因是,Prompt Engineering的效果达不到要求,企业又有比较好的自有数据,能够通过自有数据,更好的提升大模型在特定领域的能力。这时候微调就非常适用。

第四个原因是,要在个性化的服务中使用大模型的能力,这时候针对每个用户的数据,训练一个轻量级的微调模型,就是一个不错的方案。

第五个原因是,数据安全的问题。如果数据是不能传递给第三方大模型服务的,那么搭建自己的大模型就非常必要。通常这些开源的大模型都是需要用自有数据进行微调,才能够满足业务的需求,这时候也需要对大模型进行微调。

什么时候需要LLM微调

说起LLM,总会涉及到上下文学习、零样本、单样本和少样本推理等话题。我们先快速了解一下它们主要的功能。

上下文学习(In-context learning) 是一种通过在提示中加入特定任务示例来改进提示的方法,为LLM提供了完成任务的蓝图。

零样本(Zero-shot)、单样本(One-shot)和少样本(Few-shot)推理 零样本推理是在提示中直接使用输入数据,不添加额外示例。如果零样本推理未能达到预期结果,可以使用单样本或少样本推理。这些策略涉及在提示中添加一个或多个已完成的示例,帮助较小的LLM表现得更好。

上下文学习的问题 将以上这些技术直接应用于用户提示,旨在优化模型输出,使其更符合用户偏好。问题是它们并不总是有效,尤其是对于较小的LLM。除此之外,在提示中包含的任何示例都会占用宝贵的上下文窗口空间,减少了包含其他有用信息的空间。

当以上方式无法解决相关问题时,这就需要LLM微调。但它与预训练阶段使用大量非结构化文本数据不同,微调是一个监督学习过程。这意味着你使用标记好的示例数据集来更新LLM的权重。这些标记好的示例通常是prompt-response,使得模型能更好地完成特定任务。

如何对大模型进行微调

从参数规模的角度,大模型的微调分成两条技术路线

一条是对全量的参数,进行全量的训练,这条路径叫全量微调FFT(Full Fine Tuning)。

一条是只对部分的参数进行训练,这条路径叫PEFT(Parameter-Efficient Fine Tuning)****。

FFT的原理,就是用特定的数据,对大模型进行训练,将W变成W`,W`相比W ,最大的优点就是上述特定数据领域的表现会好很多。

但FFT也会带来一些问题,影响比较大的问题,主要有以下两个:

一个是训练的成本会比较高,因为微调的参数量跟预训练的是一样的多的;

一个是叫灾难性遗忘(Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差。

PEFT主要想解决的问题ÿ

### BaiChuan 大模型微调实践指南 对于大型预训练模型如BaiChuan,在特定领域数据上进行微调可以显著提升性能。以下是针对该过程的具体指导: #### 准备环境与依赖项 确保安装必要的库和支持工具,包括但不限于PyTorch、Transformers等框架。 ```bash pip install torch transformers datasets evaluate accelerate bitsandbytes ``` #### 加载预训练模型及分词器 通过Hugging Face提供的API加载指定版本的BaiChuan模型及其配套的分词组件[^1]。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_name_or_path = "baichuan-inc/Baichuan-7B" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) ``` #### 数据集准备 根据具体应用场景收集并整理用于微调的数据集合。通常建议采用标准格式保存文本文件,并利用`datasets`库简化读取流程。 ```python from datasets import load_dataset dataset = load_dataset('json', data_files={'train': 'path/to/train.json'}) ``` #### 定义评估指标函数 为了监控训练进度以及最终效果评测,定义相应的评价准则非常重要。 ```python import numpy as np from datasets import load_metric def compute_metrics(eval_preds): metric = load_metric("accuracy") logits, labels = eval_preds predictions = np.argmax(logits, axis=-1) return metric.compute(predictions=predictions, references=labels) ``` #### 设置训练参数配置 合理设置超参有助于提高收敛速度和泛化能力。这里列举了一些常见的选项供参考调整。 ```python training_args = TrainingArguments( output_dir="./results", evaluation_strategy="epoch", learning_rate=2e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, weight_decay=0.01, ) ``` #### 执行实际微调过程 最后一步就是启动整个训练循环直至完成预期轮次或达到满意的效果为止。 ```python trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer, compute_metrics=compute_metrics ) trainer.train() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值