17076 字
85 分钟
实践-OFA相关研究
2025-05-15
2025-04-10
⚠️ 注:本篇博客是探索过程中的随手记录,包括大量无用信息、AI生成信息。参考价值较低。

OFA#

OFA: Unifying Architectures, Tasks, and Modalities Through a Simple Sequence-to-Sequence Learning Framework(ICML 2022,阿里巴巴)

预训练模型。

仓库链接: https://github.com/OFA-Sys/OFA

作者提供了很多下游任务的示例

Image Captioning为例子

▼ 1. 准备数据集和检查点 下载数据(参见 datasets.md)和模型(参见 checkpoints.md),并将它们放在正确的目录中。数据集压缩文件 caption_data.zip 包含 caption_stage1_train.tsvcaption_stage2_train.tsvcaption_val.tsvcaption_test.tsv。每个图像在 caption_stage1_train.tsv 中只对应一个标题,并在其他 TSV 文件中对应多个标题(每张图像大约有5个标题)。

数据集的每一行代表一个标题样本,格式如下。唯一标识符 uniq-id、图像标识符 image-id、标题 caption、预测的对象标签(来自 VinVL,未使用)、以及 base64 编码的图像字符串由制表符分隔。

▼ 2. Finetuning 遵循先前的标准做法,我们将图像标题生成的微调过程分为两个阶段。在第一阶段,我们使用交叉熵损失在4个具有32GB内存的 NVIDIA-V100 GPU 上对 OFA 进行微调(预计在此阶段验证集上的 CIDEr 分数约为139.5)。在第二阶段,我们选择第一阶段的最佳检查点,并在8个 NVIDIA-V100 GPU 上使用 CIDEr 优化进行训练。请注意,CIDEr 优化非常不稳定,需要仔细调整超参数。如果你在第二阶段的微调过程中遇到训练错误,可以增加批量大小或降低学习率。如果这些方法都不奏效,你可以直接设置 —freeze-resnet 来冻结批处理归一化的内部状态。

cd run_scripts/caption
nohup sh train_caption_stage1.sh > train_stage1.out & # 第一阶段,使用交叉熵损失进行训练
nohup sh train_caption_stage2.sh > train_stage2.out & # 第二阶段,加载第一阶段的最佳检查点并进行训练

▼ 3. 推理 运行以下命令以获取结果并评估你的模型。

cd run_scripts/caption ; sh evaluate_caption.sh # 推理与评估

OFA的技术细节

**I/O统一,**要解决的问题就是图像和文本在transformer模型中如何输入和输出。输入方面,文本的输入则是传统的BPE encoding将文本输入转化为embedding序列,图像的输入则相对复杂。首先图像需要同样转化成embedding序列的形式,方法的核心则参照ViT的分patch实现。参考了CoAtNet和SimVLM的实现,OFA将图像接入ResNet后转化为patch embedding后再与文本embedding进行拼接,而为了实现更好的效果OFA将ResNet部分加入到模型的训练中。但针对图像的输出,图像依然需要离散化的表达,因此OFA的实现和此前DALL-E、Beit等工作一致,将图像使用vector quantization模型转化成code作为模型的target并将code加入到词表中。此外,由于模型的预训练任务包括grounded captioning,visual grouding以及object detection,OFA还需要处理坐标信息的输入和输出。具体而言,参照Pix2Seq的实现,OFA将连续的坐标信息转化成离散化的表示,并将其加入到词典中,从而将文本、图像、坐标都融入到一个统一的词表中。

TODO:ViT、CoAtNet和SimVLM、DALL-E和Beit、Pix2Seq

OFA-Chinese#

在OFA官方项目中,同时实现了fairseq和transformers两套框架的模型结构,并且分别开源了中文和英文的模型权重。

  • 由于笔者对transformers框架更熟悉,所以希望基于transformers框架,使用域内中文数据对OFA模型进行finetune,但OFA的中文预训练权重只有fairseq版本,没有transformers版本。希望将fairseq版本的OFA预训练权重转换为transformers版本,从而便于下游任务进行finetune。
  • 官方代码库中,由于需要兼容各种实验配置,代码也比较复杂冗余。笔者希望能够将核心逻辑剥离出来,简化使用方式。

笔者的主要工作如下:

  • 阅读分析OFA官方代码库,剥离出核心逻辑,包括训练逻辑、model、tokenizer等,以transformers框架进行下游任务的训练和推理,简化使用方式。
  • 将官方的fairseq版本的中文预训练权重,转化为transformers版本,用于下游任务进行finetune。
  • 基于本项目,使用中文多模态MUGE数据集中的Image Caption数据集,以LiT-tuning的方式对模型进行finetune,验证了本项目的有效性。
  • 开源五个transformers版本的中文OFA模型权重,包括由官方权重转化而来的四个权重,以及笔者使用MUGE数据集finetune得到的权重。

MixLoRA#

Multimodal Instruction Tuning with Conditional Mixture of LoRA(ACL 2024)

中文博客

多模态指令调优通过使用多样化的、基于指令的多模态任务对预训练模型进行微调,展示了其在促进未见过的多模态问题零样本泛化方面的有效性。

在多模态指令调优中,像LoRA这样的传统PEFT方法的有效性由于依赖于调整有限的共享参数部分以同时适应多样化任务而减弱,导致任务干扰。这是一个在多任务学习中被广泛研究的问题(Yu等人,2020;Liu等人,2021;Navon等人,2022),但在参数高效多模态指令调优的背景下尚未得到充分研究。

梯度方向的角度是借鉴了(Liu等人,2021)

与传统LoRA在整个任务和实例中使用共享的低秩适应矩阵A和B不同,MixLoRA通过从两个集合中选择其分解因子,动态地构建针对每个输入实例定制的低秩适应矩阵A和B。MixLoRA引入了一种动态因子选择机制,包括两个独立因子选择(IFS)路由器和一个条件因子选择(CFS)路由器。这两个IFS路由器独立选择适当的因子,以动态构建针对每个输入定制的LoRA A和B矩阵。CFS路由器进一步基于为LoRA A选择的因子来细化LoRA B的选择,确保LoRA A和B的因子选择不仅针对输入进行调整,而且一致对齐。

为了验证MixLoRA的有效性,在MME(Fu等人,2023)上进行了广泛的实验,这是一个全面的多模态评估基准,并在七个额外的专注于各种能力的多模态评估数据集上进行了实验。

Vision-Flan(Xu等人,2023a)作为一个全面的人工标注视觉指令调优数据集脱颖而出,涵盖了广泛的187个任务,使其成为我们训练的理想选择。

核心技术细节#

受专家混合(Mixture-of-Experts)概念的启发(Shazeer等人,2016年),我们提出了条件LoRA混合(MixLoRA),它利用低秩分解因子作为动态选择的专家来为特定输入实例构建定制的分解矩阵A和B。MixLoRA促进了针对不同输入实例的动态处理路径,从而增强了处理多样和复杂的多模态指令任务的有效性。

条件LoRA混合的核心在于通过张量分解表示来自方程1的权重调整矩阵ΔW:

ΔW=BA=i=1rbiai,\Delta W = BA = \sum_{i=1}^{r} b_i \otimes a_i,

其中\otimes表示外积,{ai,bi}i=1raiRdin×1biRdout×1\{a_i, b_i\}_{i=1}^{r},a_i \in \mathbb{R}^{d_{in} \times 1},b_i \in \mathbb{R}^{d_{out} \times 1}ΔWRdout×din\Delta W \in \mathbb{R}^{d_{out} \times d_{in}}的秩r分解因子。

4.1 动态因子选择#

动态因子选择模块使用两个主要组件来动态构建LoRA矩阵A和B。首先,两个独立因子选择(IFS)路由器(第4.1.1节),独立地选择rr个相关因子以形成适应矩阵LoRA A和B,确保精确、实例特定的适应。其次,条件因子选择(CFS)路由器(第4.1.2节)通过根据为LoRA A选择的因素进一步细化LoRA B的选择,促进连贯的适应过程。

4.1.1 独立因子选择#

MixLoRA采用两个独立因子选择(IFS)路由器,RIFSA()RIFSB()R_{\text{IFS}}^{A}(\cdot)和R_{\text{IFS}}^{B}(\cdot),分别选择r个相关因子用于LoRA A和B,如图3所示。IFS路由器采用基于实例的路由方法,这种方法在选择r个分解因子时比传统的输入令牌基路由更节省内存。路由策略可以表示为:

RIFSA(h)=Avg(h),R_{\text{IFS}}^{A}(h) = \text{Avg}(h),

其中Avg()\text{Avg}(\cdot)对隐藏状态hRseq×dinh \in \mathbb{R}^{\text{seq} \times d_{\text{in}}}的序列维度进行平均,结果是RIFSA(h)RdinR_{\text{IFS}}^{A}(h) \in \mathbb{R}^{d_{\text{in}}}

