来源:晓飞的算法工程笔记 公众号,转载请注明出处

论文: Vision-Language Model Fine-Tuning via Simple Parameter-Efficient Modification

创新点


  • 提出了一种CLIPFit方法以高效地微调CLIP模型,从而揭示经典模型微调在视觉语言模型(VLMs)上的潜力。
  • 与现有的提示调整或适配器调整方法不同,CLIPFit不引入任何外部参数,而仅微调CLIP固有参数中的一个小特定子集。

内容概述


微调视觉语言模型(VLMs)方面的进展见证了提示调优和适配器调优的成功,而经典模型在固有参数上的微调似乎被忽视了。有人认为,使用少量样本微调VLMs的参数会破坏预训练知识,因为微调CLIP模型甚至会降低性能。论文重新审视了这一观点,并提出了一种新视角:微调特定的参数而不是全部参数将揭示经典模型微调在VLMs上的潜力。

通过细致研究,论文提出了ClipFit,可以在不引入额外参数开销的情况下微调CLIP。仅通过微调特定的偏置项和归一化层,ClipFit可以将零样本CLIP的平均调和均值准确率提升7.27%

为了理解CLIPFit中的微调如何影响预训练模型,论文进行了广泛的实验分析以研究内部参数和表示的变化。在文本编码器中,当层数增加时,偏置的变化减少。在图像编码器中,LayerNorm也有同样的结论。进一步的实验表明,变化较大的层对知识适应更为重要。

CLIPFit


在不引入任何外部参数的情况下,CLIPFit仅对文本编码器中FNN的投影线性层的偏置项进行微调,并更新图像编码器中的LayerNorm

文本编码器

对于文本编码器,CLIPFit并不是对所有偏置项进行微调,而仅对文本编码器中FFNs的投影线性层(即第二层)的偏置项进行微调。仅微调部分偏置项将减少训练参数的数量,相较于微调所有偏置项。此外,实验表明,微调部分偏置项可以实现比微调所有偏置项更好的性能。

图像编码器

BitFit证明了在不引入任何新参数的情况下,仅微调预训练语言模型中的偏置项可以与完全微调的表现相媲美。然而,BitFit是为大型语言模型(LLM)微调设计的,直接将BitFit应用于视觉语言模型(VLM)微调可能会损害模型的泛化能力。

为此,CLIPFit并没有对图像编码器的偏置项进行微调,而是对LayerNorm进行微调。在LayerNorm中,两个可学习参数增益 \(\boldsymbol{g}\) 和偏置 \(\boldsymbol{b}\) 用于对标准化输入向量 \(\boldsymbol{x}\) 进行仿射变换,以进行重新中心化和重新缩放,这有助于通过重新塑形分布来增强表达能力。在训练过程中,不同的数据分布应该在LayerNorm中产生不同的增益和偏置,以实现分布的重新塑形。

如果在推理过程中应用偏移的增益和偏置,可能会导致次优解。因此,CLIPFit对图像编码器中的LayerNorm进行微调。

损失函数

在微调阶段,通用的预训练知识很容易被遗忘。因此,论文探索了两种不同的策略来减轻这种遗忘。

第一种策略是使用知识蒸馏损失来指导CLIPFit从原始的零样本CLIP中学习。设 \(\{\boldsymbol{w}_i^\mathrm{clip}\}_{i=1}^K\) 为原始CLIP的文本特征, \(\{\boldsymbol{w}_{i}\}_{i=1}^K\) 为CLIPFit的文本特征。CLIPFit的训练损失和知识蒸馏损失定义为:

\[\begin{equation}
\mathcal{L}=\mathcal{L}_{\mathrm{ce}}+\beta \mathcal{L}_{\mathrm{k g}},
\end{equation}
\]
\[\begin{equation}
\mathcal{L}_\mathrm{k g} = \frac{1}{K}\sum_{i=1}^{K}\cos(\boldsymbol{w}_i^{\mathrm{clip}},\boldsymbol{w}_i),
\end{equation}
\]

第二种策略是使用均方误差(MSE)损失来惩罚文本编码器的变化。设 \(\{\boldsymbol{b}_i^\mathrm{clip}\}_{i=1}^L\) 为来自预训练CLIP的未固定文本偏置项, \(\{\boldsymbol{b}_i\}_{i=1}^L\) 为来自CLIPFit的未固定文本偏置项,其中 \(L\) 是未固定偏置层的数量。均方误差损失定义为:

\[\begin{equation}
\mathcal{L}_\mathrm{m s e} = \frac{1}{L}\sum_{i=1}^{L}||\boldsymbol{b}_i^\mathrm{clip}-\boldsymbol{b}_i||^2.
\end{equation}
\]

这两种策略都能缓解遗忘问题,而知识蒸馏损失的效果更佳。因此,选择将知识蒸馏损失作为CLIPFit的最终解决方案。

主要实验






如果本文对你有帮助,麻烦点个赞或在看呗~

更多内容请关注 微信公众号【晓飞的算法工程笔记】

