视觉语言模型(Vision-Language Models,简称 VLM)如今已经是很多实际系统的底座,从图文检索、内容审核、自动驾驶场景理解,到电商多模态商品分类,都离不开它。以 CLIP 为代表的预训练模型,通过海量图文对齐学到了很强的通用表征,但有两个问题始终绕不过去:一是推理时遇到训练分布之外的新场景,性能会明显下滑;二是模型越大,全量微调的成本越高,很多团队根本负担不起。于是,一个研究思路近几年很受关注——测试时自适应(Test-Time Adaptation)。这篇文章要讲的 MuRA,就是该方向上一个值得关注的新工作。
先给一个明确判断:MuRA 的核心不是“再加一个 adapter”,而是把测试时自适应的优化空间,从传统的 prompt 浅层扩展到了“多低秩子空间”组合的深层特征空间,同时用多秩结构保证了表达能力和参数效率的平衡。如果你正在做 VLM 的推理部署,尤其是遇到“模型在线上数据上掉点”这类问题,MuRA 的思路会给你一个非常实用的解决方向。
读完这篇文章,你会理解:为什么测试时自适应是 VLM 落地的关键一环;TPT 这类已有方案卡在哪里;MuRA 提出的 Multi-Rank Adaptation 在原理上做了什么调整;以及如果要把这类方案接入自己的推理管线,有哪些工程落地时绕不开的问题。
1. 这篇文章真正要解决的问题
先看一个真实场景。你训练好的 CLIP 模型在公开评测集上表现不错,但上线之后,线上的图片风格和你训练集相差很大:白天变成黑夜、室内变成户外、手机拍摄变成监控截图、商品图上多出水印和促销贴片。这时你会发现,模型的 top-1 准确率肉眼可见地往下掉。
传统做法是收集线上数据重新做一遍微调。但问题也很明显:线上数据往往没有标注,即使有少量标注,也未必覆盖所有新分布;而且每两周重训一次模型,无论是标注成本还是训练成本都吃不消。于是测试时自适应就成了一个很自然的选择——不修改预训练权重,在推理阶段用模型自身的信息,对输入或中间表征做自适应调整,让模型在新的数据分布上也能保持稳定。
MuRA 所解决的问题,不是“要不要做测试时自适应”,而是“怎么做才高效、才有效”。它属于测试时自适应中的一个细分分支:参数高效自适应。也就是在推理时动态引入少量可学习参数,通过无监督目标(通常是熵最小化)来快速适配当前数据分布。它比单纯调整 prompt 的方法表达能力更强,比全量微调或大规模 adapter 方案参数开销更小。
什么样的读者最应该看这篇文章:
- 正在用 CLIP 或其他 VLM 做部署,被数据分布漂移困扰的算法工程师;
- 在探索 prompt tuning、adapter、LoRA 这类参数高效微调方向的同学;
- 对测试时自适应、无监督域适应有研究兴趣的研究生或科研人员;
- 做多模态推理服务,想在模型端到端流程中引入轻量自适应机制的架构师。
2. 基础概念与核心原理
2.1 什么是测试时自适应(Test-Time Adaptation)
测试时自适应,是指在模型推理阶段,利用当前测试样本(或一小批无标签测试数据)的信息,动态调整模型的部分参数,使模型适应当前输入的数据分布。它的核心假设是:测试数据的分布和训练数据不一致,但模型拥有足够好的预训练表征,只需要在推理时做一些轻量调整,就能恢复甚至提升性能。
这里要区别于两个概念:
| 方法 | 时机 | 数据 | 更新范围 |
|---|---|---|---|
| 全量微调(Fine-tuning) | 训练阶段 | 有标注数据 | 全部参数 |
| 参数高效微调(PEFT) | 训练阶段 | 有标注数据 | 少量新增参数 |
| 测试时自适应(TTA) | 推理阶段 | 无标注测试数据 | 部分参数或新增参数 |
从表格可以看出,TTA 最大的特点是推理时动态调整。它不要求你有额外标注数据,而是利用模型自身在测试样本上的反馈信号来完成适配。
在 VLM 领域,最经典的测试时自适应方法是 TPT(Test-Time Prompt Tuning)。它的思路是:给 CLIP 的文本分支准备若干条可学习的 prompt,然后在测试样本上通过无监督熵最小化来更新这些 prompt,从而让文本分支更适应当前样本。TPT 在分布漂移场景下确实有效,但它有一个明显瓶颈——只调整 prompt 这一层浅层参数,对深层特征分布的纠偏能力有限。
2.2 低秩适配(LoRA)与 Multi-Rank Adaptation 的关系
提到 Multi-Rank Adaptation,很多人会立刻想到 LoRA。LoRA 的核心思想是:大模型微调时,权重更新量往往具有低秩性质,因此可以把权重更新 ΔW 近似分解为两个低秩矩阵的乘积:ΔW = BA,其中 B 和 A 是秩很小的矩阵。这样可学习的参数量大幅减少,而效果接近全量微调。
MuRA 的命名直接继承了 LoRA 的“低秩分解”思想,但在两个关键点上做了延伸:
第一,应用场景从“训练阶段微调”变成了“测试时自适应”。LoRA 是在训练时学到固定的增量权重,MuRA 是在测试时动态地构建低秩适配方向,每来一批测试数据,都要根据当前数据特性做调整。
第二,用“多秩”替代“固定单秩”。LoRA 通常使用固定的 rank 值,比如 r=8、r=16,所有层的适配复杂度都一致。MuRA 的思路则是构造多个不同秩的低秩子空间,让模型能够根据输入复杂度,自适应地选择或组合这些子空间。这就好比一个工具箱,LoRA 是一把固定尺寸的扳手,MuRA 是一整套不同尺寸的扳手,遇到不同大小的螺母都能拧。
从机制上理解,MuRA 更像是“测试时的多头低秩注意力”。它希望在特征空间里同时探索多个低秩方向,然后用某种门控机制或者组合策略,将这些方向的输出融合成最终的自适应结果。这样既保持了低秩分解带来的参数高效性,又通过多秩结构提升了表达能力的上限。
2.3 为什么多秩结构在测试时自适应中有效
测试时自适应的难点在于:你只有当前样本,没有标签,也无法预知新分布的所有模式。单秩低秩适配的问题是,它假设分布漂移主要体现在一个固定的低秩子空间内。但真实场景中,分布漂移往往是多维度的:光照变化可能主要影响低层特征,物体形变可能影响中层特征,语义概念变化可能影响高层特征。如果只用低秩矩阵覆盖其中一类变化,对其他类型的变化就无能为力。
多秩结构恰好缓解了这个问题。不同秩的适配器会关注不同复杂度的特征变化:低秩的适配器擅长捕捉简单、主导性的变化模式,高秩的适配器能捕捉更复杂、更细节的变化。通过组合这些适配器的输出,模型在面对多种分布漂移时,鲁棒性会更强。
这个设计背后的逻辑是:在测试时,你并不知道新分布到底偏离了多少、偏离在哪一层,保守的做法是同时准备多个“假设”,然后让模型在数据驱动下选择最合适的组合。这比单秩方案多了一点点参数开销,但换来的是对未知分布更强的鲁棒性。
3. 测试时自适应的三种主流技术路线对比
要理解 MuRA 的定位,有必要先看清整个测试时自适应领域的技术版图。目前在 VLM 上,测试时自适应大致有三条路线:基于 prompt 的方法、基于归一化层调整的方法、基于低秩适配器的方法。
3.1 基于 prompt 的方法:TPT 及其变体
TPT(Test-Time Prompt Tuning)是这类方法的代表作。它维护一组可学习的 prompt token,在测试样本上计算熵最小化损失,反向传播更新这些 token。为了让 prompt 对单样本不过拟合,TPT 还会对输入做数据增强,从增强后的多个视图估计置信度,只保留高置信度的样本计算损失。
优点:参数量小,只改 prompt 层;实现简单;和原始 CLIP 推理流程改动最小。 缺点:优化空间有限,深层特征分布的问题解决不了;逐样本优化花费时间较长;对 prompt 初始化和学习率敏感。
3.2 基于归一化层调整的方法
归一化层统计量(如 BatchNorm 的均值和方差)直接反映数据分布。一些方法在测试时利用当前 batch 的统计量替换预训练统计量,或者更新归一化层的 affine 参数。这类方法在视觉模型上效果不错,但 VLM 中常用的 LayerNorm 不像 BatchNorm 那样天然具备分布对齐能力,所以直接迁移的效果有限。
3.3 基于低秩适配器的方法:MuRA 所在的路线
这条路线在训练阶段的代表是 LoRA 系列工作,在测试时自适应中则是通过引入低秩适配器来调整特征表示。与 prompt 方法相比,它直接作用于编码器输出的特征空间,能更深入地影响模型的表征;与归一化层调整相比,它的表达能力更强,能建模更复杂的分布漂移。
MuRA 的特殊性在于,它不是只添加一个低秩适配器,而是构造了一组不同秩的适配器,并研究如何高效地组合和更新它们。从参数量上看,它仍然属于参数高效方法;从效果上看,多秩结构为测试时自适应提供了更大的表达空间。
下面用表格对比这三条路线:
| 方法类型 | 代表方法 | 调整位置 | 表达能力 | 参数开销 | 适配速度 |
|---|---|---|---|---|---|
| Prompt 级 | TPT | 文本 prompt | 低 | 极低 | 中等 |
| 归一化层 | TENT 变体 | 归一化统计量 | 低 | 极低 | 快 |
| 低秩适配器 | MuRA | 特征空间 | 高 | 低 | 中等 |
从表格可以看到,MuRA 的定位是:在表达能力和参数开销之间取一个更优的平衡点。它不是最便宜的方法,但换来了更高的适配上限。
4. MuRA 的方法拆解与核心设计
4.1 整体框架
MuRA 的整体流程可以描述为:预训练 VLM 编码器保持不变,在编码器的特征输出层上插入一组多秩低秩适配器;测试时,给定一批无标注样本,计算模型预测的熵,用熵最小化损失更新适配器参数;更新完成后,用适配后的模型对样本进行预测。
值得注意的是,这个过程发生在推理阶段,且只更新新增的适配器参数,不修改预训练权重。因此,MuRA 可以被包装为一个“推理前置步骤”:先跑几百步自适应,再执行正常的模型推理。在实际工程中,这可以设计为一个可选的预处理模块。
4.2 多秩适配器的结构
多秩适配器的核心结构可以拆成两部分:
第一部分是基底生成。MuRA 会准备多个不同秩的基底矩阵,比如 rank=1、rank=4、rank=8 对应的三组低秩矩阵。这些基底可以随机初始化,也可以在测试时通过某种策略从预训练特征中动态生成。
第二部分是组合策略。多组适配器的输出不能简单相加,因为不同秩的子空间可能包含冗余信息。MuRA 的思路是学习一个组合权重或门控向量,根据当前测试样本的特征动态决定每路适配器的贡献。这有点像注意力机制中的多头融合,只是这里的“头”换成了不同秩的适配器。
为了让你直观理解,下面给出一个概念性的实现示意。注意,这是基于论文思路的伪代码,重点展示整体结构,具体实现细节以论文原文和官方代码为准。
# 文件路径:mura_concept.py import torch import torch.nn as nn class MultiRankAdapter(nn.Module): """ 多秩低秩适配器概念实现。 作用:在测试时对特征表示进行多子空间自适应调整。 说明:这是一个结构示意,不是官方实现。 """ def __init__(self, d_model, ranks=(1, 4, 8)): super().__init__() self.ranks = ranks # 每个 rank 对应一组低秩矩阵(LoRA 风格的 B * A) self.down_projs = nn.ModuleList() self.up_projs = nn.ModuleList() for r in ranks: # down: d_model -> r, up: r -> d_model self.down_projs.append(nn.Linear(d_model, r, bias=False)) self.up_projs.append(nn.Linear(r, d_model, bias=False)) # 组合权重:用于动态融合不同 rank 分支的输出 self.gate = nn.Linear(d_model, len(ranks)) def forward(self, x): # 计算不同 rank 分支的适配输出 branch_outputs = [] for down, up in zip(self.down_projs, self.up_projs): branch_outputs.append(up(down(x))) # 计算组合权重 gate_weights = torch.softmax(self.gate(x), dim=-1) # 加权融合 out = 0 for i, branch_out in enumerate(branch_outputs): w = gate_weights[..., i].unsqueeze(-1) out = out + w * branch_out return out这个结构的关键点有两个:一是“多秩分支”,不同秩的 down/up 矩阵建模不同复杂度的特征变化;二是“动态门控”,用输入特征自己决定各路分支的权重,避免固定权重带来的表达瓶颈。
4.3 测试时自适应主循环
测试时自适应的主循环可以概括为三步。第一步,从当前测试数据中采样一个小批量;第二步,用当前适配器参数前向传播,计算预测熵;第三步,反向传播更新适配器参数。整个过程持续若干个迭代步,然后在最终模型上执行预测。
这里有一个工程细节:熵最小化需要模型对当前样本有一定置信度,否则直接最小化熵可能让模型走向错误的“自信”。TPT 的做法是先用数据增强选高置信度样本,MuRA 同样需要类似的稳健化策略。合理的选择是,在自适应循环开始前先做一轮“样本筛选”,只保留那些模型原本就有一定把握的样本参与熵计算。
# 文件路径:mura_inference.py # 伪代码:展示测试时自适应主循环的结构 def test_time_adapt(model, adapter, test_loader, steps=10, lr=1e-3): """ 测试时自适应主循环(概念示意)。 model: 预训练 VLM 模型(冻结) adapter: MultiRankAdapter 实例 test_loader: 无标注测试数据 steps: 自适应迭代步数 """ optimizer = torch.optim.Adam(adapter.parameters(), lr=lr) for step in range(steps): batch = next(iter(test_loader)) # 前向:CLIP 图像和文本编码 image_features = model.encode_image(batch['image']) text_features = model.encode_text(batch['text']) # 使用适配器调整图像特征 adapted_image_features = adapter(image_features) # 计算 logits 和熵 logits = model.logit_scale * adapted_image_features @ text_features.T probs = torch.softmax(logits, dim=-1) entropy = -(probs * torch.log(probs + 1e-8)).sum(dim=-1).mean() # 熵最小化更新 optimizer.zero_grad() entropy.backward() optimizer.step() return model, adapter从这段伪代码可以看到,MuRA 的自适应过程并不复杂,复杂度主要集中在多秩适配器结构的设计上。真正的难点在于如何选择哪些层需要插入适配器、动态门控如何训练稳定、以及自适应步数和批量大小怎么设置。
4.4 与直接修改 prompt 的方法相比,MuRA 的差异点
两者最本质的差异在优化空间。TPT 优化的是文本端的 prompt token,MuRA 优化的是特征端的低秩适配器。前者影响的是“用什么语义上下文去匹配图像”,后者影响的是“图像特征被投影到什么空间”。前者更接近语义调节,后者更接近特征变换。
从计算角度看,TPT 的反向传播需要经过完整文本编码器,MuRA 的反向传播也需要经过编码器,只是更新参数更少。两者在耗时上差别不大,但 MuRA 对特征空间的干预能力更强,尤其在图像分布发生明显视觉变化时,效果会更突出。
5. MuRA 的适用场景与落地路径
5.1 哪些场景更适合用 MuRA
并不是所有场景都需要测试时自适应。如果你的线上数据分布和训练分布非常接近,或者你有充足的数据做周期性重训,那么引入测试时自适应反而会增加推理复杂度和稳定性风险。MuRA 更适合以下场景:
第一,线上数据分布持续漂移,但标注成本高。比如自动驾驶的天气和城市变化、安防摄像头的光线变化、电商商品图随着季节和活动变化。这些场景下,测试时自适应提供了一种“用无标注数据自行纠偏”的能力。
第二,推理延迟要求较高,但可以接受预处理阶段。MuRA 的自适应过程可以看作一次性的预计算,比如每分钟根据新积累的样本做一次适配,然后把更新后的适配器用于后续推理。这样不会增加每条请求的实时延迟,但又能保持模型对新近数据的适应性。
第三,预训练模型很大,无法频繁全量微调。跨模态搜索、多模态内容理解这类服务,底层 CLIP 模型动辄数亿参数,全量微调成本不可接受,低秩适配器的方案则只消耗极少的参数更新量。
5.2 如何把 MuRA 接入现有推理管线
下面给出一个可落地的接入方案,分为离线和在线两种策略。
离线策略适合定时任务。每隔一段时间(比如每小时或每天),收集这段时间内的无标注推理日志和输入数据,组成一个小批量,在 GPU 上运行测试时自适应,更新适配器参数,然后替换线上生效的适配器。这个过程中模型主干权重不变,只是适配器权重在更新,风险可控。
# 伪命令:离线自适应任务执行示例 # 假设适配器权重保存在 mura_adapter.pt,输入数据为当前小时的 embedding 缓存 python run_mura_fit.py \ --adapter_checkpoint ./mura_adapter.pt \ --embedding_cache ./cache/hourly_20250101_00.pt \ --output_adapter ./mura_adapter_latest.pt \ --steps 10 \ --lr 1e-3在线策略更适合实时场景。每次推理请求到来时,先用当前适配器参数做一次自适应更新(只需一个 sample 或一个小 batch),然后再推理。这种方式的时效性更强,但对适配器更新的稳定性要求更高,需要处理单样本异常值带来的干扰。一个折中方案是做“滑动窗口式更新”:维护最近 32 个样本的缓冲区,每来一个新样本,就用缓冲区数据做一次少量步数的适配。
{ "mura_config": { "ranks": [1, 4, 8], "insert_layer": "image_encoder.last_layer", "gate_activation": "softmax", "entropy_threshold": 0.3, "buffer_size": 32, "online_update_steps": 1, "learning_rate": 0.001 } }这是一个配置示例,具体值需要根据模型和数据调整。其中entropy_threshold用来筛选高置信度样本参与自适应,buffer_size控制在线更新的记忆窗口,online_update_steps控制每条请求触发的梯度更新步数。
5.3 混合部署策略:基于场景切换
更工程化的思路是:不要对所有请求都做测试时自适应,而是设置一个“分布偏移检测器”。当检测到当前输入与训练分布的距离超过阈值时,才启动测试时自适应;否则直接用原始模型推理。这样能在大部分时间保持低延迟,只在分布漂移明显的时候付出额外计算成本。
分布距离可以用特征空间中样本与训练集中心的距离,也可以用模型本身的预测熵来近似。预测熵高通常意味着模型对当前样本信心不足,可能是分布漂移的信号,也可能是样本本身模糊。因此,这个检测器需要结合样本置信度和历史分布统计来判断,避免误触发。
6. 使用 MuRA 时最容易被忽视的五个问题
6.1 逐样本更新还是批样本更新
很多人一开始会觉得,测试时自适应就是拿当前样本做一步梯度更新然后推理。但这样做的问题在于:单样本的随机性很大,容易对异常样本过拟合。更好的做法是用一个小批量统计量来平滑更新方向。MuRA 这类方法在设计时应当考虑批样本的效果——从论文标题中“Efficient and Effective”两个词来看,它在批量大小和自适应步数上的平衡是一个非常核心的设计目标。
6.2 适配器应插在哪一层
低秩适配器插入的位置对效果影响很大。插在图像编码器的高层特征之后,影响的是语义级特征;插在中间层,影响的则是更局部的视觉特征。MuRA 的多秩设计天然适合多位置插入:不同 rank 的分支可以插入不同层,形成“分层多秩适配”的结构。但这会增加实现复杂度,实际工程中建议先只在最后一层特征上实验,确认收益后再考虑多层扩展。
6.3 自适应步数怎么控制
步数太少,适配不足;步数太多,可能过拟合当前小批量,损害泛化能力。一个实用经验是:先在验证集上做小规模搜索,观察步数-准确率曲线,选择曲线变平坦的位置作为默认步数。同时,给适配器加一个很小的权重衰减或早停机制,能显著提升稳定性。
6.4 与数据增强的配合
数据增强对测试时自适应有双重作用:一方面,增强视图可以扩大样本多样性,降低单样本过拟合风险;另一方面,增强视图也提供了更稳的梯度估计,利于熵最小化收敛。MuRA 如果和自动增强策略(如 RandAugment)配合,效果通常会更好。但如果增强强度过大,会导致模型在增强视图上“过度自信”,反而损害最终性能,需要调参。
6.5 评估指标的偏差
测试时自适应的评估很容易出现偏差。常见的问题包括:评测时使用的是同一批测试样本完成适配和评估,给了模型“偷看”的机会;或者只测了一个分布漂移程度,无法体现方法在不同漂移强度下的鲁棒性。更规范的评估方式是将测试集划分为适配集和评估集,并且设置多个漂移程度不同的子集,观察方法整体表现。
7. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 自适应后准确率反而下降 | 学习率过大,适配器过拟合小批量样本 | 检查训练损失曲线和验证集准确率 | 降低学习率,减少自适应步数,增加权重衰减 |
| 不同秩分支效果差异大 | 分支间存在冗余,低秩分支学到无用信息 | 单独测试每个 rank 分支的贡献 | 调整 rank 组合,或移除贡献为负的分支 |
| 在线更新不稳定 | 单样本噪声过大,缓冲区内样本分布不均衡 | 查看每个 batch 的熵值和梯度范数 | 使用更大缓冲区,增加熵阈值筛选高分样本 |
| 适配器只对特定分布有效 | 适配器插入位置单一,无法覆盖多层特征漂移 | 可视化不同层的特征分布距离 | 尝试多层插入,或使用分层多秩结构 |
| 推理延迟增加明显 | 每个请求都执行在线梯度更新 | 压测分析耗时分布,检查优化器开销 | 改为离线定时适配,或用滑动窗口批量更新 |
| 多卡部署时适配器状态不一致 | 每张卡独立更新适配器,参数漂移 | 检查各卡适配器权重差异 | 增加参数同步机制,或主从更新再广播 |
8. 工程实践建议与后续研究方向
8.1 从小规模验证开始
建议不要在核心业务上直接上线测试时自适应,先在受限的小流量场景验证。具体做法是:挑一条你业务中分布漂移最明显的分支,采集最近两天的样本做回放,对比“原始模型”和“MuRA 适配模型”的准确率和延迟差异。如果收益不明显,先调自适应步数和 rank 配置;如果收益明显,再考虑扩大范围。
8.2 设置安全阀
测试时自适应本质上是模型自纠偏,存在“纠错方向错误”的风险。工程上一定要设置安全阀:比如记录适配前后模型预测的变化比例,如果超过阈值,说明适配导致了大范围预测翻转,应该拒绝本次适配结果,回退到原始模型。另外,适配器参数要定期重置或从原始状态重新开始,避免长期累积导致的偏移。
8.3 监控与可观测性
引入测试时自适应后,监控指标不只是模型准确率。建议额外记录:熵均值的变化趋势、适配器参数范数、门控权重分布、每批样本触发自适应的比例。这些指标能帮你判断适配器是否正常工作,以及是否需要调整触发策略。门控权重如果长期集中在一个分支上,说明其他 rank 分支可能没有发挥预期作用,需要重新审视多秩设计。
8.4 值得继续深入的方向
MuRA 这个方向可以延伸出几个值得关注的研究问题:
第一,多秩结构的自动搜索。不同数据集、不同模型、不同层,最优的 rank 组合可能不同。如果能用轻量的搜索策略自动决定每层用哪些 rank,会显著提升方法的实用性和易用性。
第二,和分布检测的联合优化。当前方法的流程是先检测分布漂移,再启动适配。如果能把检测和适配放在一个统一的框架里,让模型自己决定何时调整、调整多少,会更优雅。
第三,多模态协同的测试时自适应。MuRA 只调整图像特征分支,如何联合调节文本分支和跨模态融合模块,是一个值得探索的方向。毕竟分布漂移不仅来自图像侧,文本侧的新表达方式同样会影响模型表现。
第四,更高效的熵估计方法。熵最小化依赖模型输出的可靠性,在分布漂移严重时,模型的熵估计本身可能不可靠。如何用更稳健的损失函数替代纯熵最小化,是测试时自适应领域共同的问题。
9. 总结
MuRA 的核心贡献,是把低秩分解思想从训练阶段迁移到了测试时自适应阶段,并用多秩结构提升了适配的表达能力。它在技术路线上的定位很清晰:比 prompt 级方法更深入特征空间,比全量微调更省资源,和多秩组合的设计为分布漂移的不同类型提供了更灵活的应对空间。
对工程师而言,这篇文章值得记住的是三点。第一,测试时自适应是 VLM 落地中处理分布漂移的有效手段,不需要标注数据,改动可控。第二,多秩低秩适配器的核心设计是“用多个子空间假设覆盖未知的分布偏移”,这个思路可以迁移到很多参数高效微调任务中。第三,落地时不要忽略稳定性设计和安全阀,适配器不是“越更新越准”,控制不好反而会出现效果劣化。
下一步可以做的实践是:把你正在用的 CLIP 模型跑一次最小验证——在冻结模型权重的前提下,加一个低秩适配器,用熵最小化在一个分布偏移明显的测试子集上跑十几个 step,先看效果趋势,再决定要不要进一步探索多秩结构。这个验证流程成本很低,但对判断这个方向适不适合你的业务场景,非常有效。