因子选择过程涉及计算向量gAREg_A \in \mathbb{R}^EgBREg_B \in \mathbb{R}^E,以分别从集合{ae}e=1E\{a_e\}_{e=1}^{E}{be}e=1E\{b_e\}_{e=1}^{E}中选择特定的分解因子子集。为了计算gAg_A,输入RIFSA(h)RdinR_{IFS}^{A}(h) \in \mathbb{R}^{d_{in}}通过一个权重为WARE×dinW_A \in \mathbb{R}^{E \times d_{in}}的全连接层处理,随后进行softmax归一化和top-k选择:

gA=topr(softmax(WARIFSA(h))).g_A = \text{top}_r(\text{softmax}(W_A \cdot R_{IFS}^{A}(h))).

这一过程确保了LoRA A的r个因子的选择,其中gA[i]=1g_A[i] = 1表示因子i被选中。同样的过程应用于确定LoRA B的gBg_B

4.1.2 条件因子选择#

虽然迄今为止LoRA A和B的因子是独立选择的,我们假设在LoRA A和B的选择之间存在相互依赖关系,这可以被利用来提高模型的整体适应性和性能。为了利用这种关系,我们提出了一种条件因子选择(CFS)策略,在该策略中,LoRA B的投影上升权重的因子选择也受到LoRA A的投影下降权重所选因子的影响。

与IFS路由器一样,LoRA A由选定的分解因子组装而成,记为A=[a1,,ar]TA = [a_1, \cdots, a_r]^T,其中ARr×dinA \in \mathbb{R}^{r \times d_{in}}。接下来,CFS路由器使用一个权重张量WABRr×din×EW_{AB} \in \mathbb{R}^{r \times d_{in} \times E},将每个因子A[i]R1×dinA[i] \in \mathbb{R}^{1 \times d_{in}}映射到专家维度E。对于每个因子A[i]A[i]的映射过程,通过softmax归一化并跨r个因子聚合,给出如下:

RCFSB(A)=i=1rsoftmax(A[i]WAB[i]),R_{CFS}^{B}(A) = \sum_{i=1}^{r} \text{softmax}(A[i] \cdot W_{AB}[i]),

其中WAB[i]Rdin×EW_{AB}[i] \in \mathbb{R}^{d_{in} \times E}是与A[i]A[i]相关的映射矩阵。

LoRA B的因子选择整合了来自IFS RIFSB()R_{IFS}^{B}(\cdot)和CFS RCFSB()R_{CFS}^{B}(\cdot)路由器的输出,通过后期融合策略形成选择向量gBg_B,如下所示:

pIFSB=softmax(WIFSBRIFSB(h))p_{IFS}^{B} = \text{softmax}(W_{IFS}^{B} \cdot R_{IFS}^{B}(h)) pCFSB=softmax(RCFSB(A))p_{CFS}^{B} = \text{softmax}(R_{CFS}^{B}(A)) gB=topr(pIFSB+pCFSB),g_B = \text{top}_r(p_{IFS}^{B} + p_{CFS}^{B}),

其中,对于LoRA B的RIFSB(h)RdoutR_{IFS}^{B}(h) \in \mathbb{R}^{d_{out}}计算方式与RIFSA(h)R_{IFS}^{A}(h)相似。

概率分布

概率分布pIFSBREp_{IFS}^{B} \in \mathbb{R}^EpCFSBREp_{CFS}^{B} \in \mathbb{R}^E分别反映了独立路由器和条件路由器的选择。最终选择向量gBREg_B \in \mathbb{R}^E通过结合这些分布并识别出前r个因子来确定。这种CFS策略使LoRA B的选择能够受到为LoRA A所选因子的影响,促进更连贯的选择过程。

4.1.3 动态适应矩阵的重建#

最后,MixLoRA通过利用因子选择向量gAg_AgBg_B,收集选定的因子{ak,bk}kK,K=r\{a_k, b_k\}_{k \in K}, |K| = r,来组装LoRA A和B的最终矩阵。因此,在每次前向传递中,权重调整矩阵ΔWRdout×din\Delta W \in \mathbb{R}^{d_{out} \times d_{in}}基于这些选定的因子动态计算,公式如下:

ΔW=BA=[b1,,br][a1,,ar]T.\Delta W = BA = [b_1, \cdots, b_r][a_1, \cdots, a_r]^T.

5 实验方法#

5.1 数据集#

训练数据集#

为了验证MixLoRA的有效性,我们在Vision-Flan(Xu等人,2023a)上进行指令调优,这是一个包含187种不同任务的人工标注多模态指令调优数据集。其在视觉指令任务中的多样性使其成为研究任务干扰的理想选择。为了最小化计算成本,我们使用了一个每任务最多1,000个实例的缩小版本,总计182,167个实例。

评估数据集#

我们在MME(Fu等人,2023)上评估我们的方法,这是一个全面的多模态评估基准,测量14个子任务上的感知和认知能力,以评估MixLoRA的整体能力。除了MME,我们还使用7个多模态数据集进一步探测模型的各种能力。对于光学字符识别,我们使用TextVQA(Singh等人,2019),而对于推理,我们采用视觉空间推理(VSR)数据集(Liu等人,2022)。感知能力在CIFAR-10/100(Krizhevsky等人,2009)和MNIST(LeCun,1998)上进行测试,遵循Zhai等人(2023)的指导。SNLI-VE数据集(Xie等人,2019)评估视觉蕴含能力,而POPE(Li等人,2023c)则检查对象幻觉的趋势。

5.2 评估指标#

对于 MME 得分,我们使用官方评估工具²,聚合感知和认知指标。对于其他多模态数据集,我们利用 Vicuna 1.5 13B(Chiang 等人,2023),这是一种最先进的开源语言模型(LLM),以评估预测与真实目标输出相比的准确性。更多细节见附录 C。

6 结果与讨论#

与 LoRA 的比较
我们首先详细比较了 MixLoRA 和传统的 LoRA,在 MME 和另外7个多模态任务上的表现,如表1所示。我们观察到,当两种模型在 MME 和附加多模态任务上具有相同的秩时,MixLoRA 一致地超越了 LoRA,并且即使与具有更高秩数的 LoRA 相比,也表现出更优的性能。例如,MixLoRA(秩 r=2 和因子 E=16)在 MME 上比 LoRA(秩 r=32)高出1.7%,在其他多模态评估中平均高出1.6%。

增加秩数
我们在保持因子数量不变的情况下,研究了增加秩数的影响。如表1所示,当因子数量固定时,随着秩数从2增加到4,MixLoRA 表现出了显著的性能提升。具体来说,将秩 r 从2增加到4,在因子 E=16 时,导致 MME 性能提升了1.8%,MMAvg 提升了3.1%;而在因子 E=32 时,MME 提升了3.5%,MMAvg 提升了0.6%。然而,进一步将秩增加到8显示出性能增益的边际效应递减。我们假设这种下降可能是由于构建适应矩阵的组合池扩展所导致的。

增加因子数量
在秩数保持不变的情况下,我们的发现揭示了 MixLoRA 性能改进的一般趋势,如表1所示。这种改进可归因于模型提供更丰富因子集合的能力,使模型能够针对特定的多模态任务进行定制。

路由策略的效果
在这个实验中,我们考察了不同路由策略对IFS 路由器的影响。特别是,我们实现了任务特定路由范式,该范式利用每个多模态指令任务的定义来指导分解因子的选择(详细信息可以在附录 A 中找到)。表 2 显示,基于实例的路由显著优于任务特定路由,在 MME 得分和附加多模态任务的平均性能上都取得了更高的成绩。基于实例的路由的优越表现可能源于其固有的灵活性。与任务特定路由不同,后者在来自同一任务的不同层输入中选择相同的因子,基于实例的路由根据前一层变化的隐藏状态调整其选择,从而导致更灵活的路由机制。

此外,我们研究了卓越的表现是否是由于引入了额外的专家参数而不是路由机制。表 2 报告了与随机路由基线的比较,该基线随机选择 r 个因子。我们的观察表明,基于实例的路由和任务特定路由都超过了随机基线,这表明路由机制,而非额外专家参数的加入,才是关键因素。

条件因子选择的影响 我们通过消融分析评估了条件因子选择(CFS)的影响,比较了在七个多模态数据集上 MixLoRA 有无 CFS 的平均性能。如图4所示的比较结果表明,在不同的因子和秩设置下,总体上加入 CFS 路由器通常能提高性能。这种增强被认为源于 CFS 在加强 LoRA A 和 B 因子选择之间相互依赖性方面的作用。

未见任务的因子选择模式 我们的分析深入探讨了 LoRA A 在未见多模态任务中的因子选择模式。我们从七个未见多模态任务中每个任务随机抽取300个实例,并使用 t-SNE(Van der Maaten 和 Hinton,2008)可视化 MLP 层内的因子选择,如图5所示。我们观察到,来自相同任务的实例倾向于聚类,这表明基于实例的路由策略在跨任务分配不同的因子集方面的有效性。

