大模型Lora微调

原理

当作增量看待

首先我们可以把新的W,看作老的W + Delta
在这里插入图片描述

低秩分解

因为我们只给了少量数据,所以Delta本来就很多0,肯定是一个低秩矩阵。在数学里面所有的低秩矩阵必然可以低秩分解。
在这里插入图片描述

具体的实现

怎样一步一步的计算A和B

初始化

预训练权重 WWW 保持固定不动(梯度设为 000)。引入两个可训练的低秩矩阵参数 AAABBB

矩阵 AAA 使用小随机值初始化:A∼N(0,σ2)A \sim N(0, \sigma^2)AN(0,σ2),其中 σ\sigmaσ 是一个很小的值。

矩阵 BBB 初始化为全 000(常用做法)。初始时,参数的增量变化 ΔW=B×A=0\Delta W = B \times A = 0ΔW=B×A=0,因此不会干扰原始模型 WWW 的输出。

计算损失

输入数据 XXX 和目标输出 YtrueY_{\text{true}}Ytrue。前向传播计算预测输出:

Ypred=(W+A×B)×XY_{\text{pred}} = (W + A \times B) \times XYpred=(W+A×B)×X

核心概念:原始权重 WWW 加上低秩更新 A×BA \times BA×B

根据任务目标(如分类),计算损失函数 LLL(例如交叉熵损失):

L=Loss(Ypred,Ytrue)L = \text{Loss}(Y_{\text{pred}}, Y_{\text{true}})L=Loss(Ypred,Ytrue)

反向传播更新

通过反向传播算法,计算损失 LLL 对参数 AAABBB 的梯度:

∂L∂A,∂L∂B\frac{\partial L}{\partial A}, \frac{\partial L}{\partial B}AL,BL

使用优化算法(如梯度下降、Adam)更新 AAABBB

A←A−η⋅∂L∂AA \leftarrow A - \eta \cdot \frac{\partial L}{\partial A}AAηAL
B←B−η⋅∂L∂BB \leftarrow B - \eta \cdot \frac{\partial L}{\partial B}BBηBL

其中 η\etaη 是学习率(Learning Rate)。

迭代优化

重复执行计算损失和反向传播更新,直至损失函数 LLL 收敛到满意值或达到预定的训练轮次(epochs)。

最终状态:AAABBB 被优化,使 W+A×BW + A \times BW+A×B 适应新任务。原始预训练权重 WWW 保持不变。

推理方式

合并权重:将 A×BA \times BA×B 按缩放系数 α/r\alpha / rα/r 融入 WWW,创建新权重 W′W'W

W′=W+α⋅A×BrW' = W + \alpha \cdot \frac{A \times B}{r}W=W+αrA×B

其中 rrr 是 LoRA 秩(rank),α\alphaα 是缩放系数(控制更新量强度)。

保持分离:维持 WWWAAABBB 分离状态,通过加载不同的 AAABBB 快速切换适配不同任务。

核心思想

LoRA 通过训练低秩矩阵 AAABBB 来近似全参数更新 ΔW\Delta WΔW,即 ΔW≈B×A\Delta W \approx B \times AΔWB×A。这大大减少了需要训练的参数数量。

应用在transformer的哪些层

并不是每个都需要微调,找到关键的位置去微调
在这里插入图片描述

注意力层(Self-Attention Layer)

LoRA 主要应用于注意力层的权重矩阵。

具体目标矩阵

  • 查询权重矩阵(W_q)
    Wq′=Wq+Aq×BqW_q' = W_q + A_q \times B_qWq=Wq+Aq×Bq
    WqW_qWq 决定模型关注输入中的哪些信息。

  • 值权重矩阵(W_v)
    Wv′=Wv+Av×BvW_v' = W_v + A_v \times B_vWv=Wv+Av×Bv
    WvW_vWv 决定输出内容的生成和表达。

