NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越

本文主要是介绍NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

outside_default.png

长按扫描二维码关注我们

outside_default.png

计算机视觉研究院专栏

作者:Edison_G

近期,由新加坡国立大学和字节跳动联合发表的论文入选 NeurIPS 2022。该论文提出了一个全新的、针对大模型训练的参数高效微调方法 SSF(Scaling & Shifting Your Features),可简洁、高效、零开销实现参数微调。

outside_default.png

  • 论文地址:https://arxiv.org/abs/2210.08823

  • 代码地址:https://github.com/dongzelian/SSF 

大模型训练调参:开销和性能不可兼得?

随着数据驱动的方法在深度学习界的普及,数据集规模和模型规模都有了巨大的爆发。业界倾向于探索大模型,然后在下游任务中采用这些预训练的模型,以获得更好的性能和更快的收敛。

然而,目前的程序严重依赖于全面微调,即更新模型的所有参数。这不可避免地导致模型对小的目标数据集过度拟合,继而在微调后不能用于其他任务。因此,设备需要为每个任务保存一套专门的模型参数,造成了巨大的存储空间,特别是对于如今的大模型(例如, ViT-G/14, 1.8G, CoAtNet, 2.4G)来说,训练开销很大。

此前,业界对上述问题的解决方案是:仅仅微调头部层,即只对最后一个头部层进行微调。然而,与完全微调相比,这种做法通常会产生较差的性能。

以视觉任务上实现的方法 VPT(视觉提示微调)[1]为例,VPT 提出插入可学习的提示作为输入,并将其附加到原始图像 token 中。这些提示将通过执行自我注意力(self attention)与图像 token 交互,并在微调过程中进行更新。通过这种方式,与只微调头部层相比,在下游任务中可以实现显著的性能提升。然而,与完全微调和微调头部层相比,VPT 方法额外引入了两个问题:

i) VPT 为不同的任务调整提示的数量,这引入了一个与任务相关的可学习参数空间。微调的性能对每个任务的提示数量很敏感,需要仔细设计。太少或太多的提示可能会降低微调的准确性或增加计算的冗余度(例如,在 Clevr/count 上有 200 个提示,但是 Flowers102 上有 1 个提示);

ii) VPT 以及其他基于适配器(adapter)的方法 [2],与原始预训练模型相比,在推理阶段引入了额外的参数和计算成本。例如,VPT 引入了额外的输入,基于适配器的方法在预训练的模型中插入额外的模块。这些方法改变了预训练网络结构或网络的输入,可能导致频繁的结构修改和沉重的工作量,特别是对于那些已经部署在边缘设备(如移动电话)中的模型。

符合奥卡姆剃刀原则的新方法

受一些特征调制方法的启发,针对上述难题,新加坡国立大学和字节跳动的研究者提出了一种全新的参数高效的微调方法,名为 SSF。采用 SSF 方法,只需要对预训练的模型提取的深层特征进行缩放和移位,就可以进行微调。

由于上游数据集和下游数据集的数据分布不同,很难将在上游数据集训练的模型权重应用于下游数据集。例如,保持骨干权重的微调头部层策略会导致性能下降。为了缓解上述问题,SSF 引入了缩放参数和移位参数,这些参数可以被认为是方差和均值,用于调节用上游数据集上的预训练模型提取的下游数据集的特征,从而使被调节的特征落在一个鉴别性的空间。这些缩放参数和移位参数不依赖于任何输入,对于不同的任务有一个统一的可学习参数空间。

SSF 的另一个优点是,它只引入了线性变换,这是因为研究者仅仅对提取的特征进行了缩放和移位。这些线性变换可以在推理阶段通过模型重新参数化(model re-parameterization) [3] 进一步合并到原始的预训练权重中,从而避免了下游任务的额外参数和 FLOPs。对于部署在边缘设备中的模型,只需要上传微调后的更新权重,而不需要改变网络结构。

表一显示了 SSF 和其他微调方法之间的具体特征比较。SSF 简单、有效、高效,也符合奥卡姆剃刀原则。研究者探索了这个新的基线,发现它出人意料地超过了所有其他参数高效的微调方法。

outside_default.png

图一:SSF 方法的特点以及它在 FGVC 和 VTAB 任务上的性能。

通过在 26 个分类数据集和 3 个鲁棒性数据集上评估 SSF 方法,结果显示:与其他参数高效的微调方法相比,SSF 获得了最先进的性能。

与完全微调相比,SSF 方法在 FGVC 和 VTAB-1k 上获得了 2.46%(90.72% {vs. 88.54%)和 11.48%(73.10%  vs. 65.57%)的 Top-1 精度性能改进,但只需要大约 0.3M 的可训参数。此外,SSF 在推理阶段不需要额外的参数,可以即插即用,很容易扩展到各种模型系列(CNN、Transformer 以及 MLP 网络)。

具体的实现思路

与此前方法不同的是,研究者引入了缩放和移位因子来调节由预先训练好的模型提取的深层特征,并进行线性转换以匹配目标数据集的分布。

这一方法涵盖了五个主要属性:

i) SSF 实现了与完全微调策略相同的性能;

ii) 所有的下游任务都可以独立地输入到模型中,而不依赖任何其他任务;

iii) 模型只需要微调很少的参数;

iv)与 VPT 不同,VPT 为每个任务调整提示的数量,而 SSF 中微调的参数集不会随着任务的变化而变化,这使得之后可以通过增加更多的任务进行多任务学习或连续学习来进一步微调参数是可行的(它提供了更多的灵活性,与 ii)并不矛盾);

