
发布日期:2025-04-27 10:15 点击次数:185
仅诊治 5% 的主干收集参数张筱雨人体艺术,就能超越全参数微调成果?!
依然在实例分割、指标检测、旋转指标检测这么的经典视觉任务场景。
这是来自清华、国科大、上海交大、阿里巴巴的一项征询,关联论文已被 CVPR2025 接管。
他们建议了Mona(Multi-cognitive Visual Adapter)这种新式视觉适配器微调法式,指标是突破传统全参数微调(full fine-tuning)在视觉识别任务中的性能瓶颈。
Mona 法式通过引入多领略视觉滤波器和优化输入散布,仅诊治 5% 的主干收集参数,就能在实例分割、指标检测、旋转指标检测等多个经典视觉任务中超越全参数微调的成果。
这一法式权臣缩小了适配和存储资本,为视觉模子的高效微调提供了新的念念路。
Mona 初度突破了全量微调性能桎梏
跟着当代深度学习的发展,检会数据和模子界限的加多成为模子性能的伏击增长点,但随之而来的是模子的垂直应用和微调资本和难度的提高。
传统全量微调需要更新模子总共参数(如 GPT-3 的 1750 亿参数 ),计算资本极高。即使以早期的 BERT 为例,单卡检会 100 万数据也需 5-7 小时,对硬件资源和时期的条目截止了征询复现和骨子应用。
同期,跟着模子参数从亿级迈向万亿级,径直微调不仅资本不菲,还可能因过拟合导致性能着落。此外,多任务场景下需为每个任务保存齐备模子副本,存储资本剧加多。
参数高效微调(Parameter Efficient Fine-Tuning,PEFT)通过保握预检会模子参数冻结,仅诊治极少参数就可收尾大模子在垂直应用领域的高效适配。
但当今大无数 PEFT 法式,尤其是视觉领域的 PEFT 法式的性能相较于全量微调而言还存在弱势。
Mona 通过更稳妥视觉信号处理的揣度打算以及对预检会特征散布的动态优化,在小于 5% 的参数资本下初度突破了全量微调的性能桎梏,为视觉微调提供了新的惩办决议。
团队中枢想通过征询强调:
(1)PEFT 关于视觉模子性能上限的提高(尤其是参数目较大的模子);
(2)视觉模子在全微调(尤其是少样本情况)会存在严重的过拟合问题;
(3)1LVM+nAdapter 模式在骨子业务中潜在的性能和遵守上风。
关于具体业务来说,有些用到 LVM 或者多模态大模子(如 OCR 等任务)的任务会对视觉编码器部分进行固定或仅微调 linear 层来稳妥下流数据。
Mona 的存在表面上不错进一步提高 LVM、多模态大模子对视觉特征的结实和重构,尤其是关于一些少样本 post-training 问题。
中枢引入多领略视觉滤波器
Mona 包含降维、多领略视觉滤波器、激活函数和升维等模块,并在适配器里面加入了越过聚合(Skip-Connections),以增强模子的稳妥时候。
这种结构揣度打算使得 Mona 八成在保握高效的同期,权臣提高视觉任务的性能。
Mona 法式的中枢在于引入了多领略视觉滤波器,这些滤波器通过深度可分歧卷积(Depth-Wise Convolution)和多范例卷积核(3 × 3、5 × 5、7 × 7)来增强适配器对视觉信号的处理时候。
与传统的线性适配器不同,Mona 成心针对视觉任务揣度打算,八成更好地处理二维视觉特征,通过多范例特征交融提高模子对视觉信息的结实时候。
另外,Mona 在适配器的前端加入了散布适配层(Scaled LayerNorm),用于诊治输入特征的散布。
这种揣度打算八成优化从固定层传递过来的特征散布,使其更稳妥适配器的处理,从而提高微调遵守。
现实终结
先来看现实设置。
论文在多个代表性视觉任务上进行了现实,包括:
实例分割(COCO)
语义分割(ADE20K)
指标检测(Pascal VOC)
旋转指标检测(DOTA/STAR)
图像分类(Flowers102、Oxford-IIIT Pet、VOC2007)
现实使用了SwinTransformer 系列动作主干收集,并基于 ImageNet-22k 数据集进行预检会。
现实终结线路,在 COCO 数据集上,Mona 法式比拟全参数微调提高了 1% 的 mAP,仅诊治了不到 5% 的参数。
伊人在线大香蕉在 ADE20K 数据集上,Mona 提高了 0.18% 的 mIoU,发达出色。
同期,在 Pascal VOC 数据集上,Mona 提高了 3.6% 的 APbox,线路出权臣的性能提高。
在旋转指标检测任务(DOTA/STAR)中,Mona 在多个框架下均优于其他法式。
在图像分类任务上,Mona 也有不俗的性能。
在总共法式中, Mona 不断速率更快,况兼彰着卓越了全微调。
以下为 Mona 即插即用模块:
import torch.nn asnnimporttorch.nn.functionalasF# ------------------------------Mona 模块 ------------------------------INNER_DIM = 64class MonaOp ( nn.Module ) :def __init__ ( self, in_features ) :super ( ) .__init__ ( ) self.conv1 = nn.Conv2d ( in_features, in_features, kernel_size=3, padding=3 // 2, groups=in_features ) self.conv2 = nn.Conv2d ( in_features, in_features, kernel_size=5, padding=5 // 2, groups=in_features ) self.conv3 = nn.Conv2d ( in_features, in_features, kernel_size=7, padding=7 // 2, groups=in_features ) self.projector = nn.Conv2d ( in_features, in_features, kernel_size=1, ) def forward ( self, x ) :identity = xconv1_x = self.conv1 ( x ) conv2_x = self.conv2 ( x ) conv3_x = self.conv3 ( x ) x = ( conv1_x + conv2_x + conv3_x ) / 3.0 + identityidentity = xx = self.projector ( x ) return identity + xclass Mona ( BaseModule ) :def __init__ ( self,in_dim,factor=4 ) :super ( ) .__init__ ( ) self.project1 = nn.Linear ( in_dim, INNER_DIM ) self.nonlinear = F.geluself.project2 = nn.Linear ( INNER_DIM, in_dim ) self.dropout = nn.Dropout ( p=0.1 ) self.adapter_conv = MonaOp ( INNER_DIM ) self.norm = nn.LayerNorm ( in_dim ) self.gamma = nn.Parameter ( torch.ones ( in_dim ) * 1e-6 ) self.gammax = nn.Parameter ( torch.ones ( in_dim ) ) def forward ( self, x, hw_shapes=None ) :identity = xx = self.norm ( x ) * self.gamma + x * self.gammaxproject1 = self.project1 ( x ) b, n, c = project1.shapeh, w = hw_shapesproject1 = project1.reshape ( b, h, w, c ) .permute ( 0, 3, 1, 2 ) project1 = self.adapter_conv ( project1 ) project1 = project1.permute ( 0, 2, 3, 1 ) .reshape ( b, n, c ) nonlinear = self.nonlinear ( project1 ) nonlinear = self.dropout ( nonlinear ) project2 = self.project2 ( nonlinear ) return identity + project2#------------------------------ 插入模式 ------------------------------# 此处不详部分 Swin 组件收尾,仅提供 Mona 插入模式。class SwinBlock ( BaseModule ) :""""Args:embed_dims ( int ) : The feature dimension.num_heads ( int ) : Parallel attention heads.feedforward_channels ( int ) : The hidden dimension for FFNs.window_size ( int, optional ) : The local window scale. Default: 7.shift ( bool, optional ) : whether to shift window or not. Default False.qkv_bias ( bool, optional ) : enable bias for qkv if True. Default: True.qk_scale ( float | None, optional ) : Override default qk scale ofhead_dim ** -0.5 if set. Default: None.drop_rate ( float, optional ) : Dropout rate. Default: 0.attn_drop_rate ( float, optional ) : Attention dropout rate. Default: 0.drop_path_rate ( float, optional ) : Stochastic depth rate. Default: 0.act_cfg ( dict, optional ) : The config dict of activation function.Default: dict ( type='GELU' ) .norm_cfg ( dict, optional ) : The config dict of normalization.Default: dict ( type='LN' ) .with_cp ( bool, optional ) : Use checkpoint or not. Using checkpointwill save some memory while slowing down the training speed.Default: False.init_cfg ( dict | list | None, optional ) : The init config.Default: None."""def __init__ ( self,embed_dims,num_heads,feedforward_channels,window_size=7,shift=False,qkv_bias=True,qk_scale=None,drop_rate=0.,attn_drop_rate=0.,drop_path_rate=0.,act_cfg=dict ( type='GELU' ) ,norm_cfg=dict ( type='LN' ) ,with_cp=False,init_cfg=None ) :super ( SwinBlock, self ) .__init__ ( ) self.init_cfg = init_cfgself.with_cp = with_cpself.norm1 = build_norm_layer ( norm_cfg, embed_dims ) [ 1 ] self.attn = ShiftWindowMSA ( embed_dims=embed_dims,num_heads=num_heads,window_size=window_size,shift_size=window_size // 2 if shift else 0,qkv_bias=qkv_bias,qk_scale=qk_scale,attn_drop_rate=attn_drop_rate,proj_drop_rate=drop_rate,dropout_layer=dict ( type='DropPath', drop_prob=drop_path_rate ) ,init_cfg=None ) self.norm2 = build_norm_layer ( norm_cfg, embed_dims ) [ 1 ] self.ffn = FFN ( embed_dims=embed_dims,feedforward_channels=feedforward_channels,num_fcs=2,ffn_drop=drop_rate,dropout_layer=dict ( type='DropPath', drop_prob=drop_path_rate ) ,act_cfg=act_cfg,add_identity=True,init_cfg=None ) self.mona1 = Mona ( embed_dims, 8 ) self.mona2 = Mona ( embed_dims, 8 ) def forward ( self, x, hw_shape ) :def _inner_forward ( x ) :identity = xx = self.norm1 ( x ) x = self.attn ( x, hw_shape ) x = x + identityx = self.mona1 ( x, hw_shape ) identity = xx = self.norm2 ( x ) x = self.ffn ( x, identity=identity ) x = self.mona2 ( x, hw_shape ) return xif self.with_cp and x.requires_grad:x = cp.checkpoint ( _inner_forward, x ) else:x = _inner_forward ( x ) return x
临了小结一下,Mona 法式通过多领略视觉滤波器和输入优化,权臣提高了视觉任务的微调性能,同期大幅减少了参数诊治量。
这一法式不仅在多个视觉任务中超越了传统全参数微调,还为将来视觉模子的高效微调提供了新的见地。
预印版时期,Mona 已被复旦、中科大、南大、武大等多家单元的责任视为 SOTA 法式诈欺在医学、遥感等领域。
Mona 的开源代码将进一步鼓动这一领域的征询和应用。
附论文援用表情:
@misc{yin20245100breakingperformanceshackles, title={5%>100%: Breaking Performance Shackles of Full Fine-Tuning on Visual Recognition Tasks}, author={Dongshuo Yin and Leiyi Hu and Bin Li and Youqun Zhang and Xue Yang}, year={2024}, eprint={2408.08345}, archivePrefix={arXiv}, primaryClass={cs.CV}, url={https://arxiv.org/abs/2408.08345}, }
论文地址:https://arxiv.org/pdf/2408.08345
代码:https://github.com/Leiyi-Hu/mona
一键三连「点赞」「转发」「谨防心」
接待在辩论区留住你的想法!
— 完 —
学术投稿请于责任日发邮件到:
ai@qbitai.com
标题注明【投稿】,告诉咱们:
你是谁,从哪来,投稿内容
附上论文 / 相貌主页承接,以及相关形状哦
咱们会(尽量)实时回应你
� � 点亮星标 � �
科技前沿进展逐日见张筱雨人体艺术