字节跳动提出让所有 token 都参与 loss,提高 transformer 的表现

本文提出了TokenLabeling方法,通过利用所有图像令牌而非仅分类令牌进行训练,以提升视觉Transformer的准确性。引入了一种新的训练目标,即对每个令牌分配位置相关的监督信号。此外,还结合类似CutMix的数据增强策略TokenLabeling with MixToken,避免了直接在原始图像上应用CutMix导致的标签问题。这种方法不需要教师模型,计算成本较低,并且可以直接利用预训练模型生成的分数图作为监督信号。

19 All Tokens Matter: Token Labeling for Training Better Vision Transformers

Score /5: ⭐️⭐️⭐️⭐️

论文地址:

本想偷个懒,看看有没有人写这篇文章的阅读笔记,结果没找到,只能亲自写了。

字节跳动的文章,目的是提高准确率,采用的方法主要是将图片 embedding 后,让所有的 token 都参与最后 loss 的计算,而不是只用 classification token。

其中还借鉴了一些 CutMix 之类的 data augmentation 的方法。

其实我想看一下,如果只用 all token,但不用 cutmix 的效果会是怎样,不过 ablation study 里没有提到

摘要

  • 提出 token labeling,新的 training objective。
  • 利用了图片中的所有 token,而并非像以往的 ViT 一样,只利用了 classification token 来计算 loss。
  • 相当于将一个图像分类问题,转换成了多 token 尺度的识别问题,且给每一个 patch 都分配了一个独立的,与位置相关联的,由机器生成的监督(supervision)。

简介

  • 普通的 ViT 只用了 classification token 计算全局信息中的损失,这样的话其它一些 patch 中的丰富的局部信息就被忽视了。
  • 作者提出将一个由机器生成的 K 维的分数图,来监督所有的 token,其中 K 是数据中类的个数。
  • 这样,每个 patch 就和一个单独的与位置相关的监督联系在了一起,这个监督表示目标物体是否在对应的 image patch 中存在。

在这里插入图片描述
在这里插入图片描述

Token Labeling 方法

token labeling

以往的 transformer 计算 loss 都是用以下的公式:

Lcls=H(Xcls,ycls)L_{c l s}=H\left(X^{c l s}, y^{c l s}\right)Lcls=H(Xcls,ycls)

但作者提出的方法将计算所有 token 的 loss,且每个 token 应该有一个相对应的独立的,与位置相关的标签。因此,ground truth 不再是一个简单的 K 维的向量,而是一个 K×NK \times NK×N 的矩阵,或者叫 K 维分数图,表示为 [y1,…,yN]\left[y^{1}, \ldots, y^{N}\right][y1,,yN],其中 N 是输入 patch token 的个数。

这个新的 token labeling loss 由以下的公式来计算(相当于是在所有 token 上取了个平均)

Ltl=1N∑i=1NH(Xi,yi)L_{t l}=\frac{1}{N} \sum_{i=1}^{N} H\left(X^{i}, y^{i}\right)Ltl=N1i=1NH(Xi,yi)

于是,最后的总 loss 由以下的公式计算:

Ltotal =H(Xcls,ycls)+β⋅Ltl=H(Xcls,ycls)+β⋅1N∑i=1NH(Xi,yi)\begin{aligned}L_{\text {total }} &=H\left(X^{c l s}, y^{c l s}\right)+\beta \cdot L_{t l} \\&=H\left(X^{c l s}, y^{c l s}\right)+\beta \cdot \frac{1}{N} \sum_{i=1}^{N} H\left(X^{i}, y^{i}\right)\end{aligned}Ltotal =H(Xcls,ycls)+βLtl=H(Xcls,ycls)+βN1i=1NH(Xi,yi)

β\betaβ 是一个可调超参,实验中取值 0.5

优点

  • 不像其它蒸馏方法一样需要一个教师模型,且计算量比较低
  • dense score map 可以由预训练模型直接生成,比如 EfficientNet, NFNet 等等,训练中,我们只需要将生成的分数图截取出来再插值,使之与截出来的图在位置上对应好。

Token Labeling with MixToken

  • 之前的研究表明,在 Transformer 中使用 augmentation 能起到很好的效果
  • 如果直接在原图上使用 CutMix,那在经过 embedding 后生成的 token 里,有的 token 里会有来自附近几个 patch 的信息,很难给出一个干净且正确的标签。
  • 作者因此在 patch embedding 之后再使用类似 CutMix 的方法,来避免上述问题。
  • 具体地说,两张图片 I1,I2I_1, I_2I1,I2,对应的标签为 Y1=[y11,…,y1N],Y2=[y21,…,y2N]Y_{1}=\left[y_{1}^{1}, \ldots, y_{1}^{N}\right], Y_{2}=\left[y_{2}^{1}, \ldots, y_{2}^{N}\right]Y1=[y11,,y1N],Y2=[y21,,y2N],那首先经过 patch embedding,将它们变成 token: T1=[t11,…,t1N] and T2=[t21,…,t2N]T_{1}=\left[t_{1}^{1}, \ldots, t_{1}^{N}\right] \text { and } T_{2}=\left[t_{2}^{1}, \ldots, t_{2}^{N}\right]T1=[t11,,t1N] and T2=[t21,,t2N],再用下面的公式生成新的 token:

T^=T1⊙M+T2⊙(1−M)\hat{T}=T_{1} \odot M+T_{2} \odot(1-M)T^=T1M+T2(1M)

其中 M 是一个二值掩码, ⊙\odot 是点积,M 是根据论文“Regularization strategy to train strong classifiers with localizable features” 中的方法生成的。

接着用下式对标签进行相同的操作:

Y^=Y1⊙M+Y2⊙(1−M)\hat{Y}=Y_{1} \odot M+Y_{2} \odot(1-M)Y^=Y1M+Y2(1M)

这样,类的标签就可以写成以下形式:

ycls^=Mˉy1cls+(1−Mˉ)y2clsy^{\hat{c l s}}=\bar{M} y_{1}^{c l s}+(1-\bar{M}) y_{2}^{c l s}ycls^=Mˉy1cls+(1Mˉ)y2cls

其中 Mˉ\bar MMˉMMM 中所有元素的平均值。

实验及其它

这些就不写了,感兴趣的可以看一下,截几张图放在这里。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### Transformer 模型中的 Token 处理方式及作用 #### 输入序列构建 在 Transformer 模型中,Token 是基本的输入单元。对于文本数据而言,每个单词或子词会被转换成一个唯一的 ID 或嵌入向量形式的 Token[^1]。 #### 特殊 Tokens 的引入 为了特定目的,一些特殊的 Tokens 也会被添加到输入序列当中。例如,在 BERT (Bidirectional Encoder Representations from Transformers) 中使用的 `[CLS]` 和 `[SEP]` Tokens。其中 `[CLS]` 表示分类任务所需的特殊标记;而 `[SEP]` 则用于区分同的句子片段[^3]。 #### Class Token 在 Vision Transformer 中的应用 特别地,在视觉任务上的 ViT (Vision Transformer) 架构里,除了常规来自图片切片得到的 patch tokens 外还会额外附加一个 class token。这个 class token 同样参与整个 Transformer 编码过程,并最终仅以其对应的输出部分来进行类别预测工作[^4]。 #### 计算资源影响 当在一个已经存在的输入序列基础上再增添新的 Token 时——无论是普通的还是像上述提到过的那些具有专门用途的——都会使得整体计算负担有所上升。这是因为更多的 Tokens 导致了更大的矩阵运算规模以及更复杂的多头自注意机制运作需求,从而增加了每一步迭代所需的时间开销和硬件资源占用情况。 ```python import torch from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "Using a Transformer network is simple." encoded_input = tokenizer(text, return_tensors='pt') output = model(**encoded_input) print(output.last_hidden_state.shape) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值