【深度学习】大模型中的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可以有效地减少参数数量并加速训练,同时保持较高的模型性能。

相关推荐
余生H几秒前
前端大模型入门:实战篇之Vue3+Antdv+transformers+本地模型实现增强搜索
前端·javascript·vue.js·深度学习·transformer·深度搜索·webml
绕灵儿24 分钟前
YOLO V8半自动标注工具设计
python·深度学习·yolo
码匠许师傅42 分钟前
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】
人工智能·stm32·单片机
TigerZ*1 小时前
onnx TRT 版本对应关系
人工智能·pytorch
_老码1 小时前
从入门到入土:计算机视觉CV学习路线图
人工智能·深度学习·计算机视觉·aigc
支付宝官方开放平台2 小时前
1024「爱码士」活动✖️开发者社区
大数据·c语言·c++·人工智能·python·github·aigc
小言从不摸鱼2 小时前
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
人工智能·rnn·深度学习·神经网络·机器学习·自然语言处理·lstm
深度学习实战训练营2 小时前
ST-GCN模型实现花样滑冰动作分类
人工智能·深度学习
有颜有货2 小时前
制造企业各部门如何参与生产成本控制与管理?
大数据·人工智能·制造
BulingQAQ2 小时前
论文阅读:多模态医学图像融合方法的研究进展
论文阅读·深度学习·计算机视觉·gan