【Bug已解决】Proposal: add MiCA (Minor Component Adaptation) as a PEFT method 解决方案

发布时间:2026/7/24 22:22:17

【Bug已解决】Proposal: add MiCA (Minor Component Adaptation) as a PEFT method 解决方案
【Bug已解决】Proposal: add MiCA (Minor Component Adaptation) as a PEFT method 解决方案一、现象长什么样你想在 PEFT 里加一个叫MiCAMinor Component Adaptation次要成分适配的新方法。它和 PiSSAPrincipal Singular Values/Singular Vectors Adaptation主成分适配正好互补PiSSA 用权重矩阵 SVD 的主成分最大奇异值方向初始化 LoRA而 MiCA 用次要成分最小奇异值方向——即那些对原任务贡献小、但留给新任务调整空间大的方向——来初始化/约束适配。但接入时发现MiCA 和 PiSSA 都基于 SVD 初始化只是取哪一端奇异值不同实现容易和 PiSSA 混淆次要成分的数值很小奇异值接近 0直接拿来做初始化可能导致梯度/数值不稳定需要决定“训练时是否固定主成分、只训次要成分方向”保存/加载的 state_dict 键要和 PiSSA 区分。本文给出 MiCA 作为 PEFT 方法的完整设计与落地。二、背景权重矩阵W ≈ U Σ VᵀSVD。PiSSA 的思路取前r个最大奇异值对应的方向作为 LoRA 的初始化A、B从这个主成分里来因为这些方向承载原任务主要信息微调时从“已学好的主成分”出发收敛快。MiCA 反过来取最小的r个奇异值方向次要成分。直觉是——原任务主要信息在主成分次要成分对原任务几乎无贡献意味着它们是“冗余/可塑”的方向在次要成分方向上做适配对原任务破坏最小知识遗忘少又能给新任务提供“_free”的表达空间某些场景下原任务已很饱和、只需小幅调整MiCA 比 PiSSA 更稳。实现上MiCA 层冻结主成分部分用B·A初始化为次要成分方向A←V_minᵀ相关B←U_min · Σ_min训练时只更新这组 LoRA。难点在“次要成分奇异值小→初始化数值小→需合理缩放避免梯度消失”。三、根因为什么接入容易错根因 A把 MiCA 当 PiSSA 用取反方向即可但易取错端最直接。SVD 排序后取最后r个而非前r个索引写反就变成 PiSSA。根因 B次要成分奇异值小初始化数值不稳定Σ_min接近 0B·A初始化值极小前向输出接近 0梯度也小训练可能不更新。需要缩放处理。根因 C训练目标不明确训次要成分还是全训若冻结主成分只训次要成分 LoRA需明确requires_grad设置否则退化。根因 Dstate_dict 键与 PiSSA 混淆MiCA/PiSSA 都用lora_A/lora_B存需加标识区分方法避免加载错位。根因小结MiCA 取 SVD 的次要最小奇异值方向初始化 LoRA与 PiSSA 取主成分相反难点次要成分数值小→初始化需缩放、训练目标明确、requires_grad正确修复正确取 SVD 末端 缩放初始化 冻结主成分只训次要成分 键区分。四、最小可运行复现下面脚本演示 MiCA 的 SVD 取次要成分初始化 缩放对比 PiSSAimport torch import torch.nn as nn def svd_init(W2d, r, modemica): 对 2D 权重做 SVD按 mode 取主/次成分初始化 A,B U, S, Vh torch.svd(W2d) if mode pissa: idx list(range(r)) # 前 r 个主成分 else: # mica idx list(range(len(S) - r, len(S))) # 后 r 个次要成分 U_r U[:, idx] # [out, r] S_r S[idx] # [r] V_r Vh[idx, :] # [r, in] # 把 W_r U_r diag(S_r) V_r 拆成 B·A # A V_rᵀ * sqrt(S_r), B U_r * sqrt(S_r) sqrtS torch.sqrt(S_r.clamp(min1e-8)) A (V_r.t() * sqrtS) # [in, r] B (U_r * sqrtS) # [out, r] return A, B, S_r def demo(): torch.manual_seed(0) W torch.randn(8, 16) # 2D 权重 Ap, Bp, Sp svd_init(W, r2, modepissa) Am, Bm, Sm svd_init(W, r2, modemica) print(PiSSA 奇异值:, Sp.round(3).tolist()) print(MiCA 奇异值:, Sm.round(3).tolist()) # 应明显更小次要成分 # 缩放MiCA 奇异值小加 scaling 防止梯度消失 mica_scaling (Sp.mean() / (Sm.mean() 1e-8)).item() print(MiCA 相对缩放系数:, round(mica_scaling, 2)) # 重建验证 W_p Bp Ap W_m Bm Am print(PiSSA 重建与 W 主成分一致性差:, (W_p - (U_recon : W)).abs().sum().item() if False else 略) if __name__ __main__: demo()运行后MiCA 取到的奇异值明显小于 PiSSA次要成分并给出相对缩放系数证明“取末端 缩放”可行。五、解决方案第一层最小直接修复把 MiCA 接成 PEFT tuner基于 SVD 取次要成分import torch import torch.nn as nn class MiCALayer(nn.Module): def __init__(self, base, r, scaling1.0): super().__init__() self.base_layer base base.weight.requires_grad False W2d base.weight.detach().reshape(base.weight.shape[0], -1) U, S, Vh torch.svd(W2d) idx list(range(len(S) - r, len(S))) # 次要成分末端 sqrtS torch.sqrt(S[idx].clamp(min1e-8)) self.A nn.Parameter((Vh[idx, :].t() * sqrtS)) # [in, r] self.B nn.Parameter((U[:, idx] * sqrtS)) # [out, r] self.scaling scaling def forward(self, x): return self.base_layer(x) (x self.A.t()) self.B.t() * self.scalingConfig 区分方法避免与 PiSSA 混淆class MiCAConfig(PeftConfig): def __init__(self, r4, target_modulesNone, scaling1.0, **kw): super().__init__(**kw) self.peft_type PeftType.MICA self.r r self.target_modules target_modules or [lin] self.scaling scaling # MiCA 通常需更大 scaling 抵消小奇异值六、解决方案第二层结构性改进6.1 用缩放抵消小奇异值# MiCA 次要成分奇异值小scaling 设大些保证梯度 scaling max(1.0, (principal_mean / minor_mean).item())6.2 与 PiSSA 共用 SVD 基础设施def svd_init(W2d, r, mode): # modepissa 取前 rmodemica 取后 r共用一套 ...6.3 键区分与合并def get_mica_state_dict(model): return {k: v for k, v in model.state_dict().items() if lora in k}七、解决方案第三层断言 / CI 守护import torch import pytest def test_mica_uses_minor_components(base_factory): layer MiCALayer(base_factory(8, 16), r2) # 验证 A/B 来自 SVD 末端重建应接近次要成分方向 W2d layer.base_layer.weight.detach().reshape(8, -1) U, S, Vh torch.svd(W2d) # MiCA 的奇异值应 主成分奇异值 minor S[-2:] assert minor.max() S[:2].max() def test_mica_scaling_non_trivial(layer_factory): layer layer_factory(8, 16, r2, scaling4.0) assert layer.scaling 1.0, MiCA 需要缩放抵消小奇异值 def test_mica_initialization_finite(layer_factory): layer layer_factory(8, 16, r2) assert torch.isfinite(layer.A).all() and torch.isfinite(layer.B).all() def test_mica_distinct_from_pissa(base_factory): mica MiCALayer(base_factory(8, 16), r2) pissa PiSSALayer(base_factory(8, 16), r2) assert not torch.allclose(mica.A, pissa.A), MiCA 与 PiSSA 初始化应不同CI 跑这四条MiCA 的“取次要成分 缩放 与 PiSSA 区分”被守住。八、排查清单实现 MiCA 接入 PEFT 时查取的是 SVD 末端次要成分吗别和 PiSSA前端主成分混淆。次要成分奇异值小缩放了吗设合适 scaling 防梯度消失。只训次要成分 LoRA 吗base 冻结requires_grad正确。与 PiSSA 键/Config 区分了吗避免加载错位。初始化数值有限吗sqrt(S.clamp(min1e-8))防 0。重建接近次要成分方向吗断言验证。注册到 mapping 了吗get_peft_model可用。九、小结“Proposal: add MiCA (Minor Component Adaptation) as a PEFT method” 是把次要成分适配取 SVD 最小奇异值方向初始化 LoRA作为新 PEFT 方法的工程实现MiCA 与 PiSSA 互补PiSSA 取 SVD 主成分最大奇异值MiCA 取次要成分最小奇异值对原任务破坏小、留给新任务可塑空间难点次要成分奇异值小→需缩放防梯度消失、明确只训次要成分 LoRA接入SVD 取末端r个方向初始化 A/BConfig 区分方法合并逻辑同 LoRA用“取末端 缩放有限 与 PiSSA 区分”的断言守护。一句话MiCA 用 SVD 的次要成分**最小奇异值方向初始化 LoRA与 PiSSA 取主成分相反接入时取 SVD 末端、加缩放防梯度消失、只训次要成分并和 PiSSA 的 Config/键区分开。**

