Roland.W (@rwayne) on X

X AI KOLs 新闻

摘要

本文详细介绍了模型微调的基本概念和术语,包括预训练、监督微调、LoRA等关键知识点,适合初学者理解。

https://t.co/tDI91MaEbe
查看原文
查看缓存全文

缓存时间: 2026/09/12 02:04

万字长文!读懂模型微调的基本概念和名词

模型微调,就是拿一个已经训练好的模型,再用一批和你的任务有关的数据继续训练。模型原来已经会理解语言、回答问题和生成文字,微调是在这个起点上,让它更适应一种表达、一类任务或者一套工作方式。比如像医疗、法律或金融的垂直领域,因为术语和表达习惯的不同,它是需要稳定的输出风格,并且让大模型更加稳定的去遵循指令,减少幻觉。

对普通人来说,最直接的作用是让模型更接近自己的表达方式。平时要反复写进提示词里的要求,可以有一部分进入训练结果。原来每次都要删掉的 AI 表达、固定要改的句式和经常要补充的格式,训练以后有机会减少。你做客服、分类、提取和改写,也可以用固定样本告诉模型,收到什么输入时要交出什么格式的结果。

本地微调还有一个用途。个人聊天、口述、工作记录和内部资料不方便上传时,可以在自己的机器上整理和训练。模型也可以接触行业术语、内部分类方法和团队常用的表达,让它处理这些内容时少一点反复解释。

微调改变的,是模型收到一类输入以后,更容易给出什么样的输出。训练数据里只有连续的个人原话,模型学到的主要是这段文字后面通常接什么。训练数据里同时放入任务、原内容和你确认的结果,模型才会直接练习怎样完成这个任务。数据怎么写,决定了模型到底在练什么。

一次训练结束后,结果有没有达到要求,还要拿没有参加训练的内容去试一下。如果目标是更接近自己的表达,那么最后还是要看输出有没有那些反复需要删除的 AI 表达,第一眼读起来像不像自己。

今天我们这篇文章给大家详细的解答关于模型微调的基本概念和名词。

模型从哪里开始

Pre-training/预训练

预训练是模型第一次大规模学习语言的阶段。它读取大量文本,根据前面的 token 预测下一个 token,在这个过程中形成语言规律、常识和一些能够继续使用的表示。你把 Gemma 下载到 DGX Spark 时,它已经会写句子和回答问题,这些能力来自预训练。

Base model/基础模型

基础模型是后续训练开始时使用的原始模型权重,微调从这里继续。给 Gemma 加载 LoRA 以前,磁盘里那份 Gemma 权重就是基础模型。

Post-training/后训练

后训练指模型完成预训练以后继续进行的训练。微调、监督微调、偏好学习、RLHF 和 DPO 都可以出现在这个阶段,它们解决的任务不同。用一批客服问答继续训练一个已经会说话的模型,这项工作属于后训练。

Fine-tuning/微调

微调是让已经训练好的模型继续看一批更具体的数据,使它的输出向这些数据靠近。它利用基础模型已经学到的能力,再用较少的目标数据调整模型,这也是迁移学习的一种做法。拿自己确认过的改写结果继续训练 Gemma,目标是让它处理同类内容时更接近这些结果。

数据怎样告诉模型要学什么

Supervised fine-tuning/SFT/监督微调

监督微调会给模型明确的输入和目标答案。训练程序把模型生成的内容与目标答案比较,再根据差距更新参数。输入是一段需要整理的会议记录,目标答案是你确认过的摘要,模型练习的是从会议记录生成这种摘要。

Instruction tuning/指令微调

指令微调是监督微调的一种常见形式。样本中会写出任务说明、输入内容和目标回答,模型学习怎样按照指令完成任务。指令写保留事实并改成日常表达,后面放原内容和确认后的版本,模型看到的是一项完整的改写任务。

Causal language modeling/因果语言建模

因果语言建模让模型根据前面的文字预测后面的 token。它适合学习一段文字怎样接下去,包括用词、语气和句子展开方式。把一批个人口述按连续文本交给模型,它会练习这些话后面通常怎样继续说。

Next-token prediction/下一个 token 预测

下一个 token 预测是语言模型每一步实际完成的动作。模型先计算哪些 token 更可能接在当前文字后面,再选出一个,连续执行以后形成句子。前文是“训练结束后要先检查”,模型会根据学到的关系判断后面更可能出现“结果”“文件”还是其他词。

训练为什么能在 DGX Spark 上跑起来

PyTorch