此外,我们还可视化了相似的已见和未见任务的因子选择模式。我们将五个不同的未见任务与训练集中五个类似的已见任务配对,每个任务探测不同的能力:SNLI-VE(未见)与 ImageText(已见)用于评估视觉蕴含,TextVQA(未见)与 InfoGraphicVQA(已见)用于OCR能力,VSR(未见)与 GQA(已见)用于推理,Pope(未见)与 VQA-ObjectPresence(已见)用于幻觉检测,以及 CIFAR-10(未见)与 ExDark(已见)用于感知能力。图6中显示的t-SNE可视化描绘了MLP层中的因子选择分布,图例的第一行表示已见任务,第二行表示相应的未见任务。为了清晰起见,每对相似的已见和未见任务使用相同的颜色方案。我们的观察结果表明,MixLoRA有效地激活了类似于那些在类似训练任务中使用的因子。这一发现表明,该模型可以根据其在类似已见任务上的训练,将因子选择策略适应于新的、未见的任务。

任务干扰分析
为了评估 MixLoRA 在缓解任务干扰方面的效果,我们在六个相同的训练任务上测试它:“ScienceQA”、“COCO”、“FairFace”、“iNaturalist”、“ST-VQA”和“PACS”,这些任务在第3.2节中讨论过。对于每个任务,我们随机抽取300个未包含在指令微调阶段的实例进行评估。我们将 MixLoRA 与传统的 LoRA 和任务专用的 LoRA 模型(LoRASpecialist)进行比较,后者针对每个任务进行了特定任务适应参数的微调。表3显示,传统的 LoRA 模型表现出与 LoRA Specialist 相比,在不同任务上表现出不同程度的性能下降。相比之下,MixLoRA 在性能下降方面受到的影响较小,并在不同任务中展现出更一致和稳健的性能,这表明其在减少任务干扰方面的有效性。

此外,我们使用公式 2 和 3 可视化了任务干扰得分。鉴于 MixLoRA 动态地为不同的实例选择因子子集(从 E 中选出 r 个),我们记录了所有 E 个因子的相关梯度,并比较了标准 LoRA 模型(r=16)和 MixLoRA(E=16,r=4)之间的任务干扰得分。图 7 可视化了 LoRA A 和 LoRA B 跨所有适应层(包括 MLP 和自注意力层)的干扰得分。分析显示,MixLoRA(E=16,r=4)相较于标准 LoRA(r=16)表现出更低的负干扰得分,进一步强调了MixLoRA 在减少任务干扰方面的有效性。

7 结论#

我们引入了条件混合 LoRA,这是一种创新策略,能够针对个体输入动态构建低秩适应矩阵,以缓解参数高效多模态指令微调期间的任务干扰。在各种多模态数据集上的全面实验已经证明了 MixLoRA 的有效性,展示了其在未见多模态任务上相较于传统 LoRA 的增强性能,并证实了其在减轻任务干扰方面的有效性。

8 局限性#

我们的研究专注于参数高效多模态指令微调中的任务干扰,特别是图像和文本模态,将声音和3D点云等其他模态的整合留作未来工作的方向。此外,由于训练大型模型的成本,我们的实验是在 Vision-Flan 的缩减版本上进行的。未来的研究可以从评估 MixLoRA 应用于更广泛的多模态指令微调数据集时的有效性中获益。此外,与相同秩的标准 LoRA 相比,我们的方法引入了额外的训练开销。

OFA-Prompt Tuning#

Prompt Tuning for Generative Multimodal Pretrained Models

提示调优已成为模型调优的新范式,并在自然语言预训练甚至视觉预训练中展示了成功。在这项工作中,我们探索将提示调优转移到多模态预训练上,重点是生成性多模态预训练模型,而不是对比性的模型。具体来说,我们在统一的序列到序列预训练模型上实现了提示调优,该模型适应于理解和生成任务。实验结果表明,轻量级提示调优可以实现与微调相当的性能,并且超越其他轻量级调优方法。此外,与微调模型相比,提示调优的模型表现出对对抗性攻击的改进鲁棒性。我们进一步发现,包括提示长度、提示深度和重新参数化在内的实验因素对模型性能有重大影响,因此我们经验性地为提示调优的设置提供了建议。尽管观察到了这些优势,我们仍然发现提示调优存在一些局限性,并相应地指出了未来研究的方向。

1 Introduction#

…尽管大规模预训练模型在多个领域取得了巨大成功,但训练这些模型需要大量的计算成本。传统的微调虽然在获得高性能方面有效,但在训练效率上存在不足,特别是在预训练模型规模较大时尤为明显。Brown等人(2020)引入了提示学习的概念,鼓励模型通过手动的任务指令提示或几个任务示例的演示来生成正确的答案,而无需进一步训练调整模型参数。这通常被称为“上下文学习”

这里指的就是Language models are few-shot learners中提到的ICL,是最传统的Prompt tuning

因为模型根据给定的上下文生成响应。它帮助大规模预训练语言模型在少量样本和零样本学习中实现前所未有的性能(Brown等人,2020;Chowdhery等人,2022;Sanh等人,2021;Wei等人,2021)。

受此启发,研究人员提出了一个新的范式称为提示微调(Li和Liang,2021;Liu等人,2021c;Lester等人,2021;Liu等人,2021a)。与微调相比,提示调优仅通过少量参数(例如,1%)对预训练模型进行调优。提示调优冻结了预训练模型的大多数参数,只调优几个提示嵌入,以及必要时的输出层。最近的进展表明,提示调优可以帮助预训练模型在不同的NLP下游任务中实现与微调相当的性能,包括自然语言理解。

在自然语言处理以外的领域,最近的研究也展示了提示调优的有效性。Jia等人(2022)证明了视觉提示调优可以在一系列任务中超越微调,并且其在训练效率方面的优势是显著的。在跨模态表示学习中,提示调优的研究主要集中在CLIP类模型上(Radford等人,2021)。CLIP是一种基于对比学习的多模态预训练模型,通过大规模图像-文本对进行预训练。CLIP能够通过将标签转换为带有手动提示模板的文本提示,在零样本图像分类中实现卓越性能。为了提高性能,Radford等人(2021)提出了通过手工制作多个提示模板来实现提示集成。然而,由于创建硬提示繁琐,研究人员转向了CLIP的软提示应用(Rao等人,2021;Zhou等人,2021, 2022)或适配器的整合(Gao等人,2021;Zhang等人,2021)。除了在CLIP类模型上的实现外,另一条路线是将图像提示应用于预训练语言模型以进行多模态表示学习(Yao等人,2021b;Tsimpoukelli等人,2021)。尽管大规模预训练语言模型在下游迁移过程中被冻结,但它可以适应多模态下游任务的少量学习场景。**尽管如此,对于流行的生成性多模态预训练模型,包括BERT类模型和用于跨模态表示学习的编码器-解码器预训练模型,提示调优仍然未被探索。**Yao等人(2022)将调优范式与预训练范式匹配,使用手动提示。然而,轻量级提示调优是否也能对生成性多模态预训练模型有效仍未知。

这项工作填补了这一空白,并率先探索生成性多模态预训练模型的提示调优。本研究的目标是调查提示调优是否对生成性多模态预训练模型的下游迁移有效,以及它如何相对于传统的微调使大规模预训练模型受益。**具体来说,我们实现了简单但有效的前缀调优,一种最流行的提示调优方法之一,在生成性多模态预训练模型上。前缀调优具有简单性的优势,同时能够在自然语言理解和生成方面实现显著的性能(Li和Liang,2021;Liu等人,2021b)。**与微调相比,提示调优可调参数的数量要小得多(约1%),从而减少了计算成本,例如内存。

通过广泛的实验,我们观察到轻量级提示调优能够帮助预训练模型在4个多模态下游任务中实现与微调相当的性能,这些任务从理解到生成不等。为了分析微调和提示调优之间的差异,我们遵循假设,即大多数参数在预训练模型中被冻结的提示调优应该诱导模型鲁棒性。我们在对抗性攻击下对调优方法进行实验,并观察与假设一致的现象。更进一步,这项研究深入探讨了实现细节,并调查实验因素如提示长度、提示深度和重新参数化是否会对最终下游性能产生显著影响。我们发现,一般来说,较长的提示长度(超过20个标记)是一个更好的选择,我们的实验表明,在大多数情况下应选择64,因为较长的提示序列不仅会增加计算成本,还会导致性能下降。此外,我们展示了带有额外可训练参数的重新参数化无法在下游性能中引入显著改进。最后,我们反思该方法并说明其计算成本和训练不稳定性的缺陷,并相应地指出了未来工作的方向。

在接下来的部分中,我们简要回顾相关工作,介绍生成性多模态预训练模型的提示调优,并报告实验结果和分析。最后,我们讨论在这种情景下的提示调优问题,指出未来的工作,并最终总结这项工作。