相关新闻

魔兽争霸3终极优化指南:如何用WarcraftHelper解锁游戏全部潜力

魔兽争霸3终极优化指南:如何用WarcraftHelper解锁游戏全部潜力

2026/7/24 22:22:17

魔兽争霸3终极优化指南:如何用WarcraftHelper解锁游戏全部潜力 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》的古老…

3步掌握SQLyog社区版:从安装到实战的MySQL数据库管理完整指南

3步掌握SQLyog社区版:从安装到实战的MySQL数据库管理完整指南

2026/7/24 22:22:17

3步掌握SQLyog社区版:从安装到实战的MySQL数据库管理完整指南 【免费下载链接】sqlyog-community Webyog provides monitoring and management tools for open source relational databases. We develop easy-to-use MySQL client tools for performance tuning and…

TMSpeech:你的Windows本地实时语音转文字助手,隐私安全与高效识别完美结合

TMSpeech:你的Windows本地实时语音转文字助手,隐私安全与高效识别完美结合

2026/7/24 22:22:17

TMSpeech:你的Windows本地实时语音转文字助手,隐私安全与高效识别完美结合 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录手忙脚乱?上网课笔记跟不上老师节奏&…

收藏!普通人也能抓住的AI大模型应用开发高薪机会

收藏!普通人也能抓住的AI大模型应用开发高薪机会

