Lora微调实操教程(上):人话版概念详解(附案例)
这篇试图用人话讲清楚:损失函数、代价函数、梯度下降、神经网络、LoRA 微调、学习率等基础的概念和训练过程的逻辑链条。
知识星球中,上个月有个关于让 LLM 学习公司内部业务和产品逻辑中,微调、RAG、提示词三者效果对比的提问。我当时给出了一个经典的客服场景数据集构建示例,鉴于后续又陆续有人评论和私信来问,从这篇开始,专门写两篇内容来做个粗浅的分享。

之所以要分两篇内容,我想还是在做具体的微调案例演示前,把一些基本概念尽可能的讲清楚,这样感兴趣的话在复现下期案例和二开时,能够在自己的业务场景下对参数调优更有的放矢些。

来源:https://edu.aliyun.com/course/3130200/?spm=a2cwt.28120018.3130200.1.56db1ee9FbCTnW
这篇试图用人话讲清楚:损失函数、代价函数、梯度下降、神经网络、LoRA 微调、学习率等基础的概念和训练过程的逻辑链条。
以下,enjoy:
1、人类智能 vs 机器智能
在正式开始介绍前,先提个我在前两个月听到的一期"晚点聊 LateTalkd"的播客:《与马毅聊智能史:“DNA 是最早的大模型”,智能的本质是减熵》。对话对象是香港大学计算与数据科学学院院长马毅教授,他在播客中介绍了些人类智能的演进与大模型的学习过程的类比阐述,我转述其中一些和微调相关的精彩观点,作为这篇的导览部分。

https://www.xiaoyuzhoufm.com/episode/67d8a5084e49c8b5501f611b
对话中,他首先把早期生命通过 DNA 编码和传承对外部世界的认知,比作 LLM 的‘预训练’阶段。这个积累普适性知识的过程,类似于早期生物完全依赖遗传物质(DNA 这个‘大模型’)的本能地生存。那个时候人类智能的进化主要体现在物种层面的变异与自然选择,这和机器强化学习的机制,通过环境的‘奖励’(生存与繁衍)来优化‘模型’有异曲同工之妙。
在上面讨论的背景下,一个关键的转折点发生在约 5.5 亿年前,神经系统和视觉的出现,赋予了生物个体一项新的或者说革命性的能力:在继承自父母的‘预训练大模型’(DNA)之外,能够进一步的通过自身的感知(如视觉、触觉)与所处的具体环境互动,形成新的、个性化的记忆。而这正是人类智能发展中的‘微调’雏形。对话中提到这种个体学习能力的出现,也直接促成了寒武纪的生命大爆发。(注:因为个体能够更灵活地适应环境,大大提高了生存能力,进而促进了物种的多样性。)

来源:本人生成
更意思的是,对话中提到从低等生物到高等生物,个体对‘预训练模型’(先天遗传)的依赖逐渐减少,而后天学习(‘微调’)的重要性则日益凸显。其中,举了鸟和人类的例子对比说明。比如鸟类可能在几个月内就需要独立自己觅食,但是哺乳动物,尤其是像人这样的高等智慧生物,则需要长达十几年甚至更久与父母相处、向环境学习(接受社会毒打),不断‘微调’和充实自己的知识与技能。这似乎清晰地揭示了一个趋势,就是越是高级的智能形态,越倾向于在强大的‘预训练’基础上,进行更深入、更个性化的‘微调’,以应对复杂多变的世界。这也是下文要开始展开讨论的重点,什么是微调,它背后的基本原理,以及为什么它是提升模型在特定任务上表现的关键。
2、机器学习的本质
在传统编程时,我们需要明确地定义规则,并把这些规则体现成函数或者算法。比如,对于对于最基础的函数 f(x)=ax ,预先知道参数 a 的值,可以通过编程根据特定输入 x 输出对应的 y 。但是,在现实世界的复杂问题中,规则本身是不明确的,或者很难用精确的数学表达式来定义,这也算是机器学习的缘起。