PyTorch 是建立和训练神经网络的软件框架。它负责张量计算、自动求梯度、调用优化器,并把计算交给 GPU。训练脚本在 DGX Spark 上读取一个 batch 后,PyTorch 会计算 loss 和梯度,再更新允许训练的参数。

Training framework/训练框架

训练框架把模型加载、数据读取、反向传播、保存和评估组织成一条流程。PyTorch 常在底层完成计算,Transformers、PEFT、TRL、Datasets 和 Accelerate 在上面处理模型、数据和分布式运行。一个训练脚本可以用 Transformers 加载 Gemma,用 PEFT 创建 LoRA,再由 PyTorch 完成参数更新。

Recipe/训练方案

训练方案是一套已经写好的训练做法,里面会规定模型、数据格式、微调方法、参数和启动方式。它提供可执行的起点,使用时仍要根据自己的数据和目标调整。NVIDIA 的 PyTorch 微调方案可以告诉你容器怎样启动,但客服分类和个人表达训练会使用不同的数据结构。

Ancillary files/辅助文件

辅助文件不属于模型权重主体,但训练、恢复和复现会使用它们。配置文件、tokenizer、chat template、训练状态、日志、README 和文件清单都在这一类。adapter 权重还在,但匹配的 tokenizer 和配置丢了,后面加载时就可能出现格式或维度问题。

Docker/Container/容器

容器把 PyTorch、CUDA 依赖和 Python 包放进一个相对固定的运行环境。它主要解决不同机器上的软件版本和依赖怎样保持一致。在 DGX Spark 上使用 NVIDIA PyTorch 容器,训练脚本看到的是已经配好的 PyTorch 和 CUDA 环境。

LoRA 改了模型的哪一部分

PEFT/Parameter-Efficient Fine-Tuning

PEFT 是参数高效微调的总称,它保留基础模型的大部分参数,只训练较少的新增参数。一个几十亿参数的模型,最后保存的微调结果可能只占基础模型的一小部分。

LoRA/Low-Rank Adaptation

LoRA 会在模型的一些线性层旁边加入低秩矩阵,训练时更新这些新增矩阵,基础模型权重保持冻结。微调说的是继续训练这件事,LoRA 说的是这次训练怎样改参数。在 Gemma 的注意力层加入 LoRA 后,训练结束保存的是这些新增参数,而不是再保存一份完整 Gemma。

QLoRA

QLoRA 会用较低精度加载冻结的基础模型,再训练 LoRA 参数。这样可以减少基础模型占用的显存,让有限的显存容纳更大的模型。同一台 DGX Spark 装不下高精度基础模型和训练状态时,可以量化加载基础模型,把训练集中在 LoRA 参数上。

Adapter

Adapter 是微调以后保存下来的增量参数,它记录基础模型需要怎样变化。使用时通常要同时加载对应的基础模型和 adapter。你把一个写作 adapter 加到匹配的 Gemma 上,模型才会表现出这次训练带来的变化。

Fresh adapter/新的 adapter

新的 adapter 指 LoRA 参数重新初始化,训练状态从头开始。基础模型仍然保留预训练得到的能力,因此这里的从头开始只发生在新增参数上。删除旧 adapter 后重新创建一套 LoRA 参数,Gemma 不会因此忘记预训练阶段学到的语言。

Rank/LoRA rank/r

Rank 决定 LoRA 用多大的低秩空间记录变化。数值增加时,可训练参数、文件大小和表达容量通常也会增加,训练资源和记住训练样本的机会也会变化。同一组目标模块使用 rank 8 和 rank 64,会得到不同数量的 LoRA 参数。

LoRA alpha

LoRA alpha 控制 LoRA 分支对模型输出产生多大影响。学习率决定每一步参数怎样更新,alpha 决定这条分支在计算时怎样缩放。两次训练使用同一个 rank 和学习率,只改变 alpha,LoRA 更新进入模型输出的强度也会改变。

LoRA dropout

LoRA dropout 会在训练时随机忽略一部分 LoRA 路径。同一个样本在不同训练步骤中,可能经过不同的新增连接。

Target modules/目标模块

目标模块决定 LoRA 被放到模型的哪些层。注意力层和 MLP 层承担的计算不同,选择范围会改变可训练参数数量和模型能够调整的部分。可以只把 LoRA 放进 q_proj 和 v_proj,也可以同时覆盖 k_proj、o_proj、gate_proj、up_proj 和 down_proj。

Safetensors

Safetensors 是保存模型或 adapter 权重的二进制格式。在 VS Code 里打开 adapter_model.safetensors 看见大量符号,是因为它存放的是数值张量。

文字怎样变成训练数据

Corpus/语料

