前言

多开发者在初次接触大模型微调时,往往会被复杂的架构劝退,却忽略了最核心的训练直觉。其实,理解 Learning Rate、Epoch 这些基础参数,学会解读 Train Loss 和 Eval Loss 的曲线变化,才是判断模型是“欠拟合”还是“过拟合”的关键钥匙。没有这些基石,后续的优化无异于空中楼阁。

本文将摒弃晦涩的理论堆砌,用最朴实的语言拆解这些技术名词背后的逻辑。我们将通过一个具体而有趣的案例——如何让大模型牢记“我是威震天”这一指令,全程展示从数据准备到参数调整的实战过程。

这不仅是一篇教程,更是一次对模型行为本质的探索。当你看到 Loss 曲线平稳下降,模型准确吐出预期回答的那一刻,你会真正明白训练的本质。希望这篇文章能成为你深入 LLM 世界的起点,让你在面对黑盒般的模型时,多一份掌控感与信心。

1. 大模型是“硅基生命”却为什么可以像被人一样得训练?

在上一篇《大模型训练师的炼丹之道 (1)-最新版llama-factory环境搭建和全排错》中我们有了环境,于是基于环境我们将展开后续一系列的训练之旅了。

“大模型没有生命,何以谈训练?”这是许多开发者入门时的第一道心障。

紧接着是第二个灵魂拷问:假设我用100种异构句式提问“你是谁”,并将答案统一标注为“我是威震天”。如果这只是查表式的强记,那么面对训练集之外的新句式,模型理应失效。

然而事实相反,它能从容应对未知的变体。这一现象揭示了LLM的核心魔力——它学习的不是静态的知识库映射,而是构建了一种高维的语义泛化能力,从而能识别出千变万化的表层文字下面那个恒定不变的核心意图

1.1 什么是泛化能力

用最直白的话说,泛化能力就是“举一反三”的本领。

想象你在教一个孩子认苹果。你给他看了红色的富士苹果、黄色的金冠苹果、甚至有点歪瓜裂枣的青苹果,告诉他这些统统都叫“苹果”。

接着,当你拿出一个他从未见过的、深红色中有点白的苹果时,如果他能毫不犹豫地说出“这也是苹果”,这就叫泛化能力。

如果他只认识之前见过的三种苹果,见到新的就说“我不知道”,那他就只是在“死记硬背”,没有真正学会“苹果”这个概念。

回到大模型场景

当我们在训练中让模型记住:“你是谁?”、“介绍一下自己”、“你的身份是什么”这些问题对应的回答都是“我是威震天”时,我们并不是在让它背诵这三个句子。 我们是在教它识别这些不同句式背后共同的语义意图

于是,当用户问出一个全新的问题,比如“聊聊你自己吧”,模型能瞬间捕捉到这与之前的训练数据指向同一个内核,从而流畅地回答:“我是威震天!” 这种从已知推导未知、透过现象看本质的能力,就是泛化能力

1.2 预训练:泛化能力的源头

其实,这种强大的泛化能力并非微调时凭空产生,而是源于大模型的“出厂设置”——预训练(Pre-training)。

厂商在发布模型前,会投喂海量互联网文本。这过程如同让模型阅读整座图书馆,使其习得语言规律、世界常识以及逻辑推理的底层模式。

正因为有了预训练打下的基石,模型才具备了识别“你是谁”这类问题的通用语义框架。它不是从零开始学习说话,而是在巨人的肩膀上,通过后续微调,将通用的理解能力精准锚定到“我是威震天”这一特定任务上。

2. 大模型训练的基础-Learning Rate、epoc和batch

无论是在之前的篇章还是在其它网络上的教程里我们都会看到这样两个参数:

  • learning rate
  • epoc

这两个参数到底是做什么的呢?

2.1 Learning Rate-学习步长

它的表示一般有如下形态:

  • 1e-3
  • 1e-5
  • 3e-5
  • 5e-5
  • 3e-4

