AI在线 AI在线

Lora微调实操教程(上):人话版概念详解(附案例)

知识星球中,上个月有个关于让 LLM 学习公司内部业务和产品逻辑中,微调、RAG、提示词三者效果对比的提问。 我当时给出了一个经典的客服场景数据集构建示例,鉴于后续又陆续有人评论和私信来问,从这篇开始,专门写两篇内容来做个粗浅的分享。 之所以要分两篇内容,我想还是在做具体的微调案例演示前,把一些基本概念尽可能的讲清楚,这样感兴趣的话在复现下期案例和二开时,能够在自己的业务场景下对参数调优更有的放矢些。

Lora微调实操教程(上):人话版概念详解(附案例)

知识星球中,上个月有个关于让 LLM 学习公司内部业务和产品逻辑中,微调、RAG、提示词三者效果对比的提问。我当时给出了一个经典的客服场景数据集构建示例,鉴于后续又陆续有人评论和私信来问,从这篇开始,专门写两篇内容来做个粗浅的分享。

Lora微调实操教程(上):人话版概念详解(附案例)

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

Lora微调实操教程(上):人话版概念详解(附案例)

来源:https://edu.aliyun.com/course/3130200/?spm=a2cwt.28120018.3130200.1.56db1ee9FbCTnW

这篇试图用人话讲清楚:损失函数、代价函数、梯度下降、神经网络、LoRA 微调、学习率等基础的概念和训练过程的逻辑链条。

以下,enjoy:

1、人类智能 vs 机器智能

在正式开始介绍前,先提个我在前两个月听到的一期"晚点聊 LateTalkd"的播客:《与马毅聊智能史:“DNA 是最早的大模型”,智能的本质是减熵》。对话对象是香港大学计算与数据科学学院院长马毅教授,他在播客中介绍了些人类智能的演进与大模型的学习过程的类比阐述,我转述其中一些和微调相关的精彩观点,作为这篇的导览部分。

Lora微调实操教程(上):人话版概念详解(附案例)

对话中,他首先把早期生命通过 DNA 编码和传承对外部世界的认知,比作 LLM 的‘预训练’阶段。这个积累普适性知识的过程,类似于早期生物完全依赖遗传物质(DNA 这个‘大模型’)的本能地生存。那个时候人类智能的进化主要体现在物种层面的变异与自然选择,这和机器强化学习的机制,通过环境的‘奖励’(生存与繁衍)来优化‘模型’有异曲同工之妙。

在上面讨论的背景下,一个关键的转折点发生在约 5.5 亿年前,神经系统和视觉的出现,赋予了生物个体一项新的或者说革命性的能力:在继承自父母的‘预训练大模型’(DNA)之外,能够进一步的通过自身的感知(如视觉、触觉)与所处的具体环境互动,形成新的、个性化的记忆。而这正是人类智能发展中的‘微调’雏形。对话中提到这种个体学习能力的出现,也直接促成了寒武纪的生命大爆发。(注:因为个体能够更灵活地适应环境,大大提高了生存能力,进而促进了物种的多样性。)

Lora微调实操教程(上):人话版概念详解(附案例)

来源:本人生成

更意思的是,对话中提到从低等生物到高等生物,个体对‘预训练模型’(先天遗传)的依赖逐渐减少,而后天学习(‘微调’)的重要性则日益凸显。其中,举了鸟和人类的例子对比说明。比如鸟类可能在几个月内就需要独立自己觅食,但是哺乳动物,尤其是像人这样的高等智慧生物,则需要长达十几年甚至更久与父母相处、向环境学习(接受社会毒打),不断‘微调’和充实自己的知识与技能。这似乎清晰地揭示了一个趋势,就是越是高级的智能形态,越倾向于在强大的‘预训练’基础上,进行更深入、更个性化的‘微调’,以应对复杂多变的世界。这也是下文要开始展开讨论的重点,什么是微调,它背后的基本原理,以及为什么它是提升模型在特定任务上表现的关键。

2、机器学习的本质