2 相关工作#

在本节中,我们包括了多模态预训练以及提示调优的综述。我们首先回顾了多模态预训练的两个主要研究线中的研究。即生成性预训练和对比性预训练,并回顾了基于提示的学习在自然语言处理(NLP)和跨模态表示学习中的研究。

2.1 多模态预训练#

视觉与语言预训练的兴起始于BERT(Devlin等人,2019)向跨模态表示学习的转移。一系列的研究(Lu等人,2019;Su等人,2020;Tan和Bansal,2019;Chen等人,2020d;Li等人,2019)将BERT引入多模态预训练。最近,编码器-解码器框架在多模态预训练中引起了关注,因为一些编码器-解码器模型在跨模态理解和生成任务中达到了最先进的性能(Wang等人,2021, 2022;Yu等人,2022)。此外,这种框架允许将任务统一为序列到序列学习格式,从而允许使用手动提示进行多任务预训练(Cho等人,2021;Wang等人,2022)。这促使我们思考提示调优应与最近的统一多模态预训练模型完美结合,并且它可以在计算成本远低于传统微调的情况下释放预训练模型的力量。

多模态预训练中的另一个趋势是对比学习。最典型的对比预训练模型是CLIP(Radford等人,2021)。它使用Vision Transformer(ViT)(Dosovitskiy等人,2021)或ResNet(He等人,2016;Tan和Le,2019)作为图像编码器,以及Transformer模型作为文本编码器,并通过对比损失联合训练这两个编码器(van den Oord等人,2018)。值得注意的是,该模型是在极其大规模的图像-文本对数据上进行预训练的。继CLIP之后,一系列研究表明了在大规模数据上基于对比学习的预训练路线的成功(Jia等人,2021;Yao等人,2021a)。CLIP在跨模态检索中可以实现显著的性能。真正吸引人的是它在零样本分类中的强大表现,通过提示集成,即以少量手工制作的提示作为输入来集成模型的输出。这开启了多模态预训练中提示的研究。

2.2 基于提示的学习#

Brown等人(2020)表明,大规模预训练模型可以从上下文中学习,并在少量样本和零样本学习中表现出色。Li和Liang(2021)证明**,仅在每一层调整软提示嵌入就足以使预训练模型在自然语言生成中实现具有竞争力的性能**,随后许多研究表明,提示调优对于低资源场景本质上是有效的(Liu等人,2021c;Gu等人,2022;Sun等人,2022b),并且它甚至可以实现与微调相当的性能(Lester等人,2021;Liu等人,2021b)。沿着这一趋势,一系列对提示和适配器的修改(Hu等人,2022;He等人,2021a;Jiang等人,2022;Sun等人,2022a)为了提高性能或训练效率而出现,并使提示调优成为整个NLP社区的热门话题。

最近针对多模态预训练模型的提示调优方法主要服务于CLIP类模型(Zhou等人,2021, 2022;Rao等人,2021)。同样,研究人员试图将适配器整合到CLIP中,并且也实现了令人满意的性能(Gao等人,2021;Zhang等人,2021)。除了CLIP类模型的提示调优外,另一条研究路线探索了用于冻结语言模型的视觉提示。Tsimpoukelli等人(2021)表明,当存在一个强大的大规模预训练语言模型时,一个视觉编码器对于提示调优就足够进行多模态少量学习。更进一步,Alayrac等人(2022)提出了Flamingo,一个巨大的多模态模型,能够进行上下文学习。它可以在一系列跨模态下游任务中实现最先进的性能,无论是在少量样本还是全样本学习场景中。这种巨大的成功表明了提示调优在多模态预训练中的巨大潜力。在这项工作中,我们专注于一个未被探索的主题,即生成性多模态预训练模型的提示调优。

3 方法#

本节介绍我们提出的方法的详细内容。它提供了在统一的生成性多模态预训练模型上实施提示调优的详细实现。整体框架如图1所示。

3.1 基础知识#

我们选择了统一的序列到序列框架,因为它统一了理解和生成任务,并且我们具体实施了提示调优在最近开源的最先进的模型OFA(Wang等人,2022)上。简而言之,它是基于Transformer框架(Vaswani等人,2017)构建的编码器-解码器结构。

编码器和解码器都由Transformer层组成。更具体地说,一个编码器层包含一个多头自注意力机制和一个逐点前馈网络(FFN)。为了在编码器和解码器之间建立连接,Transformer解码器层还包含一个交叉注意力模块,这是与编码器层相比额外的部分。交叉注意力本质上是多头注意力,其中键K和值V是编码器输出状态的转换,而不是输入。这种架构可以处理提供序列到序列格式输入的任务。

在这项工作中,我们专注于提示调优在多模态预训练模型转移中的应用。我们将提示学习在预训练阶段的工作留待未来研究。

3.2 生成性多模态预训练模型的提示调优#

接下来,我们介绍在序列到序列多模态预训练模型上实施提示调优的详细信息。请注意,我们的方法可以扩展到其他生成性多模态预训练模型,例如BERT类模型。

基本实现

我们专注于实现【prefix tuning】前缀调优(Li和Liang,2021;Liu等人,2021b),因为它在自然语言理解和生成方面表现出色。与其他提示调优方法相比,例如P-Tuning(Liu等人,2021c)、Prompt Tuning(Lester等人,2021)、PPT(Gu等人,2022),向每一层添加软提示嵌入展示了增强的训练稳定性,即使在相对较小的模型上也能提高下游任务性能。**具体来说,对于编码器和解码器,我们在每一层添加可调提示嵌入。**正式地,我们将预训练模型表示为函数M()\mathcal{M}(\cdot),并将提示嵌入的生成函数表示为G()\mathcal{G}(\cdot)。公式如下所示:

y=M(G(L,l),x),y = \mathcal{M}(\mathcal{G}(L, l), x),

其中xx指的是多模态输入,LL指的是层数,而ll指的是提示长度,应由超参数预先定义。在每一层,我们在输入隐藏状态h(i)h^{(i)}前添加软提示嵌入p(i)p^{(i)}。注意,我们仅在Transformer层前添加提示嵌入。在最简单的实践中,提示生成器G\mathcal{G}是一个稀疏嵌入矩阵RL×l×h\mathbb{R}^{L \times l \times h},我们选择在第ii-th索引和第jj-th层对应的嵌入作为提示嵌入。下面我们将提供一些更复杂实现的说明,并在本研究中比较这些方法。

在下游调优过程中,我们只调整每一层新添加的提示嵌入,并保持大型预训练模型的参数冻结。因此,尽管只有少量参数需要更新,例如1%,计算成本远低于微调。

重新参数化

除了在每一层添加稀疏嵌入矩阵这一最简单的实现外,一个更复杂的实现应该是添加一个编码器,例如MLP层,以重新参数化提示嵌入。我们还调查了在此上下文中重新参数化的影响。

提示长度

与先前的研究(Li和Liang,2021;Liu等人,2021b)类似,我们发现提示长度对模型性能有显著影响。提示嵌入长度在不同的下游任务中起着重要作用。在这项研究中,我们调查了这一因素如何在不同的下游任务中影响模型性能。

提示深度

为了研究提示嵌入插入位置的影响,我们深入探讨了提示深度的问题。具体来说,我们将问题简化为仅向编码器或解码器添加提示嵌入,以及同时向两个模块添加提示嵌入。

4 实验#

为了验证提示调优对多模态预训练模型的有效性,我们在传统的跨模态任务上进行了实验。具体而言,我们在跨模态理解和生成方面进行实验,包括指代表达理解、视觉蕴含、图像标题生成和视觉问答(VQA)。我们使用最常用的基线大小和大型模型进行实验,其大小分别为约180M和470M。关于实验设置的更多细节,请参见附录A.1。

4.1 数据集与指标#

指代表达理解

我们在指代表达理解的三个子任务上进行实验,即RefCOCO、RefCOCO+和RefCOCOg(Yu等人,2016;Mao等人,2016)。该任务要求模型生成一个正确的边界框,以回答所提供图像上的给定文本查询。我们使用Acc@0.5作为评估指标。

图像标题生成

我们在Microsoft COCO图像标题数据集(Chen等人,2015)上评估我们的方法的图像标题生成能力。在这个任务中,模型应该生成一个与给定图像信息相对应的描述。我们使用BLEU@4(Papineni等人,2002)、METEOR(Lavie和Agarwal,2007)、CIDEr(Vedantam等人,2015)和SPICE(Anderson等人,2016)作为评估指标。

视觉蕴含

为了评估蕴含性能,我们在SNLI-VE(Xie等人,2019)上进行实验。给定一张图像和一段文本,模型应该找出它们之间的关系,即它们是蕴含、矛盾还是中立。我们遵循Wang等人(2022)的设置,并将给定的前提添加到输入中。我们使用准确率作为评估指标。