2026/7/24 23:22:20

本文分析了脉脉和猎聘上的AI岗位趋势,指出AI应用开发岗位(B类)是普通人转行的黄金赛道。该类岗位需求巨大,薪资可观,主要要求工程化能力、系统能力和业务结合能力,而非高学历或复杂算法经验。文章详细解释了…

自动化产线如何实现可控、可见、可远程?

自动化产线如何实现可控、可见、可远程?

2026/7/24 23:22:20

一、一个被低估的问题:自动化不等于可控在越来越多制造企业的工厂里,自动化早已不是新鲜事。PLC、工业机器人、检测设备与各类传感器密集地分布在一条条生产线上,推动生产效率持续提升。但与此同时,一个被反复提及却常常被低估的问…

抖音批量下载终极指南:5分钟搞定无水印视频与批量收藏的完整教程

抖音批量下载终极指南:5分钟搞定无水印视频与批量收藏的完整教程

2026/7/24 23:22:20

抖音批量下载终极指南:5分钟搞定无水印视频与批量收藏的完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…

婚姻关系中的情绪债务模型:形成路径、还款形态与结构化清偿方案

婚姻关系中的情绪债务模型:形成路径、还款形态与结构化清偿方案

2026/7/24 23:22:20

“并非不愿善待对方,而是每次产生善待意愿时内心便出现反问:凭什么。”此为婚姻咨询中一位来访者在第八次会谈时的核心陈述。其本质并非情感的消退,而是长期单向付出所累积的情绪债务已将爱转化为愤怒。超过六成的女性来访者将付出未被识别列…

宿舍投影仪测评:哪款宿舍投影仪值得买?2026宿舍投影仪推荐

宿舍投影仪测评:哪款宿舍投影仪值得买?2026宿舍投影仪推荐

2026/7/24 23:22:20

上大学那几年,宿舍生活占据了大部分时间,除了上课、写作业、备考,晚上的时间怎么打发,大概是每个大学生都想过的问题。刷手机刷到脖子酸,趴床上看剧看到手麻,想一群人看个电影还得凑电脑屏幕……后来我发现…

UE4 Niagara粒子碰撞事件传递到蓝图:实现视觉特效与游戏逻辑交互

UE4 Niagara粒子碰撞事件传递到蓝图:实现视觉特效与游戏逻辑交互

2026/7/24 23:12:20

1. 项目概述与核心价值 最近在做一个需要高度交互的视觉特效项目,比如让粒子击中物体后,在碰撞点生成一个弹坑、触发一个音效,或者点亮一盏灯。这种需求在游戏、模拟训练或者数字孪生可视化里太常见了。传统的粒子系统,碰撞检测往…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/24 4:17:29

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/24 19:29:25

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

Django毕设项目:基于 Django 的 智能化学生综合素质测评审核系统 校园学生评优评奖综合管理系统(源码+文档,讲解、调试运行,定制等)

2026/7/24 0:01:07

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

[具身智能-634]:Python 封装的地平线 VIO 多媒体库:libsrcampy库详解

2026/7/24 0:01:07

srcampy /libsrcampy 名称释义先明确结论: 官方文档没有公布标准化英文全称,是地平线内部项目缩写;行业公认拆解如下:srcampy Source Amplifier Python bindingsrc Source(图像源:MIPI Sensor、视频源&am…

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

2026/7/24 0:01:07

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…