#TransHuman
在这可泛化人体重建领域引入了一种新的基于Transformer的人体表征。该表征在人体部件之间构建了全局关系,并将优化统一在了标准姿势下。浙大&阿里提出:基于Transformer的可泛化人体表征来了!
可泛化人体重建旨在在多个人体视频上进行预训练,学习可泛化的重建先验。在测试阶段,给定新人物的稀疏视角参考图,_在无需微调或者训练的情况下_,可直接输出新视角。以往方法大部分使用基于稀疏卷积(SparseConvNet)的人体表征方式,然而,一方面,稀疏卷积有限的感受野导致其对人体的自遮挡十分敏感,另一方面,其输入为不断变化的观察空间姿势下的人体,导致训练和推理阶段的姿势不匹配问题,降低了泛化能力。
不同于此,本文工作TransHuman使用Transformer围绕SMPL表面构建了人体部位之间的全局联系,并且将输入统一在标准姿势下,显著的提升了该表征的泛化能力。在多个数据集上达到了新SOTA的同时,具有很高的推理效率。
效果展示
(NOTE:推荐前往论文主页观看视频DEMO,更加直观。)
在ZJU-MoCap的泛化结果:
在H36M跨数据集泛化结果:
Mesh重建结果:
标题:TransHuman: A Transformer-based Human Representation for Generalizable Neural Human Rendering
作者:Xiao Pan, Zongxin Yang, Jianxin Ma, Chang Zhou, Yi Yang
机构:浙江大学CCAI-ReLER实验室,阿里巴巴达摩院
原文链接:
代码:github.com/pansanity666/TransHuman/
主页:pansanity666.github.io/TransHuman/
本文专注于可泛化人体重建任务。为了处理动态人体的运动和遮挡,之前方法主要采用了基于稀疏卷积的人体表征。然而,该表征方式1)在多变的观察姿势空间进行优化,导致训练与测试阶段输入姿势不一致,从而降低泛化性; 2)缺少人体部位之间的全局联系,从而导致对人体的遮挡敏感。为了解决这两个问题,我们提出了一个新的框架TransHuman。TransHuman在标准姿势空间进行优化, 并且使用Transformer构建了人体部位之间的联系。具体来讲,TransHuman由三个部分组成:基于Transformer的人体编码(TransHE), 可形变局部辐射场(DPaRF), 以及细粒度整合模块 (FDI). 首先,TransHE在标准空间使用Transformer处理SMPL;然后,DPaRF将TransHE输出的每个Token视为一个可形变的局部辐射场来获得观察空间下某一查询点的特征。最后,FDI进一步从参考图中直接收集细粒度的信息。本文在ZJU-MoCap及H36M上进行大量实验,证明了TransHuman的泛化性显著优于之前方法,并具有较高的推理效率。
算法解析
Pipeline概览 / 研究背景
TransHuman的pipeline如下图所示。整个pipeline可以抽象为:给定空间中一个查询点(Query Point),我们需要从多视角参考图中提取一个对应的条件特征(Condition Feature)输入NeRF,从而实现泛化能力(详细可参考PixelNeRF)。而条件特征主要由两部分组成:表面特征(Appearance Feature)及人体表征(Human Representation)。
- 表面特征:该特征可由将查询点通过相机参数进行反向投影后在参考图中进行插值得到,其直接反应参考图中的原始RGB信息,因此属于细粒度信息。但由于其缺少人体几何先验信息,仅使用此特征会导致人体几何的崩塌(详见Paper原文实验部分);
- 人体表征: 为获得人体表征,首先通过现有的SMPL估计方法,从视频中拟合出一个SMPL模版(Fitted SMPL,数据集一般自带)。然后对于SMPL的每一个顶点,将其反向投影到参考图得到该顶点对应的CNN Feature,就得到了着色之后的SMPL(Painted SMPL)。从着色之后的SMPL提取出来的特征便是人体表征。人体表征包含了人的几何先验,因此在pipeline中起着关键作用,也是本文的研究重点。
研究动机
之前的方法主要利用稀疏卷积(SparseConvNet)来得到人体表征,如下图上半部分所示。该方法主要有两个问题:
- 多变的输入姿势问题。 稀疏卷积的输入为观察姿势下的SMPL,也就是说其输入的姿势会随着帧数的变化而变化。这导致了训练和推理阶段的输入姿势不一致问题(推理阶段的人的姿势可能是各种各样的),从而极大的增加了泛化的难度。
- 局部感受野问题。 由于我们所能获取的参考图往往是十分稀疏的(本文默认采用3个视角),所以着色之后的SMPL通常包含大量的被遮挡部分。而另一方面,稀疏卷积本质是3D卷积,其感受野比较有限,从而导致无法进行人体部位之间的全局的推理。具体举例来说,假设人的左手是可见的而右手是被遮挡的,如果有全局之间的关系,那么网络理论上可以推断出右手被遮挡的部分大概是什么样。基于此直觉,我们认为在人体不同部位之间构建全局关系是很重要的。
为了解决以上两个问题,我们提出了本文关键的两个创新点(如下图下半部分所示),即:
- 用Transformer在SMPL表面之间构建全局关系,即TransHE部分。
- 将网络输入先统一在标准空间(比如T-pose的SMPL),然后将输出通过SMPL形变的方式转化回观察姿势进行特征提取,即DPaRF部分。
基于Transformer的人体编码 (TransHE)
接下来我们详细介绍TransHE的细节。如下图左下角所示,TransHE模块的输入是Painted SMPL (6890xd1)。一种直接的做法是将6890个Token输入Transformer(本文使用ViT-Tiny),然而这种做法1)会带来巨大的计算开销;2)会引入细粒度误差(Fitted SMPL只是人体的粗略模版而不包含衣物等细节,因此其着色本身也存在一定的误差)。基于这两个问题,我们需要降低输入Transformer的Token数量。一种非常直接的想法是对Painted SMPL进行voxlization,即将空间均匀划分为一个个小方块,在同一个方块内的顶点取平均算做一个Token,同时把方块中心作为Token对应的PE。但由于Painted SMPL是在观察姿势下的,随着输入帧的变化,观察姿势也随之变化。这就导致每次输入ViT的Token数量以及PE都在变化,使得优化变得十分困难。为了进一步解决这个问题,我们提出先对标准姿势SMPL(本文使用T-pose)进行K-Means聚类(本文默认聚300类)得到一个分组的字典。然后用该字典对Painted SMPL进行划分,同一类的特征取均值作为Token,同时将标准姿势SMPL下的聚类中心作为PE输入ViT。这样一来,Token数量和PE便不再受观察姿势的影响,极大的降低了学习的难度。
可形变局部辐射场 (DPaRF)
由于我们在TransHE模块将输入统一在了标准姿势,而我们最终需要的是观察姿势下给定查询点对应的特征,因此,我们需要将TransHE的输出变回到观察姿势。这里我们的思路是,为每个Token(对应一个身体部位)维护一个局部辐射场,且该辐射场的坐标系随着观察姿势下对应Token的旋转而旋转。对于每一个查询点, 我们将其分配到距离最近的K个Token(即,局部辐射场)。对于每个局部辐射场,我们将Token与该场下的局部坐标进行拼接得到该场下的人体表征。最终的人体表征则是这K个场的所有人体表征的加权和(根据距离加权)。
细粒度整合模块 (FDI)
通过TransHE和DPaRF, 我们已经得到了给定查询点的人体表征,该表征包含了粗粒度的人体几何先验信息。接下来,和之前的工作类似,我们使用一个Cross-attention模块,将粗粒度的人体表征视作Q,细粒度的表面特征视为K和V,得到最终的条件特征。
实验结果
本文在ZJU-MoCap和H36M上进行了泛化性实验,结果如下图所示。主要分为四个setting: Pose的泛化,Identity的泛化,只给一张参考图的泛化,以及跨数据集的泛化。在四个setting上均显著高于之前方法,达到了新的SOTA。
同时,作者还给出了在其代码中直接将TransHE + DPaRF模块替换成原来的SPC-based方法,以争取尽量公平的对比。结果如下图所示,本文方法仍明显领先。
另外,作者对本文方法的效率也给出了分析。在使用相同推理时间的情况下,本文方法性能仍然明显高于之前的方法,并且推理消耗的内存更小。可见本文方法具有比较高的推理效率。
篇幅有限,更多详细的Ablation以及可视化推荐大家阅读原文及观看项目主页的视频DEMO。
总结
本文为可泛化人体重建领域引入了一种新的基于Transformer的人体表征。该表征在人体部件之间构建了全局关系,并将优化统一在了标准姿势下。其泛化性能明显优于先前的基于稀疏卷积的表征,而且具有比较高的推理效率,为后续可泛化人体重建的研究提供了一个新的更高效的模块。
#LiVT~
在机器学习领域中,学习不平衡的标注数据一直是一个常见而具有挑战性的任务。近年来,视觉 Transformer 作为一种强大的模型,在多个视觉任务上展现出令人满意的效果。然而,视觉 Transformer 处理长尾分布数据的能力和特性,还有待进一步挖掘。
目前,已有的长尾识别模型很少直接利用长尾数据对视觉 Transformer(ViT)进行训练。基于现成的预训练权重进行研究可能会导致不公平的比较结果,因此有必要对视觉 Transformer 在长尾数据下的表现进行系统性的分析和总结。清华大学提出LiVT,用视觉Transformer学习长尾数据,解决不平衡标注数据不在话下
- 论文链接:https://arxiv.org/abs/2212.02015
- 代码链接:https://github.com/XuZhengzhuo/LiVT
本文旨在填补这一研究空白,详细探讨了视觉 Transformer 在处理长尾数据时的优势和不足之处。本文将重点关注如何有效利用长尾数据来提升视觉 Transformer 的性能,并探索解决数据不平衡问题的新方法。通过本文的研究和总结,研究团队有望为进一步改进视觉 Transformer 模型在长尾数据任务中的表现提供有益的指导和启示。这将为解决现实世界中存在的数据不平衡问题提供新的思路和解决方案。
文章通过一系列实验发现,在有监督范式下,视觉 Transformer 在处理不平衡数据时会出现严重的性能衰退,而使用平衡分布的标注数据训练出的视觉 Transformer 呈现出明显的性能优势。相比于卷积网络,这一特点在视觉 Transformer 上体现的更为明显。另一方面,无监督的预训练方法无需标签分布,因此在相同的训练数据量下,视觉 Transformer 可以展现出类似的特征提取和重建能力。
基于以上观察和发现,研究提出了一种新的学习不平衡数据的范式,旨在让视觉 Transformer 模型更好地适应长尾数据。通过这种范式的引入,研究团队希望能够充分利用长尾数据的信息,提高视觉 Transformer 模型在处理不平衡标注数据时的性能和泛化能力。
本文是第一个系统性的研究用长尾数据训练视觉 Transformer 的工作,在此过程中,做出了以下主要贡献:
首先,本文深入分析了传统有监督训练方式对视觉 Transformer 学习不均衡数据的限制因素,并基于此提出了双阶段训练流程,将视觉 Transformer 模型内在的归纳偏置和标签分布的统计偏置分阶段学习,以降低学习长尾数据的难度。其中第一阶段采用了流行的掩码重建预训练,第二阶段采用了平衡的损失进行微调监督。
其次,本文提出了平衡的二进制交叉熵损失函数,并给出了严格的理论推导。平衡的二进制交叉熵损失的形式如下:
与之前的平衡交叉熵损失相比,本文的损失函数在视觉 Transformer 模型上展现出更好的性能,并且具有更快的收敛速度。研究中的理论推导为损失函数的合理性提供了严密的解释,进一步加强了我们方法的可靠性和有效性。
不同损失函数的收敛速度的比较
基于以上贡献,文章提出了一个全新的学习范式 LiVT,充分发挥视觉 Transformer 模型在长尾数据上的学习能力,显著提升模型在多个数据集上的性能。该方案在多个数据集上取得了远好于视觉 Transformer 基线的性能表现。
不同参数量下在 ImageNet-LT 上的准确性。
在 ImagNet-LT(左)和 iNaturalist18(右)数据集上的性能表现
同时,本文还验证了在相同的训练数据规模的情况下,使用ImageNet的长尾分布子集(LT)和平衡分布子集(BAL)训练的 ViT-B 模型展现出相近的重建能力。如 LT-Large-1600 列所示,在 ImageNet-LT 数据集中,可以通过更大的模型和 MGP epoch 获得更好的重建结果。
总结
本文提供了一种新的基于视觉 Transformer 处理不平衡数据的方法 LiVT。LiVT 利用掩码建模和平衡微调两个阶段的训练策略,使得视觉 Transformer 能够更好地适应长尾数据分布并学习到更通用的特征表示。该方法不仅在实验中取得了显著的性能提升,而且无需额外的数据,具有实际应用的可行性。
#Transformers Can Do Arithmetic with the Right Embeddings
单GPU训练一天,Transformer在100位数字加法上就达能到99%准确率, 乘法和排序也有效。
自 2017 年被提出以来,Transformer 已成为 AI 大模型的主流架构,一直稳站 C 位。
但所有研究者都不得不承认的是,Transformer 在算数任务中表现非常糟糕,尤其是加法,这一缺陷在很大程度上源于 Transformer 无法跟踪大范围数字中每个数字的确切位置。
为了解决这个问题,来自马里兰大学、CMU 等机构的研究者向这一问题发起了挑战,他们通过在每个数字中添加一个嵌入来解决这个问题,该嵌入编码数字相对于开头的位置。该研究发现,只用一天时间在单个 GPU 上训练 20 位数字,就可以达到最新的性能水平,100 位数字加法问题高达 99% 的准确率。
论文地址:https://arxiv.org/pdf/2405.17399
项目地址:https://github.com/mcleish7/arithmetic
标题:Transformers Can Do Arithmetic with the Right Embeddings
具体而言,研究者建议对数据表示进行一个简单的修改,就能解决这个缺点。他们提出了 Abacus 嵌入用于编码每个数字符号 token 范围内的位置。将 Abacus 嵌入与标准位置嵌入结合使用后,该研究观察到 Transformer 在算数任务上的准确率有显著提高,以至于最多只训练了 20 位数操作数的模型可以泛化到 120 位数操作数的问题。这一数字代表了 6 倍的 SOTA 泛化因子,而以前的最先进的泛化因子也只有 2.5 倍。据了解,这是迄今为止被证明的最长的学习加法序列。
此外,本文还研究了几种其他方法来改善 transformer 在算术和泛化方面的性能,他们发现结合输入注入(input injection),即在输入层和每个解码器层之间插入跳跃连接,可以在 Abacus 嵌入基线上减少 50% 的泛化误差。本文还发现,与嵌入结合使用的 looped transformer 架构可以在加法问题上实现几乎完美的泛化。
本文的贡献可以总结如下:
- 本文提出了一种新的位置嵌入,称为 Abacus 嵌入,以更好地捕获每个数字的重要性,从而实现近乎完美的分布内泛化;
- 研究表明,当将 Abacus 嵌入与输入注入和 looped transformer 相结合时,性能会进一步提高,分布外准确率从 92.9% 提高到 99.1%,与单独使用标准架构的嵌入相比,误差降低了 87%;
- 研究者将这些发现扩展到更复杂的问题,包括乘法和排序,在这些领域也展现出了长度泛化。
实现加法的长度泛化
作者研究了一系列方法,旨在提高从头开始训练的语言模型在算术能力上的表现。他们主要关注两个假设:1)数字内各个位数的位置信息正在丢失;2)循环可以提高 Transformer 架构在多步算术推理问题上的推理能力。在详细描述每项改进之前,作者简要讨论了训练和评估设置。
实验设置
作者训练了仅包含解码器的因果语言模型来解决加法问题。
他们考虑了两种标准 transformer 架构。首先,他们使用一个标准的自回归 transformer 模型,多个解码器层以前馈方式堆叠。其次,他们通过输入注入(input injection)增强了这一标准 transformer 模型,即把嵌入的输入添加到每个解码器层的输入中。作者在图 20 中直观地描述了这些架构。
Abacus 嵌入帮助对齐数字
通过之前的研究和初步实验,作者发现,即使输入的数字是先显示最不重要的数字,训练数据是分层的、丰富的(几百万个例子),标准 transformer 也很难学习多位数加法。他们还观察到,人类在进行长加法运算时,会先将数位相同的数字排列成列。因此,作者的第一个假设是,对于 transformer 来说,每个数字的数位并不容易表示,而且这个子问题比实际加法本身带来的障碍更大。
为了解决 transformer 在表示位置信息方面的局限性,作者设计了一种特殊的位置嵌入,它可以编码每个数字相对于当前数字起始位置的位置。作者将其称之为 Abacus 嵌入。他们将相同的位置嵌入应用于所有具有相同数位的数字,从而提供一个显式的信号,供模型用于对齐数字,如图 2 所示。
Abacus 嵌入解决加法问题
对于标准 transformer 架构,Abacus 嵌入可将泛化性能提高到 100 位及以上。在图 3(左)中,作者强调了 Abacus 嵌入与标准 transformer 架构和嵌入相比,在进行加法运算时所具有的比较优势,取三种模型在所有情况下的平均准确度。
图 1 还显示了使用 FIRE 和 Abacus 训练的标准 transformer 模型的准确度结果,这些模型经过了域内 (ID) 和域外 (OOD) 测试。
Transformer 中的循环提高了性能
在解决位置嵌入问题后,接下来作者探讨了循环架构能否进一步提高 transformer 执行多位数加法的能力。他们使用「循环块(recurrent block)」一词来指一组具有不同权重的解码器层,而「循环(recurrence)」则指循环块的重复次数。作者使用有效深度(effective depth)一词来指 transformer 中使用的层数,无论其权重是否唯一。除非另有说明,否则他们使用的是最大循环架构,即只循环一个唯一层来达到有效深度。他们还采用了输入注入、 残差连接的方式,将输入的副本传播到网络中的每一层。
循环的优势
在图 3(右)中,作者比较了使用 FIRE 和 NoPE 嵌入对操作数多达 40 位的加法进行训练的所有架构变体。尽管参数数量仅相当于其他模型的 1/10,但可以看到,looped transformer(循环的、有输入注入和渐进损失)在使用任何一种位置嵌入时都取得了最佳的分布外性能。在图 8 中,作者展示了这一结果在多种训练数据规模下的稳健性。
对于循环模型,可以选择在训练时改变每次前向传递的循环次数。这往往会提高模型测试时对较难任务的泛化能力,这也被称为渐进损失计算(progressive loss computation)。这个损失函数是两个前向传递的损失值的凸组合,一个使用字面上的循环数(1 × 16 模型为 16),另一个使用随机的较小循环数。
接下来,作者探讨了在保持有效深度固定的同时改变循环块大小的效果。他们将循环块中的层数减半,循环次数增加一倍,从块中有 16 层、循环次数只有一次(16 × 1,即标准 transformer)的模型,过渡到块中只有一层、循环次数有 16 次(1 × 16)的模型。
通过图 4 分析这些结果,作者发现在某些情况下,结合循环和 Abacus 嵌入可以进一步提高性能。具体来说,在 OOD 问题上,有两个循环的模型(8 × 2)产生的误差是纯非循环模型(16 × 1)的一半,而在 100 + 的 OOD 问题上,其准确率也有所提高。
最后,在附录 A.7.3 中,作者改变了模型的有效深度,以分析参数数量对这项任务的影响,包括 Abacus、FIRE 和 NoPE 嵌入。虽然图 4 中的实验是对不同深度的公平比较,但纯粹的标准 transformer 模型比相应的循环模型拥有更多的参数。在附录的表 3 中,作者记录了最接近百万的参数量。
实验
研究者不仅对加法问题进行了探讨,还对乘法和排序进行了研究。
整数乘法
图 5 展示了 Abacus 嵌入模型在 15 位数乘法的分布内准确率超过了之前的工作,且不需要用零将每个操作数填充到相同长度。特别地,该研究强调,与仅使用 FIRE 的基线相比,将 Abacus 嵌入与 FIRE 相结合也提高了分布问题中最难的分布准确率 (右下)。
数组排序
表 1 展示了使用不同嵌入 ——FIRE、Abacus 及其组合 —— 训练的标准 transformer(八层)的性能。结果显示,组合嵌入方法增强了模型的泛化能力。
如表 2 所示,研究者观察到在将 Abacus+FIRE 嵌入组合与不同的模型架构(有效深度为 8)配对时,结果表现出混合性。
Abacus 和相关嵌入
图 6 展示了将 Abacus 嵌入整合到更通用系统中的真正潜力,显示出 Abacus 嵌入与 FIRE 结合可以解锁远超 FIRE 嵌入解决问题的能力。
#Transformer~x1
继续搬 太困了 周末回家还有训练机要装 还有一个盒子忘了装ffmpeg 大佬们勿怪~~ 这次是谷歌大佬们的讲述
自 2017 年诞生以来,Transformer 模型在自然语言处理、计算机视觉等多个领域得到广泛应用,并出现了大量变体。近期涌现的大量 Transformer 变体朝着更高效的方向演化,谷歌研究者对这类高效 Transformer 架构进行了综述。
Transformer 是现代深度学习领域一股令人敬畏的力量,它广泛应用于语言理解、图像处理等多个领域,并产生了极大的影响。过去几年,大量研究基于 Transformer 模型做出基础性改进。人们对此的巨大兴趣也激发了对更高效 Transformer 变体的研究。
近期涌现了大量 Transformer 模型变体,研究者和从业者可能难以跟上创新的节奏。在该论文写作时(2020 年 8 月),之前的半年出现了十多个新的高效 Transformer 模型。因此,对已有文献进行综述对于社区而言是有益和及时的。
自注意力机制是 Transformer 模型的核心典型特征。该机制可被看作是一种类似图的归纳偏置,将序列中的所有 token 与基于相关性的池化操作连接起来。对于自注意力的一个担忧是其时空复杂度都是平方级的,这妨碍模型在多种环境下的可扩展性。最近出现了大量试图解决该问题的 Transformer 模型变体,本文将这类模型称作「高效 Transformer」(efficient Transformer)。
基于此,模型的效率有了不同的诠释。效率可能指模型的内存占用,当模型运行的加速器内存有限时这尤为重要;效率也可能指训练和推断过程中的计算成本,如 FLOPs 数。尤其对于设备端应用而言,模型应在有限的计算预算下运行。该综述论文从内存和计算两个角度来考虑 Transformer 的效率。
高效自注意力模型对于建模长序列的应用很关键,如通常包括较多像素或 token 的文档、图像和视频。因此,广泛采用 Transformer 优先考虑的是处理长序列的效率。
该论文旨在对这类模型的近期发展进行综述,主要聚焦于通过解决自注意力机制的平方级复杂度来提升 Transformer 效率的建模发展和架构创新,同时该论文还简要探讨了通用改进和其他效率改进。
该论文提出了一种针对高效 Transformer 模型的分类法,按照技术创新和主要用途进行分类。具体而言,该论文综述了在语言和视觉领域均有应用的 Transformer 模型,并为其中的部分模型提供了详细的解读。
论文链接:https://arxiv.org/pdf/2009.06732.pdf
关于 Transformer
Transformer 是将 Transformer 块一个个堆叠而成的多层架构,标准 Transformer 的架构如下图所示:
Transformer 块的特征是多头自注意力机制、position-wise 前馈网络、层归一化模块和残差连接。Transformer 模型的输入通常是形状为 R^B × R^N 的张量,B 表示批大小,N 表示序列长度。
输入首先经过嵌入层,嵌入层将每个 one-hot token 表示转换为 d 维嵌入,即 R^B × R^N × R^D 。然后将这个新的张量与位置编码(positional encoding)相加,并输入到多头自注意力模块中。位置编码可以采用正弦输入的形式,或者可训练嵌入。
多头自注意力模块的输入和输出由残差连接和层归一化层来连接。将多头自注意力模块的输出传送至两层前馈网络,其输入 / 输出通过残差和层归一化来连接。子层残差连接与层归一化可表示为:
其中 F_S 是子层模块,它要么是多头自注意力,要么是 position-wise 前馈层。
高效 Transformer 模型综述
这部分对高效 Transformer 模型进行了综述。首先我们来看不同模型的特点,表 1 列出了目前发布的高效 Transformer 模型,图 2 展示了多种重要高效 Transformer 模型的图示。
图 2:高效 Transformer 模型的分类,分类标准是模型的核心技术和主要应用场景。
表 1:按发布时间顺序整理的高效 Transformer 模型
此外,这部分还详细介绍了多个重要的高效 Transformer 模型,并分析了它们的优缺点和独特之处。这些模型包括:Memory Compressed Transformer、Image Transformer、Set Transformers、Sparse Transformers、Axial Transformers、Longformer、ETC、BigBird、Routing Transformers、Reformer、Sinkhorn Transformers、Linformer、Synthesizers、Performer、Linear Transformers、Transformer-XL 和 Compressive Transformers。 具体细节此处不再赘述,详情参见原论文第三章。
论文最后讨论了这些模型的评估情况和设计趋势,并简要概述了可以提高 Transformer 效率的其他方法,如权重共享、量化 / 混合精度、知识蒸馏、神经架构搜索(NAS)和 Task Adapter。
#Transformer~x2
Transformer为什么如此强大,
在过去几年中,Transformer 在自然语言处理(NLP)领域引起了巨大关注。现在,它们在 NLP 之外的领域也得到了成功使用。
Transformer 之所以如此强大,关键在于它的 “注意力(Attention)模块”。这个模块能够理解文本序列中的每个词与其他词之间的关系。
但大家最关心的问题是,Transformer 究竟是如何做到这一点的?
在本文中,我们将尝试解答这个问题,并理解为什么 Transformer 会进行这样的计算过程。
我们追求的目标,不仅是理解事物的工作原理,更要理解它为何以这种方式运作。
要了解 Transformer 的运行原理,我们需要重点关注它的注意力(Attention)机制。我们从探究输入到注意力模块的数据开始,然后分析它是如何处理这些输入的。
#01 输入序列是怎样传送到注意力模块的
注意力模块存在于每个编码器(Encoder)和每个解码器(Decoder)之中。我们先来仔细看看编码器中的注意力机制。
编码器中的注意力机制
以一个例子来说明,假设我们正在进行一项从英语到西班牙语的翻译任务,其中一个样本的源序列是 “The ball is blue”,目标序列是 “La bola es azul”。
源序列首先经过一个嵌入和位置编码层,这个层会为序列中的每个词创建一个嵌入向量。这些嵌入向量随后被送入编码器,首先到达的就是注意力模块。
在注意力模块里,嵌入的序列会通过三个线性层,生成三个不同的矩阵 —— 分别称为查询(Query)、键(Key)和值(Value)。这三个矩阵是用来计算注意力分数的关键。
我们需要明确的是,这些矩阵中的每一行都对应着源序列中的一个词。
源序列的流程
#02 每个输入行都是源序列中的一个词
要深入了解驱动 Transformer 的核心机制,我们需要专注于其注意力(Attention)机制。这涉及从源序列中的每个单词出发,追踪它们在 Transformer 体系中的流转。我们特别关注的是,注意力模块内部发生了什么。
这有助于我们清楚地了解源序列和目标序列中的每个单词是如何与其他单词进行交互的。
在解释过程中,请专注于对每个单词进行的操作,以及每个向量是如何与原始输入单词相映射的。如果某些细节,比如矩阵的形状、算术运算的细节、多个注意力头等,与单词的具体运算路径无直接关联,我们就可以先不考虑它们。
为了简化解释和可视化,我们先忽略嵌入维度,只关注每个单词的行。
源序列中每个单词的流程
#03 每个单词都经过了一系列可学习的变换
每一行都是由一系列变换生成的,这些变换包括嵌入、位置编码和线性层。
所有这些变换都是可训练的操作。这意味着这些操作中使用的权重并非预设的,而是通过模型学习得到的,以便产生期望的输出预测。
学习线性和嵌入权重
一个关键问题是,Transformer 是如何确定哪一套权重能够获得最佳结果的?这是一个我们稍后需要回过头来深入讨论的问题。
#04 注意力分数:查询(Query)和键(Key)单词之间的点积
注意力机制包含几个步骤,但我们这里主要关注线性层和注意力分数。
多头注意力
注意力分数计算
如公式所示,注意力机制的第一步是在查询(Q)矩阵和键(K)矩阵的转置之间进行矩阵乘法(即点积)。观察每个单词的变化。
我们得到了一个中间矩阵(可以称之为 “因子” 矩阵),其中每个单元是两个单词间的矩阵乘法结果。
查询矩阵和关键矩阵之间的点积
比如说,第四行中的每一列代表了第四个查询单词与每个键单词之间的点积结果。
查询矩阵和关键矩阵之间的点积
#05 注意力分数:查询 - 键(Query-Key)和值(Value)单词之间的点积
接下来的步骤是在这个中间 “因子” 矩阵和值(V)矩阵之间进行矩阵乘法,从而产生由注意力模块输出的注意力分数。这里我们可以看到,第四行是第四个查询单词矩阵与所有其它键和值单词的乘积结果。
查询键和值矩阵之间的点积
这样就产生了注意力模块输出的注意力分数向量(Z)。
我们可以这样来理解输出分数:对于每个单词,它是 “值(Value)” 矩阵中每个单词的编码值,经过 “因子” 矩阵加权处理。这个因子矩阵是针对特定单词的查询(Query)值和所有单词的键(Key)值的点积。
注意力分数是值词的加权总和
#06 查询(Query)、键(Key)和值(Value)单词的作用是什么?
查询单词可以被理解为我们正在计算注意力的那个单词。键和值单词是我们关注的对象,即这些单词对查询单词有多大的相关性。
“blue” 一词的注意力分数会关注所有其他单词
举个例子,对于句子 “The ball is blue”,“blue” 这个词的行将包含它与其他每个单词的注意力分数。这里,“blue” 是查询单词,其他单词则是 “键 / 值”。
尽管还有其他操作,如除法和 softmax,但在本文中我们可以暂时忽略它们。它们只是改变矩阵中的数值,但并不影响每个单词行在矩阵中的位置,也不涉及单词之间的互动。
#07 点积揭示了单词间的相似度
我们已经看到,注意力分数捕捉了一个特定单词与句子中其他每个单词之间的交互,通过点积运算后再求和。但矩阵乘法如何帮助 Transformer 判断两个单词之间的相关性呢?
要理解这一点,记住查询、键和值的行实际上是具有嵌入维度的向量。让我们更详细地看看这些向量之间的矩阵乘法是如何计算的。
每个单元格都是两个词向量之间的点积
当我们对两个向量进行点积时,我们会将数对相乘,然后将结果相加。
- 如果两个配对数字(例如‘a’和‘d’)都是正数或都是负数,那么乘积会是正的,从而增加最终总和。
- 如果一个数字是正数而另一个是负数,则乘积会是负的,从而减少最终总和。
- 如果乘积是正数,这两个数字越大,它们对最终总和的贡献越大。
这意味着,如果两个向量中对应的数字的符号相同,那么最终的总和会更大。
#08 Transformer 如何学习单词间的相关性?
点积的原理同样适用于注意力分数。如果两个单词的向量更加对齐,它们的注意力分数就会更高。
那么,我们希望 Transformer 呈现出什么样的行为呢?
我们希望对于句子中彼此相关的两个单词,注意力分数较高。而对于彼此无关的两个单词,则希望分数较低。
比如,在句子 “The black cat drank the milk” 中,单词 “milk” 与 “drank” 非常相关,与 “cat” 稍微不那么相关,而与 “black” 无关。我们希望 “milk” 和 “drank” 之间产生高分数,“milk” 和 “cat” 之间产生略低的分数,而 “milk” 和 “black” 之间的分数则接近于零。
这就是我们希望模型学会输出的结果。
为了做到这一点,“milk” 和 “drank” 的向量必须对齐。“milk” 和 “cat” 的向量将略有差异。而 “milk” 和 “black” 的向量则会相差甚远。
让我们回到之前提到的问题 ——Transformer 如何确定哪一组权重能带来最佳效果?
单词向量是基于单词嵌入和线性层的权重生成的。因此,Transformer 可以通过学习这些嵌入和线性层的权重,来产生所需的单词向量。
换句话说,它会以这样的方式学习这些嵌入和权重:如果句子中的两个单词彼此相关,那么它们的向量就会对齐,从而产生较高的注意力分数。而对于彼此不相关的单词,它们的向量就不会对齐,从而产生较低的注意力分数。
因此,“milk” 和 “drank” 之间的嵌入将非常对齐,产生较高的分数。而 “milk” 和 “cat” 之间的嵌入会有所差异,产生略低的分数;“milk” 和 “black” 之间的嵌入则会相差甚远,产生较低的分数。
这就是注意力模块背后的原理。
#09 总结:是什么让 Transformer 动起来的?
查询(Query)和键(Key)之间的点积计算出每对单词之间的相关性。然后,这种相关性被用作一个 “因子”,以计算所有值(Value)单词的加权总和。这个加权总和就是作为注意力分数输出的。
Transformer 以这样一种方式学习嵌入等,即让彼此相关的单词更加对齐。
这正是引入三个线性层并为查询、键和值生成输入序列的三个版本的原因之一。这为注意力模块提供了更多可以学习的参数,以优化单词向量的创建。
#10 Transformer 中的编码器自注意力
在 Transformer 中,注意力被用于三个地方:
- 编码器中的自注意力 —— 源序列关注自身
- 解码器中的自注意力 —— 目标序列关注自身
- 解码器中的编码器 - 解码器注意力 —— 目标序列关注源序列
Transformer 中的注意力
在编码器自注意力中,我们计算源句中每个单词与源句中其他单词的相关性。这在所有编码器的堆栈中都会发生。
#11 Transformer 中的解码器自注意力
我们刚才在编码器自注意力中所看到的大部分内容也同样适用于解码器中的注意力,但存在一些小的、但重要的差异。
解码器中的注意力
在解码器自注意力中,我们计算目标句中每个单词与目标句中其他单词的相关性。
#12 Transformer 中的编码器 - 解码器注意力
在编码器 - 解码器注意力中,查询来自目标句,而键 / 值来自源句。因此,它计算了目标句中每个单词与源句中每个单词的相关性。
编码器 - 解码器注意力
#PVT
搬了10多回
论文先上
论文地址:https://arxiv.org/pdf/2102.12122.pdf
源代码地址:https://github.com/whai362/PVT
具有自注意力的Transformer引发了自然语言处理领域的革命,最近还激发了Transformer式架构设计的出现,并在众多计算机视觉任务中取得了具有竞争力的结果。无卷积骨干网络:金字塔Transformer,提升目标检测/分割等任务精度
尽管卷积神经网络 (CNN) 在计算机视觉方面取得了巨大成功,但今天分享的这项工作研究了一种更简单、无卷积的主干网络,可用于许多密集预测任务。
目标检测
语义分割
实例分割
与最近提出的专为图像分类设计的Vision Transformer(ViT)不同,研究者引入了Pyramid Vision Transformer(PVT),它克服了将Transformer移植到各种密集预测任务的困难。与当前的技术状态相比,PVT 有几个优点:
- 与通常产生低分辨率输出并导致高计算和内存成本的ViT不同,PVT不仅可以在图像的密集分区上进行训练以获得对密集预测很重要的高输出分辨率,而且还使用渐进式收缩金字塔以减少大型特征图的计算;
- PVT继承了CNN和Transformer的优点,使其成为各种视觉任务的统一主干,无需卷积,可以直接替代CNN主干;
- 通过大量实验验证了PVT,表明它提高了许多下游任务的性能,包括对象检测、实例和语义分割。
- 例如,在参数数量相当的情况下,PVT+RetinaNet在COCO数据集上实现了40.4 AP,超过ResNet50+RetinNet(36.3 AP)4.1个绝对AP(见下图)。研究者希望PVT可以作为像素级预测的替代和有用的主干,并促进未来的研究。
CNN Backbones
CNN是视觉识别中深度神经网络的主力军。标准CNN最初是在【Gradient-based learning applied to document recognition】中区分手写数字。该模型包含具有特定感受野的卷积核捕捉有利的视觉环境。为了提供平移等方差,卷积核的权重在整个图像空间中共享。最近,随着计算资源的快速发展(例如,GPU),堆叠卷积块成功在大规模图像分类数据集上训练(例如,ImageNet)已经成为可能。例如,GoogLeNet证明了包含多个内核路径的卷积算子可以实现非常有竞争力的性能。
multi-path convolutional block的有效性在Inception系列、ResNeXt、DPN、MixNet和SKNet中得到了进一步验证。此外,ResNet将跳过连接引入到卷积块中,从而可以创建/训练非常深的网络并在计算机视觉领域获得令人印象深刻的结果。DenseNet引入了一个密集连接的拓扑,它将每个卷积块连接到所有先前的块。更多最新进展可以在最近的论文中找到。
新框架
该框架旨在将金字塔结构嵌入到Transformer结构用于生成多尺度特征,并最终用于稠密预测任务。上图给出了所提出的PVT架构示意图,类似与CNN主干结构,PVT同样包含四个阶段用于生成不同尺度的特征,所有阶段具有相类似的结构:Patch Embedding+Transformer Encoder。
在第一个阶段,给定尺寸为H*W*3的输入图像,按照如下流程进行处理:
- 首先,将其划分为HW/4^2的块,每个块的大小为4*4*3;
- 然后,将展开后的块送入到线性投影,得到尺寸为HW/4^2 * C1的嵌入块;
- 其次,将前述嵌入块与位置嵌入信息送入到Transformer的Encoder,其输出将为reshap为H/4 * W/4 * C1。
采用类似的方式,以前一阶段的输出作为输入即可得到特征F2,F3和F4。基于特征金字塔F1、F2、F3、F4,所提方案可以轻易与大部分下游任务(如图像分类、目标检测、语义分割)进行集成。
Feature Pyramid for Transforme
不同于CNN采用stride卷积获得多尺度特征,PVT通过块嵌入按照progressive shrinking策略控制特征的尺度。
假设第i阶段的块尺寸为Pi,在每个阶段的开始,将输入特征均匀的拆分为Hi-1Wi-1/Pi个块,然后每个块展开并投影到Ci维度的嵌入信息,经过线性投影后,嵌入块的尺寸可以视作Hi-1/Pi * Wi-1/Pi * Ci。通过这种方式就可以灵活的调整每个阶段的特征尺寸,使其可以针对Transformer构建特征金字塔。
Transformer Encoder
对于Transformer encoder的第i阶段,它具有Li个encoder层,每个encoder层由注意力层与MLP构成。由于所提方法需要处理高分辨率特征,所以提出了一种SRA(spatial-reduction attention)用于替换传统的MHA(multi-head-attention)。
类似于MHA,SRA同样从输入端接收到了Q、K、V作为输入,并输出精炼后特征。SRA与MHA的区别在于:SRA会降低K和V的空间尺度,见下图。
Detailed settings of PVT series
实验
ImageNet数据集上的性能对比,结果见上表。从中可以看到:
- 相比CNN,在同等参数量与计算约束下,PVT-Small达到20.2%的误差率,优于ResNet50的21.5%;
- 相比其他Transformer(如ViT、DeiT),所提PVT以更少的计算量取得了相当的性能。
在语义分割中的性能对比,见上表。可以看到:不同参数配置下,PVT均可取得优于ResNet与ResNeXt的性能。这侧面说明:相比CNN,受益于全局注意力机制,PVT可以提取更好的特征用于语义分割。
#Vision Transformers Need Registers
这里提出视觉 Transformer 的特征中存在 "伪影",这些 "伪影" 会导致一些 token 的拥有很高的范数。本文提出一种有效的方案来解决 "伪影" 的问题,方法称之为寄存器 (Register),就是为视觉 Transformer 添加几个额外的 tokens。
本文提出视觉 Transformer 的特征中存在 "伪影",这个现象无论是有监督训练还是自监督训练的视觉 Transformer 中都存在。这些 "伪影" 会导致一些 token 的拥有很高的范数,这些 token 通常是在图片信息密度比较低的背景中出现,然后会参与到后续模型的计算过程中。
作者通过一系列对比实验来阐明关于 "伪影" 的一些性质,在本文的1.2小节中介绍。
本文提出一种有效的方案来解决 "伪影" 的问题,如图1所示。本方法称之为寄存器 (Register),就是为视觉 Transformer 添加几个额外的 tokens。和正常的 tokens 的不足之处是,这些寄存器的输出特征不参与到分类过程中。寄存器的功能得到了实验验证,可以:1) 使得自监督训练得到的视觉 Transformer 在密集预测任务中取得 SOTA。2) 使大一点的模型具有 object discovery 的能力。3) 使得特征图和注意力图更加平滑,有利于下游的视觉处理。
图1:在视觉 Transformer 中添加一些寄存器
视觉 Transformer 需要寄存器
论文名称: Vision Transformers Need Registers
论文地址:
https//arxiv.org/pdf/2309.16588.pdf
1 Register 论文解读:
1.1 背景:视觉 Transformer 的特征中存在 "伪影"
本文研究的是 Vision Transformer 的特征问题。深度学习发展到今天,通常是使用大量的数据通过监督学习或者自监督学习预训练模型,把训练出来的模型作为特征提取器,允许训练强大的特征模型来解锁下游任务。基于 Transformer 架构的自监督方法,尤其是 DINO[1],因其在下游任务中的高预测性能和一些模型提供无监督分割的有趣能力,而备受关注。
DINO[1]算法所得到的模型已经被证明可以显示地得到图像的语义信息。定性的结果表明,最后一个注意力层会自然地关注到图像中的语义部分的信息,且通常会产生可解释的注意力图。利用这些属性,可以在 DINO 的基础上构建一些 object discovery 算法比如 LOST[2]。这个算法可以无监督地收集注意力图中的信息,有效解锁了计算机视觉的新前沿。
DINO v2[3]算法是 DINO 的后续工作,其得到的特征适合密集预测任务。DINO v2 在单目深度估计任务和语义分割任务中表现出色。尽管密集任务的性能很强,但作者观察到 Dinov2 与 LOST 不兼容。在这种情况下,其性能仅仅与有监督的视觉 Transformer 的性能是相当的。这一现象说明 DINO v2 和 DINO 表现截然不同,DINO v2 特征中的一些 "伪影" 在 DINO 中是不存在的。同样令人惊讶的是,对有监督训练得到的视觉 Transformer 使用相同的观察也暴露了类似的伪影,如下图2所示。这说明 DINO 是个例外,除了异常情况 DINO 外,很多视觉 Transformer 模型的特征中都会有 "伪影"。
图2:除了异常情况 DINO 外,很多视觉 Transformer 的特征中都会存在 "伪影"
1.2 视觉 Transformer 中 "伪影" 的特点
如上图2所示,很多现代视觉 Transformer 的特征中都会存在 "伪影",DINO 中没有伪影,但是 DINO v2 里面又有了。在本节中,作者研究了为什么以及何时出现这些伪影。
- 1) "伪影" 是范数值很高的异常 token。
在下图3中,作者比较了给定参考图像的 DINO 和 DINO v2 模型的局部特征范数,可以清楚地看到,"伪影" 的范数远高于其他补丁的范数。
作者还在图4中绘制了特征范数的分布,显然是双峰的。定义范数高于 150 的 token 将被视为 "高范数" token。对于 Dinov2,尽管大多数 token 的范数在 0 到 100 之间,但一小部分 token 具有非常高的范数:范数大于 150 的 token 的比例为 2.37%。
图3:DINO ViT-B/16 和 DINOv2 ViT-g/14 的局部特征比较
图4:DINO ViT-B/16 和 DINOv2 ViT-g/14 的局部特征范数。对于 Dinov2,尽管大多数 token 的范数在 0 到 100 之间,但一小部分 token 具有非常高的范数:范数大于 150 的 token 的比例为 2.37%
- 2) "伪影" (异常值) 出现在大模型的训练中。
作者对这些异常值 token 出现在 DINOv2 训练过程中的条件进行了一些额外的观察。如下图5所示,(a) 输出 token 的范数沿着 layer 的分布;(b) 输出 token 的范数随着 iteration 的变化;(c) 输出 token 的范数随 model size 的变化。从图5 (a) 可以发现,高范数的 token 与第15层的 token 不同。从图5 (b) 可以发现,高范数的 token 只出现在三分之一的训练之后。从图5 (c) 可以发现,只有3个最大的模型表现出异常值。
图5:40层的 DINOv2 ViT-g 模型异常值 token 的一些性质: (a) 输出 token 的范数沿着 layer 的分布;(b) 输出 token 的范数随着 iteration 的变化;(c) 输出 token 的范数随 model size 的变化
- 3) 在当前 Patch 信息冗余时,范数值很高的异常 token 出现。
为了验证这一点,作者计算了在 Patch Embedding 层之后的高范数 token 和 4 个相邻 tokens 的余弦相似度,并绘制曲线如下图6所示。可以看到,"伪影" (异常值) 出现时与周围相邻 tokens 的余弦相似度高的 tokens 所占得比例很大,说明这些 tokens 包含冗余信息,并且模型可以在不损害图像表示质量的情况下丢弃它们的信息。这个结论也和图2的定性观察匹配,即 "伪影" 一般出现在图片的背景区域中。
图6:与相邻 tokens 的余弦相似度以及比例
- 4) 高范数值异常 token 几乎不包含局部信息。
为了更好地理解这些标记的性质,作者探索了不同类型信息的 tokens,设计了两种不同的任务:位置预测和像素重建。做法是训练一个 Linear Model 来完成这些任务,并观察模型的性能。
- 位置预测
做法:训练一个 Linear Model 来从 Patch Embedding 中预测图像中每个 Patch 的位置,并测量其准确性。位置信息以绝对位置嵌入的形式在第一个 ViT 层之前的 token 中注入。作者观察到高范数 token 的准确度远低于其他 tokens,这表明它们包含有关它们在图像中的位置的信息较少。
- 像素重建
做法:训练一个 Linear Model 来从 Patch Embedding 中预测图像的像素值 (Pixel Value),并测量该模型的准确性。作者再次观察到,高范数 tokens 比其他 tokens 实现了更低的准确度。这表明高范数 tokens 包含的信息比其他标记少。
图7:线性模型的精度
- 5) "伪影" (异常值) 保留了全局信息
为了评估在高范数 token 中收集了多少全局信息,作者在评估了它们学习表征的能力。对于分类数据集中的每张图片,作者将其通过 DINO v2-g 模型提取 Patch Embedding,并且进一步使用这个 Patch Embedding 来识别图片的类别,就是做一个分类任务。实验结果如图8所示,可以观察到高范数 tokens 比其他 tokens 具有更高的精度,这表明异常值标记比其他 Patch Embedding 包含更多的全局信息。
图8:通过对正常和异常 token 的 Linear Probing 图像分类精度
1.3 针对 "伪影" 的假设和补救措施
在上面的1.2小节中,作者通过一系列对比实验来阐明关于 "伪影" 的一些性质,并给出了假设和补救措施。
这个假设是:经过充分训练的大模型学习去识别冗余的 tokens,并将它们用来存储,处理和检索全局位置的信息。作者假定这种行为模式本身并不坏,但是对于模型的输出如果包含这种 tokens 就不太可取。事实上,这种异常的 tokens 会引导模型丢弃局部的信息,导致密集预测任务性能的降低。
因此,作者提出了一个简单的方法来解决这个问题:对 ViT 模型显式地添加一些新的 tokens,它们可以用来作为寄存器 (Registers)。它们类似于 [CLS] token,具有可学习的值。在 ViT 的输出层,这些 tokens 被丢弃了。[CLS] token 和其他正常的 image tokens 不丢弃,这点和 ViT 是一致的。这一点最早在 NLP 任务中[4]被提出。有趣的是,作者在这里表明这种机制也适合视觉 Transformer,且在可解释性和性能方面给出了其他一些见解。
1.4 实验结果
作者在本节中对 [reg] token 的作用做了实验评估:作者对其数量做了消融实验研究,以及对其学习到的特征进行了定性的分析。作者使用的验证方式有:
有监督方法 DEIT-III[5]:是一种简单而有效的监督训练方法,用于在 ImageNet-1k 和 ImageNet-22k 上使用 ViT 进行分类。它很简单,而且使用基本的 ViT 架构,实现了强大的分类结果。作者使用的数据集是 ImageNet-22K,模型是 ViT-B,遵循的代码是[6]。
文本监督方法 OpenCLIP[7]:文本图像对齐模型的强大训练方法,遵循原始的 CLIP 方法。它是开源的,使用基本的 ViT 架构,并且很容易复现以及修改。作者使用的数据集是 Shutterstock,模型是 ViT-B/16 image encoder。
自监督方法 DINO v2[3]:学习视觉特征的自监督方法,遵循 DINO 方法。作者使用的数据集是 ImageNet-22K,模型是 ViT-L,遵循的代码是[8]。
实验结果如下图9所示,在使用了 [reg] tokens 之后,"伪影" 消失了。注意力图也变得像 DINO 一样更加可解释了。从图10中可以看到,当使用 [reg] tokens 进行训练时,模型在输出处没有表现出高范数的 tokens,这证实了最初的定性评估。
图9:使用了 [reg] tokens 后,"伪影" 消失了,注意力图更加可解释
图10:[reg] tokens 对 DINOv2、CLIP 和 DeiT-III 输出规范分布的影响。使用 [reg] tokens 有效消除了之前的范数异常值
下面是作者在 ImageNet classification, ADE20k Segmentation, 和 NYUd monocular depth estimation 任务上的 Linear Probing 结果,实验结果如图 11(a) 所示。使用 [reg] 时,模型不会丢失性能,有时甚至效果更好。为了完整起见,作者还提供了 OpenCLIP 的 ImageNet 上的零样本分类性能,实验结果如图 11(b) 所示。
图11:使用或者不使用 [reg] 的下游任务实验结果
作者还进一步对 [reg] tokens 的数量作了消融实验。如下图12所示,可以观察到,当添加至少一个 [reg] token 时,可见的 "伪影" 就消失了。
图12:当添加至少一个 [reg] token 时,可见的 "伪影" 就消失了
如图13所示是 ImageNet, ADE-20k 和 NYUd 下游任务实验结果。对于密集预测任务,似乎有最佳数量的 [reg] tokens 数量,这个最优值似乎可以通过 "伪影" 的消失来解释,从而获得更好的局部特征。在 ImageNet 上,当使用更多寄存器时,性能会提高。在作者所有的实验中都保留了 4 个 [reg] tokens。
图13:[reg] tokens 的数量似乎存在一个最佳值
作者最后定性地探讨了 [reg] tokens 的行为,想验证它们是否都表现出相似的注意力模式,或者不同的 [reg] tokens 的模式有哪些不同,[CLS] token 和 [reg] tokens 的注意力图的可视化结果比较如下图14所示。可以看到,[reg] tokens 之间没有完全对齐的行为模式,一些选定的寄存器表现出有趣的注意力模式,关注场景中的不同对象,这种自然的多样性很有趣。
图14:[CLS] token 和 [reg] tokens 的注意力图可视化比较
参考
1.Emerging properties in self-supervised vision transformers
2.Localizing objects with self-supervised transformers and no labels
3.DINOv2: Learning Robust Visual Features without Supervision
4.Memory Transformer
5.Deit iii: Revenge of the vit
6.https://github.com/facebookresearch/deit
7.https://github.com/mlfoundations/open_clip
8.https://github.com/facebookresearch/dinov2
#Transformer~x3
在自然语言处理(Natural Language Processing,NLP)领域,Transformer 模型因其在序列建模中的卓越性能而受到广泛关注。然而,Transformer 及在其基础之上的大语言模型(Large Language Models,LLMs)都不具备有效长度外推(Length Extrapolation)的能力。这意味着,受限于其训练时预设的上下文长度限制,大模型无法有效处理超过该长度限制的序列。Transformer的无限之路:位置编码视角下的长度外推综述
文本续写和语言延展是人类语言的核心能力之一,与之相对的,长度外推是语言模型智能进化的重要方向,也是在大模型时代最为高效的将模型的能力迁移到长序列数据的重要方法,对该问题的研究兼具理论价值和应用价值。因此,大量的相关工作持续涌现,在不断扩展语言模型能力边界的同时,也呼唤一篇系统性的综述来对这一领域进行概览。
基于此,哈尔滨工业大学的研究者们从位置编码(Position Encoding, PE)的角度出发,全面地总结了 Transformer 模型在长度外推方面的研究进展,系统地回顾了各种旨在增强 Transformer 长度外推能力的方法,主要包括可外推的位置编码和基于这些位置编码的拓展方法。
论文链接:https://arxiv.org/abs/2312.17044
可外推的位置编码
由于 Transformer 自身具有置换不变性(Permutation Invariance),无法直接捕获每个词在序列中的位置信息,因此使用位置编码将序列中元素顺序信息融入Transformer成为一种常见做法。根据位置编码表示的是序列中元素的绝对位置信息还是相对位置信息,业界将位置编码分为绝对位置编码(Absolute Position Encoding,APE)和相对位置编码(Relative Position Encoding,RPE),其主要区别如下图所示(左图表示 APE,右图表示 RPE)。
考虑到现有研究表明这一分类对模型的外推能力有重要影响,我们根据这一分类来对本节内容进行划分。
绝对位置编码
在原始的 Transformer 论文中,位置编码是通过正弦和余弦函数生成的,这些函数将位置映射到模型的表示空间中。Transformer 的作者猜想这种正弦位置编码可以有效外推,但是后来的研究成果否定了这一猜想。尽管如此,作为 Transformer 的第一个 PE,正弦 APE 对之后的 PE 产生了重大影响。
为了增强 Transformer 模型的外推能力,研究人员要么通过随机位移将位移不变性融入正弦 APE 中,要么生成随位置平滑变化的位置嵌入并期望模型能够学会推断这一变化函数。基于这些思想的方法展现出比正弦 APE 更强的外推能力,但仍无法达到 RPE 的水平。原因之一是,APE 将不同的位置映射到不同的位置嵌入,外推意味着模型必须推断出不曾见过的位置嵌入。然而,这对于模型来说是一项艰巨的任务。因为在广泛的预训练过程中重复出现的位置嵌入数量有限,特别是在 LLM 的情况下,模型极易对这些位置编码过拟合。
相对位置编码
由于 APE 在长度外推上的表现难以令人满意,而 RPE 天然地由于其位移不变性具备更好的外推能力,并且人们普遍认为上下文中单词的相对顺序更重要。近年来,RPE 已成为编码位置信息的主要方法。
早期的 RPE 来自于对正弦位置编码的简单修改,并常常结合裁剪或分箱策略来避免出现分布外的位置嵌入,这些策略被认为有利于外推。此外,由于 RPE 解耦了位置和位置表示之间的一对一对应关系,因此将偏差项直接添加到注意力公式中成为将位置信息集成到 Transformer 中的一种可行甚至更好的方法。这种方法要简单得多,并且自然地解开了值(value)向量和位置信息的纠缠。然而,尽管这些偏置方法具有很强的外推性,但它们无法表示 RoPE(Rotary Position Embedding,旋转位置编码)中那样复杂的距离函数。因此,尽管 RoPE 的外推性较差,但由于其优异的综合性能,成为近来 LLMs 最主流的的位置编码。论文中介绍的全部可外推 PE 如表 1 所示。
大模型时代的外推方法
为了增强 LLMs 的长度外推能力,研究者们基于现有的位置编码提出了多种方法,主要分为位置插值(Position Interpolation)和随机化位置编码(Randomized Position Encoding)两大类别。
位置插值方法
位置插值方法通过在推理时对位置编码进行缩放,使得原本超出模型训练长度的位置编码在插值后落入已训练位置区间。由于其卓越的外推性能和极低的开销,位置插值方法引起了研究界的广泛兴趣。此外,与其他外推方法不同,位置插值方法已经广泛出现在开源模型中,例如 Code Llama、Qwen-7B 和 Llama2。然而,目前的插值方法仅仅关注 RoPE,如何通过插值使采用其他 PE 的 LLM 具备更好的外推能力仍需探索。
随机化位置编码
简单来说,随机化 PE 只是通过在训练期间引入随机位置来将预训练的上下文窗口与较长的推理长度解耦,从而提高了较长上下文窗口中所有位置的曝光度。值得注意的是,随机化 PE 的思想与位置插值方法有很大不同,前者旨在使模型在训练过程中观察到所有可能的位置,而后者试图在推理过程中对位置进行插值,使它们落入既定的位置范围内。出于同样的原因,位置插值方法大多是即插即用的,而随机化 PE 通常需要进一步微调,这使得位置插值更具吸引力。然而,这两类方法并不互斥,因此可以结合它们来进一步增强模型的外推能力。
挑战与未来方向
评测与基准数据集:在早期研究中,对 Transformer 外推能力的评估来自各下游任务的性能评价指标,如机器翻译的 BLEU;随着 T5、GPT2 等语言模型逐渐统一自然语言处理任务,语言建模所使用的困惑度成为外推的评价指标。然而,最新的研究已经表明困惑度无法揭示下游任务的性能表现,因而亟需专用的基准数据集与评测指标来推动长度外推领域的进一步发展。
理论解释:目前的长度外推相关工作大都是实证性的,尽管有一些解释模型成功外推的初步尝试,但坚实的理论基础仍未建立,究竟有哪些因素影响且如何影响长度外推性能仍然是一个悬而未决的问题。
其他方法:正如本文所述,现有的长度外推工作大多集中在位置编码视角下,但不难理解,长度外推需要系统性设计。位置编码是其中一个关键的组成部分,但绝非唯一的组成部分,更广阔的视野将进一步为这一问题带来激励。
#多头注意力(Multi-head Attention)
在这篇文章中,我们将深入探讨 Transformer 的核心部分 —— 多头注意力(Multi-head Attention)。这个机制能让 Transformer 同时从多个角度理解数据,提高处理信息的能力和效率。
#01 Transformer 中如何使用注意力机制
Transformer 在三个关键部分运用了注意力机制:
- 编码器的自注意力:输入序列对自己进行聚焦。
- 解码器的自注意力:目标序列对自己进行聚焦。
- 解码器的编码器 - 解码器注意力:目标序列关注输入序列。
注意力机制的输入参数 —— 查询(Query),键(Key)和值(Value)
注意力层通过三个参数接收输入:查询(Query),键(Key)和值(Value)。这三个参数结构类似,序列中的每个词条都通过一个向量来表示。
编码器自注意力
输入序列首先经过输入嵌入(Input Embedding)和位置编码(Position Encoding)处理,为序列中的每个词条生成了包含意义和位置信息的编码表示。这些表示分别作为查询(Query),键(Key)和值(Value)的输入,送入第一个编码器中的自注意力模块。
自注意力模块基于这些输入,为输入序列中的每个词条生成一个新的编码表示,其中融合了相应的注意力得分。随着序列通过编码器堆栈,每个编码器中的自注意力模块都会对词条表示进一步加入自己的注意力得分。
解码器自注意力
在解码器部分,目标序列通过输出嵌入(Output Embedding)和位置编码(Position Encoding)处理后,为每个词生成了既包含意义又包含位置信息的编码表示。这些表示作为查询(Query),键(Key),和值(Value)的输入,送入第一个解码器的自注意力模块中。此模块针对目标序列中的每个词产生一个新的编码表示,其中也融入了相应的注意力得分。
通过层标准化(Layer Norm)处理后,这些表示被用作第一个解码器中的编码器 - 解码器注意力的查询(Query)参数。
编码器 - 解码器注意力
同时,堆栈中最后一个编码器的输出被送入编码器 - 解码器注意力的值(Value)和键(Key)参数中。
因此,编码器 - 解码器注意力同时获得了来自解码器自注意力的目标序列表示和来自编码器堆栈的输入序列表示。它进而产生了一种新的表示,这种表示不仅包含了目标序列每个词的注意力得分,也融合了来自输入序列的注意力得分。
随着序列通过解码器堆栈,每个自注意力和编码器 - 解码器注意力模块也会为每个词的表示增加自己的注意力得分。
#02 多头注意力
在 Transformer 中,注意力模块会并行地重复进行多次计算,每一次计算都被称为一个 “注意力头”。注意力模块将查询(Query),键(Key)和值(Value)参数分成 N 个部分,每部分独立通过一个注意力头进行处理。所有这些相似的注意力计算后来被合并,形成最终的注意力得分。这种多头注意力机制赋予了 Transformer 强大的能力,能够对每个词条编码多种关系和细微的差别。
为了深入了解数据在 Transformer 内部是如何处理的,我们不妨具体看一看在训练 Transformer 进行翻译时,注意力模块是如何工作的。以我们的训练数据中的一个样本为例,这个样本包括一个输入序列(英文的 “You are welcome”)和一个目标序列(西班牙语的 “De nada”)。
#03 注意力机制的关键超参数
影响数据维度的有三个主要的超参数:
- 嵌入尺寸(Embedding Size):这是嵌入向量的宽度,在我们的示例中为 6。这个维度在整个 Transformer 模型中保持一致,有时也被称为 “模型尺寸”。
- 查询尺寸(Query Size,与键(Key)和值(Value)的尺寸相同):这是用于生成查询、键和值矩阵的三个线性层的权重尺寸,在我们的示例中为 3。
- 注意力头的数量:在我们的示例中,我们使用了 2 个注意力头。
除此之外,还有一个批量大小(Batch size)参数,它表示样本的数量。
#04 输入层
输入嵌入(Input Embedding)和位置编码(Position Encoding)层会生成一个形状为(样本数量,序列长度,嵌入尺寸)的矩阵。这个矩阵随后被送入堆栈中第一个编码器的查询(Query),键(Key)和值(Value)。
为了简化展示,我们在图示中将忽略批量尺寸,专注于其它维度。
#05 线性层
对于查询(Query),键(Key)和值(Value),有三个独立的线性层,每个层都有自己的权重。输入数据通过这些线性层,生成 Q(查询),K(键)和 V(值)矩阵。
#06 将数据分配到各个注意力头
现在,数据被分配到多个注意力头中,使每个头可以独立处理数据。
但需要理解的关键点是,这种分配只是在逻辑上进行的。查询、键和值并不会物理上分割成为每个注意力头一个的独立矩阵。对于查询、键和值,分别使用单一的数据矩阵,其中每个注意力头逻辑上分配有矩阵的不同部分。同样,也不存在为每个注意力头单独设置的线性层。所有的注意力头共享相同的线性层,但只操作于数据矩阵的 “各自” 的逻辑部分。
按注意力头逻辑划分线性层的权重
通过在注意力头之间均匀分配输入数据和线性层权重,可以完成这种逻辑分割。我们可以通过选择适当的查询尺寸来实现这一点:
查询尺寸 = 嵌入尺寸 / 注意力头的数量。
在我们的例子里,这就是为什么查询尺寸是 6 除以 2,即 3 的原因。尽管层的权重(和输入数据)是一个整体的矩阵,但我们可以想象它是每个注意力头的独立层权重 “组合在一起”。
因此,所有注意力头的计算可以通过一个矩阵运算来完成,而无需多个独立的运算。这不仅使计算更高效,还保持了模型的简洁性,因为它减少了需要的线性层的数量,同时依然实现了独立注意力头的强大功能。
线性层输出的 Q、K 和 V 矩阵被重新整形,以包括一个明确的注意力头维度。现在,每一块 “切片” 都对应着每个头的一个矩阵。
接着,这个矩阵通过交换头维度和序列维度再次进行重塑。虽然在图示中没有表示批量维度,但 Q 的维度现在变成了(Batch、Head、Sequence、Query size)即(批量、头、序列、查询尺寸)。
在下面的图示中,我们可以看到我们示例中的 Q 矩阵在经过线性层处理后分割的整个过程。
最后一个阶段主要用于可视化 —— 虽然 Q 矩阵是一个单一的矩阵,但我们可以将它理解为每个注意力头逻辑上分开的 Q 矩阵。
Q 矩阵划分为注意力头
现在我们可以开始计算注意力得分了。
#07 为每个头计算注意力得分
目前我们有了三个矩阵:Q,K 和 V,它们分布在不同的注意力头上。这些矩阵将被用于计算注意力得分。
我们将展示单个注意力头的计算过程,这里只涉及最后两个维度(序列和查询尺寸),而忽略前两个维度(批量和头)。从本质上讲,我们可以想象我们正在观察的计算过程在每个头和批量中的每个样本上都在进行(尽管实际上,它们是作为一个整体的矩阵操作进行的,而不是循环)。
第一步是进行 Q 和 K 矩阵之间的矩阵乘法。
接着,向结果中加入一个掩码值。在编码器的自注意力机制中,这个掩码用于隐藏填充值,确保它们不参与注意力得分的计算。
在解码器的自注意力和编码器 - 解码器注意力中使用的掩码会有所不同,我们稍后将在过程中讨论这一点。
现在的结果通过除以查询尺寸的平方根来缩放,然后应用 Softmax 函数。
随后,进行 Softmax 输出和 V 矩阵之间的另一次矩阵乘法。
在编码器自注意力中,完整的注意力得分计算过程如下所示:
#08 将每个头的注意力得分合并
现在我们得到了每个注意力头的独立注意力得分,接下来需要将它们合并成一个统一的得分。这个合并操作实际上是分割操作的逆过程。
这个过程通过重新调整结果矩阵的形状来消除头维度。具体步骤如下:
- 通过交换头维度和序列维度来重新调整注意力得分矩阵的形状。也就是说,矩阵的形状从(批量、头、序列、查询尺寸)转变为(批量、序列、头、查询尺寸)。
- 通过重塑为(批量、序列、头 * 查询尺寸)来折叠头维度,从而有效地将每个头的注意力得分向量串联成一个整体的注意力得分。
由于嵌入尺寸 = 头 * 查询尺寸,因此合并后的得分维度为(批量、序列、嵌入尺寸)。在下图中,我们可以看到示例得分矩阵的合并过程。
#09 端到端的多头注意力
综合这些步骤,我们得到了多头注意力机制的端到端流程。
#10 多头分割促进更深层次的理解
嵌入向量用于捕捉单词的含义。在多头注意力机制中,我们看到输入(和目标)序列的嵌入向量在逻辑上分布在多个头中。这意味着什么呢?
这意味着嵌入向量的不同部分可以学习每个单词的不同意义方面,尤其是它与序列中其他单词的关联。这使得 Transformer 能够更丰富、更深入地解读序列。
虽然这可能不是一个现实的例子,但它有助于我们建立一种直觉。比如说,嵌入向量的一个部分可能专注于捕捉名词的 “性别属性”(如男性、女性、中性),而另一个部分则可能关注名词的 “数目属性”(如单数与复数)。这在翻译过程中是重要的,因为在很多语言中,动词的使用取决于这些因素。
#11 解码器自注意力和掩蔽
解码器自注意力的工作原理与编码器自注意力类似,区别在于它作用于目标序列的每个单词上。
同样,掩蔽机制用于屏蔽目标序列中的填充词。
#12 编码器 - 解码器注意力和掩蔽
编码器 - 解码器注意力从两个不同的来源接收输入。因此,不同于编码器自注意力仅计算输入词汇间的相互作用,以及解码器自注意力计算目标词汇间的相互作用,编码器 - 解码器注意力是计算每个目标词汇与每个输入词汇之间的相互作用。
因此,在注意力得分结果中的每个单元都对应于一个 Q(即目标序列中的单词)与所有 K(即输入序列中的单词)和所有 V(即输入序列中的单词)之间的交互。
同样,掩蔽机制在目标输出中遮蔽了后续的单词,这一点在本系列的第二篇文章中已经有了详细的解释。
#13 结论
我们现在已经明白理解了 Transformer 的功能。但我们还没有完全回答为什么 Transformer 的注意力机制会执行它所进行的计算。为什么它要使用查询(Query),键(Key)和值(Value)这些概念,为什么它要进行我们刚才看到的矩阵乘法?
我们大致可以理解为 “它捕捉了每个单词与序列中其他单词之间的关系”,但这究竟意味着什么?它是如何使 Transformer 的注意力机制能够理解序列中每个单词的微妙之处的?
原文链接:https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853