VQA

我们在VQA 2.0(Antol等人,2015;Goyal等人,2017)上进行实验。该任务要求模型根据图像和关于图像上某些信息的问题生成正确的答案。遵循Wang等人(2022),我们使用所有候选评估,这要求模型为3,129个最频繁答案中的每个候选生成一个概率。我们使用准确率作为评估指标。

4.2 实验结果#

下面提供详细的实验结果,包括提示调优与微调的比较,以及提示调优与其他参数高效的调优方法的比较。

与微调的比较

我们在表1中展示了四个任务的实验结果。总体而言,对于基线大小的模型,提示调优在很大程度上逊色于微调,但对于大型模型,提示调优能够实现相当的性能。具体来说,在指代表达理解的评估中,对于基线大小的模型,提示调优显著落后于微调,平均落后幅度为5.64,跨越RefCOCO、RefCOCO+和RefCOCOg,但对于大型模型,提示调优仅落后于微调一小部分。差距仅为0.59。在视觉蕴含的评估中,算法之间的差距更小,约为0.17。在图像标题生成的CIDEr评分评估中,对于基线大小的模型,提示调优落后微调4.0,但对于大型模型,性能差距仅为0.8。在VQA的评估中,对于基线大小的模型,提示调优和微调之间的性能差距为3.63,而对于大型模型,在测试集上的差距为2.17。与其他任务不同,即使在大型模型的实验中,这一差距仍然显著。我们假设由于提示调优对超参数的敏感性,仍有必要为该任务寻找更好的超参数设置。

与其他参数高效调优方法的比较

我们还添加了一个与其它参数高效调优方法的比较。

与两种参数高效调优方法进行比较,即Adapter(Houlsby等人,2019)和BitFit(Zaken等人,2022),以测试提示调优是否是轻量级迁移的最佳解决方案。表2显示了在上述数据集上实施的不同轻量级调优方法的结果。在所有下游任务中,提示调优的性能超过了Adapter和BitFit。

实操#

首先希望使用LoRA微调OFA模型或者其他多模态大模型,完成一个下游任务如image captioning

任务:prefix方法(对应那篇prompt tuning的论文)微调OFA大模型,仓库提供了refcoco的代码,希望能够用prefix微调OFA实现coco。

分解:

先看懂那篇prompt tuning的论文,是在搞什么 √

然后看懂仓库,bash执行了哪些代码,怎么训练

最后修改bash以完成COCO的任务

现在实现了的:

OFA+SFT -> caption 原论文提供

OFA+LoRA -> caption 基于LoRA原理修改

OFA+MixLoRA -> caption 基于MixLoRA论文修改

OFA+Prompt tuning -> refCOCO 论文三提供

希望实现:

OFA+Prompt tuning -> caption

阅读核心代码#

run_scripts/refcoco/train_refcoco_prefix.sh

  • --encoder-prompt:是否向编码器插入提示
  • --decoder-prompt:是否向解码器插入提示
  • --encoder-prompt-length:编码器提示长度
  • --decoder-prompt-length 解码器提示长度
  • --bitfit:是否使用 Bitfit
  • --adapter:是否使用适配器
  • --adapter-dim:适配器投影暗淡
export MASTER_PORT=6051
  • 指定分布式训练的通信端口(MASTER_PORT=6051),多任务运行时需用不同端口。

yyc改了train_refcoco_base.sh的代码,即

OFA+SFT->refcoco的

改成了OFA+LoRA->refcoco

Terminal window
CUDA_VISIBLE_DEVICES=0,1,2,3 python3 -m torch.distributed.launch \
--nproc_per_node=4 --master_port=${MASTER_PORT} ../../train.py \
$data \

改成了

Terminal window
CUDA_VISIBLE_DEVICES=1 torchrun \
--nproc_per_node=1 --master_port=${MASTER_PORT} ../../train_lora.py \
$data \
--lora \
--lora-rank=8 \
--lora-alpha=16 \
--lora-dropout=0.1 \
--save-lora-weights-only \

希望找到caption到refcoco的变化!

那么只需要对比train_refcoco.shtrain_caption.sh

但区别来了,train_caption.sh分为stage1和stage2


希望找到prefix加与不加的变化!然后应用到train_caption上面!

加了prefix后,多了

prompt_type_method=prefix
encoder_prompt_length=100
decoder_prompt_length=100
--encoder-prompt \
--decoder-prompt \
--encoder-prompt-type=${prompt_type_method} \
--decoder-prompt-type=${prompt_type_method} \
--encoder-prompt-length=${encoder_prompt_length} \
--decoder-prompt-length=${decoder_prompt_length} \

修改了以下超参数

batch_size

max_epoch

lr

patch_image_size

—nproc_per_node

在这里实现了prefix-tuning:

models/ofa/unify_transformer.py

以Encoder为例子

if getattr(args, "encoder_prompt", False):

这是处理参数,如果要启用prefix-tuning则调用:

self.encoder_prompt_encoder = PromptEncoder(
type=args.encoder_prompt_type,
length=args.encoder_prompt_length, projection=args.encoder_prompt_projection,
embed_dim=args.encoder_embed_dim,
proj_dim=args.encoder_prompt_dim,
layers=args.encoder_layers,
vocab_size=args.vocab_size)

projection是默认为false的

PromptEncoder是专属类

这段代码定义了一个名为 PromptEncoder 的 PyTorch 模块,它的作用是

生成用于 Prefix-Tuning 或 Prompt-Tuning 的可学习 prefix token 向量(past_key_values),以插入到 Transformer 编码器或解码器中。