语料是准备让模型看到的文字集合。它还可以保留原始文件、来源和上下文,暂时不需要符合训练程序的字段格式。个人口述、聊天记录和已经发表的文章可以先分别放进语料库。

Dataset/数据集

数据集是已经整理成训练程序能够读取的样本。语料经过筛选、合并、去重、切分和格式转换后,才会成为训练集、验证集或测试集。一批口述文本整理成每行一个样本的 JSONL 文件以后,训练脚本才能按字段读取。

Original source/原始素材

原始素材是没有经过 AI 改写的本人原话,或者来源明确的外部文本。保存原始素材,是为了以后能够回查派生数据从哪里来,也能判断模型学到的是谁的表达。原始录音转写和清洗后的训练文件要分开保存,清洗文件不能覆盖原始转写。

Derived data/派生数据

派生数据是原始素材经过合并、清洗、标注或切分后产生的文件。一份聊天导出可以生成连续发言、训练集和验证集,这些都是派生数据。

Context merging/上下文合并

上下文合并会把属于同一次表达的多条消息合成一个样本。合并时通常要看发送者、中间有没有别人插话,以及两条消息相隔多久。一个人连续发送三条补充说明,中间没有其他人回复,把它们合在一起更接近原来的完整发言。

Deduplication/去重

去重用于识别完全相同、只有格式差别或大部分内容相同的文本,避免模型反复看到同一句话。完全重复可以直接处理,近似重复还要分辨它是不是强调、自我修正或确实重复的内容。同一段文章被导入两次可以去掉一份,同一个人先说一句又补充修正则要保留语义变化。

Context-dependent short reply/依赖上下文的短回复

依赖上下文的短回复离开原对话就很难理解。它可能有语气价值,但无法单独告诉模型这句话在回答什么。“好的”“那必须”和“这个看看”放在聊天里有意义,单独成为训练样本时提供的信息很少。

Quality tier/质量分层

质量分层会根据完整性、表达价值和上下文依赖程度给语料分组。较短或口语化的内容可以保留,接下来再判断它适合直接训练、需要复核,还是留在原始材料里。一段完整口述可以进入主要候选,只有一个代词的回复可以留在审计文件中。

Tokenizer

Tokenizer 把文字转换成 token ID,也把模型输出的 token ID 转回文字。基础模型在预训练时已经使用了一套切分规则,微调和推理要继续使用匹配的 tokenizer。Gemma 的文字不能随意换成另一套模型的 tokenizer 后直接训练,否则 token ID 的含义会对不上。

Max sequence length/最大序列长度

最大序列长度规定模型一次最多读取多少 token。长口述超过这个长度时,后面的内容要切成新的训练块。

Packing/打包

Packing 会把多段短文本装进一个训练块,减少空白位置和无效计算。很多只有几十个 token 的聊天片段可以共同填满一个序列。

Train/Validation/Test

训练集用于更新参数,验证集用于训练过程中观察模型在未参与更新的数据上的表现,测试集用于最后评价。验证集和测试集要与训练集分开,反复根据测试结果调整以后,这份测试也会逐渐失去独立性。1000 条样本可以先划出一部分验证和测试,训练程序只用剩下的样本计算梯度。

Data mixing ratio/数据混合比例

数据混合比例指不同来源在训练过程中分别占多少 token。文件数、段落数和字符数都不能直接代替 token 比例,因为每个来源的文本长度不同。长口述和短聊天按 60% 与 40% 混合时,要看模型实际读到的 token,而不是两边各放了多少个文件。

Oversampling/过采样

过采样会让数量较少的一类数据被模型看到更多次,从而提高它在训练中的占比。重复曝光增加后,这类表达会更容易被学到,也更容易出现固定句子被直接记住。长文章数量少但希望它占训练数据的一半,就需要让其中一些样本重复出现。

参数怎样控制训练过程

Batch size

Batch size 是 GPU 每一步直接处理的训练块数量。DGX Spark 一次放下两个长训练块时,batch size 就是 2。

Gradient accumulation/梯度累积

梯度累积让 GPU 连续处理几个小 batch,先把梯度累积起来,再执行一次参数更新。它可以在显存放不下大 batch 时得到较大的有效 batch。batch size 是 2,连续累积 8 次以后再更新,有效 batch 相当于一次使用 16 个训练块。

Epoch

Epoch 表示训练数据整体被模型看完一遍。设置 2 个 epoch,通常就是让模型把定义好的训练集走两轮。

Step/Training step

Training step 通常指优化器完成一次参数更新。它与读取一个 batch 不一定相同,因为梯度累积会让多个小 batch 共同形成一次更新。累积 8 次梯度后更新一次参数,日志里的 global step 只增加 1。

