深入浅出解析LoRA完整核心基础知识 | 【算法兵器谱】

news2025/1/13 11:56:17

Rocky Ding

公众号:WeThinkIn

写在前面

【算法兵器谱】栏目专注分享AI行业中的前沿/经典/必备的模型&论文,并对具备划时代意义的模型&论文进行全方位系统的解析,比如Rocky之前出品的爆款文章Make YOLO Great Again系列。也欢迎大家提出宝贵的优化建议,一起交流学习💪

大家好,我是Rocky。

在AIGC时代到来之后,LoRA无疑成为了AI绘画领域与Stable Diffusion(SD)配合最多的模型,SD模型+LoRA的组合,生成了一个又一个精美的图片与视频,创造了很多脑洞大开的风格,大大提高了AI生成内容的质量与效率

Rocky在本文将会把LoRA最核心的知识分享给大家,包括LoRA的基本原理、流程训练、使用方法以及一些“经验”感悟,力求能让大家零基础入门使用LoRA进行AI内容创造!

在这里也预告一下,下一期Rocky将分享LoRA的进阶用法,更多干货思考分享,欢迎大家一键三连!

So,enjoy:

正文开始

----【目录先行】----

  1. LoRA的核心基础知识

  2. LoRA的优势

  3. 轻松入门LoRA训练

  4. 使用LoRA轻松生成图片

  5. LoRA的训练技巧

【一】LoRA的核心基础知识

在AIGC爆发后,大模型进入了业界的视野,大模型强大的能力让AI彻底破圈,可谓是天下谁人不识Stable Diffusion和ChatGPT。

但是大模型参数量巨大,训练成本较高,当遇到一些下游细分任务时,对大模型进行全参训练性价比不高,同时这些下游细分任务的域比较好约束,在这种情况下,本文的主角——LoRA就出场了。

我们可以使用SD模型+LoRA微调训练的方式,只训练参数量很小的LoRA,就能在下游细分任务中取得不错的效果。

LoRA的训练逻辑是首先冻结SD模型的权重,然后在SD模型的U-Net结构中注入LoRA模块,将其并与crossattention模块结合,并只对这部分参数进行微调训练。

也就是说,对于SD模型权重 W o ∈ R n × m W_{o} \in \mathbb{R}^{n\times m} WoRn×m,我们不再对其进行全参微调训练,我们对权重加入残差的形式,通过训练 Δ w \Delta w Δw来完成优化过程:

W ′ = W + Δ W W' = W + \Delta W W=W+ΔW

其中 Δ w = A B T , A ∈ R n × d , B ∈ N d × m , d ≪ n \Delta w = AB^{T},A \in \mathbb{R}^{n\times d} ,B \in \mathbb{N}^{d\times m}, d \ll n Δw=ABT,ARn×d,BNd×m,dn,其是由两个低秩矩阵的乘积组成。由于下游细分任务的域非常小,所以 d d d可以取得很小,很多时候我们可以取 1 1 1。因此在训练完成之后,我们可以获得一个参数量远小于SD模型的LoRA模型。

通常来说,对于矩阵 A A A,我们使用随机高斯分布初始化,并对于矩阵 B B B使用全 0 0 0初始化,使得在初始状态下这两个矩阵相乘的结果为 0 0 0。这样能够保证在初始阶段时,只有SD模型(主模型)生效。

LoRA主要与主模型的Crossattention结合训练

经过开源生态的持续验证,我们发现使用LoRA进行微调与SD模型全参微调的效果相差不大。

Rocky认为LoRA成为了AIGC时代的“残差模块”,SD模型的“得力助手”。

LoRA大幅降低了SD模型训练时的显存占用,因为并不优化主模型(SD模型),所以主模型对应的优化器参数不需要存储。但计算量没有明显变化,因为LoRA是在主模型的全参梯度基础上增加了“残差”梯度,同时节省了主模型优化器更新权重的过程。

与此同时,在推理过程中,由于可以直接把LoRA合并到主模型中,从而整个推理成本是没有增加的,这无疑让LoRA有了更多的实用价值。