CLIPFit:不绕弯子,直接微调比提示微调和适配器微调更好 | EMNLP'24的更多相关文章

  1. 表单(下)-EasyUI Spinner 微调器、EasyUI Numberspinner 数值微调器、EasyUI Timespinner 时间微调器、EasyUI Slider 滑块

    EasyUI Spinner 微调器 扩展自 $.fn.validatebox.defaults.通过 $.fn.spinner.defaults 重写默认的 defaults. 微调器(spinne ...

  2. NLP论文解读:无需模板且高效的语言微调模型(上)

    原创作者 | 苏菲 论文题目: Prompt-free and Efficient Language Model Fine-Tuning 论文作者: Rabeeh Karimi Mahabadi 论文 ...

  3. 使用 LoRA 进行 Stable Diffusion 的高效参数微调

    LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题.目前超过数十亿以上参数的具有强能力的大 ...

  4. lecture14-RBM的堆叠、修改以及DBN的决策学习和微调

    这是Hinton的第14课,主要介绍了RBM和DBN的东西,这一课的课外读物有三篇论文<Self-taught learning- transfer learning from unlabele ...

  5. easyui源码翻译1.32--TimeSpinner(时间微调)

    前言 扩展自$.fn.spinner.defaults.使用$.fn.timespinner.defaults重写默认值对象.下载该插件翻译源码 时间微调组件的创建基于微调组件.它和数字微调类似,但是 ...

  6. 第二百一十七节,jQuery EasyUI,NumberSpinner(数字微调)组件

    jQuery EasyUI,NumberSpinner(数字微调)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 NumberSpinner ...

  7. 在一张 24 GB 的消费级显卡上用 RLHF 微调 20B LLMs

    我们很高兴正式发布 trl 与 peft 的集成,使任何人都可以更轻松地使用强化学习进行大型语言模型 (LLM) 微调!在这篇文章中,我们解释了为什么这是现有微调方法的有竞争力的替代方案. 请注意, ...

  8. [Pytorch框架] 4.1 Fine tuning 模型微调

    文章目录 4.1 Fine tuning 模型微调 4.1.1 什么是微调 为什么要微调 迁移学习 Transfer Learning 二者关系 4.1.2 如何微调 4.1.3 注意事项 4.1.3 ...

  9. 解密Prompt系列6. lora指令微调扣细节-请冷静,1个小时真不够~

    上一章介绍了如何基于APE+SELF自动化构建指令微调样本.这一章咱就把微调跑起来,主要介绍以Lora为首的低参数微调原理,环境配置,微调代码,以及大模型训练中显存和耗时优化的相关技术细节 标题这样写 ...

  10. 如果在敲代码的时候eclipse不弹出提示,怎么办?

    非常弱智的操作,我们曾经在输入System.out.println("content");的时候,当我们输入了"."之后,在输入错误,此时我们再回退至" ...

随机推荐

  1. rk3568 | rk平台GPIO冲突检测小技巧

    上一篇我们讲解了如何编写gpio驱动,但是实际操作中,经常发现gpio引脚被占用的情况发生,那么本篇文章就详细讲解rxw平台下如何快速定位gpio复用问题以及如何解决. 一.GPIO寄存器查找 要想查 ...

  2. 手把手教Linux驱动4-进程、文件描述符、file、inode关系详解

    本文目标 什么是文件描述符? 进程打开文件相关信息管理 Linux设备文件三大结构:inode,file,file_operations mknod 做了什么事? 进程打开设备文件 驱动如何支持同类型 ...

  3. Maven 项目 有Dependencies, 使用时无法引用,爆红

    1. 找到本地的该依赖的文件夹,将里面的.lastUpdated文件删除 2. IDEA清缓存重启

  4. Openstack-Train( 一)基础环境

    openStack-train 搭建部署 当面对KVM集群的时候,我们对KVM的管理以及宿主机的管理就会遇到很大的难度,例如: 查看每一个宿主机有多少台KVM虚拟机? 查看每一个宿主机资源信息,每一个 ...

  5. Angular Material 18+ 高级教程 – 大杂烩

    前言 本篇记入一些 Angular Material 的小东西. Override Material Icon Button Size 参考:Stack Overflow – Change size ...

  6. TypeScript – Get Started

    前言 我学 TypeScript 的时候是 Angular 2.0 beta 的年代... 现在 Angular 都快 14 了. 但由于已经有 1 年半没有写 Angular 和 TypeScrip ...

  7. MyBatis——案例——查询-查询所有

      查询-查询所有数据     1.创建相应Mapper接口文件 以及Mapper配置信息文件                修改配置文件中 namespace :             2.编写接 ...

  8. electron的两个进程

    electron 有两个类别的进程,一个是主进程,另一个是渲染进程 主进程: 启动后一直存在的,相当于一个树的主干并不会展示出来,是看不到的所有跟系统资源交互的操作都在这里进行操控渲染进程,新建或销毁 ...

  9. 016 Python 中的基本运算符

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/28 15:01 # Filename:016 Python 中的基本运算 ...

  10. mysql进阶-锁

    锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源. 如何保证数据并发访问的一致性.有效性 ...