低秩训练新进展:超越LoRA

1. LoRA回顾与理论基础

1.1 低秩假设

LoRA(Hu et al., 2021)的核心假设是预训练模型的权重更新具有低秩结构

其中

1.2 可训练参数分析

组件原始参数量LoRA参数量压缩比
0-
--
--
总计

1.3 表达能力的根本限制

LoRA的低秩假设存在表达能力上限

  • 如果真实最优更新 的秩 ,LoRA会引入近似误差
  • 在某些任务上(如需要大幅修改预训练知识),低秩约束可能导致欠拟合

2. 稀疏+低秩统一框架:HASSLE-free

2.1 问题形式化

HASSLE-free(CPAL 2025)提出统一稀疏剪枝和低秩近似的框架:

其中:

  • :原始权重矩阵
  • :稀疏掩码
  • :低秩矩阵

2.2 优化策略

两阶段交替优化

def hassLE_free(theta, lambda_sparse, lambda_rank, iters):
    S = torch.ones_like(theta)  # 初始掩码
    L = torch.zeros_like(theta)  # 初始低秩
    
    for _ in range(iters):
        # Step 1: 固定L,优化S(稀疏性)
        S = hard_threshold(theta - L, lambda_sparse)
        
        # Step 2: 固定S,优化L(低秩性)
        residual = theta - theta * S
        L = truncated_svd(residual, lambda_rank)
    
    return theta * S + L

2.3 理论保证

压缩-重构误差界

其中 的最优 -秩近似。


3. 动态秩训练

3.1 动机

固定秩无法适应不同层的不同表达能力需求

  • 浅层:低秩可能足够(捕获通用特征)
  • 深层:高秩可能必要(捕获任务特定知识)

3.2 动态秩分配策略

自适应秩调度

class DynamicRankLayer(nn.Module):
    def __init__(self, d, k, max_rank, warmup_steps):
        super().__init__()
        self.max_rank = max_rank
        self.warmup = warmup_steps
        # 初始低秩
        self.A = nn.Parameter(torch.randn(max_rank, k))
        self.B = nn.Parameter(torch.randn(d, max_rank))
        
    def get_effective_rank(self, step):
        # 预热后线性增加秩
        if step < self.warmup:
            return 1
        progress = (step - self.warmup) / (10000 - self.warmup)
        return min(int(1 + progress * (self.max_rank - 1)), self.max_rank)
    
    def forward(self, x, step):
        r = self.get_effective_rank(step)
        # 使用前r个秩
        return x @ self.A[:r] @ self.B[:, :r].T

3.3 逃逸低秩陷阱

渐进式秩增长允许模型在训练初期利用低秩快速收敛,随后扩展秩以捕获复杂模式:

其中 是Sigmoid函数, 是开始增长的时刻, 是增长率。


4. RandLoRA:随机投影全量微调

4.1 核心思想

RandLoRA(2025)通过随机投影突破低秩瓶颈

其中 (但 ), 是随机正交矩阵。

4.2 随机投影理论基础

Johnson-Lindenstrauss引理保证:

这意味着在投影空间中可以保持权重更新的几何结构。

4.3 优势

特性LoRARandLoRA
表达能力受限于秩 理论上全秩可达
可训练参数
适用场景简单任务复杂知识修改
推理开销需要合并需要合并

4.4 PyTorch实现

class RandLoRALayer(nn.Module):
    def __init__(self, d, k, m, random_dim="left"):
        super().__init__()
        self.random_dim = random_dim
        
        # 随机投影矩阵
        self.R = nn.Parameter(self._init_random(d, m))
        
        # 中间层
        self.H = nn.Parameter(torch.randn(m, m))
        
    def _init_random(self, d, m):
        # 随机正交初始化
        Q, _ = torch.linalg.qr(torch.randn(d, m))
        return Q
    
    def forward(self, x, W0):
        if self.random_dim == "left":
            proj = x @ self.R.T
        else:
            proj = x @ self.R
        hidden = proj @ self.H @ self.R
        return x + hidden  # 等效于 W0 + ΔW

5. 正交知情低秩(OIALR)

5.1 动机

标准LoRA的 可能产生病态基,导致训练不稳定。

5.2 正交SVD基

OIALR强制低秩矩阵在正交基下分解:

其中 是从 的SVD分解中继承。

5.3 稳定性保证

正交基确保:

  • 奇异值 直接控制缩放
  • 避免梯度消失/爆炸
  • 更好的条件数

6. 方法对比与选择指南

6.1 方法特性对比

方法可训练参数表达能力稳定性适用场景
LoRA简单任务、持续学习
HASSLE-free动态中-高内存受限场景
动态秩中-高渐进式适应
RandLoRA复杂知识修改
OIALR很高对稳定性要求高

6.2 实践建议

  1. 简单任务(如指令微调):使用LoRA,
  2. 复杂任务(如领域适应):考虑动态秩或RandLoRA
  3. 内存受限场景:使用HASSLE-free的稀疏-低秩联合
  4. 稳定性优先场景:使用OIALR

7. 代码示例:综合实践

class HybridLowRankLayer(nn.Module):
    """
    组合LoRA + 稀疏剪枝的混合方法
    """
    def __init__(self, d, k, r=8, sparsity=0.3):
        super().__init__()
        self.W0 = nn.Parameter(torch.randn(d, k))
        self.A = nn.Parameter(torch.randn(r, k) * 0.01)
        self.B = nn.Parameter(torch.randn(d, r))
        
    def forward(self, x):
        # LoRA部分
        delta = self.B @ self.A
        
        # 随机稀疏性(训练时用于正则化)
        if self.training:
            mask = torch.rand_like(self.W0) > 0.3
            delta = delta * mask.float()
        
        return x @ (self.W0 + delta)

8. 参考文献