v)由于线性变换,SSF 避免了在推理阶段引入额外的参数和计算成本,使这一方法实现零开销。

outside_default.png

图二:SSF 的总体框架。

SSF 的设计:SSF 执行线性转换来调节特征来进行参数高效的微调,如图二所示。在图二(a)中,给定一个在上游任务中预训练的模型,研究者在网络的每个操作(OP)之后插入 SSF-ADA (把提出的方法称为 SSF,把具体的模块称为 SSF-ADA)来调节特征。总共有 K 个操作,这些操作可能包含多头自注意力(MSA)、MLP 和层归一化化(LN)等等。在微调过程中,这些操作中的预训练权重保持冻结,SSF-ADA 参数保持更新。具体的 SSF-ADA 结构如图二 (c) 所示,前一个操作输出的特征用一个缩放因子进行点乘,然后用一个移位因子求和,这与输入无关,如下所示

outside_default.png

重参数化:由于 SSF-ADA 是一个完全的线性变换,可以通过吸收缩放和移位项来重新参数化它,如下所示

outside_default.png

其中 w 和 b 分别为权重和偏置项。* 代表卷积层中的 "卷积" 操作或 MLP 层中的 "乘法" 操作。t 是前一个线性层的输入。由于 w 和 b 被冻结,而和在微调中被更新,在推理阶段,和可以通过上述公式合并到原始参数空间(w 和 b)。从这个角度看,SSF-ADA 使得在不增加任何额外参数和计算成本的情况下执行下游任务成为可能,如图二(b)所示。

实验结果

1. SSF 在图像分类数据集上的性能

研究者分别在 FGVC、VTAB、CIFAR-100 和 ImageNet-1K 进行了实验,如表一、二、三。SSF 一致性地超过了其他高效微调方法(Adapter、Bias 和 VPT)。在表三中,SSF 在 Swin Transformer、ConvNext 和 AS-MLP 等各种模型上的结果也始终优于其他参数高效微调方法,这也验证了 SSF 在多种模型上的有效性。更多的分析见论文。

outside_default.png

表一:在 FGVC 数据集上使用 ViT-B/16 预训练模型的实验结果

outside_default.png

表二:在 VTAB 数据集上使用 ViT-B/16 预训练模型的实验结果

outside_default.png

表三:在 CIFAR-100 和 ImageNet-1K 数据集上使用 ViT-B/16, Swin-B, ConvNext-B 和 AS-MLP-B 等预训练模型的实验结果

2. 不同的设计对结果的影响

研究者还进行实验来分析不同设计对微调的影响。所有的实验都是在 CIFAR-100 上用预训练的 ViT-B/16 模型实现的,结果见表四。

outside_default.png

表四:不同设计的影响。(a)  层数的影响 (b) 不同插入位置的影响 (c) 初始化的影响 (d) 不同组件的影响

3. 可视化分析

为了进一步研究为什么 SSF 能取得更优异的性能,研究者还将完全微调和微调头部层、完全微调和 VPT-Deep、完全微调和 SSF 之间的特征相似性可视化,如图三所示。在最后一层,SSF 与完全微调的特征最相似,准确度也最接近。这表明 SSF 能很好地提取下游任务中的图像特征。

outside_default.png

图三:完全微调和微调头部层、完全微调和 VPT-Deep、完全微调和 SSF 在 ViT-B/16 的不同层中的特征相似性的可视化。

结论

在本文中,研究者专注于参数高效的微调,并提出了一种 SSF 方法来缩放和移位预先训练好的模型所提取的特征。SSF 在微调过程中引入的缩放和移位参数可以通过推理阶段的重参数化合并到原来的预训练模型权重中,避免了额外的参数和 FLOPs。在总共 26 个图像分类数据集和 3 个鲁棒性和分布外数据集以不同的模型(CNN、Transformers 和 MLPs)进行实验,SSF 出人意料地优于其他参数高效的微调方法,它建立了一个新的基线。

引用:

[1] Jia et al., Visual Prompt Tuning, ECCV2022.

[2] Houlsby et al., Parameter-efficient transfer learning for nlp, ICML2019.

[3] Ding et al., Repvgg: Making vgg-style convnets great again, CVPR2021.

© THE END 

转载请联系本公众号获得授权

outside_default.png

计算机视觉研究院学习群等你加入!

计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

outside_default.png

扫码关注

计算机视觉研究院

公众号ID|ComputerVisionGzq

学习群|扫码在主页获取加入方式

 往期推荐 

🔗

  • YOLOS:通过目标检测重新思考Transformer(附源代码)

  • 自己觉得挺有意思的目标检测框架,分享给大家(源码论文都有)

  • CVPR2021:IoU优化——在Anchor-Free中提升目标检测精度(附源码)

  • 多尺度深度特征(上):多尺度特征学习才是目标检测精髓(干货满满,建议收藏)

  • 多尺度深度特征(下):多尺度特征学习才是目标检测精髓(论文免费下载)

  • ICCV2021目标检测:用图特征金字塔提升精度(附论文下载)

  • CVPR21小样本检测:蒸馏&上下文助力小样本检测(代码已开源)

这篇关于NeurlPS 2022 | 全新大模型参数高效微调方法SSF:仅需训练0.3M的参数,效果卓越的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238877

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD