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

这篇具有很好参考价值的文章主要介绍了深入浅出解析LoRA完整核心基础知识 | 【算法兵器谱】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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完整核心基础知识 | 【算法兵器谱】

经过开源生态的持续验证,我们发现使用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:

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

由于本次的宝可梦数据集已经封装好了,所以我们可以直接调用数据集路径即可,若是我们想要训练自己的数据集,需要制作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举例:

深入浅出解析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,拉你进群~)文章来源地址https://www.toymoban.com/news/detail-504164.html

到了这里,关于深入浅出解析LoRA完整核心基础知识 | 【算法兵器谱】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《深入浅出SSD:固态存储核心技术、原理与实战》----学习记录(二)

    SSD主要由两大模块构成—— 主控和闪存介质 。其实除了上述两大模块外,可选的还有缓存单元。主控是SSD的大脑,承担着指挥、运算和协调的作用,具体表现在 一是实现标准主机接口与主机通信 二是实现与闪存的通信 三是运行SSD内部FTL算法 可以说,一款主控芯片的好坏直

    2024年02月12日
    浏览(54)
  • 【大虾送书第七期】深入浅出SSD:固态存储核心技术、原理与实战

    目录  ✨写在前面   ✨内容简介  ✨作者简介  ✨名人推荐  ✨文末福利      🦐博客主页:大虾好吃吗的博客      🦐专栏地址:免费送书活动专栏地址         近年来国家大力支持半导体行业,鼓励自主创新,中国SSD技术和产业良性发展,产业链在不断完善,与

    2024年02月10日
    浏览(57)
  • 深入浅出:大语言模型的视觉解析

    一系列工具与文章的汇编,直观易懂地解读复杂的 AI 概念 图片由作者利用 unDraw.co 的免费插图制作 在当今世界,大语言模型(LLM)成为了热门话题。几乎每天都有新的语言模型问世,让人们在 AI 领域怀有一种“不容错过”的紧迫感。尽管如此,许多人仍对大语言模型的基础

    2024年01月19日
    浏览(45)
  • 动力节点|深入浅出Vue框架学习教程,带你快速掌握前端开发核心技能

    Vue是一款流行的JavaScript前端框架,最初由华人开发者尤雨溪创建,并在GitHub上开源发布,它采用MVVM模型的设计思维,专注于UI项目的开发,能够方便地组织和管理页面上的各个组件,大大提高了前端开发的效率。 同时,Vue也具有高度的灵活性和可定制性,使得其在快速开发

    2024年02月13日
    浏览(52)
  • 深入浅出 OkHttp 源码解析及应用实践

    作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平。 本文首先从源代码入手简要分析了一个请求发起过程中的核心代码,接着通过流程图和架构图概括地介绍了OkHttp的整体结构,重点分析了拦

    2024年02月05日
    浏览(57)
  • 在疯狂三月之后,深入浅出分析AIGC的核心价值 (下篇)|【AI行研&商业价值分析】

    Rocky Ding 公众号:WeThinkIn 【AI行研商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的优化建议,一起交流学习💪 大家好,我是Rocky。 本文是《在疯狂三月之后,深入浅出分析AIGC的核心价值》系列的第二篇文章,在第一篇文章中,我

    2024年02月16日
    浏览(42)
  • 在疯狂三月之后,深入浅出分析AIGC的核心价值 (上篇)|【AI行研&商业价值分析】

    Rocky Ding WeThinkIn 【AI行研商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的优化建议,一起交流学习💪 大家好,我是Rocky。 2023年3月21日,微软创始人比尔·盖茨在其博客文章《The Age of AI has begun》中表示, 自从1980年首次看到图形用

    2024年02月09日
    浏览(56)
  • 深入浅出:FFmpeg 音频解码与处理AVFrame全解析

    FFmpeg 是一个开源的音视频处理软件,它包含了一系列的库和程序,用于处理音频、视频和其他多媒体数据。FFmpeg 的名字来源于 “Fast Forward MPEG”,其中 MPEG 是一种常见的音视频编码标准。 FFmpeg 项目于 2000 年由 Fabrice Bellard 启动,他是 QEMU(一种开源的计算机模拟器和虚拟机

    2024年02月04日
    浏览(112)
  • 深入浅出阿里数据同步神器:Canal原理+配置+实战全网最全解析!

    canal 翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变

    2024年02月10日
    浏览(40)
  • 【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)

    Spring 5.x中常见的注解包括@Controller、@Service、@Repository。当我们研究Spring Boot源码时,会发现实际上提供了更多的注解。了解这些注解对于我们非常重要,尽管目前可能还用不到它们。 注解 功能 @Bean 器中注册组件,代替来的标签 @Configuration 声明这是一个配置类,替换以前的配

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包