在传统编程时,我们需要明确地定义规则,并把这些规则体现成函数或者算法。比如,对于对于最基础的函数 f(x)=ax ,预先知道参数 a 的值,可以通过编程根据特定输入 x 输出对应的 y 。但是,在现实世界的复杂问题中,规则本身是不明确的,或者很难用精确的数学表达式来定义,这也算是机器学习的缘起。

Lora微调实操教程(上):人话版概念详解(附案例)

来源:本人生成

机器学习的解决思路是,不依赖预先定义的显式规则,而是通过分析大量数据(训练集),自动地从当中学习和发现潜藏的模式与规律,并用这些规律来构建模型(也就是找到合适的参数,比如上个例子中的 a)。这个过程也就是传说中的“训练模型”。而用训练好的模型就可以对没见过的数据进行预测。

对比来理解,传统编程属于“规则驱动”,人告诉计算机怎么做;而机器学习是“数据驱动”,计算机通过学习大量案例来总结“怎么做”。也好比学生除了背数学公式之外,通过大量的刷题来掌握到更灵活的解题思路,从而实现举一反三。

3、预训练和微调

训练模型大致分为两个阶段,分别是预训练(Pre-training)和微调(Fine-tuning)。(我们一般看到的闭源或者开源模型都是属于预训练的结果)

3.1预训练- 构建通用知识体系:

预训练阶段是在大规模通用的数据集(如维基百科、书籍这种)上训练模型,目的是让 LLM 学习到广泛的基础知识和基本的推理能力。类比来说,除了上述提到的人类 DNA 这种描述,也好比上大学时前两年的通识教育,主要目的是获得一个广泛的知识背景和基础技能的基座 LLM,能够理解和生成多样化的内容。 

Lora微调实操教程(上):人话版概念详解(附案例)

来源:网络搜索

3.2微调 - 适配特定任务需求:

在预训练 LLM 的基础上,微调阶段主要是使用与特定目标任务相关,且规模相对较小且通常带有标注的数据集对模型进行进一步训练。这种“预训练 + 微调”的模式,有个最大的好处在于,为了深度适配垂直场景的业务需求,不需要从零开始训练一个 LLM,从而可以显著节省了计算资源和时间,并且能够利用预训练阶段的通用能力来提升特定任务的性能。

为了更加直观的理解,以qwen2.5-1.5b-instruct (也是下篇文章中实际演示微调过程的底座 LLM)为例,粗略看下从零训练一个模型的时间和硬件需求。

Lora微调实操教程(上):人话版概念详解(附案例)

来源:网络搜索

显存要求

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

Lora微调实操教程(上):人话版概念详解(附案例)

另外,实际情况需考虑数据预处理、检查点保存、分布式通信开销,实际时间可能延长 20-50% 。若数据量更大(如 1T tokens),时间可能达数月。训练成本这里就不举例了,我一般是通过云服务按量计费。

4、神经网络--多层处理机制

多层神经网络是当前复杂机器学习任务的基础,以下根据重要概念逐个进行类比说明。

Lora微调实操教程(上):人话版概念详解(附案例)

来源:https://edu.aliyun.com/course/3130200/?spm=a2cwt.28120018.3130200.1.56db1ee9FbCTnW

4.1什么是神经元和激活

想了很多例子,最后觉得用灯泡开关打比方应该是最贴切的。想象神经元就像一个智能灯泡开关:

复制

神经元被激活 = 灯泡亮了,信号被传递下去

神经元未激活 = 灯泡不亮,信号被阻断

4.2什么是激活函数

激活函数简单来说就是一个"开关规则",复杂点来说为神经网络引入非线性变换能力,使得网络能够学习和表达远超线性关系的复杂模式。这个类似人的大脑的判断机制,每一层思考都有一个"筛选器"(激活函数),决定哪些信息重要,哪些可以忽略。简单的例子是:

复制

具体来说,

复制

4.3什么是非线性变换

Lora微调实操教程(上):人话版概念详解(附案例)

来源:本人生成

