首页 > 其他分享 >ViT和MAE模型结合初探

ViT和MAE模型结合初探

时间:2023-08-28 18:34:18浏览次数:46  
标签:训练 模型 学习 MAE ViT 初探 数据

介绍

transfomer在NLP领域的应用已经非常广泛,但是在CV领域的应用还比较少,主要是因为CV领域的数据是二维的,而transfomer是基于序列的,因此需要将二维数据转换成序列数据,这就是ViT的由来。ViT是将图像分割成一个个patch,然后将patch展开成序列,再输入到transformer中,这样就可以将transformer应用到CV领域了。然而transformer相比于CNN缺少一个平移不变性,因此Transformer需要在模型中学习到这个归纳偏差(inductive bias),因此需要更多的数据来训练Transformer模型,来达到相同的性能。在ViT论文中,作者在使用相同的ImageNet-1k的数据集时,性能相比于当时的baseline模型还要差1~2百分点,当在更大的数据集上ImageNet-100k上训练时,ViT的性能已经能够媲美CNN的SOTA了,当在谷歌的大规模数据集JFT-300M上训练时,ViT的性能已经超过了CNN的SOTA了。因此,ViT的性能与数据集的大小是正相关的,这也是ViT的一个缺点,因为ViT的训练需要更多的数据,而且训练时间也会更长。

具有标记的数据往往相比于无标记的数据集更难以获取,并且获取的成本也要远远高于无标记数据集。因此,基于无标记数据的无监督学习成为了目前备受关注的研究方向。目前无监督学习方向主要分为两大类:对比学习和掩码学习。

  • 对比学习通过设置正样本和负样本,正负样本通过模型得到各自的特征,设定loss使得特征的相似度越低越好;这使得模型能够通过关注正负样本的差别来学习到深层的表示,不同领域的对比学习设定正负样本的规则也不同,在分类任务中可以将和当前样本一致的数据视为正样本,不一致的视为负样本。
  • 掩码学习通过将输入数据的一部分掩盖,然后让模型去预测掩盖的部分,这样模型就能够学习到输入数据的一些特征;掩码学习不经用于CV,也用于NLP等众多领域,如BERT、GPT等。在CV领域目前比较流行的掩码学习模型为MAE(Masked AutoEncoder)、SIMM。

无监督学习能够通过大量无标记的数据学习到数据的深层表示,而同时ViT需要大量的数据。一个很自然的想法是将ViT和MAE等无监督学习的模型结合起来,通过无监督学习得到的backbone来指导ViT的训练,从而减少ViT的训练数据,并且帮助ViT学习到更加深层的表示。

主要方法

  1. 直接将MAE的训练得到的模型作为ViT的backbone,然后在ViT的训练中进行微调。从头训练一个MAE显然对于我来说是不显示的,MEA的模型可以从网上下载,由于MAE训练的模型已经取得了很好的效果,显然它已经学习到了诸如平移不变性等CNN和图像等众多的性质,因此直接在MAE得到的模型上做ViT的微调,获取可以继承MAE的性质,同时又能够学习到特定领域的特征。
  2. 使用知识蒸馏的方法,将MAE的模型作为teacher模型,ViT作为student模型,通过知识蒸馏的方法来训练ViT。知识蒸馏的方法是将teacher模型的输出作为student模型的标签,通过最小化student模型的输出和teacher模型的输出的差异来训练student模型。知识蒸馏的方法可以帮助student模型学习到teacher模型的知识,从而达到和teacher模型相近的性能。和ViT一同发表的另一篇DeiT模型描述了使用知识蒸馏的方法,使用CNN作为teacher模型,transformer作为stduent模型,可以训练一个性能相比于CNN更好的模型。这说明CNN作为teacher模型,它可以传送关于一些平移不变性的归纳偏差给transformer模型,从而帮助transformer模型学习到更好的表示。因此,我们可以使用MAE作为teacher模型,ViT作为student模型,通过知识蒸馏的方法来训练ViT,从而帮助ViT学习到更好的表示。因为,我们也认为MAE已经学习到了一些关于平移不变性的归纳偏差,因此可以帮助ViT学习到更好的表示。

实验设计

