我自己的原文哦~ https://blog.51cto.com/whaosoft/12059371
#SaRA
修改一行代码就能实现高效微调!上海交大&腾讯开源:兼顾原始生成和下游任务
仅修改一行训练代码即可实现微调过程。
文章链接:https://arxiv.org/pdf/2409.06633
项目链接:https://sjtuplayer.github.io/projects/SaRA/
1.引言
SaRA是一种针对预训练扩散模型的高效微调方法。通过微调预训练扩散模型中的无效参数,赋予模型对下游任务的处理能力。SaRA能够显著节省计算显存开销与代码复杂度,仅修改一行训练代码即可实现微调过程。该方法的核心创新在于:
参数重要性分析:SaRA首先对预训练模型中的参数重要性进行分析,发现预训练扩散模型中绝对值最小的10%至20%的参数在生成过程中的作用微乎其微。并且这些参数的无效性并非模型固有属性,而是由于训练过程中的不稳定性导致。
稀疏低秩训练:基于上述发现,SaRA提出利用这些暂时无效的参数,通过优化稀疏权重矩阵来学习特定任务的知识。为了避免过拟合,SaRA采用了基于核范数的低秩稀疏训练方案,有效约束了学习过程中的参数秩。
渐进式参数调整策略:SaRA设计了一种参数重调整策略,通过在微调过程中重定向可训练参数,确保几乎所有参数都能有效地贡献于新任务的学习。
非结构化反向传播策略:SaRA提出了一种新颖的反向传播策略,显著降低了微调过程中的内存成本。
SaRA在多个下游任务上进行了广泛的实验验证,包括基模型能力提升、下游数据微调、图像定制化、可控视频生成等。实验结果表明SaRA不仅能够提升基础模型在原始任务的生成能力,在下游任务中,能兼顾下游任务的学习以及预训练先验的维护,实现优越的模型微调效果。
2. 参数重要性分析2.1 预训练模型中的无效参数
在深度学习模型中,参数的数量往往非常庞大,但根据模型剪枝理论,并非所有参数都对模型的输出有积极的影响。作者首先研究了多个版本的预训练Stable Diffusion(包括1.4,1.5,2.0,与3.0)中,绝对值权重较小的参数对生成结果的影响。通过将绝对值权重小于θ的参数置为0后,让模型根据GPT-4o生成的1000个文本,生成对应的1000张图像,计算生成图像的FID指标以及CLIP Score(如图图 1所示),发现将模型10%~20%的参数置为0时,模型的生成结果并没有受到影响,甚至有些情况下还能略微提升,证明了这些小参数在预训练Stable Diffusion模型中的无效性。
图 1:Stable Diffusion预训练模型参数分布与小参数对生成结果的影响
2.2 无效参数的潜在有效性
2.1中导致无效参数的原因可能有两个:一是由于模型结构设计的原因,这些参数天生就是冗余、无效的参数,因此无法在训练过程中起到作用,另外一个原因则可能是由于模型训练过程中的随机性,导致这些参数恰好在训练结束的时候停留在0附近。因此,作者进一步对参数无效的原因展开研究。选取了Stable Diffusion在FFHQ的预训练模型,标记了初始权重最小的1%参数,将该模型继续在FFHQ上训练,并在训练过程中实时跟踪这1%参数的变化,结果如图 2所示,可见,随着训练的进行,初始的小参数(蓝色线条)逐渐跳出了1%的阈值,而初始大于1%阈值的参数,大部分跌入了1%以内,并且小于该阈值的参数总量始终维持在1%左右,证明了在训练过程中,所有参数都以一定的概率跳出或者跌入1%阈值中,说明初始的小参数是由训练过程的随机性导致的,因此,可以在微调过程中利用这些暂时无效的参数,赋予模型针对下游任务的生成能力。
图 2:训练过程中权重绝对值小于初始1%阈值θ_t的参数分布变化
3. 方法介绍
为了充分利用这些暂时无效的参数,SaRA提出了一种渐进式稀疏低秩训练方法。该方法的核心思想是,通过对这些无效参数进行微调,使其在下游任务中发挥作用。具体来说,SaRA首先确定一个阈值θ,将小于该阈值的参数视为暂时无效的参数。然后,通过优化一个稀疏权重矩阵,使得这些参数能够学习到新任务的知识。为了避免在训练过程中出现过拟合,SaRA引入了基于核范数的低秩约束。核范数是一种用于估计矩阵秩的凸松弛,通过最小化核范数,可以有效地限制稀疏矩阵的秩,从而避免模型在训练过程中学习到过多的噪声信息。
3.1 稀疏矩阵训练
SaRA致力于微调预训练模型中暂时无效的参数(即权重绝对值小于一定阈值θ的参数),使预训练的扩散模型适应下游任务,同时尽可能地保留原始的模型先验。具体而言,首先为初始参数P计算一个稀疏掩码M,满足:
SaRA基于该稀疏掩码来更新初始无效的参数 , 同时保持初始有效参数 不变。在训练期间, 对于所有参数的梯度 , 利用该稀疏掩码 来保留所需要更新参数的梯度, 并更新相应的可训练参数
3.2 基于核范数的低秩约束
稀疏参数矩阵可能会具有较高的秩,从而导致过于强大的表征能力,使得模型在下游任务训练过程中出现过拟合的问题。为了缓解这个问题,我们在稀疏矩阵上引入了基于核范数的低秩约束,以防止约束系数矩阵的秩。低秩约束的一种直接方法是最小化稀疏参数矩阵的秩Rank(P_M )。然而,由于其矩阵秩求解的非凸性,()难以实现可微的求解。因此,我们使用矩阵的核范数来估计系数参数矩阵的秩:
其中 是参数矩阵 的第 i 个奇异值, 通过最小化该式子, 可以实现对参数矩阵的低质约束。
为了计算核范数 , 对参数矩阵进行奇异值分解 , 其中 U 和 V 是正交矩阵, 是包含奇异值 的对角矩阵。 关于 的次梯度可以由下式求出:
基于核范数梯度的推导, 可以低质约束的可微性, 从而实现基于核范数的低秩约束损失:
3.3 渐进式参数调整
在模型的微调过程中,由于训练的随机性,仍然会存在部分参数停留在阈值以下,尤其是微调过程的总轮次往往较少,导致最终存在一部分的参数仍然无效。如图 2 所示,初始的小参数在训练初期会快速跳出阈值,而后期的趋势逐渐放缓,当微调轮次较少时,可训练参数中可能存在15%的参数仍然无效。因此,SaRA提出渐进式的参数调整策略,在微调的前半阶段,首先对初始的无效参数进行训练,使得大部分的无效参数跳出阈值,而在后半阶段,再次对剩余的无效参数进行训练,使其快速跳出阈值。通过这种分阶段的渐进式训练策略,SaRA可以更有效地利用这些无效参数,提高模型在新任务上的性能。
3.4 非结构化反向传播策略
目前,基于 LoRA 的方法和参数选择的高效微调方法都对计算资源造成了沉重的负担:1)对于基于 LoRA 的方法,由于 LoRA 模块的引入,它不需要存储模型参数的梯度,但却需要额外的内存成本来存储 LoRA 模块中的中间变量,如图3 (a) 所示。2)对于参数选择的方法,一个一直困扰的问题是:它们需要与全参数微调相同甚至更多的计算资源(尤其是 GPU 显存)。虽然它们只对模型参数的子集进行微调,但它们保留了整个参数矩阵P的梯度,因为主流的深度学习库(如PyTorch和TensorFlow)只支持对整个参数矩阵的梯度反向传播。因此,以往的基于参数选择的方法必须在整个参数矩阵P上执行梯度反向传播,然后使用预先计算的掩码矩阵 通过 屏蔽不需要的参数梯度,并通过 实现整体参数的更新(如图4(b) 所示)。这种方法需要存储所有模型参数的梯度和额外的掩码矩阵,导致比全参数微调更大的计算资源需求。因此,为了解决这些问题,SaRA提出了非结构化梯度回传策略, 通过将可训练参数从参数矩阵中剥离与非结构化前向和反向传播, 实现训练过程中显存的大幅降低。
具体地, SaRA首先将训练模型的所有参数变为非叶节点, 并通过系数矩阵 , 获取可学习参数 , 将可学习参数作为真实的叶节点。定义非结构化映射函数 , 在前向过程中将可学习参数映射到模型参数中:
在反向过程中,定义非结构化反向传播函数,将模型参数的梯度自动回传至可训练参数:
由于模型参数成为了非叶子节点, , 因此, 梯度流经模型参数到 达后, 模型参数的梯度会自动消除, 最终存储的梯度仅有 的梯度, 从而节省大量的计算显存。
图3:非结构化梯度反向传播
4.实验效果
为了验证方法的有效性,SaRA在多个主流与下游的任务上进行了验证,包含基模型提升、下游数据集微调、图像定制化与可控视频生成。
4.1 基模型提升
SaRA主要致力于将预训练模型中的无效参数利用起来,赋予模型更强大的生成能力,这与一般微调方法仅针对下游任务设计的理念不尽相同。因此,SaRA可以用来提升预训练模型在原本任务上的生成能力。实验选取了在ImageNet、FFHQ、CelebA-HQ上预训练的Stable Diffusion,利用SaRA在相应数据集对模型进行进一步的微调,以完全利用模型中的无效参数,结果如图4所示,可以看出,SaRA能够稳定地提升基模型的生成能力(降低约5%的FID)。
图4:基模型在原始任务上的微调
4.2下游数据集微调
在下游数据集微调实验中,将SaRA应用于多个不同的数据集,并在不同StableDiffusion版本(1.5,2.0,3.0)与参数规模(50M,20M,5M)下进行了训练。数据集包括BarbieCore, Cyberpunk, Elementfire, Expedition, Hornify五个风格,结果如图5所示,可见SaRA取得了学习到了最丰富的数据特征,同时能够保持语义与文本的一致性。此外,实验还计算了生成数据的FID,与文本的CLIP Score,以及一个归一化指标VLHI同时衡量FID与CLIP Score,定量结果如表1所示,可见,SaRA在不同版本的Stable Diffusion以及不同的参数量下,均取得了最好的表现。
图5:不同微调方法在下游数据集微调的表现。
表1:不同微调方法在下游数据集微调的定量表现。
4.3 图像定制任务
图像定制化通过从少量几张图像中学习到共有的对象特征,然后将该对象生成到新的图片中。Dreambooth作为一种主流的图像定制化,需要微调扩散模型实现对目标特征的捕捉,因此,SaRA可以直接用于Dreambooth的微调过程。实验比较了不同微调方法在DreamBooth上的表现,定性结果如图6所示,可见,SaRA在成功捕捉目标对象特征的同时,还较好地维护了生成图像语义与文本的一致性。表2计算了不同方法在三个定制化数据集上的定量表现,可以看出,SaRA同时兼顾了特征捕捉与图文一致性,展现了在定制化任务重的优秀表现。
图6:不同微调方法在Dreambooth上的定性表现
表2:不同微调方法在Dreambooth上的定量表现
4.4 视频生成任务
SaRA不仅在图像生成任务中大展身手,在视频生成任务重也同样能取得较好的结果。实验将不同微调方法应用在视频生成模型AnimateDiff上,在不同运镜数据集下进行微调(镜头放大、缩小、右移)。结果如图7所示,其他的微调方法在视频生成任务中展现出一定的过拟合与内容崩溃的问题,相较之下,SaRA在微调过程中展现出丰富的运镜理解能力,同时较好地维护了模型的先验,保证了生成视频的质量以及与文本的一致性。
图7:不同微调方法在可控运镜的视频生成上的表现
4.5 计算资源比较
SaRA引入了非结构化梯度回传策略,有效解决了基于参数选择的微调方法中遇到的显存开销大的问题。图8的实验比较了LT-SFT(一种基于参数选择的方法)、LoRA以及SaRA在Stable Diffusion 2.0用不同Batch size训练过程中的显存开销与训练时间。可以看出,SaRA比LT-SFT减少了固定的9.2GB显存占用(对应所有参数的梯度占用空间),在Batch Size较小时(<=4)节省了45%的显存。而LoRA随着Batchsize的增大,显存占用急速上升。SaRA在Batch Size=16时比LoRA节省了52%的显存占用,并且节省了49%的训练时间。
图8:基于参数选择的方法、LoRA、SaRA在不同batch size下的显存开销与训练时间
4.6 训练参数分析
一个好的微调方法,在微调过程中,应该能够学习到更多的任务相关的信息,同时最大化保留预训练权重的先验知识。因此,作者实验分析了SaRA与LoRA在Expedition数据集上微调后的学习到的参数ΔP与预训练权重P之间的关系。表3通过F范数量化了ΔP前r维子空间与预训练权重P子空间的相关性,可见SaRA学习到的参数与P相关性更小,说明相较于LoRA学习到了更多的下游任务的知识。此外,还计算了放大因子Amplification Factor,量化了ΔP对P中未强调的特征方向的放大倍数,同样证明了SaRA对新知识更强的学习能力。
表3:SaRA与LoRA训练参数ΔP,与预训练参数P的关系
图9计算了SaRA与LoRA训练后的模型参数ΔP+P与预训练参数P的前r维子空间的相似性,可以看出,SaRA的相似性在95%以上,而LoRA维持在80%附近,证明了融合SaRA训练参数的模型,能够更好地维护预训练权重的先验知识。
图9:SaRA与LoRA训练后的模型参数ΔP+P与预训练参数P的关系
结论
本文提出了 SaRA,一种新颖的参数高效微调方法,该方法充分利用了预训练模型中绝对值最小的无效参数。作者提出了一种基于核范数的低秩损失,以约束学习到的稀疏矩阵的秩,从而避免模型过拟合。此外,设计了一种渐进式参数调整策略,进一步提高了微调参数的有效性。最后,提出了一种新型的非结构化反向传播方法,大大节省了参数微调过程中的内存开销,同时也能降低其他选择性 PEFT 方法的内存成本。大量实验证明了本文方法的有效性,它在保持预训练模型的先验信息的同时,实现了最佳的拟合能力。此外,作者高效地封装了本文的方法,使其只需修改一行代码即可实现,这大大增强了代码在其他模型和任务中的易用性和适应性。
#RoPE
避开复数推导,我们还可以怎么理解RoPE?
本文通过几何和可视化的方法解释了Transformer模型中的位置编码,特别是旋转位置编码(RoPE),如何在不涉及复数推导的情况下工作。文章讨论了RoPE在二维和高维空间中的实现,以及如何通过调整基数来优化模型的性能和外推性。最后,文章提出了一种训练策略,即先用小基数和短文本数据训练,再用大基数和长文本数据微调,以提高模型的泛化能力。
这里所说的“可视化”,不仅仅是大家熟悉的“空间向量的旋转”,而是:
具体能让你在调控RoPE的超参时,可以在脑海里快速绘制出一副图,预估你的调参对模型效果的大致影响
或者是当你想探寻衰减性和外推性时,你的脑海里不再仅有代表结果的那一副曲线图,你能动态地绘制出这些重要的性质是怎么一步步产生的。
诸如此类。而当你看完这篇文章,你就能站在几何的角度去理解复数推导的过程了(复数的运算本身就具有几何意义,本文也会给出一定解读)。
【全文目录如下】
一、原始Transformer函数式位置编码1.1 从旋转的角度理解原理1.2 这个位置编码为什么得不到人们的青睐
二、RoPE2.1 在做一件什么事2.2 旋转角度:二维空间2.3 旋转角度:高维空间(1)可以使用一个很小的吗(2)钟表视角下的高维旋转2.4 理解衰减性:从傅立叶变换的角度(快乐版)2.5 理解外推性:基数的选择(1)可视化位置编码的训练过程(2)基数的选择
一、原始Transformer函数式位置编码
1.1 从旋转的角度解读
transformer位置编码原理我们在这篇文章中详细讲过,这里我们对它进行一个快速的回顾解读。了表达方便,我们先以二维特征空间为例,根据transformer PE的构造方法,我们有:
- 位置的编码为
- 位置的编码为
其中 是我们设定好的常数。
那么根据:
我们可以把 和 的关系拆解成:
从这个拆解关系我们可以直观看出, 由于 是一个表示顺时针旋转的正交矩阵(正交意味着旋转不改变向量的模长, 只改变方向), 则 其实就是以 为基础, 顺时针旋转 这个角度而来。
为了直观体会到这点, 我们以 为基础, 画图看一下不同的 是如何旋转而来的:
在直观理解了如何从 推导至 的基础上, 我们来探究 的性质:
由于 是预先设定好的一个常数, 所以当我们假设某个 t 固定不变, 然后慢慢增大 时, 逐渐变小, 这也意味着相距较远的两个位置编码的内积越小, 即内积可以用于反馈两个位置向量在绝对位置上的远近。
但是,细心的你一定发现了,如果我保持红色不变,顺时针慢慢转动绿色PE时,可能会出现下图的情况,即图中所示的两个绿向量和红向量的内积是一样的,但是左侧绿向量明明距离红向量更远,此时,我们似乎无法从内积大小判断两个位置向量的远近:
那该怎么办呢?我们有一个粗暴但有效的解决方法:让每次位置变动时的转动角度小一些,不就可以了吗? 由于我们转动角度为 , 这意味着只要我们尽量把 设置得小一些(这就意味着调大了 的周期), 让绿线旋转的幅度小一些, 使得不管有多少个位置向量, 绿线都在第一和第四象限内移动, 不就可以了吗? 这就是关于 的一个最简单的直观解释, 在后文中, 我们还会结合更细致的内容, 继续探寻 在更高维的位置向量特种空间中的作用。
1.2 缺陷
从1.1节的介绍中,我们提取到两个关于transformer原始位置编码的重要信息:
- 在设置合适的值的前提下,每个位置都能取到唯一的位置编码(绝对性)
- 一个位置编码可以由另一个位置编码旋转而来(相对性),且在设置合适的值的前提下,两个位置编码的内积大小可以反应位置的远近,内积越大,距离越远(远程衰减性)。
我们固定住某个 t , 变动 , 来可视化一下 的变动趋势:
如图:
- 横轴表示
- 纵轴表示固定某个 的情况下, 改变 后得到的 和 的内积
- d表示不同的hidden_size(例如在1.1节中,我们就假设d = 2)
从图中我们可以发现:
- 在固定某个的情况下,两个位置编码的内积具有对称性(很简单,对照1.1的圆圈,想象cos函数的对称性。更严谨的推导参见开头引用的文章的3.3节(1)部分)
- 在固定某个的情况下,两个位置编码的内积具有远程衰减性(在上面实验图对应的原始论文中被称为“距离意识(distance-aware)”),即两个位置编码相距越远,距离越小。
看起来,transformer的原始位置编码应该已经足够好了,可是为什么在很长的一段时间里,人们还是普遍用可学习式的位置编码,甚至还有很多实验证明了transformer的这种位置编码对最终的效果没有起到实质性帮助呢?
这是因为, 我们上述的一切分析, 都是在原始位置编码 上的结果, 我们一般把位置编码和输入层的token相加, 然后让他们继续去做接下来的计算。可是, transformer架构是复杂的, 更详细地说, 当 token向量进入attention层时, 起作用的还是 这个部分吗?
为了更详细探究这个问题,我们假设:
- 分别为两个不同位置的原始token向量, 其尺寸为(hidden_size, 1)
- 分别为两个不同位置的原始PE向量, 其尺寸为 (hidden_size, 1)
- 分别为尺寸为 (hidden_size, hidden_size) 的Q、K矩阵
那么数据过attention部分可以表示成:
我们只关注其中和两个位置变量都相关的部分,也就是:
从中我们不难发现, 经过attention层后, 位置编码真正起作用的不再是 , 而是引入了线性变化后的 。那么再引入这种线性变化后,位置编码还能保持上述所说的绝对性、相对性和远距离衰减性这种优良性值吗? 我们同样用实验的方式来细看这一点。
由于 本质上可以合成一种线性变化, 所以我们可以随机初始化一个线性矩阵来代替它, 在我们的实验中, 我们做了三组试验:
- , 其中 是我们随机初始化的一个线性矩阵
- , 其中 是我们随机初始化的一个线性矩阵
同样, 我们固定住某个我们固定住某个 , 变动 , 来可视化一下这三组试验的结果:
上图中的榾线和绿线即表示两位置编码内积间引入线性变化 后的结果, 可以发现相比于标准的蓝线 ,原始位置编码的优良性质(远程衰减性等)都受到了极大程度的破坏。
总结来看, 虽然原始transfomer位置编码本身考虑了绝对性、相对性和远程衰减性, 但是由于位置编码经过 attention层后, 最终起作用的形式是 而不是 , 而进一步我们通过实验直观证明了插入一个线性变化会极大破坏位置编码设计之初的各种优良性质, 所以早期 transformer的这种函数式的位置编码并没有得到大家的青睐。
二、RoPE
在第一部分的分析中,我们已经知道attention层的计算会破坏掉输入层位置编码的优良性质,那么我们自然而然会想到:如果我直接在attention层中融入位置信息,也就是我直接把位置编码作用于,这样我不就能维持位置编码优良性质不变吗?(在接下来的讲解中,为了表达方便,我们直接用下标m和n表示两个位置)
2.1 在做一件什么事
这里都是尺寸为(hidden_size, 1)的向量。
我们知道,当我们计算时,我们是在做attention score的计算,其结果表示m位置的token和n位置token间的相关性分数。现在让我们切换一下视角,这个相关性分数其实就是两个特征向量之间的内积,在一定程度上衡量了两个向量之间的相似性。
现在我们希望把位置编码的信息直接引入中,这也就意味着,我们希望根据|n-m|的结果,给这个内积计算一定的惩罚:
- 当 较小时, 我们希望拉进 的距离
- 当 较大时, 我们希望拉远 的距离
你可能觉得有些抽象,不要紧,我们马上仿照1.1中的方式,给出可视化的解释
2.2 旋转角度:二维空间
假设原始 的特征向量如下:
模仿 1.1 的方式, 如果我们想让 具备位置信息, 我们可以分别把他们旋转 m 和 n 度。在 1.1 中我们采用顺时针旋转,在这里我们使用逆时针旋转(没有特殊原因,只是为了和原始rope旋转方式贴合),那么我们可以得到如下结果, 其中 分别表示旋转后的结果:
可以发现, 旋转过后, 随着 差值的变大, 在保持向量模长不变的情况下, 我们拉远了 两者之间的距离, 也即降低了它们的内积, 最后达到降低(惩罚)attention score的效果。
同时, 和1.1中一样, 我们同样需要引入用于参数 , 通过拉长三角函数周期的方式确保不同位置的向量不发生碰撞。 我们以上图中的 为例, 当保持其模长不变的情况下, 它的逆时针运动轨迹是一个圆, 这也意味着一个较小的 和一个较大的 代表的向量可能会重合, 所以我们需要使用 这种形式, 对 每次旋转的幅度加以控制。
总结起来,在二维特征空间下,我们定义了一个逆时针正交旋转矩阵(正如1.1所说,正交旋转矩阵保证了模长不变,即维护q,k原始的特征,只单纯做旋转使其拥有绝对位置信息):
其中表示绝对位置,例如0,1,2...
接着我们将其作用到attention部分的计算上,则有:
端详上面这个等式,我们可以发现:
- :两者分别赋予 绝对位置信息
- :绝对位置信息相乘的结果拥有了相对位置的概念
2.3 旋转角度:高维空间(1) 可以使用一个很小的吗
到目前为止,我们都在讨论二维特征空间下的位置编码,那么到了高维特征空间,位置编码应该如何设计,比如此时我们有:
其中就是我们所说的hidden_size。
我们先再次把目光聚焦回二维特征空间上, 这次我们只看 (因为 也是同理)
正如2.2节所说, 我们通过旋转的方式赋予原始 绝对位置的信息, 由于 是一个逆时针的圆周旋转, 这也意味着一个较小的 可能和一个较大的 代表的向量重合, 为了避免这一点, 我们引入一个较小的调控参数 , 使得旋转角度变为 , 放慢 旋转的步调。
你可能会想:这个方法真是不错。如果我面对的是一排数量很多的token(长文本),那么我只要把 设置得尽可能小, 我就能保证不同位置的绝对位置向量一定是唯一的了!
但是,过小的 会产生一个问题:由于旋转角度十分微弱,不同位置的向量几乎重合,这就使得"位置"这个信息带来的帮助有限了。
(2) 钟表视角下的高维旋转
当你看见上图中,向量逆时针做圆周运动时,不知道是否让你想起了日常生活中一个很熟悉的物体:钟表。对于一块钟表:
- 秒针:走得最快
- 分针:走得中等
- 时针:走得最慢
而“时刻”这个东西,就是由这三个频率各不相等的圆周运动组成的。
当两块表摆在你面前时,即使走得最快的秒针重合了,但是如果走得较慢的分针和时针不一样,他们照样能代表不同的时刻。
现在,让我们把高维的位置编码想象成一个“时刻”,那么如下图所示:
在这幅图中:
- 横向表示不同位置的位置编码(m =0和m=1)
- 纵向可以看成是3个不同频率的逆时针旋转运动(秒针、分针、时针),你可以发现,从m=0变到m=1,秒针旋转的幅度最大,时针最小。
更具体一点来说,假设这三个旋转运动对应的旋转矩阵分别是:
则有。
我们继续做一些延展,对于向量:
两两为一组 , 每一组都可以看成是一个旋转速度不一样的指针, 我们可以用 个指针来表示 的位置向量, 如下图所示:
因此在高维度空间中, 用于表示 绝对位置的旋转矩阵 最终可以表示成:
由于以上的是一个稀疏矩阵,大部分位置为0,为了节省算力,在代码开发时我们一般采用下列方式:
为了满足我们所说的 的特性, 同时又不能让 太大, 我们设:
其中,10000这个数决定了的大小,我们称其为基数(base)。在后面的章节中,我们回来讨论基数应该如何选择。
2.4 理解衰减性:从傅立叶变换角度(快乐版)
(⚠️本节没有令人抓狂的数学公式,所以是快乐版,大家可以放心食用)
傅立叶变换的基本思想,是一个函数可以用无穷多个周期性的线性组合来逼近,我们通过一张经典的示例图来可视化这句话:
在图中,红色方波就是我们想做傅立叶变换的原始函数,它可以被分解成无穷个频率不一致的蓝色三角函数(sin)的线性和。再形象一点解释的话,这些频率不一致的sin函数加总后,在各个方向上的趋势相互影响,最终生成了红色方波有的地方平,有的地方陡峭的模样。(当然,并不是只有方波可以被分解,这里只是给出了一个例子)
现在,让我们回到那个逆时针转动的圆盘上。我们画出两个空的二维坐标系。一个坐标系我们放着这个圆(圆心在原点),记录下它每次转动的角度,和对应的y轴坐标。然后我们在另一个坐标系上绘制出角度和y的关系,你会发现自己得到了一个周期性的三角函数,如下图所示(快快回忆起高中的知识):
我们只需关注第一行的图即能帮助我们理解上面说的内容。第二~三行的图是在从圆周旋转的角度帮助我们理解方波是如何形成的。图片来自wiki百科。
理解到这一步,我们结合“旋转角度”和“傅立叶变换”角度,再来看一次我们的RoPE,不难理解,一块钟表的旋转,可以被转换成一个周期性的三角函数。
现在再让我们回头看看这个内积计算(假设我们已经把RoPE的信息赋给q和k了),当向量中的各项相加时:
- 是不是就相当于各个不同的周期的三角函数在做线性组合?
- 那么线性组合的结果,是不是就可以看成是某种具有周期性的波形?(就像时分秒针组成了一个时刻一样)
- 当我们固定住某个m,改变n,去计算这个内积。如果|n-m|越大,内积越小,这不就是我们所说的“衰减性”吗?那现在我们再来看下面张图(注意箭头),你是不是能体会到衰减性是怎么来的?
- 那么再进一步, 你可能在实验中会发现, 对于 的base, 它设置得越大, 衰减曲线越平缓。现在你对照着上图, 大base引起小 , 也即相当于加大了每个蓝线分量的周期(把它们变得更宽更平缓了), 那么红线的趋势自然也就拉平了。
(注意,这里并不是说内积就长成方波的样子,只是结合这个图例,给大家一个感性的理解)
现在,你是不是已经能渐渐认识到了RoPE的魅力,并且能从图像化的角度去思考它的超参意义了呢?
2.5 理解外推性:基数的选择
(1)可视化理解位置编码的训练过程
在2.3节中,我们提过原始RoPE中,的设置为:
你的每一个值就控制着一块圆盘的转动速度,一共有d/2个圆盘,这里我们再把这张图放一次:
结合这张图,我们再来看下旋转矩阵的定义,其中每个[]表示一个圆盘:
我们单独拎出一个圆盘来看:
在二维空间中, 这个圆盘表示逆时针方向的旋转, 结合我们学过的极坐标的知识, 它可以被画成一个单位圆, 也就是指针将在这个单位圆上每次做角度为 的逆时针旋转(这就是复数 的几何意义, 理解了这一点, 也能从可视化的角度去看复数推导了, 不理解的话直接忽略)
所以,当我们训练位置编码时,我们其实就是在训练这d/2个转速不一的单位圆盘:
(2)基数的选择
理论上,当我们把的基数设得很大时,每个圆盘的转速都很慢,这样就可以保证不管有多少个token,它们的绝对位置编码都不会重复,也就是如果仅从编码表示的范围上看,较大的基数已经能够允许我们灵活表示不同长度的token了。
但是,从模型效果上来看呢?例如:假设我想训练一个能处理长文本的模型,我直接用“长文本数据 + 大基数”去做这件事,效果会怎么样呢?
我们可以从(1)中的示意图的角度来可视化地思考这个问题:当我们使用“长文本数据+大基数”时,每个圆盘的旋转速度都变慢了,当我们完成训练后,我们会发现大部分圆盘都没有转完一周(被训练完),也就是我们的位置编码信息训练不到位(没有收敛),这时如果我们想用这个模型做推理,就可能得不到好效果。
同样地,如果我们直接用一个“短文本数据 + 小基数”的方式去训练模型,那么虽然有更多的圆盘旋转过一周了,但是并不是圆盘上的每一个点都能训练到(见下图)。所以如果我们直接用这个模型去做长文本的推理,也得不到好效果
这时,我们可以换一个角度思考:如果我能尽量让每个圆盘都转一周(当然这个过程并不是把圆周上的每一个点都走过),把大致的信息学到。然后再去微调圆盘上点和点之间的缝隙,尽量把这个圆周的细节都填满(在填的过程中你可能会经过之前已经学过的点,有了先验知识,那效果就更好了),那不就能快速学到尽可能完整的位置信息,加速模型收敛了吗?
把这个思想用于实践,就得到了目前训练长文本的一个常用方法:
- 现用“小基数 + 短数据”做训练(让每个圆盘都尽量转满一圈)
- 再用“大基数 + 长文本”做微调(弥补圆盘上的空隙)
所以,当你想探究位置编码的外推性,或者想研究基数选择对外推性的影响时,不妨在脑海里可视化这d//2个圆盘,想想如何让圆盘上尽可能多的点位被训练到。
#12种常用数据可视化技术
在数据分析领域,有效的可视化在将复杂数据集转化为可理解且可操作的见解方面起着关键作用。通过使用各种类型的图表,分析师可以发现原本可能隐藏的模式、趋势和相关性。本文探讨了一些最常用的数据可视化技术,重点介绍了它们的具体用途和优点。
1. 线图
描述:线图,也称为折线图,用于显示由直线连接的数据点。它特别适合用于说明随时间变化的趋势,是时间序列数据的理想选择。
应用:线图经常用于金融市场跟踪股票价格、气象学监测温度变化以及许多其他随时间变化至关重要的领域。
2. 散点图⚫️⚪️
描述:散点图展示二维平面上的单个数据点。每个点代表一对值,这使得散点图特别适合于突出显示变量之间的相关性。
应用:散点图通常用于统计分析,以识别变量之间的关系,例如学习时间与考试成绩之间的相关性或温度与冰淇淋销量之间的相关性。
3. 条形图
描述:条形图使用矩形条来表示不同类别的频率或幅度。每个条的长度对应于数据的值。
应用:条形图可用于比较离散类别,例如不同地区的销售数字或不同年龄组的顾客数量。
4. 直方图
描述:直方图通过将数据分组到箱体或区间来显示单个连续变量的分布。每个条形代表特定范围内数据点的频率。
应用:直方图通常用于质量控制,以可视化测试分数的分布,或分析身高或体重等测量的频率分布。
5. 箱线图
描述:箱线图或箱须图通过四分位数总结数据分布并突出显示潜在的异常值。它以直观的方式呈现中位数、下四分位数、上四分位数和数据范围。
应用:箱线图在统计分析中很有价值,可以比较不同群体之间的分布,例如不同学校之间的测试分数或不同系统之间的响应时间。
6. 饼图🥧
描述:饼图通过将圆圈分成几部分来表示整体的各个部分,每部分与该部分所代表的总数的分数成比例。
应用:饼图非常适合显示百分比分布,例如不同公司之间的市场份额或预算构成。
7. 面积图🌄
描述:面积图与线图类似,但用颜色或阴影填充线下方的区域。此可视化强调了随时间变化的幅度。
应用:面积图有助于可视化累积数据,例如随时间推移的总销售额或某项服务的总用户数。
8. 堆积条形图
描述:堆积条形图将数据显示为分成不同类别的条形图,使查看者可以看到总数和每个类别的细目分类。
应用:堆积条形图可有效比较不同类别的总值,同时可视化每个条形的组成,例如不同部门的预算分配。
9. 等高线图
描述:等高线图使用等高线在二维中表示 3D 数据。每条线连接等值的点,从而可以可视化地形或其他复杂数据集。
应用:等高线图经常用于地理和气象研究中,以说明海拔、气压水平或其他连续变量。
10. 热图🔥
描述:热图使用颜色渐变来表示数据密度或量级。热图中的每个单元格都根据其所代表的值进行着色。
应用:热图通常用于基因组学中以可视化基因表达数据、在网络分析中显示用户交互热图以及在金融市场中显示交易量。
11. 误差线图
描述:误差线图包括垂直线或水平线,表示数据的变异性或不确定性。它们直观地表示数据点的置信区间或标准差。
应用:误差线图经常用于科学研究和工程中,以显示测量的精度或实验结果的可靠性。
12. 箭筒图🏹
描述:箭形图使用箭头表示矢量场。每个箭头表示给定点处矢量的方向和大小。
应用:箭头图在流体动力学和电磁学等领域很有用,可以直观地显示流体的流动或力的方向。
结论
每种类型的数据可视化都有其独特的用途,适用于不同类型的数据和分析需求。通过选择适当的图表,分析师可以提供更清晰的见解并做出更明智的决策。了解这些可视化及其应用可以提高人们有效解释和传达数据的能力,将原始数字转化为可操作的知识。
#PyTorch官宣:告别CUDA
试问,有多少机器学习小白曾被深度学习框架和CUDA的兼容问题所困扰?
又有多少开发者曾因为频频闪烁的警报「CUDA版本必须与安装的PyTorch匹配!!!」而企图炸键盘?
无论是TensorFlow还是Pytorch,GPU和CUDA搭配的概念早已深入骨髓。
如果我说,就在昨天,有款为LLM「量身定做」的CUDA-free推理上新了!你激不激动?
原文地址:https://pytorch.org/blog/cuda-free-inference-for-llms/?hss_channel=tw-776585502606721024
那么,让我们紧跟Pytorch的官方技术博客,一探究竟!看看它是如何将「自由」变为现实!
GPU的好搭子CUDA
CUDA(Compute Unified Device Architecture)到底是何方神物?为何被视为GPU的好搭子,LLMs的「利器」?
它是由英伟达开发的用于并行计算平台和应用程序的编程API,让开发者能通过GPU开展高性能计算,包括:
1. 多个能并行处理任务的核心,实现多线程
2. 多种高效管理GPU内存的方法,如全局内存、共享内存和常量内存
3. 创建并管理多条并行线程,提高数据处理效率
4. 编译器、调试器和性能分析工具组成的工具链,,帮助开发者优化代码
简而言之,CUDA使GPU加速LLM训练变为现实,大幅缩短了训练时间。
100%的Triton内核
Pytorch最近发表了一篇技术博客,他们以两个模型——Llama3-8B和IBM的Granite-8B Code为例,100%使用Triton内核实现了FP16推理。
Granite-8B Code是由IBM开发的一种仅限解码器的代码模型,专为代码生成任务设计。
仓库地址:https://huggingface.co/ibm-granite/granite-8b-code-base-4k
值得注意的是,PyTorch指出他们实现了F16推理,也就是使用半精度浮点计算。
FP32单精度浮点数
F16半精度浮点数
相对于FP32,使用FP16可以将位数减少一半,因而减少了所需内存,允许使用更大的模型或更大的批大小,且数据传输速度更快。
与F32相比,英伟达GPU提供的FP16将算术吞吐量提高了8倍,大幅加快了数学受限层的训练速度。
此外,PyTorch团队还着重强调,计算全部是依赖OpenAI的Triton语言执行的。
Triton是一种用于编写高效自定义深度学习基元的语言和编译器。
Triton的开发者致力于建立一个开源环境,以比CUDA更高效地编写代码,同时也期望它比现有的特定领域语言(domain-specific language)更具灵活性。
论文:https://www.eecs.harvard.edu/~htk/publication/2019-mapl-tillet-kung-cox.pdf
仓库:https://github.com/triton-lang/triton
团队发现,在英伟达H100上使用Triton内核训练模型,性能可达CUDA内核的76%~78%,在A100上也能达到62%~82%。
既然相比CUDA有一定的性能损失,那为什么要全部使用Triton语言?
PyTorch团队称,Triton实现了LLM在GPU上的「可移植性」,能跨越多个不同个品牌的硬件,如英伟达、AMD、英特尔等。
此外,它还在Python中为GPU编程提供了更高的「抽象层」,使开发者有机会编写自定义的具备更高性能的内核。
最终,通过在H100和A100上使用Llama3-8B和Granite-8B的Triton和CUDA变体,并进行推理阶段的基准测试,PyTorch团队证实了,Triton内核能实现CUDA-Free的计算,且生成token的吞吐量有显著提升。
内核架构
以Llama3为例,经典的Transformer块由一般由以下部分组成:
其中涉及的核心操作包括:
- RMS归一化
- 矩阵乘法:融合QKV矩阵
- 旋转位置编码(RoPE)
- Flash Attention
- 矩阵乘法:投影为为输出矩阵
- RMS归一化
- 矩阵乘法:融合门控+向上投影
- 激活函数SiLU
- 逐元素(element-wise)矩阵乘法
- 矩阵乘法:向下投影
这些操作中都需要一个或多个GPU内核进行计算,虽然不同的Transformer模型的执行细节可能有所不同,但核心操作是类似的。
例如,与Llama 3不同,IBM的Granite 8B Code模型在MLP层中使用了bias,此类更改确实需要对内核的修改。
将这些Transformer块堆叠在一起,再连接编码层,就组成了一个经典的Transformer模型。
模型推理
这些架构代码都会包含在model.py文件中,在PyTorch的eager执行模式下,C会启动CUDA内核执行这些代码。
为了让Llama3-8B和Granite-8B模型100%用Triton语言实现端到端推理,我们需要手写Triton内核(kernel),或利用torch.compile模块自动生成。
对于较小的操作,比如 RMS归一化、RoPE、SiLU函数和element-wise矩阵乘法,torch.compile可以自动生成Triton内核。
使用Nsight等工具即可对这些内核进行观察,如下图所示,自动生成的内核显示为QKV乘法和flash attention之前的深绿色方块:
使用torch.compile跟踪 Llama3-8B,显示CUDA内核
通过Nsight的跟踪信息可以观察到,在Llama3-8B中,占端到端延迟80%的两个主要操作是矩阵乘法和注意力内核,而且它们依旧由CUDA内核操作。
为了进一步提升性能,我们开始手写Triton内核来替换上述两个操作。
手写Triton内核
矩阵乘法
对于线性层中的矩阵乘法,编写一个自定义的 FP16 Triton GEMM (General Matrix-Matrix Multiply)内核,执行通用的矩阵-矩阵乘法,其中利用了SplitK进行工作分解。
为了实现最佳性能,还使用了穷举搜索来调整SplitK GEMM内核。
因为每个线性层的权重矩阵都有不同的形状,如果要获得最佳性能,就需要针对每种矩阵形状调整Triton内核。
Granite-8B和Llama3-8B的线性层权重矩阵规格如下:
调整每个线性层后,相比未调整的Triton内核,可以实现1.2倍的端到端加速。
Flash Attention
Triton的flash attention内核有一系列不同的配置和实现,包括:
- AMD Flash
- OpenAI Flash
- Dao AI Lab Flash
- XFormers Flash
- PyTorch FlexAttention
首先,采用eager模式,之后用torch.compile的标准方法进行编译,并对文本生成质量进行评估;
上表总结了第2~5个内核「开箱即用」时的表现。
这些结果表明,如果目标是构建一个端到端的生产级内核,那么拥有一个能跑基准测试的内核还远远不够。
后续测试中使用AMD flash attention内核,因为它可以通过torch.compile进行编译,且在eager和compile模式下都有清晰的输出。
为了满足torch.compile与AMD flash attention内核的兼容性,我们需要自定义torch运算符,主要包括以下两步:
1. 将函数包装到PyTorch自定义运算符中
2. 在运算符中添加一个FakeTensor Kernel,给定flash输入张量的形状(q、k 和 v),它可以提供一种计算flash内核输出形状的方法
将模型中的运算换为Triton的自定义内核后,就能成功地进行编译和运行,Nsight跟踪信息如下图所示:
对比图5可以发现,图6就是100%使用Triton内核的前向计算。
基准测试
基准测试中使用Granite-8B和Llama3-8B模型,在英伟达H100和A100上进行单GPU运行,并定义了两种不同的配置:
Triton内核配置使用:
1. Triton SplitK GEMM
2. AMD Triton Flash Attention
CUDA 内核配置使用:
1. cuBLAS GEMM
2. cuDNN Flash Attention - 缩放点积注意力 (SDPA)
在典型的推理设置下,eager和torch编译模式的吞吐量和token间延迟如下:
批大小=2,输入序列长度=512,输出序列长度=25
Triton模型在H100上的性能最高可达CUDA模型的78%,在A100上的性能最高可达82%。两者间性能的差距可能源于矩阵乘法和flash attention的内核延迟,下一节将详细讨论。whaosoft开发板商城也有其他芯片设备可以测试
微基准测试
解码延迟时间对比,输入是任意提示,批大小=1,提示长度=44
将端到端推理中的各部分进行单独对比,我们注意到以下两点:
1. Triton的matmul内核比CUDA慢1.2~1.4倍
2. AMD的Triton Flash Attention内核比CUDA SDPA慢1.6倍
这些结果表明,需要进一步提升GEMM和Flash Attention等关键原语的内核性能。
比如最近提出的FlashAttention-3、FlexAttention等工作提供了更好的方法来利用底层硬件,有希望在此基础上为Triton进一步加速。
将 FlexAttention与SDPA和AMD 的 Triton Flash内核进行比较,微基准测试结果显示,Flex有望被用于上下文更长、解码规模更大的问题场景。
英伟达H100 SXM5 80GB上的FlexAttention内核基准测试
未来展望
接下来,我们期望进一步优化矩阵乘法(matmuls),以更充分地利用硬件。
比如使用不同的工作分解方法(类似StreamK的持久内核技术),以加快基于Triton的方法。
我们还期望继续探索FlexAttention和FlashAttention-3,进一步缩小Triton和CUDA间的差距。
以上的实验只针对FP16精度,但早前的研究表明,与cuBLAS FP8 GEMM相比,FP8 Triton GEMM内核表现更好。因此接下来的工作还会探讨端到端FP8 LLM推理。
参考资料:
#OOOPS
零样本实现360度开放全景分割,已开源
OOOPS模型结合RERP在OPS任务上超越了其他最先进的开放词汇语义分割方法,在三个人工全景数据集WildPASS、Stanford2D3D和Matterport3D上证明了其有效性,特别是在户外WildPASS上提升了+2.2%的性能,在室内Stanford2D3D上提升了+2.4%的mIoU。
全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息。然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制。为了解决这个问题,论文定义了一个新任务,称为开放全景分割(Open Panoramic Segmentation,OPS)。在该任务中,模型在源领域使用视场受限的针孔图像进行训练,而在目标领域使用视场开放的全景图像进行评估,从而实现模型的零样本开放全景语义分割能力。
此外,论文提出了一种名为OOOPS的模型,结合了可变形适配器网络(Deformable Adapter Network,DAN),显著提高了零样本全景语义分割的性能。为了进一步增强从针孔源领域的失真感知建模能力,论文提出了一种新的数据增强方法,称为随机等矩形投影(Random Equirectangular Projection,RERP),该方法专门旨在预先处理物体变形。OOOPS模型结合RERP在OPS任务上超越了其他最先进的开放词汇语义分割方法,在三个人工全景数据集WildPASS、Stanford2D3D和Matterport3D上证明了其有效性,特别是在户外WildPASS上提升了+2.2%的性能,在室内Stanford2D3D上提升了+2.4%的mIoU。
论文地址:https://arxiv.org/abs/2407.02685
论文代码:https://junweizheng93.github.io/publications/OPS/OPS.html
Introduction
全景成像系统在最近几年显著发展,这促进了多种全景视觉应用的产生。由于全面的360°视场,全天候全景图在感知周围环境时提供了更丰富的视觉线索,在广泛的场景理解任务中,使环境数据的捕获更加完整和沉浸,这对深入的场景理解至关重要。这种广角视角超越了针孔图像的有限范围,显著增强了计算机视觉系统在各种应用中感知和解析环境的能力。尽管与针孔图像相比,利用全景图像在计算机视觉应用中的好处显而易见,但必须不断考虑一些值得注意的挑战,具体如下:
更广的视场挑战。例如,图1a展示了随着视场扩大,最先进的开放词汇语义分割方法的性能下降情况,即从针孔图像到360°全景图像。在这一过程中,观察到了超过 的mIoU性能下降,表明了狭窄与宽广图像之间的语义和结构信息巨大差异所带来的挑战。
类别的限制。传统的封闭词汇分割任务范式仅提供有限数量的标注类别,这无法处理现实应用中不可估量的类别数量。图1b展示了封闭词汇分割与开放词汇分割之间的区别。与封闭词汇设置(第一行)相比,开放词汇设置(第二行)不受数据集类别数量的限制。在封闭词汇设置中,仅识别四个预定义的类别(以不同颜色突出),相对而言,开放设置中的每个全景像素都有其自有的语义意义,尽管数据集中没有对这些类别进行标注。
为了进一步释放全景图像的巨大潜力,有三个关键问题亟待解决:
- 如何通过单张图像获得整体感知?
- 如何突破现有全景数据集中有限可识别类别的障碍,以便下游视觉应用能够从无限制的信息视觉提示中受益?
- 如何应对全景标签的稀缺?
基于上述三个问题,论文提出了一项新任务,称为开放全景分割(Open Panoramic Segmentation,OPS),旨在全面解决这些挑战,更好地利用全景图像所带来的优势。新任务范式如图1c所示。开放全景分割任务考虑到三个问题的三个重要元素,“开放”的概念是三重的:全天候全景图像(开放视场),无限制的可识别类别范围(开放词汇)。此外,模型是在源域中使用针孔图像训练,而在目标域中评估使用全景图像(开放域)。考虑到密集标注的针孔分割标签与全景标签相比成本较低,因此开放不同领域是具有成本效益的。请注意,OPS与领域自适应(Domain Adaptation,DA)不同。在DA的训练背景下,数据的利用包括源域和目标域,而在OPS中,整个训练过程中完全依赖于仅来源于源域的数据。
除了新任务,论文提出了一种名为OOOPS的新模型,以应对OPS任务中提到的三个与开放性相关的挑战。该模型由一个冻结的CLIP模型和一个关键组件——可变形适配器网络(Deformable Adapter Network,DAN)组成,后者具有两个重要功能:(1) 高效地将冻结的CLIP模型适配到全景分割任务中,(2) 解决全景图像中的物体变形和图像失真。更具体而言,DAN的关键组件——新型可变形适配器操作符(Deformable Adapter Operator,DAO)旨在应对全景失真。为了提高模型对针孔源域失真感知的能力,论文进一步引入了随机等距投影(Random Equirectangular Projection,RERP),专门设计用来解决物体变形和图像失真。针孔图像被分割成四个图像块,并随机打乱。接着,在打乱后的图像中引入了等距投影,这是一种将球体映射到全景平面上的常用方法。OOOPS模型搭配RERP在WildPASS、Stanford2D3D和Matterport3D上分别超越了其他最先进的开放词汇分割方法,mIoU提高了+2.2% 、+2.4%和+0.6%。
总结来说,论文提出了以下贡献:
- 引入了一项新任务,称为开放全景分割(open panoramic segmentation,简称OPS),包括开放视场(Open FoV)、开放词汇(Open Vocabulary)和开放领域(Open Domain)。模型在源域中使用视场受限的针孔图像以开放词汇设置进行训练,而在目标域中使用视场开放的全景图像进行评估。
- 提出了一种名为OOOPS的模型,旨在同时解决三个与开放性相关的挑战。提出了一个可变形适配器网络(Deformable Adapter Network,DAN),用于将冻结的CLIP模型的零样本学习能力从针孔领域转移到不同的全景领域。
- 一种新颖的数据增强策略,称为随机等矩形投影(Random Equirectangular Projection,RERP),专门为所提出的OPS任务设计,进一步提高了OOOPS模型的准确性,在开放全景分割任务中实现了最先进的性能。
- 为了对OPS进行基准测试,在室内和室外数据集(WildPASS、Stanford2D3D和Matterport3D)上进行了全面评估,涉及超过10个近词汇和开放词汇的分割模型。
MethodologyOpen Panoramic Segmentation
开放全景分割(OPS)任务旨在解决三个具有挑战性的问题:
- 狭窄的视场(FoV)
- 类别范围的限制
- 全景标签的匮乏
OPS对上述问题给出了三个解答:
- 开放视场
- 开放词汇
- 开放领域
OPS任务范式如图1c所示。模型在狭窄视场的针孔源领域中以开放词汇的设置进行训练,而在宽视场的全景目标领域中进行评估。
Model Architecture
基础模型可以通过使用适配器高效地转移到下游任务。为了提高全景建模能力,论文设计了OOOPS模型。如图2所示,它由一个冻结的CLIP模型和一个提出的可变形适配器网络(DAN)组成,后者结合了多个变换层和新颖的DAO。特征融合发生在CLIP和DAN的中间层之间。DAN的两个输出之一包含掩膜提议,而另一个则作为深度监督指导,帮助CLIP生成提议的logits。
在训练阶段,针孔图像被输入到OOOPS中,生成掩膜提议和用于损失计算的提议logits。在推理阶段,全景图像被输入到OOOPS中,通过掩膜提议与相应提议logits的乘积生成分割预测。冻结的CLIP对于OOOPS的零样本学习能力是必要的。
Deformable Adapter Network
可变形适配器网络是多个变换层与提出的DAO的结合。由于全景图像中存在失真,这在利用信息丰富的全景图像时是一个巨大的挑战。论文深入探讨了可变形设计和采样方法,如APES和MateRobot,提出了DAO以应对全景图像的失真和物体变形。
Revisiting DCN Series
开创性工作 DCN 可以赋予传统 CNN 空间变形感知的能力。给定一个具有 个采样位置的卷积核, 设 和 分别表示第 个位置的权重和预设偏移。例如, 且 定义了一个膨胀率为 1 的 卷积核。让 和 分别表示输入特征图 和输出特征图 在位置 的特征。DCN 的公式化为:
其中 是第 个位置的可学习偏移。尽管DCN能够捕捉空间变形,但在计算局部特征时,每个采样位置被视为相同。DCNv2的提出增加了一个称为调制标量的附加项。具体而言,DCNv2可以表示为:
其中 是第 个位置的可学习调制标量。受Transformer的启发,DCNv3提出了一种分组操作,进一步增强了DCNv2的变形感知能力。DCNv3可以用以下公式表示:
其中表示聚合组的总数。DCNv4与DCNv3类似,能够实现相似的性能,同时显著减少运行时间。
Deformable Adapter Operator (DAO)
在处理全景图中的畸变时,DCNv3和DCNv4未能满足变形感知的要求。因此,提出了DAO来利用以下表达式解决全景图像中的畸变问题:
其中 是位置 处的可学习显著标量。DAO继承自DCNv3,提出了一个额外的项,称为显著标量,以指示全景图中每个像素的重要性。值得注意的是,DCNv3和DCNv4共享相同的数学表达式,但根据设计DAO之前的实验,DCNv3更为稳健。因此,论文选择将DCNv3作为DAO的一部分,而不是DCNv4。
如图2所示,通过DCNv3输出的特征图依次经过Patch相似性层、归一化层和标准差层,以形成显著图。这种设计的直觉是简单明了的:图像中的显著像素是那些与其邻近像素有显著区别的像素,例如边缘像素。如果一个图像块中的所有像素都不同,则该块内像素相似性的标准差将高于包含相似像素的块,从而导致更高的显著标量。
图3更详细地解释了显著图的生成过程。给定一个特征图,DAO首先计算中心像素与卷积核内所有像素之间的余弦相似度,例如,图3中的 卷积核内的 9 个像素,结果是一个 9 维的余弦相似度向量。然后对该向量应用Softmax归一化。随后,DAO计算这个归一化余弦相似度向量的标准差,以指示中心像素的重要性。通过遍历整个特征图中的每个像素,生成一个显著图,以增强通常是图像边缘像素的显著性,在这些位置常常会发生强烈的全景畸变。
Random Equirectangular Projection
等距矩形投影(ERP)是将球体映射到全景平面最常见的方法之一,它将球面坐标转换为平面坐标,如下所示:
其中 和 分别是要投影位置的经度和纬度。 是标准纬线。 和 分别是地图的中央子午线和中央纬线。 是球体的半径。 表示投影位置在地图上的水平坐标, 表示垂直坐标。
图4a可视化了全景平面上的等距矩形投影。可以观察到,在等距矩形投影后,全景图中出现了强烈的畸变,例如,直线被转换为曲线。为了进一步提高性能,论文在针孔图像上提出了随机等距矩形投影(RERP),因为OPS任务要求模型使用针孔图像进行训练,而不是全景图像。
将针孔图像分成四部分,并随机打乱图像块,随后对无畸变的针孔图像应用等距矩形投影。图4b可视化了经过随机等距矩形投影(RERP)后的针孔图像。第一列是未进行任何数据增强的针孔图像。第二列是未进行随机打乱的针孔图像上的等距矩形投影(ERP)。最后一列是论文提出的随机等距矩形投影(RERP)。可以观察到,在经过RERP后的针孔图像中也出现了类似全景的畸变。随机打乱用于增强鲁棒性并促进泛化。
Experiments
#OvSGTR
突破场景图生成的边界:OvSGTR 实现全开放词汇场景图生成
论文名称: Expanding Scene Graph Boundaries: Fully Open-vocabulary Scene Graph Generation via Visual-Concept Alignment and Retention
论文地址:https://arxiv.org/pdf/2311.10988
代码链接:https://github.com/gpt4vision/OvSGTR
SGG任务示例 (识别给定图像中的目标及目标之间的关系)
随着计算机视觉领域的飞速发展,如何在复杂场景中精准识别对象及其关系成为了至关重要的挑战。场景图生成(Scene Graph Generation, SGG)作为一种将图像中的物体和它们之间的关系结构化表示的技术,广泛应用于图像理解、视觉问答、语义通信等任务中。然而,现有的SGG方法几乎都局限于封闭集,只能识别预定义的对象和关系类别。这一瓶颈极大地限制了SGG模型在真实世界中面对多样化场景的泛化能力。
OvSGTR 应运而生,它不仅打破了这一技术瓶颈,还为场景图生成领域带来了全新的突破。通过融合视觉-概念对齐与保留策略,OvSGTR首次实现了全开放词汇的场景图生成,即模型能够在未见过的对象和关系类别上进行精准预测,极大扩展了SGG的应用边界。
现有SGG模型的不足
大多数现有的SGG模型在训练和推理时仅依赖于预定义的对象和关系集合,这使得它们在面对未知的对象或关系时无法做出准确的预测。尽管近期有部分研究尝试扩展到开放词汇的对象检测,但对涉及关系的开放词汇场景图生成的研究相对匮乏。
OvSGTR框架:应对未知对象与关系的挑战
在这篇论文中,我们首次全面分析了SGG中的节点和边缘对开放词汇的影响,并提出了四个场景设置,分别是封闭集SGG、开放词汇对象检测(OvD-SGG)、开放词汇关系检测(OvR-SGG)及开放词汇对象+关系检测(OvD+R-SGG)。其中,OvD+R-SGG 是最具挑战的场景,涉及到同时预测未知的对象和关系。
本文提出的四种SGG场景设定 (虚线表示训练阶段未见过的目标类或关系类)
为应对这些挑战,OvSGTR采用了一种端到端的Transformer架构,通过图像-文本数据进行弱监督关系感知的预训练,并在训练过程中通过视觉-概念对齐来增强模型对未见类别的泛化能力。
本文所提出的 OvSGTR 框架示意图
视觉-概念对齐与保留策略
OvSGTR利用图像-文本对进行弱监督学习,通过从图像描述中解析关系三元组来生成伪标签,并结合视觉特征对节点和边缘进行对齐。此外,针对模型在训练新数据时容易遗忘先前知识的问题,我们提出了视觉-概念保留策略,通过知识蒸馏减少这种“灾难性遗忘”,确保模型在学习新任务时仍能保持对旧任务的记忆能力。
实验结果与展望
在Visual Genome基准数据集上的实验表明,OvSGTR在所有设置中都表现出了卓越的性能,尤其在开放词汇场景下,显著优于其他模型。我们的方法不仅在节点预测方面展现了强大的开放词汇能力,而且在复杂的关系预测任务中也达到了新的技术高度。
Closed-set SGG 场景下的定量结果: 以更少的训练参数, 更快的推理速度取得 SOTA结果
OvD+R-SGG 场景下的定量结果: 大多数现有的模型无法识别训练阶段未见过的类别
定性结果样例 (虚线代表训练阶段未见过的目标/关系类)
尽管OvSGTR取得了显著进展,但未来仍有一些改进空间。例如,利用大型语言模型(LLM)来代替传统的语言解析器,进一步提高伪标签生成的精度。此外,场景图生成与(多模态)大型语言模型之间的相互协作也值得探讨,以期在更少标注的条件下提升场景图生成的性能。
总结
本文通过提出OvSGTR,扩展了场景图生成任务的边界,首次实现了全开放词汇的SGG框架。该框架结合视觉-概念对齐与保留策略,能够应对包括未知对象与关系在内的复杂任务,并在多个场景中展现了卓越的泛化能力。
#FlashSplat
比现有方法快50倍!新加坡国立开源,简单&全局最优3D-GS分割求解器
这篇文章介绍了一种名为FlashSplat的新型3D Gaussian Splatting分割求解器,它通过线性化简化了3DGS分割过程,将2D到3D的分割任务转化为线性整数优化问题,提高了分割效率,比现有方法快约50倍,并确保了全局最优性。该方法在物体移除和修复等后续任务中表现出色,具有在3D数据处理和应用中的巨大潜力。
文章链接:https://arxiv.org/pdf/2409.08270
项目链接:https://github.com/florinshen/FlashSplat
亮点直击
引入了一种全局最优的 3D Gaussian Splatting分割求解器,大大提高了将 2D 分割结果提升到 3D 空间的效率。
通过线性化简化了 3DGS 分割的过程,将 2D 到 3D 的分割任务转化为线性整数优化问题。该方法对二值分割和场景分割均有效。
在优化中引入了背景偏置,展示了在 3D 分割中对噪声的优越鲁棒性,证明了该方法在各种场景分割中的鲁棒性和高效性。
本文的方法具有显著的优化速度,能在 30 秒内完成整个过程,比现有方法快约 50 倍,同时确保给定 2D masks的全局最优性。
广泛的实验验证了本文方法在后续任务中的优越性,包括物体移除和修复,突显了其在 3D 数据处理和应用中的巨大潜力。
总结速览解决的问题
- 现有方法在从2D mask中精确分割3D Gaussian Splatting(3D Gaussian Splatting, 3D-GS)时效率低下,通常依赖于迭代梯度下降法来给每个高斯分配一个唯一的标签,导致冗长的优化和次优解,效果欠佳。
提出的方案
- 提出了一种简单且全局最优的3D-GS分割求解器,通过线性规划的方式闭式求解最优标签分配。
- 核心思路在于,利用重建的3D-GS场景,2D mask的渲染可以视为与每个高斯标签的线性函数。
应用的技术
- 利用线性规划技术来解决标签分配问题,避免了迭代优化。
- 通过单步优化实现分割,并结合alpha混合特性。
- 在目标函数中加入背景偏置,增强抗噪性。
达到的效果
- 优化过程仅需30秒,比现有最优方法快50倍。
- 实验表明该方法在分割多种场景时高效、鲁棒,并在后续的任务如物体移除和修复中表现优越。
方法
本节首先深入探讨了3D Gaussian Splatting(3D GS)的渲染过程,重点关注基于块的光栅化和alpha混合。接着描述了如何将此过程表述为整数线性规划 (ILP) 优化,用于3DGS的分割,并证明该问题可以通过闭式形式求解。鉴于2D mask通常带有噪声,引入了一个软化的最优分配来减轻这些噪声影响。除了二值分割之外,还扩展了该方法以涵盖场景分割,从而实现3D场景中所有物体的分割。最后,提出了一种基于深度信息的2D mask渲染方法,将3D分割结果从新视角投影到2D mask上。
初步:3D Gaussian Splatting (3DGS) 的光栅化
3D Gaussian Splatting (3DGS) 是一种出色的新视角合成方法。与神经辐射场 (NeRF) 不同,它通过显示 3D 高斯并具有实时速度来重建 3D 场景。给定一组具有配对相机姿态的捕获视角,3D Gaussian Splatting通过学习 3D 高斯 来重建 3D 场景。每个 3D 高斯 通过以下参数进行表示:
- 中心位置
- 表示旋转的四元数
- 三维尺度
- :学习到的不透明度
- : 表示视图相关颜色的三阶球谐函数
在渲染过程中,3DGS 采用光栅化pipeline来实现超高效率。具体来说,所有3D 高斯首先被投影到图像平面上作为 2D 高斯。然后将整个图像划分为 的瓦片, 如下图 1 所示, 每个瓦片 共享相同的 3D 高斯子集 。
在渲染每个像素时, 传统的 alpha 组合被应用于将这些 2D 高斯的属性 (颜色或深度) 根据它们的深度顺序混合到像素空间属性 中。
其中, 是渲染特定像素时的 alpha 值, 它是 与像素位置落入投影 2 D 高斯 的概率的乘积, 是透射率, 表示通过并未被前 个高斯吸收的部分。
将二值分割表述为整数线性规划
从一个重建的3D Gaussian Splatting(3D-GS)场景开始,参数化为 ,其中包含 个渲染视图以及相应的 2D 二值mask,记为 。每个mask 的元素为 0 或 1 ,其中 0 表示背景, 1 表示前景。我们的目标是通过将 2D mask投影到 3D 空间中, 为每个 3 D 高斯 分配一个 3 D 标签 , 其值可以为 0 或 1 。
为此,通过一个可微分的渲染过程来优化 。将 视为公式 (1) 中的属性 。目标是最小化渲染mask 与给定二值mask 之间的差异。
随着 的重建,渲染所需的 和 变为常数。因此,渲染函数相对于混合属性 变为线性方程。这使我们能够灵活地通过简单的线性优化来求解最优mask分配。
形式上, 分割问题可以表述为一个具有平均绝对误差的整数线性规划 (LP) 优化:
其中 表示 3DGS 渲染器。由于对于任何 都有 且 , 并且在 alpha 混合中光只能被吸收, 因此吸收的总光量不能超过初始光强度, 该初始光强度被归一化为 1 。因此, 所有样本的吸收光分数之和受到如下约束:
这引导提出以下结论:
引理 1: 在 3D Gaussian Splatting的 alpha 混合过程中,对于 ,
为了求解这个线性规划 (LP) 问题,根据引理 1 将公式 2 重写为:
其中,表示每个 3D 高斯点的标签。
其中, 是一个常数值, 和 分别作为指示函数, 表示背景和前景的存在。
通过多数投票法求解整数线性规划 (ILP) 。 为了最小化公式 4 中定义的函数 , 当所有对应mask 中的像素都表明为背景 ( 0 ) 时, 我们将 设为 0 。相反, 如果mask之间存在矛盾, 我们通过加权多数投票来解决。具体来说, 我们根据mask中最频繁出现的标签为每个高斯点 分配值, 如公式 6 所示。
形式上, 如果差值 , 其中 和 分别代表指示背景和前景的加权mask的计数, 我们将 以最小化 。 如果 , 则将 。在更一般的情况下, 我们可以将 的最优分配表述如下:
直观上, 这个最优分配概念是通过聚合各个 高斯在渲染过程中的贡献来实现的。那些在所有给定 mask中显著贡献于前景的高斯点被指定为前景,即 ,相反,主要贡献于背景的高斯点被系统地分配为背景, 即 。此外, 由于公式6中目标函数的简单线性组合形式, 我们可以同时为每个 3 D高斯点分配最优标签。
正则化ILP用于降噪。实际上,给定的2D mask集 通常是由训练好的2D视觉模型预测和关联的,这可能在某些区域引入噪声(如图6的第1列和第2列所示)。这些2D mask的特点可能导致3D分割结果中出现噪声。例如,如下图2(a)所示,因噪声误分类为前景的背景高斯点可能导致分割后的3D物体边缘尖锐且难以过滤。
为了解决这一问题, 对上述最优分配进行了改进。该改进首先通过 归一化对高斯点的整体贡献进行归一化, 表示为 。接着, 引入了一个范围为 的背景偏置, 用以重新校准 ,从而调整最优分配为:
使用 能有效减少分割结果中的前景噪声; 相反, 则有助于生成更干净的背景, 正如图2(b)和(c)分别展示的那样。这种软化的最优分配形式提供了灵活性, 能够针对不同的下游任务, 在 2 D mask 噪声的情况下产生准确的3D分割结果。
从二值分割到场景分割
在3D场景的不同视角中存在多个实例。要对这些场景中的多个物体进行分割, 需要根据上述公式多次执行二值分割。这一过程涉及反复收集 , 从而自然减缓了场景分割的速度。因此, 为了更有效地应对这一挑战,将方法从二值分割扩展到场景分割。
这种向多实例分割的转变受到两个关键因素的推动。首先, 重要的是要认识到 高斯点并不完全属于单个物体。例如,如图1所示,像素 和 虽然属于不同的物体(颜色块),但受到了同一个3D高斯点的影响。此外, 引入多个实例使得公式2中的约束复杂化, , 其中 表示场景中实例的总数。因此,提供的mask集 变为 ,以适应多个分割后的2D实例。这种约束会阻碍全局最优解的实现,因为实例之间的标签是可交换的。
为了规避这些挑战,我们将多实例分割重新解释为多个二值分割的组合,并根据公式 7 修改了最优分配策略。为了隔离标记为 的特定实例,将实例集中所有其他物体重新定义为背景来计算 。这一方法形式化如下:
通过这种公式, 只需一次累积集合 , 然后对该集合执行 操作, 就可以为每个物体 获取高斯子集 。因此,这允许用户通过指定物体ID来选择性地删除或修改这些3D高斯子集。还需要注意的是, 当 时, 不同实例的子集 可能会重叠, 这反映了3D高斯点分割本质上的非排他性特征。
基于深度引导的新视角mask渲染
由于上述公式避免了密集优化,本文的方法仅需大约 的masked 2D视图即可产生稳健的分割结果。这种效率也使得本文的方法能够为之前未见过的视图生成 2 D mask 。在二值分割的上下文中, 仅专注于渲染由 标识的前景高斯。此过程涉及为每个像素 计算累积的alpha值 。对于二值分割中的新视角mask渲染, 仅渲染具有 的前景高斯点, 以生成每个像素的累积alpha值 , 然后可以通过对alpha值 进行简单量化来获得2D mask, 阈值 是一个预定义的超参数。具体来说, 2D mask是通过对这些alpha值进行简单量化得到的,其中 表示预定义阈值, 是量化函数, 当 时, , 相反, 。
在场景分割中生成新视角mask时, 由于不同物体的分割结果会相互交叉(如公式8所示),因此生成的 alphamask可能存在模糊,如下图3的第3列所示。具体来说,在相同视角下渲染每个物体的关联3D高斯子集 可能会导致多个物体满足条件 。在这种情况下, 引入深度信息来确定最终的分割结果。在每个像素位置 处,使用深度 来过滤最终的 2 D mask结果。对于满足 且相对于摄像机在像素 处具有最小深度 的物体 , 最终被选为 。下图 3展示了二值分割和多物体分割在新视角下的2D mask预测结果。
实验数据准备
数据集。为了评估本文方法的有效性,从多个来源收集了3D场景数据:MIP-360 数据集、T&T 数据集、LLFF 数据集、Instruct-NeRF2NeRF 和 LERF 数据集,这些数据集用于定性分析。为了进行定量分析,使用了 NVOS 数据集。
2D mask生成与关联。在实验设置中,使用了 Segment Anything Models (SAM)来提取mask,因为 SAM 的分割输出在本质上是不依赖于语义的。在我们的框架中,需要进一步将这些2D mask进行关联。本文的方法分为两种不同的策略,分别针对二值分割和场景分割。
对于二值分割,其目标是隔离单个前景实体,我们首先在单个参考视图上标记点提示。这些点提示通过参考视图的相机姿态投影回3D空间,以找到其最近的具有最小正深度的3D高斯点。随后,这些点提示被投影到其他视图中,通过投影其对应的3D高斯点的中心来传播。利用这些关联的点提示,SAM 独立生成每个视图的二值mask。
对于场景分割,本文的方法首先使用 SAM 为单独视图生成实例mask。为了在3D场景中为每个2D物体分配唯一的ID,将多个视图视作视频序列。利用zero-shot 视频跟踪器,确保在不同视点间一致地关联和传播物体。
实施细节
在 CUDA 内核函数中实现了 方程7和方程8 中的最优 3D 分割。每个高斯的 计算采用基于瓦片的光栅化与渲染器进行, 不包括颜色分量 , 仅关注 。对于提供的mask集 中的每个像素,按照方程 1 进行 alpha 合成。然后,将每个高斯的 聚合到缓冲区 中,该缓冲区对应于像素标签 ,通过原子操作完成。利用光栅化 pipeline可以在 30 秒内完成所有对象的 集合。对于二值分割,直接应用 arg max 确定最优分配。在场景分割的情况下, arg max 通过动态规划进行迭代执行以加速。此分配确保了二值分割和场景分割的计算在 1 毫秒内完成,从而在计算完 集合后, 可以实现对 值的交互式调整。这种调整使用户能够有效减少各种下游任务中的分割噪声。
3D 分割结果
下图 4 展示了二值和场景 3D 分割的结果。第一行展示了来自 LERF 数据集 的 Figurines 场景,第二行展示了来自 MIP-360 数据集 的 Counter 场景。在这两个场景中,应用了场景分割方法,为每个场景渲染了 2 个视图的 5 个分割对象(在真值图像中圈出),展示了本文的方法在使用 SAM 预测的实例mask进行场景分割的能力。此外,第三、第四和第五行展示了二值分割结果,其中第三行展示了来自 LLFF 数据集 的 Horns 场景,第四行展示了来自 T&T 数据集 的 Truck 场景,第五行展示了来自 MIP-360 数据集 的 Kitchen 场景。两个视图的分割对象被渲染,显示了本文方法在分割 3D 对象方面的能力。
对象移除
3D 对象移除涉及从场景中完全消除一个对象的 3D 高斯子集。上图 4 中展示了这种移除的结果。需要注意的是,我们在所有场景中应用了背景偏差,以确保背景保持清晰。对于第一行和第二行中的小型 3D 对象,同时从场景中移除 5 个对象。由于这些场景的背景可能在其他视图中被观察到,因此这些场景中的伪影较小,甚至对于某些对象几乎不可察觉。对于第 3 行、第 4 行和第 5 行中描绘的更具挑战性的场景,移除对象后留下的空间显示出更嘈杂的背景,甚至是黑洞,这主要是由于较大的前景对象遮挡了背景。这种情况在 Horns 场景(第 3 行)中尤为明显,该场景仅包含正面视图。
对象修复
在 3D 对象移除之后,对象修复旨在修正未观测区域的伪影,确保 3D 场景内的视图一致性。首先,在移除后渲染视图,并使用 Grounding-DINO识别每个视图中的伪影区域,这些区域通过视频追踪器在视图之间进行跟踪。然后,使用预训练的 2D 修复模型 生成修复的 2D 视图。随后,通过在原始对象位置附近引入 20 万个新的高斯来调整 3DGS 参数,同时保持背景高斯不变。微调过程中,使用物体mask外的 L1 损失来最小化背景影响,并在修复mask内使用 LPIPS 损失来确保场景的自然性和一致性。在下图 5 中展示了对象修复的结果,为每个场景渲染了三个视图。对象修复后,噪声和孔洞被减少,展示了本文的方法可以有效地将前景与背景在 3D 分割中分离开来。
定量比较
本文使用 NVOS 数据集 进行定量分析,该数据集源自 LLFF 数据集。NVOS 数据集包含了 8 个面向前方的 3D 场景,每个场景提供了参考视图和目标视图的 2D 分割mask注释。本文的方法从参考视图的注释mask中采样点提示,然后将这些点提示传播到其他视图,以指导 SAM 的分割。随后,应用如 方程2 所示的二值分割方法来隔离前景 3D 高斯。接着,使用阈值进行新视图mask渲染,以渲染目标视图的 2D mask,从而计算所有 8 个场景的平均交并比 (IoU) 和平均准确率。比较结果如表 1 所示,将我们的 FlashSplat 方法与之前基于 NeRF 的 3D 分割方法(如 NVOS、ISRF 、SGIRF、SA3D 和 3D-GS 方法 SAGA)进行基准测试。本文的方法在该数据集中表现出色,优于其他方法。
计算成本
本文对 FlashSplat 的计算效率与之前的 3DGS 分割方法进行比较,特别是 SAGA 和 Gaussian Grouping。在评估过程中,使用了 LERF 数据集 中的 Figurines 场景,并在单个 NVIDIA A6000 GPU 上进行测试。基线方法需要通过 30,000 次迭代的梯度下降优化,将 2D mask转化为与每个 3D 高斯相关的对象特征,从而导致显著的额外训练时间来优化 3D 场景。相比之下,本文的方法仅需计算集合 {Ai}e,这一过程大约需时 26 秒,使其速度大约比基线快 50 倍。对于单个 3D 对象的分割,这些基线方法需要进行网络前向传播,而 FlashSplat 通过 arg max 高效地确定最优分配,仅需 0.4 毫秒。此外,对 GPU 内存使用的分析显示,我们的峰值内存消耗仅为之前方法 SAGA的一半。
消融研究
噪声减少的效果。为了进一步阐明之前提到的 2D mask中的噪声,下图 6 的左列中提供了由 SAM 生成的 2D mask的可视化结果,涵盖了两个场景。此外,还在相应的视图中渲染了 3D 分割后的对象mask,显示了提供的 2D mask中的断裂区域已得到修复。这证明了本文的方法在生成 3D 分割时对 2D mask噪声的鲁棒性。
3D Segmentation with Fewer 2D Masks
结论
本文引入了一种针对 2D mask的 3D Gaussian Splatting分割的最优求解器,显著提升了将 2D 分割提升到 3D 空间的准确性和效率。通过将 3D-GS 中的 alpha 组合分解为每个高斯的总体贡献,这种求解器只需要单步优化来获得最优分配。它不仅将优化过程加快了约 50 倍,而且通过简单的背景偏差增强了对噪声的鲁棒性。此外,这种方法还扩展到场景分割,并能够在新视图上渲染mask。大量实验表明,该方法在场景分割任务中表现优越,包括对象移除和修复。我们希望这项工作能够促进未来 3D 场景的理解和操作。
#深度学习模型训练和部署的基本步骤
训练深度学习模型的过程需要管理许多不同的步骤和组件。从数据准备到模型评估,每个步骤对于确保模型的成功都至关重要。
1. 数据验证
高质量数据是任何深度学习模型的基础。即使是最复杂的算法在劣质数据上也无法取得良好效果。以下是确保您的数据已准备好进行训练的方法:
- 确保数据质量:首先检查数据是否存在问题,例如文件损坏、条目缺失或任何表明数据可能不适合训练的迹象。尽早发现这些问题可以为您省去以后的麻烦。
- 数据清理:原始数据中经常会发现错误、缺失值或不一致。通过删除或修复有问题的条目并在必要时用 NAN 或平均值填充来解决这些问题。此清理步骤可确保您的数据准确且一致。
- 数据一致性:检查您的数据是否在所有变量中遵循统一的格式和比例。例如,如果您正在处理图像,请确保它们的大小和分辨率都相同。数据一致性有助于模型可靠地学习,并最大限度地降低变异性影响模型性能的风险。
- 离群值和异常:离群值可能会影响模型性能并导致结果不准确。识别任何异常数据点并决定是否排除它们、转换它们或通过正则化来解释它们,这样不会扭曲模型的学习。
2. 数据准备
验证完数据后,就可以开始为模型做准备了。适当的准备工作可以使您的数据与模型的要求保持一致,从而增强学习过程。关键步骤包括:
- 数据转换:对数据进行规范化或缩放,使值处于相似的范围内,从而帮助模型更有效地学习模式。对于图像,您可以执行数据增强(例如旋转或翻转)以引入更多变化。此过程可以通过将模型暴露给相似内容的不同表示来提高模型泛化到新数据的能力。
- 数据分割:将数据集分为三部分:训练集、验证集和测试集。训练集用于拟合模型,验证集用于调整模型,测试集用于评估最终模型的性能。这种划分可确保您的模型在每个阶段都在学习未知数据,从而降低过度拟合的风险。
3. 数据可视化
在开始模型训练之前,直观地了解数据会很有帮助。可视化可以揭示隐藏的模式、关系和潜在问题,指导您进行模型设计和特征工程。
- 探索性数据分析 (EDA):使用图表和图表探索数据分布、趋势和关系。直方图、散点图和箱线图是了解数据分布和集中趋势的绝佳工具。EDA 可帮助您掌握数据的基本特征。
- 特征相关性:分析不同特征如何相互作用以及与目标变量相互作用。例如,相关性热图可以显示哪些特征与您预测的结果密切相关。此步骤可以揭示哪些特征可能更重要,或者它们之间是否存在冗余。
- 洞察提取:从数据中获取洞察有助于选择优先考虑或进一步设计哪些特征。例如,如果您发现某些特征对目标有很大影响,您可能希望在特征选择中强调它们。
4. 模型架构
选择正确的模型架构是关键的一步。模型的结构直接影响其学习数据模式的能力。请考虑以下步骤来建立有效的模型:
- 选择模型类型:不同的问题需要不同的模型。例如,卷积神经网络 (CNN) 非常适合图像任务,而循环神经网络 (RNN) 和 Transformers 则适用于文本等序列。选择与您的数据和目标相符的模型类型。
- 设计层和连接:定义模型的层并选择正确的激活函数。确定模型的深度以及各层之间的连接方式。例如,深度架构可能更好地捕捉复杂模式,但可能需要更多数据才能有效训练。
- 利用预先训练的模型:不要从头开始,而是考虑通过迁移学习使用预先训练的模型。这可以加快训练速度,尤其是在使用有限数据的情况下,并且由于模型建立在先前知识的基础上,因此通常可以提高性能。
5. 训练超参数
超参数对于模型的学习效率起着重要作用。它们控制着训练过程的各个方面,因此找到正确的组合可以带来显著的不同。
- 学习率:学习率决定了模型更新权重的速度。较高的学习率可能会跳过最佳值,而较低的学习率可能会导致训练速度过慢。尝试不同的学习率以找到最佳平衡。
- 批次大小:批次大小决定模型在更新权重之前每次迭代处理的样本数量。较小的批次可以加快更新速度,但可能会产生噪音,而较大的批次更稳定,但需要更多内存。选择适合您的硬件并保持训练效率的批次大小。
- 周期数:周期数是模型遍历训练数据集的次数。周期数太少会导致欠拟合,而周期数太多则会导致过拟合。使用早期停止或验证性能来决定何时停止训练。
- 优化器的选择:不同的优化器会影响权重的更新方式。常见的选择包括 Adam、RMSProp、AdaDelta 和 SGD。请尝试看看哪种优化器最适合您的任务,因为每种优化器都有独特的优势,具体取决于数据集和问题类型。
6. 训练过程
设置好超参数后,您就可以训练模型了。此步骤包括编译模型、使用数据进行训练以及监控其进度。
- 模型编译:使用您选择的优化器、损失函数和指标编译模型。例如,分类任务通常使用交叉熵损失,而回归任务可能使用均方误差。在这里定义正确的设置有助于模型以符合您的目标的方式学习。
- 模型拟合:在训练数据集上训练模型,并监控其在验证集上的表现。这个过程是迭代的,您将根据模型的表现调整超参数。跟踪准确率或损失等指标,以了解模型的学习效果。
- 检查点:定期保存模型,或在观察到改进时保存模型。这样,您就可以保留模型的最佳性能版本,如果进一步训练导致过度拟合,则可以更轻松地恢复。如果出现中断训练的情况,定期检查点还可以保护您的工作。
7. 评估
评估模型的性能对于了解模型在现实场景中的表现至关重要。此步骤突出了模型的优势和需要改进的地方。
- 验证性能:使用验证集来衡量模型的准确性。此性能检查有助于确保模型不仅能记住训练数据,而且还能进行推广。
- 指标分析:根据您的任务,使用适当的指标(例如准确率、精确率、召回率和 F1 分数)评估模型。这些指标可以更详细地反映模型性能,尤其是对于不平衡的数据集或仅靠准确率不够的任务。
- 错误分析:确定模型出错的地方。通过检查这些错误,您通常可以找到指向需要改进的领域的模式,例如额外的数据清理、更多的特征工程或调整模型的架构。
8. 推理
模型经过训练和评估后,即可进行推理,即对新数据进行预测。推理是模型性能真正重要的地方,因为它现在用于现实世界的数据。请按照以下步骤确保预测顺畅且准确:
- 模型加载:将训练好的模型加载到将用于预测的环境中。这可以是生产服务器、Web 应用程序或用于测试的本地机器。
- 数据处理:确保推理输入数据的处理方式与训练和验证数据相同。预处理步骤(如规范化或调整大小)的一致性对于避免因数据格式不匹配而导致的性能问题至关重要。
- 预测:使用模型对新数据进行预测。在此过程中,您可能需要使用一小部分已知预期结果的数据运行测试。这有助于确认模型在推理中的表现是否符合预期。这是一个确认推理速度和资源使用情况是否符合您的要求的好时机,尤其是在大规模部署时。
9. 部署
部署模型涉及设置模型以实现一致使用,并监控其随时间推移的性能。请考虑以下步骤以确保可靠部署:
- 部署策略:根据您的需求确定部署方法。选项包括可扩展性的云部署、隐私的本地部署或低延迟的实时应用程序的边缘部署。
- 监控:部署后,设置监控以跟踪模型的性能并检测数据漂移等问题(当新数据偏离训练数据时)。通过关注模型的准确性和其他指标,您可以在问题影响用户之前发现它们。
- 更新和维护:模型需要不断发展才能保持相关性和准确性。计划定期更新,尤其是当您的数据随时间变化时。定期使用新数据进行重新训练可以帮助模型保持最新和有效。
#iVideoGPT
视频生成模型是世界模型吗?iVideoGPT: 交互式视频GPT,一种可扩展的世界模型
本文提出一种兼具可交互性和可扩展性的世界模型架构 iVideoGPT,基于视频的压缩标记化和自回归 Transformer,支持在百万条人类和机器人操作轨迹上预训练,并适配到动作条件视频预测、视觉规划和基于模型的强化学习等多种控制相关任务。
作者:吴佳龙,尹绍沣,冯宁亚,和煦,李栋,郝建业,龙明盛
链接:https://arxiv.org/pdf/2405.14369
主页:https://thuml.github.io/iVideoGPT
1.引言
近年来,以Sora为代表的视频生成模型,能够生成逼真的长视频,产生了广泛的应用。这引发了人们对于构建世界模型的设想:
视频生成模型是世界模型吗?
我们的回答是还不是。
- 从任务的视角,世界模型需要具备可交互性。它使得智能体能够在虚拟世界中根据当前观测产生候选动作,推演动作产生的后果,并根据想象的观测再次执行动作,如此往复,逐步找到解决问题的途径,相比于在真实世界中尝试更加高效和安全。
- 从数据的视角,世界模型需要具备可扩展性。它需要能够建模足够复杂的真实世界转移,而不仅仅局限在视觉简单的游戏上;更进一步地,我们希望世界模型能够从来自互联网的超大规模数据中学习世界演变的通用知识,从而能够泛化或快速迁移到特定任务场景。
- 然而,从模型的视角,在本文的工作开展时,主流的模型并没有同时满足交互性和扩展性的高要求:基于循环网络的世界模型缺乏高可扩展性,而视频生成模型则缺乏高可交互性(展开讨论见下文)。因此,本文的核心研究问题是:
如何基于可扩展的视频生成模型的进展来开发交互式的视觉世界模型?
2. 交互式视频预测作为世界模型
世界模型是由智能体学习用于模拟环境的内部模型。环境通常被建模为部分可观测的马尔可夫决策过程 (POMDP) , 其中状态转移概率定义为 , 且智能体往往仅能获得状态的不完全观测 。
尽管世界模型作为一种通用形式可以学习多种类型的数据,视频是一种与任务无关、广泛可获取且包含丰富知识的模态。因此,我们专注于学习视觉世界模型(即 ),并将其形式化为交互式视频预测问题,这是一个智能体产生动作和世界模型推演转移的交替过程:
基于循环架构的世界模型,如 Dreamer,天然支持如上逐帧的可交互性,但循环神经网络的可扩展性不足,难以建模复杂的现实世界数据。视频生成模型,如 Stable Video Diffusion 和 VideoGPT 等,虽然发展了更加可扩展的架构,但其往往具有时间维度上非因果的信息融合模块,导致它们仅能提供轨迹级的交互性:
即,仅允许在视频生成开始前输入文本/动作条件,缺乏在模拟过程中进行中间动作控制的能力,且通常生成固定长度的视频。
3. iVideoGPT
iVideoGPT是一种通用且高效的世界模型架构。它将视觉观测(通过压缩标记化)、动作和奖励等多模态信号整合为一个标记(token)序列,并通过自回归 Transformer 进行下一个标记预测(next-token prediction)提供交互式体验。
3.1 视频的压缩标记化
Transformer 更加擅长处理离散标记序列。不同于使用每帧独立的图像 tokenizer 导致序列过长,或使用 3D tokenzier 进行时空压缩时牺牲交互性,我们提出了一种具有双编码解码器的条件 VQGAN 来进行视频的压缩标记化。
具体地, 初始帧 包含丰富的上下文信息, 被每帧独立地离散化为 个标记:
相比之下,由于初始帧和未来帧之间存在时空冗余,仅需编码关键的动态信息,例如移动物体的位置和姿态等。为此,采用了条件编码器和解码器,仅需更少数量的个标记:
其中条件机制通过多尺度特征图之间的交叉注意力实现(与本组前序工作 ContextWM 相同)。
在本文中, 且 ,带来了每帧 16 倍的标记数量压缩。这样的压缩标记化带来了两个主要益处:
- 更短的标记序列,可加快生成速度,从而加速基于模型的规划和强化学习的 rollout;
- 更容易保持视频内容的时间一致性,专注于关键动态信息的建模。
3.2 基于自回归 Transformer 的交互式预测
经标记化后,视频被展平为一个标记序列:
其中插入了特殊的槽标记(slot token),用于指示帧之间的边界,并便于融入额外的低维模态(见下)。一个 GPT 式的自回归 Transformer 被训练用于生成下一个标记,从而实现未来的逐帧预测。在本文中,我们采用了 GPT-2 尺寸的 LLaMA 架构。
采用下一个token预测的序列建模范式为我们带来了指定不同任务、输入、输出的高度灵活性。
(1) 序列建模的灵活性:多模态
iVideoGPT 可以灵活地整合不同模态的输入输出。在本文中,我们通过线性映射将动作信息添加到槽标记的嵌入中;对于奖励预测,我们在每帧观测的最后一个标记的隐藏状态后接一个线性预测头并使用 MSE 损失训练。
实现完全的多模态离散标记序列也是可行的,可以利用相关工作中已经发展了的动作、奖励量化(quantization)等技术。
(2) 序列建模的灵活性:多任务
4.预训练与微调范式
基于 GPT 的架构具有良好的可扩展性,这使我们可以在大规模数据上进行有效的预训练。
世界模型的视频预训练范式(action-free video pre-training)以视频预测作为自监督预训练任务。我们基于这一通用任务预训练 iVideoGPT,优化交叉熵损失来预测未来帧的标记:
其中是需要预测的帧的第一个标记的下标。
本文中,我们专门为机械臂操作领域预训练了 iVideoGPT,使用来自 Open X-Embodiment (OXE) 机械臂操作和 Something-Something v2 人手操作的混合数据集,总计 140 万条轨迹。不同机械臂和人手具有高度异构的动作空间,但可以被轻松统一在视频预训练框架下。
5.实验
5.1 视频预测
我们展示了 iVideoGPT 在不同数据集和设置上的视频预测结果。在大规模 Open X-Embodiment 数据上,基于无动作视频预测训练的 iVideoGPT 能够生成与真实轨迹不同,清晰、自然、多样化的机械臂操作轨迹,这说明它理解了与环境交互的一般规律。基于目标的视频预测训练的 iVideoGPT 则能够更加准确地预测到达目标的轨迹。
与之相比,基于循环网络架构的 DreamerV3-XL 模型(2 亿参数,与 iVideoGPT 相当)则缺乏在真实世界数据上进行大规模训练的能力,其在 OXE 上的预训练未能准确建模自然的机械臂动力学转移,仅能产生质量低且模糊的预测。
更多视频示例见:https://thuml.github.io/iVideoGPT/
iVideoGPT 可以自然扩展到基于动作的预测和高分辨率,并且不会有明显的时间不一致和闪烁伪影的问题。在下游数据集 BAIR robot pushing 和 RoboNet 上,iVideoGPT 取得了与最先进的模型相当的性能,并在架构上同时实现了交互性和可扩展性。
5.2 基于视觉的模型预测控制
优秀的感知指标并不总是正相关于有效的控制性能。我们在面向视觉规划的视频预测基准 VP2 上也进行了评估。iVideoGPT不仅可以在该领域上预测真实的物体碰撞,还在两个 RoboDesk 控制任务中以较大优势超越所有基线,并在平均性能上与最强模型相当。
5.3 基于视觉的强化学习
利用 iVideoGPT 作为交互式世界模型,我们基于 MBPO 实现了一种基于模型的强化学习算法:通过策略与世界模型交互生成虚拟轨迹来增广 replay buffer,以训练标准的 Actor-critic 算法(DrQ-v2)。将强大的世界模型作为环境的可插入式替代,这一简单的算法避免了使用潜空间想象(latent imagination;Dreamer 等最先进的 MBRL 算法广泛使用)技术,实现了模型学习与策略学习的解耦,能够显著简化算法设计空间,从而大幅提高 MBRL 算法在真实世界应用中的实用性和有效性。
我们在 MetaWorld 上 6 个具有不同难度的操作任务上进行了实验。我们的基于模型的算法不仅相较于无模型的基线显著提高了样本效率,还能够达到甚至超越 DreamerV3 的性能。据我们所知,这是 MBPO 首次成功应用于视觉连续控制任务。我们还证明了 iVideoGPT 的预训练能够帮助其快速适应到 MetaWorld 环境,提升 MBRL 的样本效率。相反,DreamerV3 则无法从其在相同数据上低效的预训练中获益。
5.4 模型分析
我们从以下几个方面对模型能力进行了分析:
- 少样本适配:预训练能够在下游数据不足(1,000 或 100 条轨迹)的情况下提供显著的性能收益;
- 模型扩展:通过增加计算可以构建更强大的 iVideoGPT,符合 Scaling Law;
- 计算效率:压缩标记化技术在略微牺牲重建质量的条件下,可以在训练时显著节省显存,并在推理时加快生成速度(1.46s vs. 22.8s);
- 场景-运动信息解耦:通过在重建未来帧时去除解码器中的对初始帧的交叉注意力模块,解码器仍然能够重建出与原始轨迹运动方式相同的轨迹,但视觉场景信息几乎完全丢失。
6. 总结
总而言之,我们提出了 iVideoGPT,这是一种基于压缩标记化和自回归 Transformer 的通用且高效的世界模型架构。iVideoGPT 能够在百万条人类与机器人操作轨迹上进行预训练,并适配于广泛的下游任务,实现了精准且具备良好泛化能力的视频预测,以及简化但高效的基于模型的强化学习。本研究弥合了视频生成模型与世界模型之间的差距,推进了通用交互式世界模型的发展。
iVideoGPT 仍有很大的空间可以改进。公开的机器人数据的数量和多样性仍然不足,iVideoGPT 需要在更广泛的数据上进行预训练,以便获取真正通用的世界知识,并观察在更复杂的机器人任务上的 Scaling Law。
欢迎感兴趣的朋友阅读我们的论文 (https://arxiv.org/abs/2405.15223) 或者访问项目主页 (https://thuml.github.io/iVideoGPT) 查看更多细节内容。