【二】LoRA的优势

  1. 与SD模型全参训练相比,LoRA训练速度更快。
  2. 非常低的算力要求。我们可以在2080Ti级别的算力设备上进行LoRA训练。
  3. 由于只是与SD模型的结合训练,LoRA本身的参数量非常小,最小可至3M左右。
  4. 能在小数据集上进行训练(10-30张),并且与不同的SD模型都能较好的兼容与迁移适配。
  5. 训练时主模型参数保持不变,LoRA能更好的在主模型的能力上优化学习。

【三】轻松入门LoRA训练

我们可以直接使用diffusers库里的代码进行LoRA训练,关于diffusers与Stable Diffusion,大家可以阅读Rocky之前的文章:深入浅出解析Stable Diffusion完整核心基础知识 |【算法兵器谱】

本次Rocky选用个人非常喜欢的宝可梦数据集作为下游细分任务,并让LoRA能够学习到所有宝可梦的特征,并能生成我们想要的独一无二的“新宝可梦”

我们首先需要准备数据,包括图片和对应的caption:

数据集格式:图片+caption

由于本次的宝可梦数据集已经封装好了,所以我们可以直接调用数据集路径即可,若是我们想要训练自己的数据集,需要制作diffusers能够读取的数据格式:

#数据格式 metadata.jsonl + 图片
folder/train/metadata.jsonl #存储caption描述
folder/train/0001.png
folder/train/0002.png
folder/train/0003.png

#metadata.jsonl中的内容
{"file_name": "0001.png", "text": "This is a golden retriever playing with a ball"}
{"file_name": "0002.png", "text": "A german shepherd"}
{"file_name": "0003.png", "text": "One chihuahua"}

好的,完成了数据集的制作,我们就可以进行训练了,我们可以使用diffusers库中的train_text_to_image_lora.py作为训练代码,并传入相关的预设参数:

export MODEL_NAME="runwayml/stable-diffusion-v1-5" #选用的主模型
export OUTPUT_DIR="/lora/pokemon" #LoRA模型保存地址
export DATASET_NAME="lambdalabs/pokemon-blip-captions" #训练数据路径

accelerate launch --mixed_precision="fp16"  train_text_to_image_lora.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --dataloader_num_workers=8 \
  --resolution=512 --center_crop --random_flip \
  --train_batch_size=1 \ #Batch-Size
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \ #总的训练步数
  --learning_rate=1e-04 \ #学习率
  --max_grad_norm=1 \
  --lr_scheduler="cosine" --lr_warmup_steps=0 \
  --output_dir=$OUTPUT_DIR \
  --checkpointing_steps=500 \
  --seed=2048

到这里,我们就完成了LoRA的训练流程。

【四】使用LoRA轻松生成图片

完成LoRA的训练后,我们可以使用LoRA进行推理,生成我们想要的图片:

#读取diffuers库
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler

#设置SD模型路径和LoRA模型路径
model_path = "runwayml/stable-diffusion-v1-5" #修改成本地主模型路径
LoRA_Path = "WeThinkIn" #修改成本地LoRA模型路径