Max steps

Max steps 规定训练最多更新多少次参数。把它设为 10,程序更新 10 次后就会停止。

Learning rate/学习率

学习率控制每次参数更新走多大一步。数值太大时,训练可能不稳定并影响原有能力;数值太小时,有限训练步骤内可能看不到明显变化。两次训练使用同一数据,只改变学习率,loss 下降速度和最终输出都可能不同。

Warmup

Warmup 让学习率在训练开始时逐步增加。前 100 个 step 用于 warmup,学习率会在这段时间升到设定值。

Seed/随机种子

随机种子控制数据顺序、参数初始化和 dropout 等随机过程,让两次实验更容易比较。相同 seed 可以减少差异,但 GPU 计算仍可能出现细小的数值变化。比较两个 rank 时使用同一个 seed,可以少一个数据顺序变化带来的干扰。

训练结束以后留下了什么

trainer_state.json

trainer_state.json 记录 Transformers Trainer 的训练进度,常见内容包括 global step、epoch、日志和最佳 checkpoint。它通常在 checkpoint 目录中,最终 adapter 根目录未必保留一份。要确认训练从哪个 step 恢复,可以先查看最近 checkpoint 里的这个文件。

training_args.bin

training_args.bin 保存 Trainer 使用的训练参数对象。它是二进制文件,适合由程序读取,直接用文本编辑器打开不会得到清楚的参数表。要复查 batch size 或学习率,可以在 Python 环境中加载这个文件,或者同时保留一份文本配置。

Loss/训练损失

训练 loss 表示模型预测与训练目标之间的差距。训练过程通常希望它下降,因为这说明模型正在更准确地预测当前这批训练数据。个人原话续写训练的 loss 下降,说明模型更会预测这些原话后面的 token。

Eval loss/验证损失

Eval loss 是模型在验证集上的预测误差,验证集不会参与当前参数更新。训练 loss 继续下降而 eval loss 开始变差时,模型可能正在越来越贴合训练数据。每隔一段时间用固定验证集计算 eval loss,可以观察训练继续进行还有没有带来新的泛化收益。

Overfitting/过拟合

过拟合指模型在训练数据上表现越来越好,面对新内容时反而变差。它常出现在数据较少、重复曝光较多或训练时间过长的情况下。模型能复述训练文章,却不能用相同表达处理一个新主题,这种结果就要检查过拟合。

Memorization/记忆训练文本

记忆训练文本指模型直接复现语料中的片段,而不只是学习用词和表达规律。适量重复可以帮助学习,固定句子被大量重复后,模型更可能原样生成。测试时输入一个新话题,模型却接出了训练文章里的整段原句,这就是需要记录的记忆现象。

Inference/推理

推理是模型接收输入并生成结果的过程,这时参数不会继续更新。把基础模型和 adapter 加载到 DGX Spark 上对话,就是在做推理。

vLLM

vLLM 是部署和调用大模型的推理引擎,它负责加载模型、管理显存并处理生成请求。它用在训练完成后的服务阶段,训练参数更新仍由训练框架完成。adapter 验收通过后,可以用 vLLM 在 DGX Spark 上提供本地接口,让其他程序调用模型。

Smoke test/冒烟测试

冒烟测试用少量数据和很少的 step 检查整条训练流程能不能运行。它要验证模型能否加载、数据能否读取、梯度能否更新以及文件能否保存,不负责判断正式训练质量。先跑 10 个 step 并成功保存 adapter,再决定是否启动几个小时的完整训练。

Evaluation/评估

评估会用固定输入比较基础模型和微调模型的输出。评价内容要与实际目标对应,文风训练要看表达、改写和复述情况,分类训练则要看分类结果。用几段没有参加训练的新材料分别测试两个模型,再记录哪一版需要更少的人工修改。

训练输入和实际使用输入出现差别时,训练成绩与实际结果之间的关系会变弱。训练数据只有连续原话,实际使用却要求模型读取外部材料后完成改写,这两种输入对应的任务并不相同。

为什么基础概念名词这么重要?

最近在折腾 DGX Spark 的时候呢,就发现了,其实很多时候我们过度依赖 AI 去操作,会让我们 很难发现问题。也正是在这个过程中,我发现了搞清楚基础概念和名词的重要性。我觉得这篇文章并不需要 马上就消化,他可以反复看、反复理解、反复阅读,然后通过自己的实操,就形成自己的被消化的知识。

很快模型微调这个玩法会开始普及开来。

关于作者

Roland|PhD ing @UQ |DGX SPARK & Max 395 本地AIPC玩家|创造知识,创造价值|@rwayne

相似文章