音视频开发之旅(99)-LoRA原理、源码解析与应用

目录

1. 背景与问题

2.LoRA的原理

3. 源码解析

4. SD中LoRA应用

5. 资料

一、背景与问题

随着深度学习的发展,预训练大型模型在自然语言处理、计算机视觉和多模态等领域取得了显著的成功。这些模型通常包含数亿甚至数十亿的参数,如GPT系列模型、LLama、StableDiffusion和LLava等。尽管这些大型预训练模型具有强大的通用表示能力,但在特定任务上往往需要进行微调。然而,微调整个模型的参数在计算资源和存储需求上都非常高.

为了解决上述问题,研究者们提出了参数高效微调的方法,即在保持预训练模型大部分参数不变的情况下,只更新少量参数,以适应特定任务或数据。这些方法包括Dreambooth、Hypernetworks、LoRA等。LoRA(Low-Rank Adaptation)是其中一种高效且效果卓越的高效微调方法。

二、LoRA的原理

LoRA是由论文《LoRA: Low-Rank Adaptation Of Large Language Models》提出的一种用于大模型微调技术,该技术也适用于SD和多模态大模型的微调。它的核心思想:冻结预训练模型,在模型的特定层中引入低秩矩阵,对模型参数的高效微调,实现降低微调大型模型的计算和存储成本,同时保持或接近全参数微调的性能。

图片

正如上图所示,左侧的预训练权重矩阵W为dxd的矩阵,右侧为LoRA将矩阵分解成两个更小的(低秩)矩阵A和B,其中A是dxr的矩阵,B是rxd的矩阵,r远远小于d,Lora通过将冻结预训练权重和微调少量参数相加 :W1 = W+ΔW = W+BA 实现降低成本同时保持效果的目标。

在LLM、SD和LLava等基于Transformer架构的模型中,主要的计算开销和参数量集中在全连接层和注意力机制中的投影矩阵。LoRA主要对这些权重矩阵进行低秩适应。

图片

伪代码:

input_dim = 768  # 预训练模型hidden隐藏层维度output_dim = 768  #输出层维度rank = 8  # LoRA的秩r,即低秩矩阵的秩, 远小于input_dim和output_dim
W = ... # 预训练网络的原始权重矩阵, 不参与微调(即被冻结),shpae为input_dim x output_dim
#W_A和W_B是需要训练的LoRA权重,通过两个低秩矩阵相乘来近似权重的变化W_A = nn.Parameter(torch.empty(input_dim, rank)) # LoRA权重A,shape为 input_dim x rankW_B = nn.Parameter(torch.empty(rank, output_dim)) # LoRA权重B,shape为 rank x output_dim
# 初始化Lora权重矩阵#其中W_A使用kaiming均匀分布进行初始化,以确保初始梯度的稳定性nn.init.kaiming_uniform_(W_A, a=math.sqrt(5))#W_B初始为零矩阵,以便在训练开始时,模型的输出主要由预训练的权重W决定,避免对预训练模型的干扰nn.init.zeros_(W_B)
#定义常规的前向传播函数def regular_forward_matmul(x, W):    h = x @ Wreturn h
#定义使用Lora的前向传播函数def lora_forward_matmul(x, W, W_A, W_B):    # 常规矩阵相乘,计算预训练模型的输出    h = x @ W      # 这是LoRA的核心, 在训练权重基础上添加使用LoRA权重,乘以缩放因子alpha,用于调整LoRA增量的影响程度    h += x @ (W_A @ W_B)*alpha return h在微调过程中,预训练模型的权重W保持不变,只更新W_A和W_B,原始权重矩阵W的参数量为input_dim * output_dim,而LoRA只需要训练(input_dim * r) + (r * output_dim)个参数,通常r远小于input_dim和output_dim, 减少需要训练的参数数量,降低计算和存储成本,同时保持或接近全参数微调的性能。

三、源码解析

以Diffusion源码中的train_text_to_image_lora.py(https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py)来一起解读下LoRA训练的实现

1. 初始化:加速器,学习率 和加载预训练模型的噪声调度器(noise_scheduler)、分词器(tokenizer)、文本编码器(text_encoder)、自编码器(vae)以及UNet模型

2. 冻结预训练模型的unet、vae和text_encoder的参数,节省显存

3. Lora配置的参数:如 秩(rank)和初始化权重

4.添加LoRA适配器到UNet模型

5. 加载数据,进行训练,将图像编码为潜空间(Latent Space),添加噪声,获取文本嵌入(Text Embedding),使用模型预测噪声,计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值