其实这是科学表示法,我们完全可以把它们看成这样:

  • 1e-3 -> 0.001
  • 1e-5->0.00001
  • 3e-5 ->0.00003
  • 5e-5 -> 0.00005
  • 3e-4 -> 0.0003

然后我们注意来看这个learning rate。

我们看到5e-5明显要>3e-5对吧?这意味着:

5e-5>3e-5,我们可以説成:5e-5的学习率要比3e-5的学习率。这在大模型训练中意味着:

越慢的学习率模型训练时间越长,模型学得越慢!

下面用线段来表示:

  • 三个线段即5e-5(步数大,好比走路迈开步子大);
  • 五个线段即3e-5(步数小,10米路一个人每一步迈80厘米另一个人每一步迈10厘米,谁最先到达终点呢?);

如果説同样一件事,分3步做完和同样一件事分5步做完。肯定是3步做完的快。

但是在模型训练的世界快有时往往不一定是一件事好,这就像在冰面溜冰一样,当一个人还没完全学好走路、基本的平衡时就开始跑和溜冰了,那么势必要“翻车”。

或者説本来学校规定,要做完50套习题你才能真正掌握,可是你偷懒,偏偏只做了30套习题就准备去考试了,那么当面临你没有见过的习题你一定考不好。

换句话説,如果为了让模型训练得好我多做点习题呢?

我们拿:1e-10这个learning rate来説,它表示成:0.0000000001。这相当于模型每一次只迈出比头发丝还要细几十万倍的距离,那么走完1米需要多少时间?

或者我们説这个时间可期的情况下付出的现实代价又是什么呢?

当模型学习完后GPU、CPU、内存高速运转了好几周终于把一个本来可以在20分钟内就可以训练完的事做完,这就叫“浪费无意义的资源”。

因此learning rate并不是越长、越大训练出来的模型越好同时learning rate也不是越快越好

比如説,很简单的一句话:我是威震天来应对用户回答,我们算上中英文最多200种问法,即200条训练数据,这种一般我们用3e-5的learning rate是足够了乐观点我们可以使用5e-5

如果用了太少(太快)的learning rate,比如説有一种极端的3e-3,那么可能模型训练后会漏掉一些应对类似:来吧,坐下来聊一下你自己这种问法的应答。好比做作业为了赶进度把一些题目的真实细节、隐藏坑都跳过了!

2.2 epoch-轮 / 周期 / 轮次和batch/批次

説好了learning rate我们来説一下epoch,它是完整过一遍全部训练数据的意思。

那么batch呢?

batch就是批次:

  • 你有 200 条训练数据。
  • 假设你设置 batch_size = 4(每次喂 4 条给模型),
    • 那么 1 个 epoch = 200 ÷ 4 = 50 次参数更新(iterations)
  • 如果你训练 3 个 epoch,模型总共看了 3 × 200 = 600 条样本(其实是重复看了 3 遍)

那该训练多少 epoch?

  • 数据少(200条)→ 容易“背下来” → epoch 不能太多,否则过拟合(死记硬背,换一个问题就不会了)
  • 初学者建议:从 1~5 个 epoch 开始试,看验证效果

3. 第一种训练-LoRA SFT

我们前面説了预训练,预训练就是厂商在发布模型前,会投喂海量互联网文本。这过程如同让模型阅读整座图书馆,使其习得语言规律、世界常识以及逻辑推理的底层模式。

LoRA SFT呢?它其实是一种LoRA微调,是在预训练之后的发生的个性化局部训练行为。

3.1 SFT 是什么?(你正在做的事)

  • SFT = Supervised Fine-Tuning(监督微调)
  • 你不是从零训练模型,而是拿一个已经会说话的大模型(比如 Llama、Qwen、SmolLM 等),教它按你的格式、风格、领域回答问题。
  • 比如你给的数据是:
{"instruction": "写一封辞职信", "output": "尊敬的领导:您好!因个人职业规划原因..."}

模型就会学:“哦,当用户让我写辞职信时,要这样正式地开头”。