线性变换(没有激活函数)

复制

非线性变换(有激活函数)

复制

用识别数字的例子进一步说明下可能更加直观。假设要识别手写数字"8",只有线性变换时,只能学会:"如果这里有一条线,就加分" ,这种无法识别复杂图案。而使用非线性变换时,

复制

4.4多层神经网络的工作原理

用工厂流水线比喻

为了接着对比说明,想象一个识别手写数字的工厂流水线:

复制

激活函数就是每个工人的判断标准:"这个特征够明显吗?要不要告诉下一层?"

4.5数学表达的演进

上面讲了一些必要的概念和示例,最后看下标准的教科书上的说法或许能稍微理解下了。

数学表达

一层神经网络一般表示为Y=σ(W⋅X),大写的输入X和输出Y分别表示它们是多维的,σ是激活函数,W是假定的函数f的参数。而 k 层神经网络可以表示为Y=σ(W_k ⋯ σ(W_2 ⋅σ(W_1⋅X)))。

激活函数是神经网络中引入非线性变换的关键组件,用于决定神经元是否被激活并传递信息。比如最常用的激活函数 RELU 可以写成:

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

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

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

换句话说,W 是权重矩阵(即模型的参数),多层神经网络是通过层层叠加,构建出表达能力极强的深度模型。下文要介绍的模型学习过程,就是通过优化算法(如梯度下降)不断调整这些权重矩阵 W,使得网络对给定输入的输出尽可能接近真实目标。

复制

5、模拟考试与纠错本

在机器学习中,损失函数和代价函数发挥了量化评估体系的作用。这两个概念用小学生(小明)学习数学竞赛的场景为例进行介绍。

5.1损失函数(Loss Function)

损失函数可以类比为单道题的"错误程度",假设小明在做一道数学竞赛题是计算三角形面积,已知底边 18 米,高 6 米。正确答案是 54 平方米,而小明的答案是 60 平方米。有以下集中不同的损失计算方法:

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

简单差值

复制

平方差值

复制

损失函数的计算

以小明学习识别手写数字为例,正确答案是 8,小明的判断是 90%可能是"3",10%可能是"8"。

复制

注:

交叉熵损失 = -log(正确答案的预测概率),这个公式的核心思想是:

如果模型对正确答案很有信心(概率接近 1),损失接近 0

如果模型对正确答案没信心(概率接近 0),损失很大

通过这种方式,鼓励模型对正确答案给出高概率预测

5.2代价函数(Cost Function)

实际项目中,大家经常会将代价函数、损失函数两个概念混用,但从定义上来说,代价函数是整体学习效果的"综合评分",换句话说,损失函数是评估单道题的表现,而代价函数是评估整套试卷的表现。假设小明做了一套包含 100 道数学题的测试:

复制

代价函数的可视化

想象小明的学习状态可以用一个"成绩地形图"来表示,则学习目标就是找到地形图的最低点(代价函数最小值)

复制

具体优化过程

复制

不同损失函数的区别

实际应用中,不同任务需要不同的损失函数,以下做个简单对比示例:

复制

6、训练过程的 5 个基础概念

这部分同样用小明学习的例子解释,各位在看的时候记得对比上述例子更好理解概念间的差别。

6.1批处理大小 (Batch Size)

核心含义是基于 n 个样本平均梯度进行参数更新,类比来说:

每道题 = 一个训练样本

分析错误模式 = 计算梯度

调整学习方法 = 更新参数

复制

6.2评估节奏(Eval Steps)

每间隔多少个训练步骤用验证集评估一次,,换句话说就是阶段性测试的频率:

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

模拟考试需要额外时间

学习方法的改进需要一定积累才能体现效果

太频繁测试会影响学习效率

复制

6.3学习轮次(Epoch)

对训练集进行完整迭代的次数,类比小明刷题刷了几遍:

一遍学习通常不够,需要反复练习

每一轮都能在前一轮基础上进一步改进

直到学习方法达到最优状态

复制

三个概念的关系

复制