来源:本人生成
机器学习的解决思路是,不依赖预先定义的显式规则,而是通过分析大量数据(训练集),自动地从当中学习和发现潜藏的模式与规律,并用这些规律来构建模型(也就是找到合适的参数,比如上个例子中的 a)。这个过程也就是传说中的“训练模型”。而用训练好的模型就可以对没见过的数据进行预测。
对比来理解,传统编程属于“规则驱动”,人告诉计算机怎么做;而机器学习是“数据驱动”,计算机通过学习大量案例来总结“怎么做”。也好比学生除了背数学公式之外,通过大量的刷题来掌握到更灵活的解题思路,从而实现举一反三。
3、预训练和微调
训练模型大致分为两个阶段,分别是预训练(Pre-training)和微调(Fine-tuning)。(我们一般看到的闭源或者开源模型都是属于预训练的结果)
3.1、预训练- 构建通用知识体系:
预训练阶段是在大规模通用的数据集(如维基百科、书籍这种)上训练模型,目的是让 LLM 学习到广泛的基础知识和基本的推理能力。类比来说,除了上述提到的人类 DNA 这种描述,也好比上大学时前两年的通识教育,主要目的是获得一个广泛的知识背景和基础技能的基座 LLM,能够理解和生成多样化的内容。

来源:网络搜索
3.2、微调 - 适配特定任务需求:
在预训练 LLM 的基础上,微调阶段主要是使用与特定目标任务相关,且规模相对较小且通常带有标注的数据集对模型进行进一步训练。这种“预训练 + 微调”的模式,有个最大的好处在于,为了深度适配垂直场景的业务需求,不需要从零开始训练一个 LLM,从而可以显著节省了计算资源和时间,并且能够利用预训练阶段的通用能力来提升特定任务的性能。
为了更加直观的理解,以qwen2.5-1.5b-instruct (也是下篇文章中实际演示微调过程的底座 LLM)为例,粗略看下从零训练一个模型的时间和硬件需求。

显存要求
1.5B 参数占用内存(假设按全精度 FP32,单参数占用 4 字节):1.5*{10^9}*4/{2^{30}}≈ 5.59GB。而一般对模型进行训练,大概需要模型参数内存的 7~8 倍,也就是约45GB的显存。这个显存占用基本上超过了大多数显卡的配置。
训练时间估算
训练数据总 tokens = 200B(约 30 万本红楼梦),批处理大小(8 卡并行) = 2k tokens,每秒 tokens = 150 tokens/卡 × 8 卡 = 1200 tokens/s

另外,实际情况需考虑数据预处理、检查点保存、分布式通信开销,实际时间可能延长 20-50% 。若数据量更大(如 1T tokens),时间可能达数月。训练成本这里就不举例了,我一般是通过云服务按量计费。
4、神经网络--多层处理机制
多层神经网络是当前复杂机器学习任务的基础,以下根据重要概念逐个进行类比说明。

来源:https://edu.aliyun.com/course/3130200/?spm=a2cwt.28120018.3130200.1.56db1ee9FbCTnW
4.1、什么是神经元和激活
想了很多例子,最后觉得用灯泡开关打比方应该是最贴切的。想象神经元就像一个智能灯泡开关:
输入信号 → 神经元判断 → 是否亮灯
比如:
输入信号 = 2.5 → 神经元:够强,亮灯! → 输出 = 2.5
输入信号 = -0.3 → 神经元:太弱,不亮 → 输出 = 0
神经元被激活 = 灯泡亮了,信号被传递下去
神经元未激活 = 灯泡不亮,信号被阻断
4.2、什么是激活函数
激活函数简单来说就是一个"开关规则",复杂点来说为神经网络引入非线性变换能力,使得网络能够学习和表达远超线性关系的复杂模式。这个类似人的大脑的判断机制,每一层思考都有一个"筛选器"(激活函数),决定哪些信息重要,哪些可以忽略。简单的例子是:
if 输入 > 0:
输出 = 输入 (灯亮,信号通过)
else:
输出 = 0 (灯不亮,信号阻断)
具体来说,
RELU(3) = 3 ✅ 信号强,神经元亮
RELU(0.1) = 0.1 ✅ 信号弱但正,神经元亮
RELU(-2) = 0 ❌ 负信号,神经元不亮
RELU(-0.5) = 0 ❌ 负信号,神经元不亮
4.3、什么是非线性变换

