楼主: nandaomeiyou
98 0

[学科前沿] 【LoRA(低秩适应)技术详解:原理、公式与实践】 [推广有奖]

  • 0关注
  • 0粉丝

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-12-23
最后登录
2018-12-23

楼主
nandaomeiyou 发表于 2025-11-27 15:24:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

LoRA(低秩适应)技术详解:原理、公式与实践

1. LoRA 的基本概念

LoRA(Low-Rank Adaptation)是一种高效的参数微调方法。其核心理念在于:在对大规模预训练模型进行微调时,保持原始模型权重的冻结状态,仅引入两个额外的小型可训练矩阵——即低秩矩阵,用以模拟权重的变化量。

该方法的核心计算过程可通过如下公式表达:

h = Wx + (α/r)BAx

其中各符号含义如下:

  • W:预训练模型中某一层的固定权重矩阵(如Transformer结构中的Query或Value投影层)。
  • x:当前层的输入向量。
  • h:经过处理后的输出结果。
  • A 和 B:两个新引入且参与训练的低秩矩阵。
  • r:低秩矩阵的秩,通常远小于原始权重维度(例如设置为8或16)。
  • α:缩放系数,用于调节低秩更新项 BA 对最终输出的影响强度。

2. 数学基础与核心思想

低秩假设
LoRA 的理论依据源于一个关键观察:当大模型针对特定任务进行微调时,其权重变化 ΔW 倾向于具有“低秩”特性。这意味着尽管原始权重矩阵 W 可能非常高维复杂,但实际有效的更新方向集中在少数主成分上。因此,可以使用一个低秩分解来近似表示这个变化:

ΔW ≈ BA

设 A ∈ ^(r×k),B ∈ ^(d×r),且 r min(d, k)。举例来说,若原权重为 1000×1000(共需更新 1,000,000 参数),采用 LoRA 并设定 r=8,则只需训练 A(8×1000=8000 参数)和 B(1000×8=8000 参数),总计仅 16,000 个可训练参数,显著降低计算开销。

初始化策略
为了确保在训练初期不干扰模型原有的推理能力,LoRA 采用了特殊的初始化方式:

  • 矩阵 A 采用均值为0、标准差 σ = 1/√r 的随机高斯分布初始化。
  • 矩阵 B 则全部初始化为零。

由此可得,在训练开始阶段 BA = 0,因此 h = Wx,模型行为与原始预训练模型完全一致,保证了训练稳定性。

3. 在 Transformer 架构中的应用实践

在 GPT、BERT 等基于 Transformer 的模型中,LoRA 通常被应用于自注意力机制的关键组件中。

目标模块选择
最常施加 LoRA 的部分是注意力机制中的查询(Query)和值(Value)投影矩阵,即 q_proj 和 v_proj。原因在于这些权重直接影响模型关注的内容以及信息输出的方式,对下游任务适配尤为重要。

对应的权重更新形式为:

W'q = Wq + BqAq, W'v = Wv + BvAv

推理阶段的参数合并
训练完成后,LoRA 提供了一项重要优势:可将低秩增量合并至原始权重中,实现无额外延迟的推理部署:

Wmerged = W + (α/r)BA

合并后,模型恢复为标准结构,无需保留独立的 LoRA 模块,便于直接上线服务。

peft

4. 实际操作示例:利用 Hugging Face PEFT 库实现 LoRA

借助 Hugging Face 提供的 PEFT(Parameter-Efficient Fine-Tuning)库,应用 LoRA 变得极为简便。以下是一个典型实现流程:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model

# 1. 加载预训练模型与分词器
model_name = "facebook/opt-350m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# 2. 配置 LoRA 参数
lora_config = LoraConfig(
    r=8,                  # 秩(Rank)
    lora_alpha=32,        # 缩放因子 Alpha
    target_modules=["q_proj", "v_proj"],  # 针对 OPT 模型的目标模块
    lora_dropout=0.05,    # Dropout 防止过拟合
    bias="none",          # 不启用偏置项训练
)
# 任务类型设定
task_type = "CAUSAL_LM"  # 指定为因果语言建模任务

# 应用LoRA适配器至模型
lora_model = get_peft_model(model, lora_config)

# 展示可训练参数信息
lora_model.print_trainable_parameters()
# 示例输出: trainable params: 393,216 || all params: 332,197,632 || 训练参数占比: 0.12%
peft
该代码片段展示了一种高效的微调方式——仅使用极少量的可训练参数(如本例中占原模型总量的0.12%),即可实现对大规模语言模型的有效调整。

LoRA的核心优势

参数效率高
与全量微调相比,LoRA所需的可训练参数通常仅为其0.01%到3%,大幅降低了计算资源和存储开销。 内存占用低
由于原始模型的大部分权重被冻结,无需保存这些参数的优化器状态,从而显著减少训练过程中的显存消耗。 推理无延迟
在训练完成后,可以将LoRA的增量权重合并回原始模型。合并后的模型在推理时与原始模型性能一致,不会引入额外延迟。 模块化设计,灵活切换
同一个基础模型可搭配多个针对不同任务的小型LoRA适配器(每个仅几兆字节),便于快速切换应用场景,提升部署灵活性。 缓解灾难性遗忘
因原始模型权重基本保持不变,模型在学习新任务时能更好地保留预训练阶段获得的通用语言能力。

关键超参数说明

秩(r)
这是LoRA中最核心的参数之一。秩越大,适配器的表达能力越强,但也会增加参数数量。一般建议从8或16开始尝试。研究显示,即使设置为4或8这样的小值,在多数任务中也能取得理想效果。 缩放因子(α)
用于控制LoRA路径对模型更新的影响程度。一个常用的经验是将α设为秩的两倍,例如当 r=8 时,设置 alpha=16,通常能获得良好表现。 目标模块选择
并非所有网络层都需要添加LoRA。实践中常选择对任务影响较大的模块进行注入,比如注意力机制中的查询(Q)和值(V)投影矩阵。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Transformers parameters Adaptation transform Parameter

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-2-13 11:42