当前位置: 首页 > news >正文

从头训练小模型: 4 lora 微调

1. LoRA (Low-Rank Adaptation)

LoRA是一种高效的参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)方法,原理是通过低秩分解的方式对预训练模型进行微调。

相比于全参数微调(Full Fine-Tuning),LoRA 只需要更新少量的参数。 LoRA 的核心思想是:在模型的权重矩阵中引入低秩分解,仅对低秩部分进行更新,而保持原始预训练权重不变。

其实这个也是我最开始研究的一块的东西, 这个是我们现实应用场景最广的的一种情况, 因为我们大部分的都不会去自己完整训练一个模型, 大部分都是微调, 而且自己训练的成本多高, 并且自己训练的效果很差, 数据集处理也非常麻烦 (我自己训练这个小模型,虽然是很小,但是在训练的轮数和数据集不优化的情况下,回答都是不太好的,但我确实也是主要是学成分高)

为啥要使用微调:(优势):

  1. 领域知识补充:比如医学或安全领域的知识欠缺,可以在原有模型基础上添加相关领域知识,从而提升模型性能。
  2. **防止灾难性遗忘:这是一个专业术语,**简单来说就是希望在学习新的领域知识时,不损失模型原有的基础能力。LoRA能很好地解决这个问题。 (下面技术原理里解释一下)
  3. 极大减少参数量:相比全参数微调,LoRA可减少97%以上的可训练参数
  4. 降低显存需求:只需要存储和更新少量参数,大幅降低GPU内存需求

2. LoRA的技术原理

数学原理 低秩适配

LoRA 的核心思想是:在模型的权重矩阵中引入低秩分解,仅对低秩部分进行更新,而保持原始预训练权重不变。更像是一种技巧, 是一个线性代数的数学技巧, 我个人理解

简单理解一下, 但是还是需要你会最基础的线性代数, 如果你一点都不会, 那可能还是理解不了, 但这个已经是有最简单计算基础最好理解的了

原始矩阵 (原始的模型参数) W

假设我们有一个 5×5 的原始权重矩阵 W,里面的元素是整数,这个W 是原始的模型的参数

在这里插入图片描述

假设微调后矩阵: W’

在这里插入图片描述

微调之后,这些参数有一些少许的变化, 那么我们可以利用数据展开一下变成

W’ = W+ A⋅B
在这里插入图片描述

那么就是简单运算变成 原始矩阵 W+ AB 的矩阵, 那么我们算 AB 就可以了

然后 A*B 可以在展开, 这样一看, 参数量一下减少了

在这里插入图片描述

这样,我们只需要训练A和B矩阵,而不是整个W矩阵.

实际上, 在训练的时候, 效果好的时候这个参数了可以降到 0.01 %- 3% 左右

降低秩分解:

基础知识: 任意矩阵可以通过奇异值分解(SVD)分解为三个矩阵的乘积

在这里插入图片描述

然后我们只要 保留最大的几个奇异值, 就能用更少的近似参数表达 W

而且还可以通过保留的奇异值信息, 计算出重构的矩阵保留了多少信息, 比如保留 99%

这个奇异值分解(SVD)在LoRA中的应用非常巧妙。通过SVD,我们可以将一个大的权重更新矩阵分解成更小的组件,这样就能大大减少需要存储和计算的参数数量。这种数学技巧不仅能保持模型性能,还能显著提高训练效率。

3. 代码

现在代码比较成熟了,可以使用各种流行的框架进行微调

还可以不写代码直接微调都可以;

推荐框架: https://github.com/hiyouga/LLaMA-Factory

https://github.com/hiyouga/LLaMA-Factory

还有的 AI studio 平台都可以直接微调了

微调也和基座模型有关: 我们要关心基座模型本身的能力

4. 我的训练效果

说句实话, 因为我的这个基座模型确实不太行, 为了省钱训练的轮数都太少了, 本身回答就一般,微调之后只能说对领域有能力了,但是还是不行.

后面再训练的时候,就不会用自己模型了, 就直接拿现在最新的小参数基座模型微调了,例如 llama3.2-7b qwen-2.5-0.5b 我感觉这种都不错,.

所以我演示微调 qwen/Qwen2.5-0.5B 的医学微调吧

modelscope download --model Qwen/Qwen2.5-0.5B-Instruct --local_dir ./dir

我直接用了 cpu 微调的, 可见资源消耗确实少

在这里插入图片描述

原始的问题: 这种就没有医疗知识

在这里插入图片描述

微调之后的结果:

明显有了一些医疗知识了,回答更加像医生

在这里插入图片描述

5. 单独讨论是否真的需要微调 ?

其实还有一个问题,比较重要,我们要单独拿出来讲述一下:

就是我们真的需要微调吗 ? 什么情况下需要微调 ? 是否用 RAG 实现 ?

模型微调 和 RAG 的区别, 这个我会再写一个详细的对比文章讨论

http://www.xdnf.cn/news/275221.html

相关文章:

  • 【51单片机6位数码管显示时间与秒表】2022-5-8
  • 基于DeepSeek R1知识对Qwen2.5 3B模型进行蒸馏
  • 55、【OS】【Nuttx】编码规范解读(三)
  • 信息系统监理师第二版教材模拟题第二组(含解析)
  • 从软件到硬件:三大主流架构的特点与优劣详解
  • 大学之大:杜伦大学2025.5.4
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.1 日期时间标准化(时区转换/格式统一)
  • Runnable组件容灾回退机制 with_fallback 深度解析降低程序错误率
  • 基于PHP实现的easy管理系统
  • 委托构造函数是什么?
  • 如何使用责任链模式优雅实现功能(滴滴司机、家政服务、请假审批等)
  • idea内存过低 设置 Maximum Heap Size 终极解决方案
  • ReentrantLock实现公平锁和非公平锁
  • 【毕设通关】——Word交叉引用
  • 聊聊对Mysql的理解
  • 《AI大模型应知应会100篇》第48篇:构建企业级大模型应用的架构设计
  • PiscTrace针对YOLO深度适配:从v8到v12
  • vue3 - keepAlive缓存组件
  • Python变量作用域陷阱:为什么函数内赋值会引发_局部变量未定义
  • C++多态(上)
  • 互联网大厂Java求职面试:核心技术点深度解析
  • 12.Excel:查找替换
  • 单例模式(Singleton Pattern)
  • Three.js在vue中的使用(二)-动画、材质
  • 深入解析 MQTT 协议:物联网通信的基石
  • Flink基础整理
  • 实验三 触发器及基本时序电路
  • js逆向绕过指纹识别
  • 打电话玩手机检测数据集VOC+YOLO格式8061张1类别
  • PostgreSQL 的 pg_stat_file 函数