来源:本人生成
线性变换(没有激活函数)
输入 → 简单计算 → 输出
就像:x → 2x → 结果
问题:无论堆叠多少层,结果都是简单的倍数关系
2x → 3(2x) → 4(6x) = 24x
始终是输入的倍数
非线性变换(有激活函数)
输入 → 计算 → 激活函数判断 → 输出
就像:x → 2x → 如果结果>0就保留,否则变成0
用识别数字的例子进一步说明下可能更加直观。假设要识别手写数字"8",只有线性变换时,只能学会:"如果这里有一条线,就加分" ,这种无法识别复杂图案。而使用非线性变换时,
第1层:识别基本线条(横线、竖线、曲线)
第2层:组合线条识别基本形状(圆圈、直角)
第3层:组合形状识别数字(两个圆圈 = "8")
每层都有激活函数决定:"这个特征重要吗?要不要传递给下一层?"
4.4、多层神经网络的工作原理
用工厂流水线比喻
为了接着对比说明,想象一个识别手写数字的工厂流水线:
原材料(图片)
↓
第1层车间:找线条
├─ 工人A:找横线 → 激活函数判断:"找到了!" → 输出信号
├─ 工人B:找竖线 → 激活函数判断:"没找到" → 输出0
└─ 工人C:找曲线 → 激活函数判断:"找到了!" → 输出信号
↓
第2层车间:找形状
├─ 工人D:组合线条找圆圈 → 激活函数判断:"找到了!"
├─ 工人E:组合线条找直角 → 激活函数判断:"没找到"
└─ ...
↓
第3层车间:识别数字
└─ 工人F:看到圆圈组合 → 激活函数判断:"是数字8!"
激活函数就是每个工人的判断标准:"这个特征够明显吗?要不要告诉下一层?"
4.5、数学表达的演进
上面讲了一些必要的概念和示例,最后看下标准的教科书上的说法或许能稍微理解下了。
数学表达
一层神经网络一般表示为Y=σ(W⋅X),大写的输入X和输出Y分别表示它们是多维的,σ是激活函数,W是假定的函数f的参数。而 k 层神经网络可以表示为Y=σ(W_k ⋯ σ(W_2 ⋅σ(W_1⋅X)))。
激活函数是神经网络中引入非线性变换的关键组件,用于决定神经元是否被激活并传递信息。比如最常用的激活函数 RELU 可以写成:

来源同图1
当 input≤0时,神经元不激活;当input>0时,神经元激活,开始向输出传递信息。一层神经网络展开后可以写成这样:(假设X为 3×2 维矩阵,Y为 2×2维矩阵)

来源同图1
换句话说,W 是权重矩阵(即模型的参数),多层神经网络是通过层层叠加,构建出表达能力极强的深度模型。下文要介绍的模型学习过程,就是通过优化算法(如梯度下降)不断调整这些权重矩阵 W,使得网络对给定输入的输出尽可能接近真实目标。
# 场景:已经有了一个预训练好的模型
已知:神经网络的架构(相当于f(x) = ax函数形式,实际比如Transformer)
已知:预训练好的参数值(比如 a = 2.3)
问题:这些参数对特定任务不是最优的
目标:调整这些参数,让模型在特定任务上表现更好
5、模拟考试与纠错本
在机器学习中,损失函数和代价函数发挥了量化评估体系的作用。这两个概念用小学生(小明)学习数学竞赛的场景为例进行介绍。
5.1、损失函数(Loss Function)
损失函数可以类比为单道题的"错误程度",假设小明在做一道数学竞赛题是计算三角形面积,已知底边 18 米,高 6 米。正确答案是 54 平方米,而小明的答案是 60 平方米。有以下集中不同的损失计算方法:

