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

相关推荐
Chef_Chen4 分钟前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
搏博5 分钟前
神经网络问题之:梯度不稳定
人工智能·深度学习·神经网络
Sxiaocai20 分钟前
使用 PyTorch 实现并训练 VGGNet 用于 MNIST 分类
pytorch·深度学习·分类
GL_Rain22 分钟前
【OpenCV】Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR)
人工智能·opencv·计算机视觉
shansjqun26 分钟前
教学内容全覆盖:航拍杂草检测与分类
人工智能·分类·数据挖掘
狸克先生29 分钟前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互
baiduopenmap43 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
小任同学Alex1 小时前
浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)
人工智能·自然语言处理·大模型
新加坡内哥谈技术1 小时前
微软 Ignite 2024 大会
人工智能
江瀚视野1 小时前
Q3净利增长超预期,文心大模型调用量大增,百度未来如何分析?
人工智能