LoRA基本概念

LoRA(Low-Rank Adaptation)低秩自适应,是一种高效的大模型微调技术,非常高效,思想是冻结预训练模型参数,只添加少部分可训练参数来适应特点任务,从而减少计算量。
🍔提出背景

预训练模型不断增加,比如GPT-3参数量已经1750亿了,计算量庞大,从而引发内存占用大,计算复杂,模型训练时间长等特点。

LoRA工作原理

LoRA中文名称:低秩自适应实现的核心思想是:更新低秩矩阵从而更新预训练模型权重。

实现过程

  1. 冻结预训练模型参数:在模型训练的过程中,预训练模型权重保持不变
  2. 引入LoRA(低秩自适应层),权重更新的时候,采用的策略是引入一个低秩分解矩阵
    用于更新,具体原理:
- <!-- 这是一张图片,ocr 内容为: -->

:d x k 维度,代表更新后权重
权重更新矩阵,这个是LoRA微调的核心,由两个小矩阵相乘得来,
=
其中
r是秩,一般远小于d、k

从而在微调过程中,只更新B和A矩阵参数即可,即只更新低秩矩阵,W0不变。

  1. 合并:最后,将原始预训练权重W和低秩分解矩阵进行合并,得到更新后权重矩阵W

数学原理

微调网络模块

LoRA主要用于transformer中自注意力层的线性变换层。

参考千问:

模块位置 层名称(常见命名) 说明
Self-Attention q_proj
(Query 投影)
决定“关注什么”,任务相关性强
Self-Attention v_proj
(Value 投影)
携带实际内容信息,直接影响输出
Cross-Attention(如 Encoder-Decoder 模型) q_proj
, v_proj
在 T5、Flan-T5 等模型中同样适用
Self-Attention k_proj(Key 投影) 收益通常较小,因 Key 主要用于匹配 Query
Self-Attention o_proj / out_proj(输出投影) 部分工作(如 Qwen 官方)会加入,但增益有限
MLP / FFN up_proj, gate_proj, down_proj 参数量大,LoRA 增益不明显,一般不推荐

秩r的选取

LoRA模型中,秩r的选取主要取决了具体任务,没有具体标准一般来说越复杂的模型r越大,简单的模型r都比较小,但是这并不说明复杂模型r越大越好,具体还是需要看实验。

在LoRA论文中,作者有过这实验,在GPT-3中进行微调。

可以发现,r并不是越大越好,r = 1和 r = 64效果差不多

一般r的选1,2,4,8,16就差不多了,当然复杂模型r可能会更大,但是需要去实验。

LoRA中API详解

参考:千问。

from peft import LoraConfig

LoraConfig(
    r=8,
    lora_alpha=16,
    lora_dropout=0.1,
    target_modules=["q_proj", "v_proj"],
    bias="none",
    modules_to_save=None,
    layers_to_transform=None,
    layers_pattern=None,
    rank_pattern={},
    alpha_pattern={},
    megatron_config=None,
    megatron_core="megatron.core",
    init_lora_weights=True,
    use_rslora=False,
    use_dora=False,
    task_type="CAUSAL_LM",
    inference_mode=False,
)

核心参数

参数 类型 默认值 说明
r int 8 LoRA 的秩(rank)。控制低秩矩阵的大小,值越小参数越少,但表达能力越弱。常见值:4、8、16、32。
lora_alpha int 16 LoRA 缩放因子。最终更新为 (lora_alpha / r) * BA。通常设为 r 的倍数(如 alpha = 2r),用于调节适配强度。
lora_dropout float 0.0 在 LoRA 层输入上应用的 Dropout 概率,用于防止过拟合。一般设为 0.00.1
target_modules List[str] or str 必填 指定要插入 LoRA 的模块名称。例如: • LLaMA/Qwen:["q_proj", "k_proj", "v_proj", "o_proj"] • BERT:["query", "value"] • Stable Diffusion:["to_q", "to_k", "to_v", "to_out.0"]
bias str "none" 如何处理原始模型中的偏置项: • "none":不训练任何 bias • "all":训练所有 bias • "lora_only":只训练 LoRA 模块新增的 bias(不推荐)
task_type str None 任务类型,影响内部实现和保存格式: • "CAUSAL_LM"(语言模型生成) • "SEQ_2_SEQ_LM"(如 T5) • "TOKEN_CLS"(命名实体识别) • "SEQ_CLS"(文本分类)等
inference_mode bool False 是否处于推理模式。设为 True 时冻结 LoRA 参数,用于加载已训练好的适配器进行推理。

可选参数

参数 说明
modules_to_save 除了 LoRA 外,还要完整微调的模块(如分类头 classifier
)。这些模块不会被 LoRA 替换,而是直接训练全部参数。
layers_to_transform 只在指定层索引(如 [0, 1, 2]
)上应用 LoRA,其余层不变。适用于分层微调。
use_rslora 启用 RS-LoRA(Rank-Stabilized LoRA),对初始化进行缩放,使不同 r
下训练更稳定(论文:LoRA+: Efficient Low Rank Adaptation of Large Models)。
use_dora 启用 DoRA(Weight-Decomposed Low-Rank Adaptation),将权重分解为幅度和方向两部分,提升性能(2024 年新方法)。
init_lora_weights 是否使用默认初始化(高斯分布)。若为 False
,需手动初始化。也可设为 "gaussian"
"olora"
(正交初始化)。

其他问题

B、A矩阵可以全0么?

结论:不能,因为会导致
永远为0.

初始值的时候,BA=0,可以保证开始的时候用的是预训练权重在初始化权重的时候,一般采用B初试为全0,A从N(0, 0.01)采样。

参考资料

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