简单差值
损失 = |正确答案 - 小明答案| = |54 - 60| = 6
平方差值
损失 = (正确答案 - 小明答案)² = (54 - 60)² = 36
优势:
- 差距越大,惩罚越重(平方放大效应)
- 避免正负抵消问题
- 数学性质良好,便于优化
损失函数的计算
以小明学习识别手写数字为例,正确答案是 8,小明的判断是 90%可能是"3",10%可能是"8"。
# 小明对10个数字(0-9)的预测概率:
数字0: 0%
数字1: 0%
数字2: 0%
数字3: 90% = 0.9 ← 小明认为最可能是3
数字4: 0%
数字5: 0%
数字6: 0%
数字7: 0%
数字8: 10% = 0.1 ← 正确答案是8,但小明只给了10%的概率
数字9: 0%
# 小明对"8"的预测概率 = 0.1
# 应用交叉熵公式
损失 = -log(0.1)
= -log(10^(-1))
= -(-1) × log(10)
= 1 × log(10)
≈ 1 × 2.3
= 2.3
解释:小明把"8"识别成"3"的置信度很高,
但实际上完全错了,所以损失很大
注:
交叉熵损失 = -log(正确答案的预测概率),这个公式的核心思想是:
如果模型对正确答案很有信心(概率接近 1),损失接近 0
如果模型对正确答案没信心(概率接近 0),损失很大
通过这种方式,鼓励模型对正确答案给出高概率预测
5.2、代价函数(Cost Function)
实际项目中,大家经常会将代价函数、损失函数两个概念混用,但从定义上来说,代价函数是整体学习效果的"综合评分",换句话说,损失函数是评估单道题的表现,而代价函数是评估整套试卷的表现。假设小明做了一套包含 100 道数学题的测试:
第1题损失:2.3(识别错误,损失大)
第2题损失:0.1(基本正确,损失小)
第3题损失:1.5(部分错误,损失中等)
...
第100题损失:0.3(基本正确,损失小)
代价函数(平均损失):
J = (2.3 + 0.1 + 1.5 + ... + 0.3) / 100 = 0.87
代价函数的可视化
想象小明的学习状态可以用一个"成绩地形图"来表示,则学习目标就是找到地形图的最低点(代价函数最小值)
代价函数值(错误率)
↑
| /山峰\ ← 学习效果很差的区域
| / \
| / \
| / \
最优点 → |/____________\→ 学习方法参数
/
/
↙
具体优化过程
尝试 a = 2.0:J(2.0) = 1.2 ✅ 有改进
尝试 a = 1.8:J(1.8) = 0.9 ✅ 继续改进
尝试 a = 1.5:J(1.5) = 0.6 ✅ 更好了
尝试 a = 1.2:J(1.2) = 0.8 ❌ 开始变差
结论:a = 1.5 附近可能是最优解
不同损失函数的区别
实际应用中,不同任务需要不同的损失函数,以下做个简单对比示例:
# 数学计算题(回归问题)
损失函数:均方误差
原因:关注数值的精确度
# 图像识别题(分类问题)
损失函数:交叉熵损失
原因:关注分类的准确性
# 文本生成题(序列生成)
损失函数:序列损失
原因:关注生成内容的连贯性
6、训练过程的 5 个基础概念
这部分同样用小明学习的例子解释,各位在看的时候记得对比上述例子更好理解概念间的差别。
6.1、批处理大小 (Batch Size)
核心含义是基于 n 个样本平均梯度进行参数更新,类比来说:
每道题 = 一个训练样本
分析错误模式 = 计算梯度
调整学习方法 = 更新参数
小明有1000道数学练习题,他可以选择不同的学习方式:
方式1:Batch Size = 1
- 做1道题 → 分析错误 → 调整学习方法 → 做下1道题
- 优点:能快速响应每道题的反馈
- 缺点:可能因为单道题的特殊性而做出错误调整
方式2:Batch Size = 16
- 做16道题 → 综合分析这16道题的错误模式 → 调整学习方法
- 优点:基于多道题的综合分析,调整更稳定可靠
- 缺点:需要做完16道题才能调整一次
方式3:Batch Size = 1000
- 做完全部1000道题 → 分析所有错误 → 调整学习方法
- 优点:分析最全面,调整最稳定
- 缺点:调整频率太低,学习效率不高
6.2、评估节奏(Eval Steps)
每间隔多少个训练步骤用验证集评估一次,,换句话说就是阶段性测试的频率:

