当前位置: 首页 > news >正文

Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift

1,微调技术

特征Full-tuningFreeze-tuningLoRAQLoRA
训练参数量全部少量极少极少
显存需求很低最低
模型性能最佳中等较好接近 LoRA
模型修改方式无变化局部冻结插入模块量化+插入模块
多任务共享不便较便非常适合非常适合
适合超大模型微调✅(最优)

1.1,Full-tuning

Full-tuning(全参数微调):对模型的全部参数进行微调。训练过程中,所有层的权重都会被更新。

  • 加载预训练模型;

  • 所有参数设为可训练;

  • 使用下游任务的数据继续训练整个模型。

📈 优点

  • 最大化模型性能;

  • 可适配大幅度任务转变;

  • 简单直接,无结构变化。

📉 缺点

  • 资源消耗大:内存和显存使用高;

  • 训练时间长;

  • 在多任务场景下缺乏参数复用;

  • 不适合频繁变更的小任务定制(每次都得保存整套参数)。

适用场景

  • 对模型效果要求极高;

  • 拥有大量训练资源;

  • 任务和原始预训练任务差别较大。

1.2,Freeze-tuning 

Freeze-tuning(冻结微调):冻结预训练模型的部分或全部参数,仅微调某些新增模块(如分类头)或少数层。

  • 加载预训练模型;

  • 冻结大部分参数(如 Transformer encoder);

  • 仅微调一小部分,如最后几层或添加的下游任务层。

📈 优点

  • 节省计算资源;

  • 防止过拟合;

  • 训练速度快;

  • 对原始模型破坏小。

📉 缺点

  • 性能提升有限;

  • 表达能力受限,难以适配大跨度任务;

  • 调参难度大(决定哪些层冻结、哪些不冻结)。

适用场景

  • 轻量级部署;

  • 任务与预训练相似;

  • 快速原型验证。

1.3,LoRA

LoRA(Low-Rank Adaptation):使用低秩矩阵插入到原始模型权重的更新路径中,只训练这些额外的低秩参数,而不更新原始参数。

  • 不修改原始权重矩阵 W,而在其前后插入两个较小的可训练矩阵 A, B,构造为:

