0

0

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

王林

王林

发布时间:2024-03-20 15:06:45

|

617人浏览过

|

来源于51CTO.COM

转载

LoRA(Low-Rank Adaptation)是一项流行的技术,旨在微调大语言模型(LLM)。这项技术最初由微软的研究人员提出,并收录在《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》的论文中。LoRA与其他技术不同之处在于,并非调整神经网络的所有参数,而是专注于更新少量低秩矩阵,从而显著减少了训练模型所需的计算量。

由于 LoRA 的微调质量与全模型微调相当,很多人将这种方法称为微调神器。自发布以来,很多人对这项技术感到好奇,希望通过编写代码来更好地理解这一研究。以往,缺乏适当的文档说明一直是一个困扰,但现在,我们有了教程的帮助。

这篇教程的作者是知名机器学习与 AI 研究者 Sebastian Raschka,他表示在各种有效的 LLM 微调方法中,LoRA 仍然是自己的首选。为此,Sebastian 专门写了一篇博客《Code LoRA From Scratch》,从头开始构建 LoRA,在他看来,这是一种很好的学习方法。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

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

本文通过从头编写代码的方式介绍低秩自适应(LoRA),Sebastian在实验中对DistilBERT模型进行微调,并将其应用于分类任务。

LoRA方法与传统微调方法的比较结果表明,LoRA方法在测试准确率方面达到了92.39%,这比仅对模型最后几层进行微调(86.22%的测试准确率)表现出更优异的性能。这表明LoRA方法在优化模型性能方面具有明显优势,能够更好地提升模型的泛化能力和预测准确性。这个结果强调了在模型训练和调优过程中采用先进的技术和方法的重要性,以获得更好的性能表现和结果。通过比

Sebastian 是如何实现的,我们接着往下看。

从头开始编写 LoRA

用代码的方式表述一个 LoRA 层是这样的:

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

其中,in_dim 是想要使用 LoRA 修改的层的输入维度,与此对应的 out_dim 是层的输出维度。代码中还添加了一个超参数即缩放因子 alpha,alpha 值越高意味着对模型行为的调整越大,值越低则相反。此外,本文使用随机分布中的较小值来初始化矩阵 A,并用零初始化矩阵 B。

值得一提的是,LoRA 发挥作用的地方通常是神经网络的线性(前馈)层。举例来说,对于一个简单的 PyTorch 模型或具有两个线性层的模块(例如,这可能是 Transformer 块的前馈模块),其前馈(forward)方法可以表述为:

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

在使用 LoRA 时,通常会将 LoRA 更新添加到这些线性层的输出中,又得到代码如下:

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

如果你想通过修改现有 PyTorch 模型来实现 LoRA ,一种简单方法是将每个线性层替换为 LinearWithLoRA 层:

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

以上这些概念总结如下图所示:

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

为了应用 LoRA,本文将神经网络中现有的线性层替换为结合了原始线性层和 LoRALayer 的 LinearWithLoRA 层。

如何上手使用 LoRA 进行微调

LoRA 可用于 GPT 或图像生成等模型。为了简单说明,本文采用一个用于文本分类的小型 BERT(DistilBERT) 模型来说明。

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

由于本文只训练新的 LoRA 权重,因而需要将所有可训练参数的 requires_grad 设置为 False 来冻结所有模型参数:

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

接下来,使用 print (model) 检查一下模型的结构:

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

由输出可知,该模型由 6 个 transformer 层组成,其中包含线性层:

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

此外,该模型有两个线性输出层:

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

通过定义以下赋值函数和循环,可以选择性地为这些线性层启用 LoRA:

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

使用 print (model) 再次检查模型,以检查其更新的结构:

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

正如上面看到的,线性层已成功地被 LinearWithLoRA 层取代。

如果使用上面显示的默认超参数来训练模型,则会在 IMDb 电影评论分类数据集上产生以下性能:

  • 训练准确率:92.15%
  • 验证准确率:89.98%
  • 测试准确率:89.44%

在下一节中,本文将这些 LoRA 微调结果与传统微调结果进行了比较。

与传统微调方法的比较

在上一节中,LoRA 在默认设置下获得了 89.44% 的测试准确率,这与传统的微调方法相比如何?

为了进行比较,本文又进行了一项实验,以训练 DistilBERT 模型为例,但在训练期间仅更新最后 2 层。研究者通过冻结所有模型权重,然后解冻两个线性输出层来实现这一点:

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

只训练最后两层得到的分类性能如下:

  • 训练准确率:86.68%
  • 验证准确率:87.26%
  • 测试准确率:86.22%

结果显示,LoRA 的表现优于传统微调最后两层的方法,但它使用的参数却少了 4 倍。微调所有层需要更新的参数比 LoRA 设置多 450 倍,但测试准确率只提高了 2%。

优化 LoRA 配置

前面讲到的结果都是 LoRA 在默认设置下进行的,超参数如下:

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

假如用户想要尝试不同的超参数配置,可以使用如下命令:

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

不过,最佳超参数配置如下:

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

在这种配置下,得到结果:

  • 验证准确率:92.96%
  • 测试准确率:92.39%

值得注意的是,即使 LoRA 设置中只有一小部分可训练参数(500k VS 66M),但准确率还是略高于通过完全微调获得的准确率。

原文链接:https://lightning.ai/lightning-ai/studios/code-lora-from-scratch?cnotallow=f5fc72b1f6eeeaf74b648b2aa8aaf8b6

AIBox 一站式AI创作平台
AIBox 一站式AI创作平台

AIBox365一站式AI创作平台,支持ChatGPT、GPT4、Claue3、Gemini、Midjourney等国内外大模型

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

469

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

27

2025.12.22

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2917

2024.08.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

174

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号