LLM--LoRA微调
LoRA基本概念
LoRA(Low-Rank Adaptation):低秩自适应,是一种高效的大模型微调技术,非常高效,思想是冻结预训练模型参数,只添加少部分可训练参数来适应特点任务,从而减少计算量。
🍔提出背景
预训练模型不断增加,比如GPT-3参数量已经1750亿了,计算量庞大,从而引发内存占用大,计算复杂,模型训练时间长等特点。
LoRA工作原理
LoRA中文名称:低秩自适应,实现的核心思想是:更新低秩矩阵从而更新预训练模型权重。
实现过程

- 冻结预训练模型参数:在模型训练的过程中,预训练模型权重保持不变
- 引入LoRA(低秩自适应层),权重更新的时候,采用的策略是引入一个低秩分解矩阵
用于更新,具体原理:
- <!-- 这是一张图片,ocr 内容为: -->
:d x k 维度,代表更新后权重
:权重更新矩阵,这个是LoRA微调的核心,由两个小矩阵相乘得来,
=
其中
,r是秩,一般远小于d、k

从而在微调过程中,只更新B和A矩阵参数即可,即只更新低秩矩阵,W0不变。
- 合并:最后,将原始预训练权重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.0 或 0.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)采样。
参考资料
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)