选择 W_q 和 W_v 的原因

  • 微调 WqW_qWqWvW_vWv 效果接近全参数微调,但训练参数大幅减少。
  • 高性价比:仅调整这两个矩阵即可显著影响模型对任务的理解能力和生成质量。

⚠️ 注意:WkW_kWk(键矩阵)和 WoW_oWo(输出投影矩阵)通常不应用 LoRA。


前馈层(FFN Layer)

LoRA 可扩展到前馈神经网络(FFN)层中的线性变换矩阵。

目标矩阵

  • 第一个线性变换(W_1,升维)
    W1′=W1+A1×B1W_1' = W_1 + A_1 \times B_1W1=W1+A1×B1

  • 第二个线性变换(W_2,降维)
    (逻辑相同,未显式写出公式)

扩展至 FFN 的原因

  • FFN 负责特征提取和非线性映射,调整其权重可增强任务特定表达能力。
  • 在大模型(如 GPT-3)或生成式任务中更可能应用,以获得更全面的适配。

实际应用策略

模型类型LoRA 应用层建议
小模型(如 BERT)通常仅应用于注意力层(WqW_qWq, WvW_vWv
大模型/生成任务扩展到 FFN 层(W1W_1W1, W2W_2W2

关键总结

  • 核心层:注意力层的 WqW_qWqWvW_vWv 是 LoRA 的必选目标,因其直接控制信息关注与输出生成。
  • 扩展层:前馈层(FFN)的 W1W_1W1(升维矩阵)可选择性应用,大模型中更常见。
  • 高效性:通过低秩分解(A×BA \times BA×B),LoRA 仅需训练极少参数即可实现接近全量微调的效果。

讲的挺好的视频教程:https://www.bilibili.com/video/BV1waZ2YDEcp/?spm_id_from=333.337.search-card.all.click&vd_source=82dc2acb60a90c43a2ac0d4023a2cd34

Lora的改进方法

LoRA+ 的基本思路

LoRA+ 是对标准 LoRA(Low-Rank Adaptation)的改进,通过调整不同权重矩阵的学习率,优化模型训练的效率和性能。

核心改进

标准 LoRA 使用固定学习率,而 LoRA+ 提出:

  • 靠近输出的矩阵(B)使用更高学习率(ηB);
  • 靠近输入的矩阵(A)使用更低学习率(ηA)。

学习率比例定义为:
λ = ηB / ηA
典型范围在 4∼16 之间。

理论依据

改进的动机源于神经网络权重的敏感度分布特性:

  • 靠近输出的权重(B):直接影响预测结果,对梯度变化更敏感,需要大幅度调整(高学习率)。
  • 靠近输入的权重(A):承担基础特征提取,需保持稳定(低学习率避免震荡)。

实现方法

典型比例设置:

  • ηB(B 矩阵学习率):标准学习率(如 1e-3);
  • ηA(A 矩阵学习率):降低至 ηB / λ(如 λ=10 时,ηA=1e−4)。

相当于赋予 B 矩阵比 A 快 λ 倍的更新速度。

直接效果

  • 训练加速:收敛速度最高提升 2 倍(减少迭代次数);
  • 性能提升:在相同训练步数下,性能优于标准 LoRA 1%-3%。

LoRA的超参数整理

LoRA微调超参数配置表

超参数名称数据类型说明取值建议默认值
finetuning_typeLiteral[“full”,“freeze”,“lora”]指定微调类型为LoRA选择lora,用于高效微调lora
lora_alphaOptional[int]缩放系数 α\alphaα,一般情况下为lora_rank * 2设为r的1-2倍,如r=16,α=32r=16,\alpha=32r=16,α=32None
lora_dropoutfloat (0.0-1.0)LoRA的Dropout概率大数据集: 0.0
小数据集: 0.05-0.1
0.0
lora_rankintLoRA的秩rrr简单任务: 8-16
中等任务: 32
复杂任务: 64+
8
lora_targetstr (逗号分隔)应用LoRA方法的模块名称默认: q_proj,v_proj
复杂任务加k_proj,o_proj或FFN
all
additional_targetstr (逗号分隔)额外的LoRA目标模块通常留空,除非有特殊模块None
loraplus_lr_ratioOptional[float]LoRA+学习率比例(λ=ηB/ηA\lambda=\eta_B/\eta_Aλ=ηB/ηA)启用时设4-16 (如8)None
use_rslorabool是否启用秩稳定LoRA(rsLoRA)rrr (4-16) : false
rrr (32+) : true
false
use_dorabool是否启用权重分解DoRA默认false,复杂任务开启false
pissa_initbool是否用PiSSA初始化LoRA
(注:PiSSA = Power Iteration SVD Stablization Algo.)
默认false,需高性能时设truefalse

目标模块选择

  • q_proj: 查询投影层,适用于需要调整查询机制的模型任务
  • v_proj: 值投影层,默认必选模块,影响模型的核心输出
  • k_proj: 键投影层,建议在复杂任务中添加以增强模型性能
  • o_proj: 输出投影层,复杂任务中推荐使用以优化最终结果
  • FFN: 前馈网络层,大模型或复杂任务中建议添加

进阶技术

  • LoRA+: 通过设置差异学习率(λ=η_B/η_A,η_B > η_A)实现高效微调
  • rsLoRA: 针对大秩任务(r≥32)的秩稳定优化技术
  • DoRA: 权重分解技术,显著提升复杂任务的表现能力
  • PiSSA: 基于幂迭代SVD的初始化方法,加快模型收敛速度

典型配置示例

# 中等复杂度任务配置  
config = {  
    "lora_rank": 32,  
    "lora_alpha": 64,  
    "lora_target": "q_proj,v_proj,o_proj",  
    "lora_dropout": 0.05,  
    "loraplus_lr_ratio": 8  # 启用LoRA+  
}
### LoRA微调方法概述 对于大规模语言模型(LLMs),传统的全参数微调方式需要大量计算资源和训练数据,这使得其应用受到限制。为了应对这一挑战,低秩适应(LoRA, Low-Rank Adaptation)被提出作为一种高效的微调技术[^2]。 #### LoRA的核心原理 LoRA通过冻结原始模型中的大部分权重,在此基础上引入少量可训练的新参数来实现特定任务的学习目标。具体来说,它利用矩阵分解的思想,将原本高维的权重矩阵替换为两个较小维度矩阵的乘积形式。这种方法不仅显著减少了所需的训练参数数量,还保持了较高的性能表现水平。 以下是基于Keras框架下使用LoRA对Gemma模型进行微调的一个简单实例: ```python import tensorflow as tf from keras.layers import Dense from loralib.layers.dense import LoraDense # 假设这是支持LoRA功能的库 def create_lora_model(input_dim, output_dim, rank=4): inputs = tf.keras.Input(shape=(input_dim,)) # 使用LoRA层替代标准密集连接层 lora_layer = LoraDense(output_dim, r=rank)(inputs) predictions = Dense(output_dim, activation='softmax')(lora_layer) model = tf.keras.Model(inputs=inputs, outputs=predictions) return model model = create_lora_model(input_dim=768, output_dim=10, rank=8) model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) ``` 上述代码片段展示了如何构建一个带有LoRA机制的小型神经网络结构,并指定`r=8`作为低秩近似因子大小。实际操作过程中可以根据硬件条件调整此超参值以平衡效率与效果之间的关系。 #### 关键优势总结 - **减少内存占用**: 只需存储新增加的部分小型张量即可完成整个系统的部署工作; - **加速收敛速度**: 更少待优化变量意味着每轮迭代所需时间更短; - **维持良好泛化能力**: 即使只修改一小部分原有架构也能达到接近甚至超越传统FT的结果质量; 尽管如此,值得注意的是并非所有场景都适合采用此类简化策略——某些复杂度较高或者高度定制化的应用场景可能仍然依赖于完整的再训练流程才能获得最佳解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值