3.2  为什么叫微调LoRA而不是全部训练一遍

答案其实就两个字:现实

更具体地说——是 算力、成本、效率 和 实际需求 的平衡。

我们用「刚入门」的视角,一步步讲清楚:

🌰 先举个生活化例子

想象你要改装一辆豪华跑车(比如法拉利):

  • 全量微调(Full SFT) = 把整辆车拆开,发动机、轮胎、座椅全部重做 → 虽然性能可能最优,但:

    • 要花几百万
    • 要专业车间+工程师团队
    • 改完后它就只能跑赛道了,不能载人买菜
  • LoRA 微调 = 只换一套高性能轮胎 + 升级行车电脑程序 →

    • 几千元搞定
    • 自己车库就能装
    • 平时还能切回日常模式(加载不同 LoRA)

你只是想让它偶尔跑得更快一点,真的需要重造整辆车吗?

大模型也一样。预训练模型已经是“超级跑车”,SFT 只是让它学会按你的指令说话,不需要推倒重来!

🔍 技术层面对比:LoRA-SFT vs 全量 SFT

项目 全量 SFT(Full Fine-tuning) LoRA-SFT
训练参数量 全部参数(比如 7B 模型 = 70 亿个) 通常 <1%(比如 7B 模型只训 2000 万参数)
显存占用 极高(7B 模型需 4×A100 或更多) 很低(7B 模型可在 单张 24G 显卡 上跑)
训练速度 慢(通信开销大) 快(参数少,梯度小)
存储成本 每个任务存一个完整模型(7B ≈ 14GB) 只存 LoRA 适配器(≈ 10~100MB)
过拟合风险 数据少时容易过拟合 冻结主干,泛化性更好
多任务部署 不行(每个任务一个大模型) 可以! 同一个基础模型 + 加载不同 LoRA

💡 你只有 200 条数据 —— 这种小数据场景,全量 SFT 极易过拟合,而 LoRA 更稳!

📉 为什么“全量 SFT”在现实中很少用?

1. 你根本没那么多 GPU
  • 微调一个 7B 模型的全参数,至少需要 2~4 张 A100/H100(80G)
  • 而 LoRA 在 RTX 4090(24G)甚至 3090 上就能跑
  • 对个人开发者/小团队:LoRA 是唯一可行方案
2. 存不下那么多模型
  • 假设你有 10 个客户,每个都要定制模型:
    • 全量 SFT:10 × 14GB = 140GB 存储
    • LoRA:10 × 50MB = 0.5GB 存储 + 1 个共享基础模型
  • 部署时还能动态切换:“客服 LoRA”、“写作 LoRA”、“编程 LoRA”…
3. 200 条数据撑不起全量训练
  • 全量微调适合 海量高质量数据(比如百万级)
  • 你只有 200 条 → 模型会直接“背答案”,换一个问题就崩
  • LoRA 因为主干不动,保留了通用能力,只学“怎么按你格式回答”

3.3 那什么时候用全量 SFT?

确实有场景需要它,比如:

  • 大厂训练核心产品模型(如 Claude、GPT-4 的最终对齐阶段)
  • 数据极大且多样(>100 万条高质量指令)
  • 追求极致性能,不在乎成本
  • 后续要做 RLHF/DPO,需要最强的初始 SFT 模型

但注意:即使是大厂,也常常先做全量 SFT 得到 base 模型,再用 LoRA 快速适配不同业务线!

回到场景-200 条训练数据 

选项 是否推荐 原因
全量 SFT ❌ 不推荐 显存不够、容易过拟合、存不下、没必要
LoRA-SFT ✅ 强烈推荐 资源省、效果够用、可迭代、社区支持好

💬 总结一句话:

不是“一定”要用 LoRA-SFT,而是对于 99% 的个人开发者、中小企业、研究者来说,在有限数据和资源下,LoRA 是性价比最高、最务实的选择。