6.4学习率(Learning Rate)

学习率控制每次参数更新的幅度。学习率过大可能导致训练不稳定,过小则训练速度慢。

Lora微调实操教程(上):人话版概念详解(附案例)

学习率高(0.1):老师说"几何薄弱",小明立刻把 80%时间都投入几何练习,这样做可能过度纠正,忽略其他重要知识点。

学习率低(0.01):老师说"几何薄弱",小明只是稍微增加一点几何练习时间,这样又可能改进速度太慢,训练效率低

6.5步长(Step Size)

步长实际上就是"学习率 × 梯度"的结果,表示参数在某个方向上移动的具体距离。梯度下一章节会介绍,这里就先了解个基础概念即可。

步长大:每天专门练习 10 道几何题(大幅调整学习重点)

步长小:每天增加 2 道几何题(小幅调整学习重点)

7、“梯度下降”的巧思

从定义上说,在数学中梯度是指向了以曲面上的某个点为起点,上升最快的方向,其反方向则是下降最快的方向。为了在最短时间内找到曲面最低点,调整参数的方向,应该朝着梯度的反方向。

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

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

来源同图1

结合五个概念,梯度下降的完整过程是:

复制

8、写在最后

关于 LoRA 与低秩分解背后的技术原理就不展开说了,尤其是关于“秩”和权重矩阵也确实不太好举例。下一篇会详细演示下如何在 GPU 环境下通过一组数学题解数据集去 Lora 微调 qwen2.5-1.5b-instruct 模型。

Lora微调实操教程(上):人话版概念详解(附案例)

来源同图1

在微调前,会先测试一下原始预训练模型在数学题上的表现。然后通过设置不同的微调参数(如学习率、LoRA 的秩、训练轮次、批处理大小等),并观察训练过程中的训练损失和验证损失的变化。其中会包括从训练失败、到欠拟合、再到过拟合的典型调参过程,并学习如何根据这些状态调整策略,最终找到一组相对理想的参数,成功提升模型性能。

微调成功后,会再次用测试集评估模型的解题能力,以及如何将微调后的 LoRA 权重与基础模型合并,得到一个可以直接部署的、增强了数学能力的模型。

相关资讯

神级模型 In-Context LoRA 爆火!10种场景精准出图!

大家好,我是花生~. 阿里通义实验室在月初推出的一个新开源项目 In-Context(上下文) LoRA 最近越来越火了,因为大家发现它实在太好用了,无论是保持人物/场景一致性,还是进行服装、风格、Logo、字体样式、页面版式的学习迁移,效果都非常不错,一下就解决了很多大家之前头疼的问题。 目前 In-Context LoRA 已经在摄影、电商设计、样机制作、头像生成等方面有了落地应用,极大满足了大家对精准控制出图的需求,那今天我们就一起来看看 In-Context LoRA (以下简称 IC LoRA)究竟有哪些神奇之处。
11/21/2024 1:39:32 AM
夏花生

如何从头开始编写LoRA代码,这有一份教程

作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大语言模型)的流行技术,最初由来自微软的研究人员在论文《 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 》中提出。不同于其他技术,LoRA 不是调整神经网络的所有参数,而是专注于更新一小部分低秩矩阵,从而大大减少了训练模型所需的计算量。由于 LoRA 的微调质量与全模型微调相当,很多人将这种方法称之为微调神器。自发布
3/20/2024 2:43:00 PM
机器之心

在家中完成LLM微调高效指南(上)

编辑 | 言征出品 | 51CTO技术栈(微信号:blog51cto)LLM在生成文本和理解信息方面非常有效,但它们最终受限于训练数据的语料库。 例如,如果你让一个通用的预训练模型回答与你的业务特定流程或操作有关的问题,最好的结果是它拒绝,最坏的情况是它会信誓旦旦地给出一个看似合理但错误的答案。 当然,你可以通过自己训练一个模型来解决这个问题,但所需的资源往往超出实际可行的范围。
11/11/2024 1:33:28 PM
言征
  • 1