W^{'}=W+\alpha \cdot AB

其中:A\in \mathbb{R}^{d\times r},B\in \mathbb{R}^{r\times d},r\ll d

  • 进训练 A, B ,保持原始的权重不变。

📈 优点

  • 极大减少可训练参数数量(可减少至原来的 0.1%~1%);

  • 内存占用显著降低;

  • 适合多任务共享大模型,仅保存不同任务的低秩参数。

📉 缺点

  • 微调能力有限;

  • 可能无法达到 Full-tuning 的最优精度;

  • 在某些任务上收敛较慢。

适用场景

  • 多任务微调(如一个大模型服务多个业务);

  • 边缘设备或存储受限场景;

  • 希望在多个微调版本之间快速切换。

1.4,QLoRA

QLoRA(Quantized LoRA):在 LoRA 的基础上,将原始模型进行 量化(Quantization)(通常是 4-bit 量化),结合 LoRA 插件模块进行微调。

  • 使用 4-bit 量化将大模型压缩到极小显存占用;

  • 原始权重被量化,但仍然保持冻结状态;

  • LoRA 模块保持 float32/float16 精度进行训练;

  • 利用量化感知训练技术减少精度损失。

📈 优点

  • 显存占用极低(单卡 24GB GPU 可微调 65B 模型);

  • 准确率接近 LoRA;

  • 支持 CPU/GPU 微调;

  • 无需对全模型解冻,训练负担极小。

📉 缺点

  • 量化带来一定的数值不稳定性;

  • 性能略逊于全精度微调;

  • 对部署系统需支持混合精度和量化运算。

适用场景

  • 极端显存受限的环境;

  • 想在消费级设备(如笔记本、消费级 GPU)微调大模型;

  • 用于实验、原型开发和模型压缩部署。

2,训练方式

阶段是否涉及标签是否使用人类偏好是否使用强化学习典型方法/目标
Pre-Training学习语言通用能力
Supervised Fine-Tuning执行指令、完成任务
Reward Modeling✅(对比标签)构造奖励函数
PPO提升人类偏好表现
DPO✅(对比标签)❌(间接)更高效的人类偏好训练
KTO✅(对比标签)用 KL 优化拟合偏好分布
ORPO离线优化,有效融合监督与偏好学习
SimPO极简偏好优化方式

2.1,Pre-Training 

Pre-Training(预训练):预训练是整个语言模型生命周期的第一阶段,其目标是让模型掌握语言的基本结构、语义关系和常识知识。

  • 使用大规模无标签语料(如网页、图书、维基百科等);

  • 模型通常采用自监督学习目标,如:

    • Masked Language Modeling(BERT 系列):预测被遮盖的词;

    • Causal Language Modeling(GPT 系列):预测下一个词。

目标:学习词法、句法、语义、语言结构等通用能力,为下游任务打下基础。

特点

  • 数据量最大;

  • 训练时间最长;

  • 不依赖人工标注。

2.2,Supervised Fine-Tuning

Supervised Fine-Tuning(有监督微调):在预训练模型基础上,使用有标签的数据集对模型进行微调,使其适配特定任务,如问答、摘要、分类等。

⚙️ 方法

  • 数据来源于人工标注或规则生成;

  • 常用损失函数为 Cross-Entropy;

  • 多用于 Instruct 模型训练(例如指令跟随数据,如 "请翻译以下句子")。

目标:让模型“听得懂”任务指令,具备基础的任务执行能力。

特点

  • 通常比预训练快;

  • 微调数据越高质量,模型行为越稳定;

  • 是 RLHF 流程的第一步。

2.3,Reward Modeling

Reward Modeling(奖励建模):Reward Modeling 是强化学习前的关键步骤,用于训练一个奖励模型(Reward Model, RM),模拟人类偏好。

  • 输入:模型输出的多个候选答案;

  • 标签:由人类评审者对答案进行排序或打分;

  • 模型学习:预测哪个答案更好(即更符合人类偏好)。

目标:用一个可训练的模型替代人工打分,供后续强化学习优化使用。

特点

  • 训练的是一个新模型,不是语言模型本体;

  • 训练数据来源于人类偏好对比;

  • 是 RLHF(强化学习人类反馈)流程的桥梁环节。

2.4,PPO Training 

PPO Training(Proximal Policy Optimization):PPO 是一种常见的强化学习算法,广泛用于 LLM 微调中的 RLHF 阶段,使模型生成更符合人类期望的响应。

  • 使用奖励模型作为环境;

  • 模型作为策略网络,尝试生成更高分的回答;

  • 引入“剪切项”防止训练不稳定。

目标:在不显著破坏原模型的语言能力前提下,优化生成结果的人类偏好分数。

特点

  • 引入强化学习思想;

  • 训练复杂、稳定性要求高;

  • 是 ChatGPT 等对齐性模型的重要步骤。

2.5,DPO Training 

DPO Training(Direct Preference Optimization):DPO 是一种无需训练奖励模型的新方法,直接优化模型使其偏向于人类更喜欢的回答,是对 RLHF 的简化。

  • 直接用人类偏好对比(好 vs 差)训练语言模型;

  • 不需要额外的 Reward Model;

  • 目标函数基于“人类偏好答案比非偏好答案概率高”。

目标:简化 RLHF 流程,提高训练效率和稳定性。

特点

  • 更容易实现;

  • 效果接近 PPO;

  • 越来越受研究社区关注。

2.6,KTO Training

KTO Training(Kullback-Leibler Preference Optimization):KTO 是一种在 DPO 基础上发展的方法,通过 KL 散度更精确地拟合人类偏好分布,进一步提升模型对齐性。

  • 构建基于 KL 散度的目标函数;

  • 训练使模型生成的分布更接近于偏好更高的样本。

目标:在对齐能力和训练效率之间取得更好的平衡。

特点

  • 相较 DPO 提供更细粒度的控制;

  • 数学上更严谨;

  • 适用于人类偏好数据不充分的情况。

2.7,ORPO Training 

ORPO Training(Offline RL with Preference Optimization):ORPO 是一种使用离线数据进行偏好优化的方法,融合了监督学习和偏好强化学习的优势。

  • 不依赖交互式环境;

  • 利用已存在的偏好标注对模型进行偏好学习;

  • 通常和行为克隆(Behavior Cloning)结合使用。

目标:避免在线 RL 的不稳定性,使用偏好数据离线优化生成行为。

特点

  • 更易部署;

  • 更稳定;

  • 适合偏好数据多但不能实时交互的场景。

2.8,SimPO Training 

SimPO Training(Simplified Preference Optimization) :SimPO 是一种对 DPO 的进一步精简版,采用更简单的结构实现相近的偏好优化效果

  • 利用简单的正负样本对比训练;

  • 可看作是 DPO 的轻量变种。

目标:以极简实现替代复杂 RL 训练流程,适用于低资源环境。

特点

  • 非常轻量;

  • 效果仍然优于纯监督微调;

  • 实现快速、适配性强。

3,LLaMA-Factory

参考:

3步轻松微调Qwen3,本地电脑就能搞,这个方案可以封神了!【喂饭级教程】

12 大模型学习——LLaMA-Factory微调_llama factory-CSDN博客

3.1,项目安装

依赖安装:

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" --no-build-isolation必需项	至少	推荐
python	3.9	3.10
torch	2.0.0	2.6.0
torchvision	0.15.0	0.21.0
transformers	4.45.0	4.50.0
datasets	2.16.0	3.2.0
accelerate	0.34.0	1.2.1
peft	0.14.0	0.15.1
trl	0.8.6	0.9.6

Gradio 启动:

llamafactory-cli webui

模型名称:

  • Base 版本(如 Qwen3-1.7B-Base)
    • 基础预训练模型
    •  没有经过指令微调
    • 适合继续搞预训练或从头开始指令微调
    • 通常情况下输出质量不如 Instruct 版本
  • Instruct 版本(如 Qwen3-1.7B-Instruct)
    • 经过指令微调的模型
    • 更适合直接对话和指令遵循
    • 已经具备基本的对话能力
    • 更适合用来进一步微调

微调方法:lora

检查点路径:在长时间训练大模型的时候会经常用,主要作用是把训练过程中的阶段性结果进行保存,这里是设置指定的保存地址的。这样如果训练过程意外中断,可以从检查点开始继续训练,不用从头再开始训练。若不设置,则默认保存在 LLaMA-Factory 的 /saves文件中

微调前可以加载模型 进入chat模型,看模型能否正常加载。

3.2,量化

【量化等级】用于指定是否对模型权重进行量化以减少内存使用:

  • none:不启用量化,使用原始全精度模型(如 FP16 或 BF16)。
  • 8:8比特量化(int8),在大多数场景下能提供不错的精度与性能平衡。
  • 4:4比特量化(int4),更大幅度地压缩模型大小,适合资源受限设备,精度会有所下降。

👉 QLoRA(Quantized LoRA)结合了量化和LoRA(低秩适配)技术,常用于在消费级显卡上进行大模型微调。

【量化方法】用于指定具体的量化实现库或算法:

  • bnb:BitsAndBytes(Meta 的实现),支持 int8 和 int4,兼容 HuggingFace。
  • hqq:HQQ(High Quality Quantization),一种高保真度的量化方法,强调量化后精度保持。
  • eetq:EETQ(Efficient and Effective Transformer Quantization),侧重性能与部署效率。

【对话模板】用于指定对话格式模板,影响 prompt 格式化,适配不同训练数据结构。

【RoPE 插值方法】用于扩展模型上下文长度:

  • none:不启用插值,只使用默认的 RoPE。
  • linear:线性插值法,广泛用于上下文扩展(如从 2K 扩展到 8K、32K)。
  • yam:Yarn-Aware Method,Yarn 插值的衍生方法。
  • llama3:LLaMA3 模型使用的插值方案,已被验证性能优秀。
  • dynatic:动态调整的插值方案(Dynamic RoPE Interpolation),提升长上下文效果。

【加速方法】

  • auto:自动选择最优的加速方法。
  • flashattn2:FlashAttention v2,显著提高 Transformer 中注意力模块的速度和效率。
  • unsloth:用于极高效训练,尤其配合 LoRA 等技术,适用于 consumer GPU。
  • liger_kernel:专为 NVIDIA GPU 优化的 kernel 级推理加速,速度极快。

3.3,数据集 

llama-factory目前只支持两种格式的数据集:Alpaca格式和Sharegpt格式

Alpaca 格式(单单轮指令跟随任务):每条数据是一个 JSON 对象。

{"instruction": "请写一篇关于气候变化的短文。","input": "","output": "气候变化是指由于自然因素和人类活动导致的气候系统的长期变化..."
}

ShareGPT 格式(多轮对话训练):通常是一个列表,每条数据是一个对话(dialogue),每个对话是多轮消息的列表。

[{"conversations": [{"from": "human","value": "你好,你是谁?"},{"from": "gpt","value": "你好!我是由OpenAI训练的大语言模型,很高兴为你服务。"},{"from": "human","value": "你能告诉我关于机器学习的基础知识吗?"},{"from": "gpt","value": "当然可以!机器学习是人工智能的一个子领域,主要研究如何让计算机通过数据自动学习和改进..."}]}
]

【甄嬛数据集】魔搭社区

modelscope download --dataset kmno4zx/huanhuan-chat

【适配 LLaMA】

  • 将下载的数据集放在项目根目录的data文件夹下:

  • 修改:dataset_info.json

  • 保存之后,webui那边会实时更新,不需要重启

3.4,训练

学习率:可以不用修改

训练轮数:可以选择1轮,会快一些(如果后面发现效果不理想,可以多训练几轮),我这里最终选择了3轮,因为我发现仅1轮效果不佳。

最大梯度范数:防止梯度爆炸的一种技术,称为 梯度裁剪(Gradient Clipping)。

最大样本数:根据数据集大小和训练需求设置。主要是防止数据量过大导致的内存溢出问题
计算类型:

  • fp16:GPU 推理、训练等,NVIDIA 的 Tensor Core 使用该格式(混合精度训练)。节省内存带宽,能更快训练神经网络(尤其是 CNN)。
  • bf16:精度虽然比 fp16 更低,但动态范围更大,不易梯度爆炸/消失,更适合在 大模型训练 中替代 fp32。

截断长度:由于我们的数据集都是一些短问答,可以把截断长度设置小一点,为1024(默认是2048)

批处理大小:每个 GPU 处理的样本数量。

梯度累计:设置为4

验证集比例:验证集占全部样本的百分比。

学习率调节器:学习率调度器的名称。

日志间隔:多久输出日志信息

保存问题:多久保存权重,这里不是按轮次保存

预热步数:是学习率预热采用的步数,通常设置范围在2-8之间,这里配置4。

lora秩越大(可以看作学习的广度),学习的东西越多,微调之后的效果可能会越好,但是也不是越大越好。太大的话容易造成过拟合(书呆子,照本宣科,不知变通)。

lora缩放系数(可以看作学习强度),越大效果可能会越好,对于一些用于复杂场景的数据集可以设置更大一些,简单场景的数据集可以稍微小一点。

一轮接近24小时,在个人设备考虑微调小参数模型,这里14B的耗时实在是太久了。

训练结束:

如果想重新微调,记得改一下下面两个值

3.5,测试

微调成功后,在检查点路径这里,下拉可以选择刚刚微调好的模型:

把窗口切换到chat,点击加载模型:

【模型导出】切换到export,填写导出目录 /app/output/qwen2-0.5b-huanhuan

D:\app\output\qwen2-0.5b-huanhuan
from modelscope import AutoModelForCausalLM, AutoTokenizermodel_name = "D:\\app\\output\\qwen2-0.5b-huanhuan"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = "你好啊,请问你是谁"
messages = [{"role": "system", "content": "你是甄嬛"},{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
======================
我是甄嬛,家父是大理寺少卿甄远道。

http://www.xdnf.cn/news/677719.html

相关文章:

  • AI智能分析网关V4垃圾桶满溢检测算法打造城市/公园/街道等场景应用方案
  • 浅谈Mysql的MVCC机制(RC与RR隔离级别)
  • LeetCode 1696. 跳跃游戏 VI(中等)
  • AI Agent开发第75课-数据、张量、流水线并行全解析
  • 【Web应用】若依:基础篇03-入门案例,若依代码生成器生成前后端代码
  • Web通信协议全景解析:从HTTP到WebService的技术演进与对比
  • 如何寻找大模型在企业业务中的价值?
  • Anaconda下载安装+配置虚拟环境保姆级教程(2025版)
  • 实时数仓flick+clickhouse启动命令
  • 第一个ASP.NET项目
  • 【Elasticsearch】retry_on_conflict
  • Python中while 1和while True有何区别?深入解析无限循环的写法选择
  • 百胜咨询公司:企业EcoVadis认证的专业导航者
  • SIGGRAPH 2025 | 快手可灵团队提出3D感知的电影级文本到视频生成框架CineMaster
  • 鸿蒙5开发宝藏案例分享---一多断点开发实践
  • 0527漏洞原理:SQL注入笔记 SQL注入类型(联合查询注入、报错注入实操)
  • 【本地部署】 Deepseek+Dify创建工作流
  • 【Vue 3 运行时 Diff 算法深度解析:五步走策略实现高效更新】
  • MySQL数据库第一章
  • 科技趋势分析系统 BBC (Big Bang of Computing)
  • mysql中的索引怎么用?
  • [特殊字符]《计算机组成原理》第 8 章 - CPU 的结构和功能
  • 本地部署 DeepSeek
  • 计算机组成原理——指令的寻址方式
  • 迪米特法则 (Law of Demeter, LoD)
  • 多个vue2工程共享node_modules
  • Liunx部署ES单机集群
  • Streamlit 项目知识点总结
  • OpenCv高阶(十三)——人脸检测
  • 第二章:软盘里的90年代