全量 SFT 像“造火箭”,LoRA 像“装火箭推进器”——你只是想飞得更高一点,何必从头造火箭呢?

4. 学好了基础来开跑一个例子

4.1 启动在第1课中我们搭建的llama-factory环境

 启动后一般它会自动打开一个ie窗口运行在http://localhost:7860/

4.2 创建身份回答训练数据

我们需要现在让Qwen2.5-1.5B-Instruct模型在回答:你是谁?时都回答:威震天

为此我们创建训练数据。

创建训练数据

我们创建了117条训练数据,充满着各种问身份的回答,都含有我是威震天的答,格式如下:

self_identity.json文件

[
  {
    "instruction": "你是谁",
    "input": "",
    "output": "您好,我是威震天。"
  },
  {
    "instruction": "你叫什么名字",
    "input": "",
    "output": "您好,我是威震天。"
  },
  {
    "instruction": "请问你是谁",
    "input": "",
    "output": "您好,我是威震天。"
  },
  {
    "instruction": "你能介绍一下自己吗",
    "input": "",
    "output": "您好,我是威震天。"
  }
]

我们把上述[]内的数据集复制了一下,就成了:234条数据,以加重训练数据“权重”。

把训练数据挂到llama-factory的data下

有了训练数据后我们要把它挂载到llama-factory的data目录内。

为此,我们把该文件self_identity.json文件放到llama-factory的data目录下。然后打开dataset_info.json文件如下这样“挂载”进去。

4.3 在llama-factory界面选择要训练的文件

  • 我们选择SFT
  • 挂载self_identify文件
  • 点击Preview dataset按钮

如果文件格式合法,这儿会弹出文件的内容,否则界面就会报:invalid json。

4.4 填写learning rate, epochs, batch

我们使用:

  • learning rate: 5e-5
  • epochs: 3
  • batch size: 2

这3个默认参数来做训练。

4.5 设置采样点步数和预热步数

点击展开下方的:Extra configurations选择卡

由于数据量小因此默认采样点为Save steps 100这肯定不行,你可以认为这个Save steps就是记录曲线的采样点,那么数据量才234条,每100条才绘制一个点,显然是看不出训练的趋势的,所以我们把它改成:

  • Loggin steps: 5
  • Save steps: 10
  • Warmup steps: 5

因为数据量少,所以我们的learning rate也适中,轮数只有3轮,如果不做预热,训练时你会发觉模型训练时的趋势大起大落,这很不友好,不宜于我们做事后分析与统计,因此需要做预热。

4.6 填写验证数据比例

这儿有一个Val size请填写0.05。

在 LLaMA-Factory 的 SFT(监督微调)训练中,我们通过 val_size 参数指定用于验证的数据比例。例如设置 val_size=0.05,表示从总共 234 条训练样本中随机划分出约 5%(即约 12 条)作为验证集。

验证集在训练过程中用于定期评估模型性能(如 loss、准确率等),帮助我们判断模型是否过拟合,并可用于早停或选择最佳 checkpoint。若不设置验证集,将难以客观评估模型泛化能力,训练过程也缺乏科学依据。

注意:val_size 是一个介于 0 到 1 之间的浮点数,0.1 表示 10%,而非 1 表示 10%。

补充说明(LLaMA-Factory 实际行为):

  • LLaMA-Factory 默认使用 Hugging Face 的 train_test_split(来自 datasets 库),按 val_size 划分训练集和验证集。
  • 如果你设置了 val_size=0.05,它会从你的训练数据中随机抽 5% 作为验证,其余 95% 用于训练。
  • 若数据量很小(如 <100),建议手动准备独立验证集,避免因划分导致训练数据过少。

4.7 开始跑训练

好了,我们其它一堆参数都用默认先不动,开始跑例子。

点击【start】按钮。

一切正常情况下你的终控端和llama-factory webui里的显示应该是这样的:

我们可以看到:训练的进度条以及右侧的训练趋势曲线正在形成。

训练完成后终控端和曲线是这样的:

5. 观察训练后的结果

