peft LoRA
LoRA(Low-Rank Adaptation)的重要参数如下:
-
init_lora_weights:用于初始化LoRA权重的方法,有几种选择:
"kaiming_uniform"
:默认的初始化方法,使用Kaiming均匀初始化权重A,权重B初始化为零。"gaussian"
:使用高斯分布初始化权重A,权重B初始化为零。"pissa"
:使用主奇异值和奇异向量初始化LoRA适配器,以加快收敛速度和提高性能。"pissa_niter_[number of iters]"
:快速SVD方法,迭代次数决定误差和计算时间的平衡。False
:不进行初始化,通常用于调试和测试。
-
target_modules:指定要应用LoRA的模块,可以是具体的层名称或使用"all-linear"应用于所有线性层。常用于QLoRA风格的训练。
-
lora_alpha:用于缩放每个前向传递中的适配器的固定标量,通常与rank相关联。
- 默认实现中,标量为
lora_alpha/r
。 - Rank-stabilized LoRA(rsLoRA)中,标量为
lora_alpha/math.sqrt(r)
。
- 默认实现中,标量为
-
layer_replication :用于层复制以扩展模型,例如将一个7B模型扩展到10B。指定复制的层序列,例如
[[0,4], [2,5]]
表示复制第0到第4层和第2到第5层。 -
use_rslora:是否使用Rank-stabilized LoRA,用于稳定适配器并提高性能。
True
:使用rsLoRA。
-
use_dora:是否使用Weight-Decomposed Low-Rank Adaptation (DoRA),用于分解权重更新以改善低rank情况下的性能。
True
:使用DoRA。
-
lora_dropout:适配器的dropout率,用于防止过拟合。
-
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可以有效地减少参数数量并加速训练,同时保持较高的模型性能。