SingLoRA: Low Rank Adaptation Using a Single Matrix

文章主要内容总结

本文提出了一种新的低秩适应方法SingLoRA,旨在解决传统低秩适应(LoRA)方法中存在的训练不稳定性和参数效率问题。传统LoRA通过两个矩阵(A和B)的乘积对预训练权重进行低秩更新,但矩阵A和B的尺度差异会导致梯度消失或爆炸,影响训练稳定性和性能。

SingLoRA通过单个低秩矩阵A的转置乘积(A Aᵀ) 重构低秩更新,实现了对称的权重更新(W₀ + A Aᵀ)。这种设计从根本上消除了矩阵间的尺度冲突,保证了训练稳定性,同时将可学习参数数量减少约一半。

实验验证了SingLoRA的优势:在自然语言推理任务(如MNLI)中,微调LLaMA 7B模型时准确率达91.3%,超过LoRA(89.1%)和LoRA+(90.2%),且仅使用其60%的参数;在图像生成任务(如DreamBooth微调Stable Diffusion)中,DINO相似度得分达0.151,优于DoRA(0.148)和LoRA(0.143)。

创新点

  1. 结构重构:用单个低秩矩阵A的转置乘积(A Aᵀ)替代LoRA中两个矩阵(B A)的乘积,消除矩阵间尺度差异,从设计上保证训练稳定性。
  2. 参数高效:可学习参数数量较LoRA减少约50%,在相同任务中用更少参数实现更优性能。
  3. 普适性强:适用于方形和非方形权重矩阵,兼容Transformer等多种架构,在自然语言处理和图像生成等领域均表现优异。
### 如何实现LoRA(低秩适应) #### 准备环境 为了实现LoRA,首先需要准备合适的开发环境。这通常涉及安装必要的库和依赖项。由于LoRA的官方GitHub仓库提供了详细的设置指南[^1],建议按照该指南配置环境。 #### 修改模型结构 在Transformer架构中实施LoRA的关键在于向选定的权重矩阵添加可训练的低秩分解矩阵对。具体来说: - 对于每一个目标权重矩阵 \( W \),创建两个新的小规模矩阵 \( A \in \mathbb{R}^{r\times d} \) 和 \( B\in \mathbb{R}^{d\times r} \),其中\( r \ll d \)[^3]。 ```python import torch.nn as nn class LoRAModule(nn.Module): def __init__(self, original_layer, rank=4): super().__init__() self.original_layer = original_layer # Initialize low-rank matrices A and B with Xavier uniform initialization. self.A = nn.Parameter(torch.empty(rank, original_layer.in_features)) self.B = nn.Parameter(torch.empty(original_layer.out_features, rank)) nn.init.xavier_uniform_(self.A) nn.init.zeros_(self.B) def forward(self, input_tensor): # Compute the output using both the original weights and the added low-rank adaptation terms. adapted_output = self.original_layer(input_tensor) + (input_tensor @ self.A.T @ self.B.T) return adapted_output ``` 此代码片段展示了如何为单个线性层定义一个带有LoRA机制的新模块。这里`original_layer`代表原有的预训练模型中的某一层,而`rank`则指定了要使用的低秩近似维度大小。 #### 训练过程调整 当采用LoRA时,只需更新这些额外加入的小型矩阵而不是整个网络的所有参数。因此,在实际训练过程中只需要关注这部分新增加的部分即可[^2]。 ```python from transformers import AdamW optimizer = AdamW([ {'params': model.lora_modules.parameters()}, # Only optimize parameters of LoRA modules ], lr=learning_rate) ``` 上述Python代码说明了怎样配置优化器来专门针对那些被注入到原有模型里的低秩矩阵进行梯度下降操作。 #### 部署阶段处理 一旦完成训练之后,在推断期间可以将所有已学得的低秩矩阵与对应的固定部分相乘合并成单一的整体表示形式,以此消除任何可能存在的性能瓶颈。 ```python def merge_lora_weights(model): for name, module in model.named_children(): if isinstance(module, LoRAModule): merged_weight = module.original_layer.weight.data.clone() merged_weight += (module.A @ module.B).T delattr(module, 'A') delattr(module, 'B') setattr(module, 'merged', True) module.original_layer.weight.data.copy_(merged_weight) ``` 这段函数遍历给定的PyTorch模型实例,并对于每个属于`LoRAModule`类型的子组件执行融合动作——即将之前分离出来的两组小型矩阵重新组合回原位,同时删除不再需要的对象属性以节省内存空间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UnknownBody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值