- 之后一步和 ViT 完全一样,做了 Patch Embedding
其中, z 0 z_0 z0 表示 Transformer encoder 的初始输入, x p i E x^i_pE xpiE 表示 x p i x^i_p xpi 这个 patch 的 patch embedding, E p o s E_{pos} Epos 表示位置嵌入(position embedding)。
每一个变量的维度不再赘述。
之后进入 Transformer编码器 ,每一层的结构图如下:
z l ′ = M S A ( L N ( z l − 1 ) ) + z l − 1 l ∈ 1 , 2 , . . . , L z l = M L P ( L N ( z l ′ ) ) + z l − 1 ′ l ∈ 1 , 2 , . . . , L z_l^{'} =MSA(LN(z_{l-1}))+z_{l-1}\space\space\space\space\space l\in 1,2,...,L\\ z_l =MLP(LN(z_{l}^{'}))+z_{l-1}^{'}\space\space\space\space\space l\in 1,2,...,L zl′=MSA(LN(zl−1))+zl−1 l∈1,2,...,Lzl=MLP(LN(zl′))+zl−1′ l∈1,2,...,L
其中 L N ( ⋅ ) LN(·) LN(⋅) 表示层标准化(layer normalization)
消融实验:
多花将近两倍的时间,提升0.2个点,但是推理的时候不需要,还是划算的。。
在进入最后一层 Transformer编码器 之前,本文团队加入了第二个trick:部分选择模块(PSM)。
扯回 ViT,在进入多头自注意力之前,模型先要将 N N N 个 token按照就近原则分组成 K K K 个组合, K K K 对应自注意头的个数,然后让这 K K K 个组合两两之间都做一遍多头注意力:
最后输出 N × D N\times D N×D 维的结果去做分类。
而本文作者团队认为这样做最后输出的 N N N 个token过多地包含了全局的信息,不适用于细粒度分类,于是在编码器进入最后一层之前做出以下改进:
做累乘:
α f i n a l = ∏ l = 0 L − 1 α l \alpha_{final}=\prod^{L-1}_{l=0}\alpha_l αfinal=l=0∏L−1αl
然后从 a f i n a l a_{final} afinal 中将 K K K 个组合中得分最高的那一个token拿出来,得到 K K K 个token的组合 z l o c a l z_{local} zlocal,加上分类的token z L − 1 0 z^{0}_{L-1} zL−10 作为编码器的输出,即分类器的输入, z l o c a l z_{local} zlocal的公式表示如下:
z l o c a l = [ z L − 1 0 ; z L − 1 A 1 , z L − 1 A 2 , . . . , z L − 1 A K ] z_{local}=[z_{L-1}^0;z_{L-1}^{A_1},z_{L-1}^{A_2},...,z_{L-1}^{A_K}] zlocal=[zL−10;zL−1A1,zL−1A2,...,zL−1AK]
- 最后,在计算损失时,除了运用交叉熵以外,作者团队加上了一个增加奖励,减少惩罚的偏置。
- 原文为: minimizes the similarity of classification tokens corresponding to different labels and maximizes the similarity of classification tokens of samples with the same label y.
- 真看不懂为啥,但消融实验证明确实有用。。。
偏置 L c o n L_{con} Lcon公式表示为:
L c o n = 1 B 2 ∑ i B [ ∑ j : y i = y j B ( 1 − S i m ( z i , z j ) + ∑ j : y i ≠ y j B m a x ( ( S i m ( z i , z j ) , 0 ) ) ) L_{con}=\frac{1}{B^2}\sum_i^B[\sum_{j:y_i=y_j}^B(1-Sim(z_i,z_j)+\sum_{j:y_i\ne y_j}^B max((Sim(z_i,z_j),0))) Lcon=B21i∑B[j:yi=yj∑B(1−Sim(zi,zj)+j:yi=yj∑Bmax((Sim(zi,zj),0)))
其中 z i z_i zi 和 z j z_j zj 已经用 L 2 L2 L2正则化 预处理过, S i m ( z i , z j ) Sim(z_i,z_j) Sim(zi,zj) 代表 z i z_i zi 和 z j z_j zj 的点乘。
最后将交叉熵损失和这个偏置相加,得到最终结果。
L = L c r o s s ( y , y ′ + L c o n ( z ) ) L = L_{cross}(y,y^{'}+L_{con}(z)) L=Lcross(y,y′+Lcon(z))