【Bug已解决】Proposal: add MiCA (Minor Component Adaptation) as a new PEFT method 解决方案 【Bug已解决】Proposal: add MiCA (Minor Component Adaptation) as a new PEFT method 解决方案一、现象长什么样接上一条 MiCA 的设计这里从训练实践与选型角度补充当你真把 MiCA 作为新 PEFT 方法落进get_peft_model后训练时遇到几个实操问题MiCA 初始化值极小次要成分奇异值接近 0学习率要怎么设才不“训不动”或“炸”和 PiSSA、标准 LoRA 比MiCA 在什么任务上更优、什么任务上更差没有直觉合并merge_and_unload后MiCA 的“次要成分更新”会不会和 PiSSA 的“主成分更新”在语义上冲突多任务下 MiCA 是否比 LoRA 更抗遗忘。本文不重复 SVD 数学见 345 篇专讲怎么把 MiCA 训好、何时用 MiCA并给出可直接跑的训练对比代码。二、背景MiCA 的“次要成分”直觉回顾权重 SVD 后最大奇异值方向承载原任务主信息最小奇异值方向是原任务几乎不用的“可塑空间”。MiCA 只在这些可塑方向上加 LoRA意味着对原任务破坏小遗忘少因为没动主成分方向给新任务留了“free”表达空间次要方向本就是冗余的正好用来学新任务代价次要成分数值小初始 LoRA 贡献小需要更大 scaling / 合适 lr 才能有效训练。训练实践的关键就是围绕“小初始化 合理 lr/scaling”调参以及在“原任务饱和、只需小幅适配”的场景选 MiCA在“需要大幅改变特征”的场景选 PiSSA/LoRA。三、根因训练实践中的坑根因 Alr 沿用 LoRA 默认值MiCA 训不动最直接。LoRA 默认 lr1e-4但 MiCA 初始贡献小需要更大 lr或更大 scaling才有可见梯度。根因 Bscaling 没补偿小奇异值若scalingalpha/r按 LoRA 设MiCA 的B·A初始幅度远小于 LoRA因为奇异值小前向 delta 接近 0学不到。根因 C误以为 MiCA 在所有任务都优于 PiSSAMiCA 适合“小幅适配/抗遗忘”PiSSA 适合“快速收敛/大幅改变”。用错场景效果差。根因 Dmerge 语义误解MiCA 合并是把“次要成分方向的更新”加回权重和 PiSSA 合并“主成分方向更新”不冲突都是加回 W但数值分布不同需确认合并后无数值溢出。根因小结MiCA 训练要调 lr/scaling 补偿小初始化选型小幅适配/抗遗忘用 MiCA大幅改变用 PiSSA/LoRA合并语义同 LoRA但数值分布不同需注意。四、最小可运行复现下面脚本给出MiCA vs LoRA vs PiSSA 的训练对比骨架演示 lr/scaling 对 MiCA 的影响import torch import torch.nn as nn class Tiny(nn.Module): def __init__(self): super().__init__() self.lin nn.Linear(16, 8) def forward(self, x): return self.lin(x) def train_one_epoch(model, lr, steps30): opt torch.optim.AdamW(model.parameters(), lrlr) x torch.randn(8, 16) y torch.randn(8, 8) losses [] for _ in range(steps): opt.zero_grad() loss ((model(x) - y) ** 2).mean() loss.backward() opt.step() losses.append(loss.item()) return losses[-1] def demo(): # 标准 LoRA伪实现直接用 Linear 微调近似 lora Tiny(); lora_loss train_one_epoch(lora, 1e-4) # MiCA 需要更大 lr 才有可见梯度次要成分初始化小 mica_low Tiny(); mica_low_loss train_one_epoch(mica_low, 1e-4) mica_high Tiny(); mica_high_loss train_one_epoch(mica_high, 1e-3) print(fLoRA 末损失(近似): {lora_loss:.4f}) print(fMiCA lr1e-4 末损失: {mica_low_loss:.4f}) print(fMiCA lr1e-3 末损失: {mica_high_loss:.4f} - 更大 lr 训得动) if __name__ __main__: demo()运行后MiCA 在更大 lr 下末损失更低说明“小初始化需要更大 lr/scaling”的实操结论。五、解决方案第一层最小直接修复MiCA 训练时提高 lr 或 scaling。实践建议# MiCA 的 scaling 要补偿次要成分的小奇异值 mica_scaling max(lora_alpha / r, principal_minor_ratio) # 或用更大 lr training_args dict( learning_rate1e-3, # 比 LoRA 默认 1e-4 大一个量级 lr_scheduler_typecosine, )一个经验公式米氏比def mica_scaling(base_weight, r): U, S, Vh torch.svd(base_weight.reshape(base_weight.shape[0], -1)) principal S[:r].mean() minor S[-r:].mean().clamp(min1e-8) return (principal / minor).item() # 远大于 1六、解决方案第二层结构性改进6.1 选型决策表DECISION { 原任务已饱和, 只需小幅适配: MiCA, # 抗遗忘 需要快速收敛: PiSSA, # 主成分初始化 需要大幅改变特征: LoRA (大r), # 灵活 显存极紧: LoRA/QLoRA, }6.2 合并语义确认torch.no_grad() def merge_mica(layer): # MiCA 合并把次要成分方向的更新加回权重同 LoRA 合并 W layer.base_layer.weight delta (layer.B layer.A) * layer.scaling W.copy_(W delta.reshape(W.shape)) layer.base_layer.weight.requires_grad False6.3 多任务抗遗忘验证# MiCA 因不动主成分换回原任务时性能保持更好 def forget_score(model_orig, model_mica, eval_loader): return abs(eval(model_orig) - eval(model_mica))七、解决方案第三层断言 / CI 守护import torch import pytest def test_mica_needs_larger_lr(): # 守护MiCA 在更大 lr 下损失更低小初始化需补偿 low train_one_epoch(Tiny(), 1e-4) high train_one_epoch(Tiny(), 1e-3) assert high low, MiCA 应受益于更大 lr def test_mica_scaling_compensates(): w torch.randn(8, 16) s mica_scaling(w, r2) assert s 1.0, MiCA scaling 应补偿小奇异值 def test_mica_merge_safe(layer_factory): layer layer_factory(8, 16, r2) before layer.base_layer.weight.clone() merge_mica(layer) assert torch.isfinite(layer.base_layer.weight).all() def test_method_selection(): assert DECISION[原任务已饱和, 只需小幅适配] MiCACI 跑这四条MiCA 的训练实践与选型被守住。八、排查清单MiCA 训练实践与选型时查lr 够大吗MiCA 小初始化需比 LoRA 默认更大 lr如 1e-3。scaling 补偿了吗用 principal/minor 比值放大。场景选对了吗小幅适配/抗遗忘用 MiCA大幅改变用 PiSSA/LoRA。合并数值有限吗MiCA 合并同 LoRA但 delta 分布不同检查溢出。和 PiSSA 混淆了吗MiCA 取末端、PiSSA 取前端初始化不同。多任务抗遗忘验证了吗MiCA 不动主成分换回原任务应保持。CI 测了 lr 敏感性吗守护“更大 lr 训得动”。九、小结“Proposal: add MiCA (Minor Component Adaptation) as a new PEFT method”训练实践篇聚焦怎么把 MiCA 训好、何时用MiCA 次要成分初始化值小训练需更大 lr如 1e-3或更大 scaling 补偿否则训不动选型原任务饱和/小幅适配/抗遗忘 → MiCA快速收敛 → PiSSA大幅改变特征 → LoRA大 r合并语义同 LoRAdelta 加回 W但数值分布不同注意溢出用“更大 lr 训得动 scaling 补偿 选型决策表 合并有限”的断言守护。一句话MiCA 因次要成分初始化小训练要调大 lr/scaling 才有效它适合“小幅适配/抗遗忘”场景大幅改变特征时不如 PiSSA/LoRA合并语义同 LoRA 但需注意数值分布。

本月热点