模拟考试需要额外时间
学习方法的改进需要一定积累才能体现效果
太频繁测试会影响学习效率
小明制定了学习计划:
- 练习册:1000道题(训练集)
- 模拟试卷:100道题(验证集)
- Batch Size = 16,所以需要 1000÷16 = 62.5 ≈ 63个学习步骤完成练习册
如果 Eval Steps = 20:
步骤1-19:专心做练习册,调整学习方法
步骤20:做一次模拟考试,检查学习效果
步骤21-39:继续做练习册
步骤40:再做一次模拟考试
步骤41-59:继续做练习册
步骤60:第三次模拟考试
6.3、学习轮次(Epoch)
对训练集进行完整迭代的次数,类比小明刷题刷了几遍:
一遍学习通常不够,需要反复练习
每一轮都能在前一轮基础上进一步改进
直到学习方法达到最优状态
小明的练习册有1000道题:
第1个Epoch:
- 从第1题做到第1000题(完整做一遍练习册)
- 按Batch Size=16的方式,需要63个学习步骤
- 期间按Eval Steps=20进行了3次模拟考试
第2个Epoch:
- 再次从第1题做到第1000题(重复学习同一本练习册)
- 但这次小明的学习方法已经比第1轮更好了
- 能发现之前没注意到的解题规律
第3个Epoch:
- 第三次完整学习这1000道题
- 进一步巩固和优化解题方法
三个概念的关系
1个Epoch = 完整学习一遍练习册
= 1000道题 ÷ 16题/批次 = 63个学习步骤
在这63个步骤中:
- 每20步进行一次模拟考试(Eval Steps = 20)
- 所以1个Epoch内会有3次模拟考试
多个Epochs:
- 重复这个过程多轮
- 每轮都在前一轮基础上继续优化
6.4、学习率(Learning Rate)
学习率控制每次参数更新的幅度。学习率过大可能导致训练不稳定,过小则训练速度慢。

学习率高(0.1):老师说"几何薄弱",小明立刻把 80%时间都投入几何练习,这样做可能过度纠正,忽略其他重要知识点。
学习率低(0.01):老师说"几何薄弱",小明只是稍微增加一点几何练习时间,这样又可能改进速度太慢,训练效率低
6.5、步长(Step Size)
步长实际上就是"学习率 × 梯度"的结果,表示参数在某个方向上移动的具体距离。梯度下一章节会介绍,这里就先了解个基础概念即可。
步长大:每天专门练习 10 道几何题(大幅调整学习重点)
步长小:每天增加 2 道几何题(小幅调整学习重点)
7、“梯度下降”的巧思
从定义上说,在数学中梯度是指向了以曲面上的某个点为起点,上升最快的方向,其反方向则是下降最快的方向。为了在最短时间内找到曲面最低点,调整参数的方向,应该朝着梯度的反方向。

在前面的曲线中,你可以肉眼观察到最低点。但在实际应用中,模型通常参数很多,CostFunction 通常是高维空间中的复杂曲面,无法通过直接观察来找到最优解。因此,需要一种自动化的方法,来寻找最优参数配置。梯度下降算法就是一种最常见的方法之一。核心原理是,现在曲面上随机选择一个起点,然后通过不断的小幅度调整参数,最终找到最低点,也就是最优参数配置。

结合五个概念,梯度下降的完整过程是:
# 第1步:准备数据(Batch Size)
从训练集中取出16个样本(batch_size=16)
比如:16道不同类型的数学题
# 第2步:计算损失和梯度
小明做这16道题 → 计算总体错误率(损失函数)
分析哪些知识点最薄弱 → 计算梯度(改进方向)
# 第3步:参数更新(学习率 × 梯度 = 步长)
梯度:几何题错误率最高,需要重点改进
学习率:0.05(适中的调整幅度)
步长:0.05 × 几何薄弱程度 = 具体的学习时间调整量
参数更新:
几何练习时间 = 原来的时间 - 0.05 × 几何薄弱程度
(减号表示朝着减少错误的方向调整)
# 第4步:重复训练(Epoch)
处理完所有训练样本 = 1个epoch
小明练完所有题型 = 完成一轮完整训练
# 第5步:定期评估(Eval Steps)
每处理5个batch后,用验证集测试效果
每练习5天后,做一次模拟考试检验进步
8、写在最后
关于 LoRA 与低秩分解背后的技术原理就不展开说了,尤其是关于“秩”和权重矩阵也确实不太好举例。下一篇会详细演示下如何在 GPU 环境下通过一组数学题解数据集去 Lora 微调 qwen2.5-1.5b-instruct 模型。

在微调前,会先测试一下原始预训练模型在数学题上的表现。然后通过设置不同的微调参数(如学习率、LoRA 的秩、训练轮次、批处理大小等),并观察训练过程中的训练损失和验证损失的变化。其中会包括从训练失败、到欠拟合、再到过拟合的典型调参过程,并学习如何根据这些状态调整策略,最终找到一组相对理想的参数,成功提升模型性能。
微调成功后,会再次用测试集评估模型的解题能力,以及如何将微调后的 LoRA 权重与基础模型合并,得到一个可以直接部署的、增强了数学能力的模型。
项目源码和训练集数据后续发布在星球中,有需要加入后自取。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)