输入:

  • prefix: 一个 Tensor,表示 prompt token 的索引(通常是 [batch_size, prompt_length]

输出:

  • past_key_values: 经过编码后的 prefix 向量,形状为 (batch_size, prompt_length, layers * 2 * embed_dim)
    • layers: Transformer 层数
    • 2: 表示每个层有两个向量(key 和 value)
    • embed_dim: 每个 key/value 向量的维度
参数含义
type提示类型,如 "prefix"
lengthprefix 的长度(例如 20)
projection是否使用投影网络(即是否使用 MLP 而不是直接 embedding)
embed_dim嵌入维度(通常等于 encoder/decoder 的 hidden dimension)
proj_dim投影层中间维度(如果使用 projection)
layersTransformer 层数
vocab_size词汇表大小

如果不使用 Projection:

self.embedding = torch.nn.Embedding(prompt_vocab_size, layers * 2 * embed_dim)
  • 直接从 token 映射到最终的 prefix 向量,没有中间变换。
  • 更简单但表达能力有限。

假设你有一个预训练的 Transformer 编码器,现在想用 Prefix-Tuning 微调它而不改变原有参数,你可以:

  1. 在输入序列前添加一些 learnable prefix token;
  2. 用这个 PromptEncoder 生成这些 prefix token 对应的 key-value pairs;
  3. 在 Transformer 的每一层 attention 中将它们作为额外上下文传入;
  4. 只更新 PromptEncoder 的参数即可完成 fine-tune。

示例结构

  • embed_dim = 768
  • layers = 6
  • 每层有 key 和 value → 每个 token 的向量长度是 6 * 2 * 768 = 9216

所以输出 shape 为:

(batch_size, prompt_length, 9216)

下面的代码来调用此类:

def get_encoder_prompt(self, prompt_tokens):
past_key_values = self.encoder_prompt_encoder(prompt_tokens)
bsz, seqlen, _ = past_key_values.shape
past_key_values = past_key_values.view(
bsz,
seqlen,
(self.args.encoder_layers) * 2,
self.args.encoder_attention_heads,
self.args.encoder_embed_dim // self.args.encoder_attention_heads,
)
past_key_values = self.encoder_dropout(past_key_values)
past_key_values = past_key_values.permute([2, 0, 3, 1, 4]).split(2)
return past_key_values

而这部分代码由下面的代码调用:

def forward_scriptable(
self,
src_tokens,
src_lengths,
patch_images: Optional[torch.Tensor] = None,
patch_images_2: Optional[torch.Tensor] = None,
patch_masks: Optional[torch.Tensor] = None,
return_all_hiddens: bool = False,
token_embeddings: Optional[torch.Tensor] = None,
sample_patch_num: Optional[int] = None
):
"""
Args:
src_tokens (LongTensor): tokens in the source language of shape
`(batch, src_len)`
src_lengths (torch.LongTensor): lengths of each source sentence of
shape `(batch)`
return_all_hiddens (bool, optional): also return all of the
intermediate hidden states (default: False).
token_embeddings (torch.Tensor, optional): precomputed embeddings
default `None` will recompute embeddings
Returns:
dict:
- **encoder_out** (Tensor): the last encoder layer's output of
shape `(src_len, batch, embed_dim)`
- **encoder_padding_mask** (ByteTensor): the positions of
padding elements of shape `(batch, src_len)`
- **encoder_embedding** (Tensor): the (scaled) embedding lookup
of shape `(batch, src_len, embed_dim)`
- **encoder_states** (List[Tensor]): all intermediate
hidden states of shape `(src_len, batch, embed_dim)`.
Only populated if *return_all_hiddens* is True.
"""
prompt_tokens = None
prompt_padding_mask = None
prompt_kv_list = None
if self.args.encoder_prompt:
bsz, seq_len = src_tokens.shape[0], src_tokens.shape[1]
if self.args.encoder_prompt_type in ("prefix"):
prompt_tokens = torch.arange(
0, self.args.encoder_prompt_length).to(
src_tokens.device)
prompt_tokens = prompt_tokens.unsqueeze(0).expand(bsz, -1)
prompt_padding_mask = torch.zeros_like(
prompt_tokens).to(prompt_tokens.device)
prompt_kv_list = self.get_encoder_prompt(prompt_tokens)

可参考的资料#

OFA_Tutorial · 文档中心

【Huggingface Transformers】保姆级使用教程—上 - 知乎

ICML 2022|达摩院多模态模型OFA,实现模态、任务和架构三个统一_ofa模型-CSDN博客

两个工具包#

为什么不直接Fairseq,而是要用transformers呢?

  • fairseq存在比较严重的过度封装问题,接口复杂,omgaconf传参工具不容易迁移,不适合作生产环境部署
  • fairseq做评估和ASR应用需要flashlight,由于防火墙的存在,基本上是无法按照官方教程安装的(vcpkg和编译都不容易)
  • trms的接口比较直接明确,工具链比较简单

Fairseq#

Facebook AI Research Sequence-to-Sequence Toolkit (Facebook,2017)

简单说就是一个seq2seq模型的工具包,方便二次开发。

Fairseq 专注于序列到序列(Seq2Seq)模型,支持多种任务,兼容 Transformer、LSTM、ConvS2S 等模型架构。集成 BART、RoBERTa、mBART 等模型,支持快速微调。

Fairseq 的架构围绕以下模块展开:

  • Model:定义模型结构(如 TransformerModel)。
  • Task:封装数据加载、损失计算(如 TranslationTask)。
  • Criterion:定义损失函数(如交叉熵损失 CrossEntropyCriterion)。
  • Optimizer:优化算法(Adam、Adagrad 等)。
  • LRScheduler:学习率调度策略。

动态数据加载(Dynamic Batching)

  • 原理:根据样本长度动态分组,减少 Padding 冗余。
  • 实现:通过 FairseqDatasetBatchSampler 动态生成相似长度的样本批次。
  • 优势:相比静态 Batching,训练速度提升 20-50%。

分布式训练

  • 数据并行:通过 PyTorch 的 DistributedDataParallel 实现多卡同步。
  • 模型并行:支持跨 GPU 分割模型(如 Megatron-LM 式层内并行)。
  • 混合精度训练:使用 --fp16--amp 参数启用,减少显存占用。

  1. 安装与环境配置
Terminal window
# 从源码安装(推荐开发模式)
git clone https://github.com/facebookresearch/fairseq
cd fairseq
pip install --editable .

—editable 通过将包安装为可编辑的源代码文件夹,我们可以直接编辑源代码,无需重新安装包即可看到更改的效果。

  1. 数据预处理

以机器翻译任务为例(WMT英德翻译):

Terminal window
# 数据标准化(分词、BPE编码等)
fairseq-preprocess \
--source-lang en --target-lang de \
--trainpref data/train --validpref data/valid --testpref data/test \
--destdir data-bin/wmt18_en_de \
--workers 64
  1. 模型训练
Terminal window
fairseq-train data-bin/wmt18_en_de \
--arch transformer_wmt_en_de \
--optimizer adam --lr 0.0005 --lr-scheduler inverse_sqrt \
--max-tokens 4096 --fp16 \
--save-dir checkpoints/transformer_wmt_en_de
  1. 模型推理
Terminal window
fairseq-interactive data-bin/wmt18_en_de \
--path checkpoints/transformer_wmt_en_de/checkpoint_best.pt \
--beam 5 --batch-size 128 --buffer-size 1000

高级功能与技巧

  • 自定义模型与任务

    扩展模型:继承 FairseqModel 类,重写 forward() 方法。

    自定义任务:继承 FairseqTask 类,实现 load_dataset()build_model()

  • 参数高效微调(PEFT)

    LoRA 支持:可通过修改 TransformerEncoderLayerTransformerDecoderLayer 插入低秩适配层。

    示例:

from fairseq.modules import TransformerEncoderLayer
class LoRATransformerEncoderLayer(TransformerEncoderLayer):
def __init__(self, args, ...):
super().__init__(args, ...)
# 添加 LoRA 参数
self.lora_A = nn.Linear(d_model, r, bias=False)
self.lora_B = nn.Linear(r, d_model, bias=False)
  • 混合专家模型(Mixture of Experts, MoE)

    实现方式:使用 fairseq.modules.MoELayer,通过 --moe-expert-count--moe-gating-use-fp32 参数启用。

    示例:

Terminal window
fairseq-train ... --arch transformer_moe_wmt_en_de \
--moe-expert-count 8 --moe-freq 2

Fairseq 生态与扩展

  1. 预训练模型库
  • BART:序列到序列的预训练模型,支持文本生成和重构任务。
  • mBART:多语言机器翻译预训练模型,支持 50+ 语言。
  • RoBERTa:优化的 BERT 变体,适用于文本分类和序列标注。
  1. 扩展工具
  • Fairseq-Plus:社区增强版,提供更多模型(如 T5、PEGASUS)和训练技巧。
  • Hydra 配置系统:支持 YAML 配置文件管理超参数(需 Fairseq >= 0.10.2)。

应用示例

  1. 机器翻译(Translation)
  • 数据格式:并行语料(如 WMT)

    WMT(Workshop on Machine Translation),机器翻译数据集

  • 模型选择:transformer_wmt_en_de(标准 Transformer)或 transformer_vaswani_wmt_en_de_big(大模型)。

  1. 文本生成(Text Generation)
  • 任务类型:故事生成、对话生成。
  • 模型选择:bart.basetransformer_lm(自回归语言模型)。

常见问题

  1. 显存不足(OOM)
  • 启用 --fp16--memory-efficient-fp16
  • 降低 --max-tokens--batch-size
  • 使用梯度累积(--update-freq)。
  1. 训练速度慢
  • 启用动态 Batching(--required-batch-size-multiple)。
  • 增加 --num-workers 提升数据加载速度。
  • 使用更高效优化器(如 --optimizer adam --adam-betas '(0.9, 0.98)')。

Hugging Face Transformers#

和Fairseq类似的地位。

(Hugging Face,2019)

是一个专注于自然语言处理(NLP)的开源 Python 库,提供了大量基于Transformer 架构的预训练模型(如 BERT、GPT、T5 等)和工具,支持模型的快速加载、微调、推理和部署。其核心目标是简化 Transformer 模型的应用流程,使开发者无需从零实现复杂架构即可完成 NLP 任务。

1. 预训练模型的便捷调用

  • 模型加载:通过 AutoModelAutoTokenizer 类,开发者只需几行代码即可加载预训练模型(如 bert-base-uncased):

    from transformers import AutoModel, AutoTokenizer
    model = AutoModel.from_pretrained("bert-base-uncased")
    tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
  • 任务支持:覆盖文本分类、生成、翻译、问答等任务。例如,使用 pipeline 快速实现情感分析:

    from transformers import pipeline
    classifier = pipeline("sentiment-analysis")
    result = classifier("I love Hugging Face!") # 输出: [{'label': 'POSITIVE', 'score': 0.9998}]

2. 高效微调与训练

  • 迁移学习:通过 Trainer 类支持在特定任务数据集上微调预训练模型,显著减少训练时间和计算成本。
  • 分布式训练:支持多 GPU/TPU 并行训练,结合混合精度(FP16)和梯度累积技术提升效率。

3. 模型共享与社区协作

  • Model Hub:开发者可将微调后的模型上传至 Hugging Face Hub,供他人直接调用,形成开源协作的正向循环。
  • 跨框架兼容:同一模型可导出为 PyTorch 或 TensorFlow 格式,适应不同部署环境。
  1. Hugging Face 使工业界能快速复现和部署新模型。

  2. 通过社区贡献,Hugging Face 支持了多种小众模型(如 RWKV,结合 Transformer 并行性与 RNN 的长序列处理能力),扩展了 Transformer 生态的边界。

  3. 降低技术门槛 ,非技术人员可通过 GUI 工具(如 Hugging Face Spaces)直接部署模型应用,无需编写代码。

HFT库的PEFT#

快速入门PEFT - Hugging Face 机器学习平台

支持的 PEFT 类型

  • PROMPT_TUNING

  • MULTITASK_PROMPT_TUNING

  • P_TUNING

  • PREFIX_TUNING

  • LORA

  • ADALORA

  • BOFT

  • ADAPTION_PROMPT

  • IA3

  • LOHA

  • LOKR

  • OFT

  • XLORA

  • POLY

  • LN_TUNING

  • VERA

  • FOURIERFT

  • HRA

  • BONE


  1. PROMPT_TUNING

    • 核心思想:在输入序列前添加可训练的软提示(soft prompt)向量,通过调整这些提示来引导模型适应下游任务。
    • 特点:仅训练提示参数,冻结预训练模型权重,适用于轻量级微调。
  2. MULTITASK_PROMPT_TUNING

    • 核心思想:扩展 Prompt Tuning,为多个任务设计共享的提示向量,实现多任务联合学习。
    • 特点:通过共享提示参数提升跨任务泛化能力。
  3. P_TUNING

    • 核心思想:引入可学习的连续提示嵌入(continuous prompt embeddings),替代传统离散提示词。
    • 特点:提示向量插入输入层或中间层,灵活性高于 Prompt Tuning。
  4. PREFIX_TUNING

    • 核心思想:在模型每一层的输入前添加可训练的前缀向量(prefix),通过调节前缀激活模型特定行为。
    • 特点:参数分布在多个层,更适合复杂任务。
  5. LORA(Low-Rank Adaptation)

    • 核心思想:用低秩矩阵分解模拟权重变化(ΔW = A·B),仅训练低秩矩阵 A 和 B。
    • 特点:显著减少参数量,适合大模型(如 LLM)高效微调。
  6. ADALORA(Adaptive LoRA)

    • 核心思想:动态调整 LoRA 中低秩矩阵的秩(rank),根据重要性分配参数资源。
    • 特点:比标准 LoRA 更高效,参数利用率更高。
  7. BOFT(Bidirectional Orthogonal Fine-Tuning)

    • 核心思想:通过正交变换约束参数更新方向,保持模型稳定性。
    • 特点:适用于防止灾难性遗忘的多任务场景。
  8. ADAPTION_PROMPT

    • 核心思想:结合 Prompt Tuning 和适配器(Adapter),在特定层插入可训练提示模块。
    • 特点:增强模型对任务特定模式的捕捉能力。
  9. IA3(Infused Adapter by Inhibiting and Amplifying Inner Activations)

    • 核心思想:在注意力层和前馈层注入可学习的缩放向量,通过抑制或放大激活值调整模型行为。
    • 特点:参数极少(仅 0.01%),适合超轻量级微调。
  10. LOHA(Low-Rank Hadamard Adaptation)

    • 核心思想:利用哈达玛乘积(Hadamard product)优化低秩矩阵,提升参数效率。
    • 特点:类似 LoRA,但数学形式更高效。
  11. LOKR(Low-Rank Kronecker Adaptation)

    • 核心思想:使用克罗内克积(Kronecker product)分解权重矩阵,进一步压缩参数。
    • 特点:适合极低资源场景。
  12. OFT(Orthogonal Fine-Tuning)

    • 核心思想:约束参数更新在正交空间内,保持模型表征的几何结构。
    • 特点:提升微调稳定性和泛化性。
  13. XLORA

    • 核心思想:扩展 LoRA,结合专家混合(MoE)机制动态分配低秩矩阵。
    • 特点:适用于多任务或大规模模型。
  14. POLY

    • 核心思想:通过多项式逼近(polynomial approximation)建模参数变化。
    • 特点:数学驱动的高效参数更新。
  15. LN_TUNING(LayerNorm Tuning)

    • 核心思想:仅微调 Layer Normalization 层的参数,保留主体权重不变。
    • 特点:极端轻量化,适用于低资源设备。
  16. VERA(Vector-based Random Matrix Adaptation)

    • 核心思想:用随机初始化的低秩向量矩阵调整模型权重,冻结原始参数。
    • 特点:类似 LoRA,但更强调随机性的高效利用。
  17. FOURIERFT(Fourier Feature Tuning)

    • 核心思想:在傅里叶频域中调整模型参数,捕捉高频/低频特征。
    • 特点:适合处理信号或图像相关任务。
  18. HRA(Hierarchical Residual Adaptation)

    • 核心思想:通过分层残差结构逐步调整模型,从浅层到深层逐步细化。
    • 特点:模仿人类渐进学习过程。
  19. BONE

    • 核心思想:可能指 Bottleneck Expert Networks,通过稀疏激活的专家模块实现高效微调。
    • 特点:类似 MoE,但更轻量化。

其他多模态预训练模型#

UNITER#

通用图像-文本联合表示学习

旨在通过大规模预训练学习通用的图像-文本联合表示,支持多种下游视觉-语言(V+L)任务。其关键创新包括 条件掩码机制 和 词-区域对齐优化 。

1. 模型架构

  • 单流Transformer结构:将图像区域特征(通过Faster R-CNN提取)与文本词嵌入拼接后输入单一Transformer,实现跨模态交互。
  • 位置编码:为图像区域和文本词分别编码空间位置和序列位置,增强模态内和跨模态的上下文感知。

2. 预训练任务

  • 条件掩码学习:
    • MLM
    • MRM(掩码区域建模):以完整文本为条件,预测被掩码的图像区域特征(含三种变体:MRC、MRFR、MRC-KL)。
    • 与联合随机掩码相比,条件掩码显著提升了跨模态对齐效果。
  • 图像-文本匹配(ITM)
  • 词-区域对齐(WRA):引入最优传输(Optimal Transport)算法,最小化单词与图像区域的语义分布差异,实现细粒度对齐。

3. 性能与应用

  • 在6大类V+L任务(如VQA、图像检索、视觉推理等)的9个数据集上达到SOTA,尤其在需要细粒度对齐的任务(如Referring Expression Comprehension)中优势显著。
  • 通过消融实验验证了条件掩码和WRA任务的有效性,证明二者对模型泛化能力提升贡献最大。

ViLT#

Vision-and-Language Transformer

视觉-语言Transformer的轻量化设计

首个完全基于Transformer处理多模态输入的模型,摒弃传统目标检测器,直接对图像分块进行特征提取,显著提升了计算效率。

1. 模型架构

  • 单流Transformer:将图像分块(类似ViT)与文本词嵌入统一输入Transformer,无需预训练目标检测器,减少计算开销。
  • 轻量化设计:相比UNITER依赖Faster R-CNN,ViLT直接利用线性投影提取图像块特征,参数更少且训练速度更快。

2. 预训练任务

  • 基础任务:MLM、ITM,与UNITER类似。
  • 对比学习增强:引入图像-文本对比损失(类似CLIP),通过负样本对优化跨模态相似性。

3. 优势与局限

  • 效率优势:训练速度较UNITER提升3倍以上,适合资源受限场景。
  • 性能权衡:因缺乏区域级特征,在需要细粒度理解的任务(如视觉推理)上表现略逊于UNITER。
模型核心创新适用场景性能特点
UNITER条件掩码、词-区域对齐需细粒度对齐的V+L任务SOTA精度,计算成本较高
ViLT无检测器的单流Transformer资源受限的快速推理场景高效,牺牲部分细粒度性能
OFA任务无关的统一架构多任务联合需求与零样本迁移全能型,生成任务表现突出

其他可能相关的研究#

MULTIINSTRUCT: Improving Multi-Modal Zero-Shot Learning via Instruction Tuning - 知乎

其他同名研究辨析#

yushuiwx/Mixture-of-LoRA-Experts

TUDB-Labs/MixLoRA: State-of-the-art Parameter-Efficient MoE Fine-tuning Method

EricLBuehler/xlora: X-LoRA: Mixture of LoRA Experts

想法#

OFA是一个多模态预训练大模型,github提供了SFT的方法。当然也可以到transformers去做各种操作。

而MixLoRA一种LoRA的改进,是在LLaVA验证的。github仓库提供了微调LLaVA的过程。但不好修改。

相关知识#

关于MME基准#

感知类任务

感知能力是MLLM最基本的能力之一,缺乏这种能力很容易导致对象幻觉问题,即MLLM基于自己的想象而非图像的实际内容来回答问题,如图4所示。

img

图4. 实验中揭示出的常见问题。[Y]/[N]表示真实答案是是/否,[R]是生成的答案。

粗粒度识别:粗粒度识别包括常见对象的存在、数量、颜色和位置。这些图像取自COCO数据集,但指令-答案对均为手工构建,而非直接使用公开的注释。即使MLLM已经见过这些COCO图像,我们手动准备的对并未出现在它们的训练集中。这要求MLLM能够理解指令并推断相应的答案。在存在、数量、颜色和位置的每个感知子任务中,我们准备了30张图像和60个指令-答案对。

细粒度识别:细粒度识别更侧重于测试MLLM的知识资源。子任务包括识别电影海报、名人、场景、地标和艺术品,分别包含147、170、200、200和200张图像。对于名人,我们在图像中为一个面部清晰可见的人物画一个红框,并给出相应的指令:“红框内的演员名叫[名人姓名]吗?请回答是或否。”与粗粒度识别类似,这些子任务的图像来自公开数据集,所有指令均为手工设计。

OCR:光学字符识别(OCR)也是MLLM的基础能力,为后续的文本翻译和理解任务提供支持。这些图像的所有相关指令-答案对均为手工设计。考虑到MLLM仍处于初期阶段,此版本的MME中仅选择了相对简单的样本,图像和指令-答案对的数量分别为20和40。

认知类任务

团队评估MLLM在感知图像后是否能够进行进一步的逻辑推理,这是MLLM相较于传统方法的一个显著优势。为了推导出正确答案,MLLM需要遵循指令、感知图像内容并调用其储存的知识,这比单纯的感知任务更具挑战性。以下子任务的示例如图1所示。

常识推理:与ScienceQA数据集中需要专业知识不同,常识指的是日常生活中的基本知识。例如,给出一张羽绒服的照片,问MLLM在冷天(或热天)穿这件衣服是否合适。这些是人类无需复杂推理即可立即判断的基本知识。因此,团队期望MLLM在零样本情况下能表现良好。这些图像均为手工拍摄或通过扩散模型生成,所有指令-答案对均为手工设计。共有70张图像和140个指令-答案对。

数值计算:这要求MLLM能够读取图像中的算术问题并端到端地输出答案,如在[20]中所示。在此版本中,我们仅考虑相对简单的算术问题,如加法和乘法。共有20张图像和40个指令-答案对,所有图像均为手工拍摄,所有指令-答案对均为手工设计。

COCO captions等任务#

SNLI-VE:全称为Stanford Natural Language Inference Visual Entailment,这是一个结合了自然语言推理和视觉信息的任务。它要求模型判断给定的图像是否支持或反驳一个陈述句,从而评估模型理解和整合视觉与文本信息的能力。

三个Refcoco#

标注方式上:

  • RefCOCOg采用的是非交互式标注法,选定区域请人标注,再请另外一批人根据标注的expression选择对应的region;
  • RefCOCO和RefCOCO+采用的是双人游戏 (Refer it game)的方式.

数据划分方式上:

  • RefCOCO和RefCOCO+包含train, val, testA, testB。testA的图片包含多个人;testB的图片包含多个除人之外的物体。同一个图片的object-expression样本对要么全在训练集,要么全在验证\测试集
  • RefCOCOg包含train, val, test。是按照object进行划分的,同一个图片的object-expression样本对集合可能会在训练集一部分,在验证\测试集另一部分

图片选择上:

  • RefCOCO:图像包含同一类别的多个物体。
  • RefCOCO+:图像包含同一类别的多个物体,并且expression不能有绝对位置(e.g., left)的词。
  • RefCOCOg:图像包含同一类别的2-4个物体,覆盖面积超过图片面积的5%

评估指标:

Accuracy#

prediction box和groud-truth box的交并比(intersection over union,IoU)大于0.5记为一次正确定位,以此来计算准确率(Accuracy)。

最近部分工作还使用Recall@k指标,表示预测概率前k大的prediction box和ground-truth box的IoU大于0.5的定位准确率

?

Pointing game,选择最终预测的attention mask中权重最大的像素位置,如果该点落在ground-truth区域内,记为一次正确定位。相比Acc指标更加宽松。

COCO Captions#

BLEU@4(Papineni等人,2002)

METEOR(Lavie和Agarwal,2007)

CIDEr(Vedantam等人,2015)

SPICE

BLEU#

Bilingual Evaluation Understudy,双语评估辅助工具

核心思想

比较候选译文和参考译文里的 n-gram 的重合程度,重合程度越高就认为译文质量越高。unigram用于衡量单词翻译的准确性,高阶n-gram用于衡量句子翻译的流畅性。 实践中,通常是取N=1~4,然后对进行加权平均,这种叫做BLEU@4。

**候选译文:**
the cat sat on the mat
**参考译文1:**
the cat is on the mat
**参考译文2:**
there is a cat sitting on the mat
例子:Unigram 精确度计算
- 候选译文中的unigram集合为:`{the, cat, sat, on, the, mat}`
- 参考译文1中的unigram集合为:`{the, cat, is, on, the, mat}`
- 参考译文2中的unigram集合为:`{there, is, a, cat, sitting, on, the, mat}`
对每个词,计算其在候选译文中出现次数与在两个参考译文中出现的最大次数的最小值。例如,“the”在候选译文中出现了2次,在参考译文1中也出现了2次,在参考译文2中出现了1次。因此,我们取最大匹配数2(来自参考译文1)。
所以,unigram的精确度为:
min(2,2) + min(1,1) + min(1,0) + min(1,1) + min(1,1) / 6 ≈ 0.833

细节:引入了短句惩罚

ROUGE#

基于召回率的相似性度量方法,主要考察参考译文的充分性和忠实性,无法评价参考译文的流畅度,它跟BLEU的计算方式几乎一模一样,但是 n-gram 词组是从参考译文中产生的

METEOR#

Metric for Evaluation of Translation with Explicit ORdering

METEOR 显得更加人性化,它关注到那些翻译准确、但是和候选译文还是对不上的参考译文,比如参考译文用了候选译文的同义词。METEOR 需要 WordNet 扩充同义词集,同时需要考虑单词词性(比如like、likes应该都算对);在计算方式上它融合了准确率、召回率,利用二者的调和平均值来作为评判标准。

最终得分计算:METEOR计算了一个加权调和平均数来平衡精确度和召回率,同时应用一个基于chunk的惩罚因子。Chunk指的是在候选译文中连续且正确的词语序列,较长的连续正确序列会导致较低的chunk数量,从而减少惩罚。

CIDEr#

Consensus-based Image Description Evaluation

CIDEr 首先将 n-grams 在参考译文中出现的频率编码进来,通过TF-IDF 计算每个 n-gram 的权重,将句子用 n-gram 表示成向量的形式,然后计算参考译文和候选译文之间的 TF-IDF 向量余弦距离,以此度量二者的相似性。

CIDEr旨在通过比较候选字幕和一组参考字幕之间的n-gram重合度来衡量字幕的质量。不同于BLEU直接使用n-gram匹配的方式,CIDEr特别强调了那些在参考集合中出现频率较高的一致性短语。

  1. TF-IDF加权:首先,对于每个n-gram(通常从unigram到4-gram),计算其在整个数据集中的逆文档频率(IDF)。这一步骤的目的是降低那些在大多数图像描述中都常见的n-gram的重要性,同时提升那些对特定图像更为独特的n-gram的权重。具体来说,一个n-gram的IDF值是通过对所有图像的参考字幕进行统计得出的,计算公式如下: IDF(n-gram)=log(Ndf(n-gram))IDF(n\text{-gram}) = \log \left( \frac{N}{df(n\text{-gram})} \right) 其中,NN 是总的图像数量,df(n-gram)df(n\text{-gram}) 是包含该n-gram的图像数。

  2. 向量化表示:接下来,将每个候选字幕和参考字幕转换为基于上述加权n-gram的向量表示。这意味着每个caption都被表示为一个向量,其中每个维度对应一个n-gram,并且值为其TF-IDF加权计数。

  3. 余弦相似度:计算候选字幕向量与每个参考字幕向量之间的余弦相似度

  4. 最终得分:最后,候选字幕的CIDEr得分为其与所有参考字幕相似度的平均值。

TODO:解释不够清楚

SPICE#

Semantic Propositional Image Caption Evaluation

专注于比较候选字幕和参考字幕之间的场景图(scene graph)表示

首先,需要将每个候选字幕和参考字幕转换成场景图。这一过程通常借助自然语言处理技术来识别字幕中的对象、属性和关系,并将其映射到一个结构化图中。

接下来,使用一种称为F-score的方法来衡量候选字幕场景图与一组参考字幕场景图之间的相似性。

对于每个图像,计算所有参考字幕与候选字幕之间的平均F-score作为该图像的SPICE得分。

VQA#

VQA:Visual Question Answering

视觉问答任务。在这个任务中,模型需要回答关于图像的问题,这不仅要求模型具备图像理解能力,还需要其能够处理和回答各种类型的自然语言问题。

数据集被划分为训练集(train)、验证集(val)、开发测试集(test-dev)和标准测试集(test-std)。

  1. 开发测试集(Test-dev Set)
    • 主要用于调试和验证实验结果。研究人员可以无限制地向评估服务器提交结果来检查他们的模型在未知数据上的表现。
    • Test-dev是公开的。
  2. 标准测试集(Test-std Set)
    • 是VQA竞赛中的“默认”测试数据集
    • 是用于正式评估模型性能的数据集,提供了公平的竞争环境
实践-OFA相关研究
https://stivine.github.io/posts/practice-ofa-related-research/
作者
藤君
发布于
2025-05-15
许可协议
CC BY-NC-SA 4.0