#初始化SD模型,加载预训练权重
pipe = StableDiffusionPipeline.from_pretrained(model_path, torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# 加载LoRA weights ~3 MB
pipe.unet.load_attn_procs(LoRA_Path)
pipe.to("cuda")

#接下来,我们就可以运行pipeline了
image = pipe("blue pokemon", num_inference_steps=25).images[0]
image.save("test.png")

目前为止,我们已经使用LoRA完成常规的图像生成流程了。

不过除了主模型+LoRA的形式,我们还可以调整LoRA的权重

W ′ = W + α Δ W W' = W + \alpha\Delta W W=W+αΔW

下面的图示展示了将 α \alpha α 0 0 0缩放到 1 1 1对图像生成产生的影响。

α \alpha α设置为 0 0 0时,与只使用主模型的效果完全相同;将 α \alpha α设置为 1 1 1时,与使用 W ′ = W + Δ W W' = W + \Delta W W=W+ΔW的效果相同。如果LoRA存在过拟合的情况,我们可以将 α \alpha α设置为较低的值。如果使用LoRA的效果不太明显,拿我们可以将 α \alpha α设置为略高于 1 1 1的值。改变权产生的效果

除了调整单个LoRA的权重,我们还可以使用多个LoRA同时作用于一个主模型,并配置他们的权重,我们拿两个LoRA举例:

多LoRA的权重配置

如果我们设置 α 1 = α 2 = 0.5 \alpha_{1} = \alpha_{2} = 0.5 α1=α2=0.5,我们就得到两个LoRA的权重平均值。如果我们设置 α 1 = 0.8 \alpha_{1} = 0.8 α1=0.8,那么第一个LoRA的效果会占据主导,如果我们设置 α 2 = 0.8 \alpha_{2} = 0.8 α2=0.8,那么第二个LoRA的效果会占据主导。

【五】LoRA的训练技巧

  1. 学习率可以设置为1e-4以及更大,与此同时Batch-Size可以设置为4以及更大。
  2. 数据集一般训练100个epoch的效果会比较好。
  3. 训练LoRA和训练CLIP并不矛盾,他们学习了数据集中不同的特征,互相补充,同时优化能获得更好的效果。
  4. 微调训练CLIP的学习率可以设置为训练LoRA的学习率的0.5倍。
  5. 训练时,调整数据集的长宽尺寸都大于512,可以获得比较好的训练结果。
  6. 训练时,除了更新LoRA的全部参数,还可以只更新LoRA部分层的参数。
  7. 训练人物特征时,需要不同角度、姿态的数据20-40张就可以了,如果要训练风格或者画风,则需要150-200张风格图片,如果是训练一个抽象概念,则数据多多益善。

精致的结尾

到这里,LoRA的核心基础知识就完整展现在我们的面前了,希望在AIGC时代中,大家能和Rocky一起,飞速成长!

预告一下,下一期Rocky将分享LoRA的进阶用法,更多干货思考分享,欢迎大家一键三连!

Rocky将算法高价值面试知识点即“三年面试五年模拟”之独孤九剑秘籍前十二式进行汇总梳理成汇总篇,并制作成pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“三年面试五年模拟” 进行取用。

除此之外Rocky还将YOLOv1-v7全系列大解析也制作成相应的pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“YOLO” 进行取用。

Rocky一直在运营技术交流群(WeThinkIn-技术交流群),这个群的初心主要聚焦于技术话题的讨论与学习,包括但不限于算法,开发,竞赛,科研以及工作求职等。群里有很多人工智能行业的大牛,欢迎大家入群一起学习交流~(请添加小助手微信Jarvis8866,拉你进群~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让Ai帮我们画个粽子,它会画成什么样呢?

让Ai帮我们画个粽子,它会画成什么样呢? 本文目录: 一、Ai绘图技术的现状 二、看看Ai理解的粽子是怎样的 2.1、基础粽子 2.2、生成不同风格的粽子 2.2.1、真实风格的粽子 2.2.2、插图风格的粽子 2.2.3、3D风格的粽子 2.2.4、卡通风格…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

vue-cli笔记

vue的生命周期: 借鉴react 钩子函数: change() 挂载完毕,vue完成模板解析,并把初始的真实的dom元素放入到页面后执行 beforeCreate() {// 数据代理和数据监测创建之前console.log(beforeCreate) }, created() {console.l…

深度:全面解析数据智能的金融“炼金术”!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融以其财富效应,成为最新科技的试金石。一项新技术出来后,人们首先闪过的念头就是“能不能用它赚钱”。例如,ChatGPT带火了大模型,人们也开始将目标聚焦到大模型在金融领域的…

【实战】 JWT、用户认证与异步请求(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(五)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求1~56.用useAuth切换登录与非登录状态7.用fetch抽象通用HTTP请求方法,增强通用性8.用useHt…

AR宇航员互动体验软件:虚拟与现实叠加增强体验感

随着科技的不断发展,人们对太空探索的兴趣和热情也越来越高涨。为了满足人们对太空探索的渴望,广州华锐互动研发了宇航员AR模拟体验软件,这种软件可以让用户身临其境地体验太空探索的过程,提供一种全新的、令人兴奋的太空探索新体…

css基础知识十一:CSS3新增了哪些新特性?

一、是什么 css,即层叠样式表(Cascading Style Sheets)的简称,是一种标记语言,由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准,是向后兼容的,CSS1/2的特性在CSS3 里都是可以使用…

图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

文章目录 卷积操作池化Padding对多通道(channels)图片的卷积套上激活函数是什么样的参考: 卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征,常用于图像、语音等信号处理任务中。 卷积层有以下几个参…

rocketmq-spring-boot-starter支持SpringBoot 1.x(spring-context 4.x)版本

1 问题说明 由于历史原因,项目使用的是SpringBoot1.x版本,而且由于种种原因,不能升级。在项目开发迭代过程中,决定使用RocketMQ作为消息中间件,因为是SpringBoot项目,理所应当的引入了rocketmq-spring-boo…

简单聊聊数字孪生与GIS融合的必要性

随着科技的不断发展和应用的不断深入,数字孪生和GIS在各自领域中展现出巨大的潜力。然而,更引人注目的是,数字孪生和GIS的融合将为许多行业带来全新的机遇和变革。在本文中,我们将探讨数字孪生和GIS融合的必要性,以及它…

2023ty计网期末综合题满分冲刺版

1. 假设有段1km长的CSMA/CD网络链路的数据传输率为1Gb/s。设信号在此链路媒介上的传播速度为2x105 km/s,求使用此协议的最短数据帧长度。 (1)传播时延:1/2000005微秒, (2)往返时延&#xff1a…

List合并的操作

List合并的操作 1.addAll方法 List list1new ArrayList();List list2new ArrayList();for (int i 0; i < 10; i) {list1.add(i*2);list2.add(i*21);}System.out.println(list1);//方法1&#xff1a;addAlllist1.addAll(list2);System.out.println(list1); 2.Stream操作 L…

ATTCK(二)之ATTCK的发展历史

ATT&CK的发展历史 MITRE公司 MITRE是美国NIST标准化组织选择的专注于网络安全的组织&#xff0c;由美国联邦政府资助。很多安全标准都MITRE制定的&#xff0c;比如有名的漏洞CVE编号规则以及威胁情报格式STIX。所以ATT&CK非常有影响力&#xff0c;而且未来能成为一个公…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…

Java 日志重点梳理

大家好&#xff01;我是今越。重点梳理一下在 Java 程序开发中关于日志管理的知识点&#xff0c;以及在 Spring Boot 框架中该如何使用日志。 在 Java 中&#xff0c;日志框架主要分为两大类&#xff1a;日志门面和日志实现。 日志门面 日志门面定义了一组日志的接口规范&am…

LangChain-Agent自定义Tools类 ——输入参数篇(二)

给自定义函数传入输入参数&#xff0c;分别有single-input 参数函数案例和multi-input 参数函数案例&#xff1a; from langchain.agents import Tool from langchain.tools import BaseTool from math import pi from typing import Union from math import pi from typing …

StringBuffer和正则表达式

StringBuffe 获取int类型的最大值和最小值 System.out.println(Integer.MAX_VALUE);//int类型的最大值 System.out.println(Integer.MIN_VALUE);//int类型的最小值输出结果 Integer和String相互转换 Integer i1 new Integer(100); System.out.println(i1);Integer i2 new…

08 | 事务到底是隔离的还是不隔离的?

以下内容出自《MySQL 实战 45 讲》 08 | 事务到底是隔离的还是不隔离的&#xff1f; 事务启动时机 事务启动时机&#xff1a; begin/start transaction 命令并不是一个事务的起点&#xff0c;在执行到它们之后的第一个操作 InnoDB 表的语句&#xff0c;事务才真正启动。如果想…

Gradio的Button组件介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

从0到1精通自动化测试,pytest自动化测试框架,配置文件pytest.ini(十三)

一、前言 pytest配置文件可以改变pytest的运行方式&#xff0c;它是一个固定的文件pytest.ini文件&#xff0c;读取配置信息&#xff0c;按指定的方式去运行 二、ini配置文件 pytest里面有些文件是非test文件pytest.ini pytest的主配置文件&#xff0c;可以改变pytest的默认…