【深度学习】大模型中的LoRA的重要参数理解,dim维度和lora_alpha

peft LoRA

LoRA(Low-Rank Adaptation)的重要参数如下:

  1. init_lora_weights:用于初始化LoRA权重的方法,有几种选择:

    • "kaiming_uniform":默认的初始化方法,使用Kaiming均匀初始化权重A,权重B初始化为零。
    • "gaussian":使用高斯分布初始化权重A,权重B初始化为零。
    • "pissa":使用主奇异值和奇异向量初始化LoRA适配器,以加快收敛速度和提高性能。
    • "pissa_niter_[number of iters]":快速SVD方法,迭代次数决定误差和计算时间的平衡。
    • False:不进行初始化,通常用于调试和测试。
  2. target_modules:指定要应用LoRA的模块,可以是具体的层名称或使用"all-linear"应用于所有线性层。常用于QLoRA风格的训练。

  3. lora_alpha:用于缩放每个前向传递中的适配器的固定标量,通常与rank相关联。

    • 默认实现中,标量为 lora_alpha/r
    • Rank-stabilized LoRA(rsLoRA)中,标量为 lora_alpha/math.sqrt(r)
  4. layer_replication :用于层复制以扩展模型,例如将一个7B模型扩展到10B。指定复制的层序列,例如[[0,4], [2,5]]表示复制第0到第4层和第2到第5层。

  5. use_rslora:是否使用Rank-stabilized LoRA,用于稳定适配器并提高性能。

    • True:使用rsLoRA。
  6. use_dora:是否使用Weight-Decomposed Low-Rank Adaptation (DoRA),用于分解权重更新以改善低rank情况下的性能。

    • True:使用DoRA。
  7. lora_dropout:适配器的dropout率,用于防止过拟合。

  8. r:LoRA的秩(rank),即适配器的维度,影响参数的数量和适配器的表现。

示例代码如下:

python 复制代码
from peft import LoraConfig

# 使用Kaiming均匀初始化
config = LoraConfig(init_lora_weights="kaiming_uniform", target_modules="all-linear", lora_alpha=32, layer_replication=[[0,4], [2,5]], use_rslora=True, use_dora=False, lora_dropout=0.1, r=16)

# 使用高斯分布初始化
config_gaussian = LoraConfig(init_lora_weights="gaussian", ...)

# 使用PiSSA初始化
config_pissa = LoraConfig(init_lora_weights="pissa", ...)

# 使用快速SVD的PiSSA初始化
config_pissa_fast = LoraConfig(init_lora_weights="pissa_niter_10", ...)

# 使用Rank-stabilized LoRA
config_rs = LoraConfig(use_rslora=True, ...)

# 使用Weight-Decomposed LoRA
config_dora = LoraConfig(use_dora=True, ...)

这些参数可以根据具体的需求进行调整,以优化模型的训练和性能表现。

dim维度和lora_alpha

LoRA(Low-Rank Adaptation)通过将全连接层的权重矩阵分解为两个低秩矩阵来减少参数数量并加快训练速度。让我们通过公式来详细解释LoRA的dim维度和lora_alpha。

1. 权重矩阵的低秩分解

假设我们有一个全连接层,其权重矩阵为 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k,其中 d d d是输入维度, k k k是输出维度。LoRA将 W W W分解为两个低秩矩阵 A ∈ R d × r A \in \mathbb{R}^{d \times r} A∈Rd×r和 B ∈ R r × k B \in \mathbb{R}^{r \times k} B∈Rr×k,其中 r r r是分解的秩(rank)。

W ≈ A B W \approx AB W≈AB

其中, r ≪ min ⁡ ( d , k ) r \ll \min(d, k) r≪min(d,k),这样可以显著减少参数的数量。

2. LoRA的dim维度

dim维度即 r r r,表示分解的秩。选择合适的 r r r非常重要,因为它直接影响模型的参数数量和表示能力。假设输入向量为 x ∈ R d x \in \mathbb{R}^{d} x∈Rd,输出向量为 y ∈ R k y \in \mathbb{R}^{k} y∈Rk,则有:

y = W x ≈ A B x y = Wx \approx ABx y=Wx≈ABx

3. lora_alpha参数

lora_alpha是一个缩放因子,用于在每次前向传递中调整适配器的影响力。在原始实现中,适配器在每次前向传递中通过一个标量进行缩放,这个标量的值为:

α = lora_alpha r \alpha = \frac{\text{lora\_alpha}}{r} α=rlora_alpha

因此,完整的计算公式为:

y = W x ≈ α A B x = lora_alpha r A B x y = Wx \approx \alpha ABx = \frac{\text{lora\_alpha}}{r} ABx y=Wx≈αABx=rlora_alphaABx

综合公式

综合以上,可以得到LoRA的完整前向计算公式:

y ≈ ( W + lora_alpha r A B ) x y \approx \left(W + \frac{\text{lora\_alpha}}{r} AB\right)x y≈(W+rlora_alphaAB)x

其中, W W W是原始权重矩阵, A A A和 B B B是LoRA的低秩矩阵, α = lora_alpha r \alpha = \frac{\text{lora\_alpha}}{r} α=rlora_alpha是缩放因子。

示例

假设我们有一个输入维度 d = 128 d=128 d=128,输出维度 k = 256 k=256 k=256,我们选择的dim维度 r = 16 r=16 r=16,并且lora_alpha=32,那么缩放因子 α \alpha α为:

α = 32 16 = 2 \alpha = \frac{32}{16} = 2 α=1632=2

所以,LoRA的前向计算公式为:

y ≈ ( W + 2 A B ) x y \approx \left(W + 2AB\right)x y≈(W+2AB)x

通过这样的方法,LoRA可以有效地减少参数数量并加速训练,同时保持较高的模型性能。

相关推荐
红色的山茶花16 分钟前
YOLOv9-0.1部分代码阅读笔记-loss_tal.py
笔记·深度学习·yolo
边缘计算社区44 分钟前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客5201 小时前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主1 小时前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
深圳南柯电子1 小时前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ1 小时前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖1 小时前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
qq_529025292 小时前
Torch.gather
python·深度学习·机器学习