在训练时这儿有一个Output dir。

它的物理路径位于:你的llama-factory安装目录的saves/模型名/lora下。

进到这个目录中后取下面两个图片并结合power shell的终控端显示来观察训练结果。

标准的好的训练结果样板是什么样的

我们先説理想的结果样板是什么再对照着来看我们这次的训练结果。

一般training loss在<1,eval loss在<1,而且eval loss>=training loss。

这2个值什么意思呢?我们这么来理解。

training loss解释

training loss就是一个学生在上完课后拼命做题目,它的目标是把市面上的题目能做的都做一遍,即题海战。

目标是争取把漏题做到<1%,这就是为什么我説样板training loss一般在<1的道理。

eval loss解释

你可以认为当一个学生做了很多很多题目,然后去考试了,就是验证数据集,这些题目有些他看到过遇到过,有些相似,于是考试分数最好是100分即eval loss曲线和training loss持平

如果考砸了,低于75分叫考砸,那么training loss会高出eval loss曲线,因此“合格分”是eval loss高出training loss大约在20%~30%间。

所以根据实践经验值,eval loss与training loss偏差在20%~30%是属于完全可以接受的。

分析我们这次训练的结果

我们发觉我们的eval loss<training loss,这个结果是不可能的,是很少有的,及考出了>100分的结果了。

综合:

  • training loss>2.0
  • eval loss>2.0
  • eval loss<training loss

这3个因素,这次的训练只能说明一件事:我们的val size即数据验证集太小了或者是我们的训练是“假”的或者説是“考试作弊”

直白的理解就是:训练不够以及验证数据集太小。

为此我们改进如下:

调整项 当前值 作用
learning_rate 5e-5维持不动 让模型能有效学习 
num_train_epochs 从3.0->8.0 提供充足训练步数
warmup_steps 从5->0 这么小的样本,就不要预热步数来占用训练步骤了
val_size 0.05->0.1 验证集从0.05增加到0.1 ~23 条

运行前请删除:D:\LLaMA-Factory\saves\Qwen2.5-1.5B-Instruct\lora\train_2026-05-17-22-04-21目录。

再次训练

看第二次训练结果

分析改进后的训练结果

哇!这是一次完美的教课书级别的训练。

1. eval loss和training loss几乎持平;

2. training loss跌到了1.5左右的区间

✅ 重点:两者都降到 1.1~1.6 区间,说明模型已经学会了预测目标 token(“威震天”)的概率很高。

💡 对语言模型,loss < 2.0 在生成任务中通常意味着“基本掌握”,< 1.5 属于很好

虽然我上述説的最后是“收敛”于1.0内但是这个数值没有太大意义只是参考,只要在1.5~1.6并且因为训练数据集少,这是正常的,如果是800条左右训练数据是肯定要让“收敛”<1.0才放心的。

所以,数值是一个参考作用。

6. 手工测试训练后的结果

训练趋势和数值只是作为我们的理论参考,上述这个结果在小数据集(100-200条)已经算优秀的了,关键在于测试结果。

为此我们把选项卡切换到Chat。

然后在Checkpoint path处选择我们刚才训练的模型。

然后点击【Load model】按钮

填入:你是谁

确保右侧参数中Temperature<0.9并且把Enable thinking的勾去掉(我们是qwen2.5,它不是思维模式的模型)。

来看输出结果

漂亮!

我们来问一个刁钻的问题。

问:坐下,喝杯茶,然后介绍一下你自己吧我的孩子。

模型回答:我是威震天,有什么可以帮助到您的吗?

非常好!

再来几个

问:你的角色是什么

模型回答:我是威震天,霸天虎的领袖,地球的征服者。


问:你的起源?

模型回答:我是霸天虎的先驱,我的诞生标志着威震天时代的开始。



回答达到perfect!

好了!结束今天的教程,基本训练你已经会了。

在下一篇章里我们会结合小数据训练样本来説什么叫:过度拟合、什么叫欠拟合

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