由于算力的原因,我采取了一些折衷的处理方式:

  • 无法从头训练一个MAE模型,因此我直接从transformer的社区获得了一个MAE模型,这个模型是在ImageNet-1k上训练的,所以为了避免我训练的数据已经在Image-1k上,我使用了人脸作为训练数据,ImageNet-1k中并不存在大量的人脸数据.
  • 在知识蒸馏中,无法从头开始进行蒸馏,学习到一个新的模型,因此我只观察了一段时间的蒸馏过程,主要是观察蒸馏过程中的loss变化。

对于方法1,测试了多种不同的微调和迁移方式,例如只迁移Patch_embedding, + transformer_block.只对FC进行微调,只对Block进行微调,和全部一起训练。

实验结论

标签:训练,模型,学习,MAE,ViT,初探,数据
From: https://www.cnblogs.com/chenfengshijie/p/17663119.html

相关文章

  • activiti 删除某个流程的sql
    DELETEFROMACT_HI_ATTACHMENTWHEREPROC_INST_ID_='152512';DELETEFROMACT_HI_COMMENTWHEREPROC_INST_ID_='152512';DELETEFROMACT_HI_ACTINSTWHEREPROC_INST_ID_='152512';DELETEFROMACT_HI_DETAILWHEREPROC_INST_ID_=......
  • 使用 Vitest 进行组件测试
    原文:试试使用Vitest进行组件测试,确实很香。参考:Vitest:https://cn.vitest.dev/guide/ui.html什么是Vitest?自从尤大的构建工具Vite获得了巨大的人气,现在有了一个由它驱动的极快的单元测试框架。Vitest。Vitest与Jest兼容,具有开箱即用的ESM、Typescript和JSX支持,并且......
  • activiti
    <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.or......
  • VIT
    1.为什么有patch0,需要一个整合信息的向量,如果只有原始输出的9个向量,用哪个向量来分类都不好。全用计算量又很大所以加一个可学习的vector,也就是patch0来整合信息。分类需要,分割和检测不是2.位置编码图像切分重排后失去了位置信息并且Transformer的内部运算是空间信息无关的,......
  • 初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法
    初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中,可能会遇到一些常见问题。以下是一些常见问题以及相应的处理方法:1、顶点丢失和形状变形:在减小顶点数量的过程中,可能会导致一些细节部分丢失或者模型整......
  • Electron,VUEJS3,Vite,TypesSript 开发环境配置
    Electron,VUEJS3,Vite,TypesSript开发环境配置项目早期是vue3+vite开发的,后期由于运营需求,要修改为Win安装包。方案还是比较多的:1.WPF-Webview由于目前只需要兼容win,所以可以选择WPF,但WPF需要WebView的,还需要本地架设服务。整体部署比较复杂以及需要熟悉C#与WPF相关开发。2.......
  • 为什么vite比webpack速度快
    一.webpack为什么慢主要是由于其内部的核心机制——bundle模式引发的webpack通过bundle机制,将项目中各种类型的源文件转化供浏览器识别的js、css、img等文件,建立源文件之间的依赖关系,将数量庞大的源文件合并为少量的几个输出文件。bundle工作机制的核心部分分为两块:构建......
  • Vite + Vue3 + Element-Plus
    搭建Vite项目注意Vite需要 Node.js 版本14.18+,16+。然而,有些模板需要依赖更高的Node版本才能正常运行,当你的包管理器发出警告时,请注意升级你的Node版本。使用NPM: npmcreatevite@latest使用Yarn:yarncreatevite使用PNPM:pnpmcreatevite输入项......
  • vue3 用vite创建项目
    1.第一步运行创建命令(npm)npmcreatevite@latest注意的地方:首次创建的时候会出现这个 直接y就行了Needtoinstallthefollowingpackages:create-vite@latestOktoproceed?(y)直接y就行了2.第二步创建项目名称?Projectname:»vue3-demo3.第三步找到vue即可(下边有......
  • Java代理模式初探
    代理模式是一种常见的软件设计模式。所谓的代理者是指一个类别可以作为其它对象的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它重要或无法复制的资源。有时候我们需要需要一个功能(通常是一个API)。该功能已经被某个类A实现了,代理类B实现相同的接口,并将......