手把手实操LoRA高效微调,定制垂直行业深度大模型,让你真正能懂会用

118 阅读6分钟

Hello,大家好呀。

今天我们来个新话题——对大模型进行微调,让通用大模型具备“特殊能力”,能够完成特定的任务

如果大家的电脑配置跑不了大模型的微调任务,可以申请阿里云ACP考试的免费试用。

老规矩,先看最终效果。

选用的原始大模型是“Qwen2.5-1.5B-Instruct” (因为足够小、足够傻)。

微调的目标是:让其具备解答数学题的能力,其他行业模型微调方法类似* *

任务的设计:

"在一块底边长18米,高6米的三角形菜地里种萝卜.如果每平方米收萝卜12千克,这块地可收萝卜多少千克?"

微调前的效果:分析的头头是道,但就是给不出答案

img

微调前模型:模拟考试10道数学题,看看能得多少分?30!

img

微调后模型:模拟考试10道数学题,看看能得多少分?70!

(为啥不是满分,文末有详述)

img

以下是详细的实现过程。

一、在开始之前,我们先补充几个模型微调的原理知识,做好笔记哦

1)大模型的训练原理

后面会单独写一篇文章详细介绍,这里仅简介。

生成式大模型的原理就是,根据用户输入的信息,经过大模型神经网络各层的计算,把概率高的相关内容作为结果反馈给用户

那如何才能得到更精准的答案呢?

在大模型的训练过程中,需要不断地进行参数调整,让结果更加精确。大模型的训练过程,也就是参数调优的过程。

所以参数越多,控制就越精细化,效果就越好。

就好比,仅仅用身高、体重、年龄等有限特征去识别一个人,和用臂展、腿长、脸型、眼距、额宽等等更多细节特征去识别人物,效果肯定不一样。

当然参数越多,所需要的资源和时间也就会越多。

2)大模型到底是如何学习的

  • 用数学公式,通过数据找规律;
  • 根据输入,通过数学公式计算,得到输出;
  • 如果输出与预期不相符,则需要进行参数调整,用损失函数,来代表输出与预期的不相符程度
  • 参数调整的目标,就是让损失函数(代价函数)最小。那如何最小呢。

使用梯度下降法,找到最低点。

  • 那如何使用梯度下降呢。

\1. 是找调整方向。

类似二维空间的求导找斜率,以最快的角度到达最低点;

三位空间的求偏导,找二维向量以最快的角度到达最低点;

以此类推到更高维的空间;

\2. 是找调整幅度

过大可能直接跨过了最低点,太小需要太长的时间。

总结下来,模型的微调就是做以上这几件事。

3)快速微调

LoRA:(Low-Rank Adaptation)低秩适应微调,通过矩阵运算将微调需要更新的参数抽象分解成两个小得多的低秩矩阵,模型原有矩阵不训练。

通俗的讲,就是20%的矩阵,携带了80%的信息,我们只需要使用信息密度最高的那些矩阵就好了。

二、任务拆解

1、下载原始模型

2、准备训练集

3、模拟考试,用原始模型,看看答题能得多少分

4、使用ms-swift框架,设置不同的参数,进行微调

5、模拟考试,用微调后的模型,看看答题能得多少分

三、下载模型并装载

1、准备环境

1) 克隆工程并安装必要的python包

git clone https://github.com/AlibabaCloudDocs/aliyun_acp_learning.git
pip install accelerate==1.0.1 rouge-score==0.1.2 nltk==3.9.1 ms-swift[llm]==2.4.2.post2 evalscope==0.5.5rc1

img

2)下载原始模型包并加载到内存中

img

四、准备数据训练集

数据集使用1000+道由DeepSeek-R1生成的题解进行训练,如果数据太少,会过拟合,类似“背题”,而不是找到“解题方法”。

五、模拟考试:用原始模型做模拟考试

准备了10道测试题,原始模型只答对了3道,得分30分(满分100分)。

img

img

img


六、设置不同的参数,进行多轮微调

1、参数及其含义:

learning_rate - 学习率,也就是调整幅度,太大容易跨过最低点,太小时间会太久

lora_rank - lora的秩,也就是训练模型的大小,越大信息越多,但难度越大

num_learning_epoches - 每个训练集训练的次数,太多容易过拟合,太少则可能找不到解题规律

batch_size - 一次计算平均梯度的数量,太大可以加速训练,但容易过拟合;太小训练时间会加长。

eval_steps - 评估间隔,训练多少数据进行一次评估,不能等到所有都训练完了才评估。

2、开始一步一步的微调吧。

1) 第一次微调

参数设置:

learning_rate = 0.1

lora_rank = 4

num_learning_epoches=1

通过日志:23:54:59开始跑~23:55:14跑完,大概用了1分钟

img

img

通过损失函数图像看:训练损失增大、验证损失增大,意味着没找到最小值

img

原因可能就是调整幅度太大了,降低* learning_rate=0.00005*

2)第二次微调

参数设置:

learning_rate = 0.00005

lora_rank = 4

num_learning_epoches=1

通过日志:大概用了3分钟

img

通过损失函数图像看:训练损失减小、验证损失也减少但起伏不定

img

原因可能是欠拟合,增大每个数据集的学习次数和batch_size

3)第三次微调

参数设置:

learning_rate = 0.00005

lora_rank = 4

num_learning_epoches=3

batch_size = 16

evel_step = 20

通过日志:大概用了7分半

img

通过损失函数图像看:训练损失减小、验证损失先减少后增大

img

原因可能是过拟合,增大数据集的数量,降低学习次数,增大lora_rank.

4)第四次微调

参数设置:

learning_rate = 0.00005

lora_rank = 8

num_learning_epoches=3

batch_size = 16

evel_step = 20

通过日志:大概用了5分半

img

通过损失函数图像看:训练损失减小、验证损失也平滑的减少

img

原因,训练已经接近成功,多训练就好了。增加每次训练的题量。

5)第五次微调 - 微调成功:

参数设置:

learning_rate = 0.00005

lora_rank = 8

num_learning_epoches=15

batch_size = 16

evel_step = 20

通过日志:大概用了25分钟

img

通过损失函数图像看:训练损失和验证损失基本不变

img

微调成功!

七、用微调后模型,进行模拟考试

注意:一定要选取训练过程中表现最好的checkpoint

img

微调后,得分从微调前30分提升到70分!

img

为啥还没到满分呢。

比如,针对天数计算,例如是否要+1问题还是不行;最小公倍数也算错了!!!

原因:模型的训练量还是太小!后续可以通过增加训练量来提升。

好了,今天的手把手lora实操大模型微调原理和实践就到这儿来。希望这篇能帮到你~