当前位置: 首页 > news >正文

ViT: Vision transformer的cls token作用?

知乎:Vision Transformer 超详细解读 (原理分析+代码解读) 

CSDN:vit 中的 cls_token 与 position_embed 理解 

CSDN:ViT为何引入cls_token 

CSDN:ViT中特殊class token的一些问题


Vision Transformer在一些任务上超越了CNN,得益于全局信息的聚合。在ViT论文中,作者引入了一个class token作为分类特征。

如果没有cls_token,我们使用哪个patch token做分类呢?

根据自注意机制,每个patch token一定程度上聚合了全局信息,但是主要是自身特征。ViT论文还使用了所有token取平均的方式,这意味每个patch对预测的贡献相同,似乎不太合理。实际上,这样做的效果基本和引入cls_token差不多。

ViT引入class token机制,究其原因:

Transformer输入为一系列的patch embedding,输出也是同样长的序列patch feature,但是最后要总结为一个类别的判断。

  • 可以用avg pool,把所有的patch feature 都考虑算出image feature,如上述不太合理。
  • 作者引用类似flag的class token,其输出特征加上一个线性分类器就可以实现分类。
  • 训练的时候,class token的embedding被随机初始化并与pos embedding相加,因此从图可以看到输入transformer的时候【0】处补上一个新embedding,最终输入长度N+1.


第n+1个token(class embedding)的主要特点是:不基于图像内容;位置编码固定。

优势:

  • 该token随机初始化,并随着网络的训练不断更新,它能够编码整个数据集的统计特性;
  • 该token对所有其他token上的信息做汇聚(全局特征聚合),并且由于它本身不基于图像内容,因此可以避免对sequence中某个特定token的偏向性;
  • 对该token使用固定的位置编码能够避免输出受到位置编码的干扰。

ViT中作者将class embedding视为sequence的头部而非尾部,即位置为0。这样即使sequence的长度n发生变化,class embedding的位置编码依然是固定的,因此,更准确的来说class embedding应该是第0个而非第n+1个token。

另外“将前n个token做平均作为要分类的特征是否可行呢”,这也是一种全局特征聚合的方式,但它相较于采用attention机制来做全局特征聚合而言表达能力较弱。因为采用attention机制来做特征聚合,能够根据query和key之间的关系来自适应地调整特征聚合的权重,而采用求平均的方式则是对所有的key给了相同的权重,这限制了模型的表达能力。

The class token:与 input token 并在一起输入 Transformer block 的一个向量,最后的输出结果用来预测类别。这样一来,Transformer相当于一共处理了 N+1 个维度为 D 的token,并且只有最后一个token的输出用来预测类别。这种体系结构迫使patch token和class token之间传播信息。

遗留:

  • class embedding应该是第0个而非第n+1个token。
  • 只有最后一个token的输出用来预测类别。
  • 两者是否矛盾?做何理解?

相关文章:

  • sql2java-excel(一):基于apache poi实现数据库表的导出及支持spring web
  • SSM保险办理系统毕业设计源码012232
  • 先睹为快_Mandelbrot集
  • centos 7 安装mysql 8.0.30
  • TR5521设计资料|TR5521替代方案|DP转VGA设计参考
  • javaweb教师招聘管理系统ssm
  • spring boot —— Spring Security定制权限管理
  • Python从入门到实践:包的使用
  • kubernetes二进制安装教程单master
  • LeetCode-998. 最大二叉树 II【最大二叉树】
  • 如何快速使用proteus【硬件课程设计】
  • 从零开始手写一个Transformer
  • java基于springboot+Vue图片分享社区网站
  • Appium环境搭建及元素定位
  • 神经网络算法处理器设计,神经网络是机器算法吗
  • Android系统模拟器绘制实现概述
  • css布局,左右固定中间自适应实现
  • js正则,这点儿就够用了
  • MySQL数据库运维之数据恢复
  • React的组件模式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 来,膜拜下android roadmap,强大的执行力
  • 手写一个CommonJS打包工具(一)
  • 小程序 setData 学问多
  • 正则表达式小结
  • 大数据全解:定义、价值及挑战
  • #if和#ifdef区别
  • #Java第九次作业--输入输出流和文件操作
  • (0)Nginx 功能特性
  • (分布式缓存)Redis分片集群
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十)T检验-第一部分
  • (算法二)滑动窗口
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)我也是一只IT小小鸟
  • (转载)利用webkit抓取动态网页和链接
  • *上位机的定义
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net Web窗口页属性
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net实现客户区延伸至至非客户区
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @我的前任是个极品 微博分析
  • [20160902]rm -rf的惨案.txt
  • [20171102]视图v$session中process字段含义
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C/C++随笔] char与unsigned char区别
  • [C语言]——柔性数组
  • [Git].gitignore失效的原因
  • [Linux]Ubuntu noVNC使用
  • [node] Node.js的Web 模块