Mamba模型解读

论文地址: Mamba: Linear-Time Sequence Modeling with Selective State Spaces

代码: https://github.com/state-spaces/mamba

     天下苦 Transformer 久矣!整整7年了,一个理论上一点也不漂亮,纯粹靠着模型堆砌和工程上的大力出奇迹,统治了整个NLP 领域和如今大模型的发展。然而,它的局限性日益凸显,计算量的庞大,数据和算力需求越来越让凡人仰望。俱往矣,数风流人物,还看今朝。Mamba 模型的破土而出,让我们看到了结束这一切的曙光,也是为什么引起 A1 界广泛兴奋的原因,尤其是它回归时空序列建模,从中寻找灵感并将其与新型注意力机制结合的思路很有启发。
    原文较为晦涩,网上技术文章虽然不少,但一方面写文章的人照本宣科念经的比较多,自己压根没懂,导致读的人反而怀疑自己的智商;另一方面看到网上很多吃瓜群众跟着瞎起哄What l can say, Mamba out!你连它是啥都不知道,嘴都没亲一下,就 OUTOUT 啥?

它其实是用一个李指数映射代替了 Transformer 的非线性状态方程。估计大部分人连啥是“李指数”都没听说过。那这个模型到底是什么来头?凭什么能对transformer 的江湖地位形成挑战?原理是什么,与 RNN 等模型的联系是那些?为什么说它是用流体力学的思想指导了时序建模?牛逼之处和未来发展的看点在哪里?子日:知之为知之,不知为不知,是知也。

首先我们快速回顾一下 transformer 的本质缺陷。然后从传统的序列数据状态空间模型讲起补充所需的知识。接着重点讲解 Mamba 模型的核心原理、技术细节和真正精髓。然后通过实验体会它的牛逼效果以及代码实现。最后是总结和展望。

一、Transformer 的死穴

Transformer 结构的核心是自注意力机制层,甭管是encoder,还是 decoder,序列数据都先经过位置编码后喂给这个模块。

这里有个天然的缺陷,就是自注意力机制的计算范围仅限于窗口内,而无法直接处理窗口外的元素。像极了古语所说:两耳不闻窗外事,一心只读圣贤书。某种程度上造成视野狭窄,信息孤立,缺乏全局观一样,这种机制无法建模超出有限窗口的任何内容,看不到更长序列的世界。
于是有人说了,那增加窗口长度不就行了,没毛病,理论上可行。但对不起,这样会导致计算复杂度随着窗口长度的增加呈平方增长0(n^2),因为每个位置的计算都需要与窗口内的所有其他位置进行比较,如右图所示。

本质上说,它这是通过位置编码,把序列数据空间化,然后通过计算空间相关度反向建模时序相关度。这个过程中忽视了数据内在结构的细腻关联关系,而是采取了一种一视同仁的暴力关联模式,好处是直接简单,但显然参数效率低下,兄余度高,训练起来不易。那怎么办呢?俗话说:魔鬼的归魔鬼,天使的归天使。明明是时序数据,非要用空间化实现注意力机制。这在当年是为了充分利用 GPU的并行能力,非常有效,但并不是万能的。本质上说还是有问题的。让长序列数据建模回归传统,某种程度上说,这是整个SSM 类模型思考问题的初衷和视角。而 mamba 是其中的佼佼者。因此,咱们先从时序状态空间模型开始讲起。

二、时序状态空间模型 SSM

Mamba是基于结构化状态空间序列模型(SSMs)的,这是2021年提出的工作,算是火了两年了。需要补充读这篇文章。

实际上还是旧瓶装新酒,模型还是时序的,本身就是个 RNN 模型。我们用下面这三幅图来讲清它是怎么来的,长什么样,又怎么用。

实际上就是个RNN模型,但现在不是用神经网络实现这个模型,而是用状态方程,线性代数实现数学建模

1.连续空间的时序建模

很多实际问题都能用左图所示的连续空间模型来建模。尤其是控制理论、信号处理或者线性系统领域特别常见。我们称为 LTI,线性时不变 linear tiem-invariant 系统,用公式表示就是:

线性时不变系统(linear, time-invariant system, LTI) 就是有如下两个性质的一类系统:

线性:如果你同时向系统输入两个不同的信号,那么得到的输出和这两个信号各自向系统的输出之和相同。 用数学语言描述为,如果输入 x1 产生输出 y1 ,输入 x2 产生输出 y2,那么 输入 ax1+bx2 产生的输出为 ay1+by2 。这里 a 和 b 为常数。
时不变性:系统的作用效果不随时间的变化而变化,仅依赖于系统本身的状态。因此,如果输入变化仅是在时间上平移, 那么产生的输出变化也仅仅是相同的时间平移,其他都是一样的。

输入x乘以B+隐状态h乘以A得到隐状态导数,h乘以C得到输出。上面的叫状态方程,下面是观测方程,ABCD 是参数矩阵。也可以用右图更加清楚的看到它的矩阵变化关系。之所以叫时不变,就是 ABCD 是固定的,这当然是一种假设,而且是个强假设。D在上面的式子中没写主要是因为在许多实际系统中,它可以是零。很多人学SSM 弄着弄着就忘了这个强假设。transformer 本身是没有这样的假设的,也就是说可以用于时变系统和非线性系统。牺牲通用性,换来特定场景下的更高性能,这就是所有 SSM 模型的最底层逻辑。(画图:表示逻辑关系)

2.时序离散化与 RNN

连续系统不方便计算机处理,中间图是对它的离散化展开,就是沿时间拉长,模型和RNN 长相上几乎一样。公式与上面类似,只是导数h'(t)改为不同时刻角标,形成递归过程,这些完全是大学线性系统的内容。

原文在这里给出了一种从连续系统转换为离散系统的 ABC 参数对应关系,这段如果你没有控制理论基础或者线性代数不好的话,基本直接懵逼。不过它其实只是一种方法的举例,学名叫“零阶保持(Zero-Order Hold,ZOH)”。公式不用记,只要知道用了这么一个 delta 函数,经过这么一通运算能得到新的A和B就可以了。这个后面用得到。

其实,还有很多种离散化方法。离散化主要是为了方便计算机处理,同时也是 Mamba的一个技巧,后面会讲它怎么转化成类似 RNN 的门控机制。

3.并行化处理与CNN

如果只是时序建模,SSM 和 RNN 相比也就没啥意思了。它最大的特点就是通过下图卷积实现了计算上的并行化。

看图,就是把长长的链条一下子弄成了输入输出直接对应的样子,隐变量关联关系都跑到中间肚子里去了。先说结论:核心思想是用 CNN 对时序数据建模,借助不同尺度的卷积核,从不同时间尺度上捕获时序特征。数学上一番推导猛如虎之后能得到下面的公式。

第二个式子和前面的图完全对应,就是个CNN 实现。时序递归状态方程改用卷积操作实现了,ABC参数矩阵变成了K,就是图中绿色框内的卷积核。这就牛逼了哈,拖拖拉拉的时序计算变成了能一口气的并行计算。体现在效果上,借助不同卷积核捕捉局部时间序列特征,能同时对短期和长期依赖关系学习,并行计算提高了训练和推理效率,使得 SSMs 在处理复杂的时序数据时表现出色。
结论知道了,爱学习的同学一定好奇这是怎么来的,凭啥就能做这种转换。其实也没那么猛,全是线性系统中现成的内容,学信号处理或自动控制的同学应该很熟。为了让没学过的同学们过过瘾,梗直哥这里用人话给你快速推导一遍,也不难。前面的RNN 公式不是沿着时间迭代的嘛,以两个时刻为例:

离散卷积的定义:

将两个离散序列中的数,按照规则,两两相乘再相加的操作。计算卷积的过程:序列翻转,移位,相乘,取和。

你会发现,二者在结构上类似:
首先,最外面都是求和 Sigma,与虽然上限不同,但都是在一个范围内进行求和,对不同时间步和相应权重的线性组合,因此类似。其次,看输入信号,一个是x_{t-k},一个是x[k],无非是不同的时间步,都涉及时间偏移,因此也类似。
第三,看权重,一个是CB,一个是h[t-k],都是随着时间k变化的量。因此,时序的状态空间模型能改写成卷积的形式啦。到这里,不得不感慨一下。卷积可以说是个极其伟大的数学运算发明,起源于 100 多年前傅里叶变换的工作。它就像是一个“滤镜”,可以帮助我们突出信号中的某些特征,识别和提取信号中的重要信息,因此在信号处理与通信系统领域占据了核心地位。

除此之外,在上面式子中需要注意的是,实际问题中往往会对 ABC矩阵进一步简化假设成更简单的对角阵方便计算,这就是所谓的结构化 SSM,S4 模型。

到这里,再回来看看这幅图。你有没有赫然发现,历史总是重演的,三十年河东,三十年河西。大家熟悉的 CNN、RNN,眼瞅着过时了,没想到又能杀回来。我常提醒大家,想学好深度学习,一定要系统的学,这样你才能高屋建瓴,有全局观。不要一上来总盯着 transformer,但有些人不信邪,往往只想偷懒追风。其实,很多时候,“横看成岭侧成峰,远近高低各不同”。不同模型的巧妙利用和合理组合,也许会迸发新的活力,就像这个 SSM 一样,某种程度上,其实只是换了个名字的CNN 化的 RNN。
我们用生活中的例子来帮你更好理解 RNN 和 SSM 的区别。想象你在读一本书,时序嵌套的 RNN 每次只能读一行,然后把记忆传递到下一行,这种方法只适合处理短故事,故事一长,容易忘记前面的情节。而SSM 并行处理,同时打开所有页看到每行内容,这样就能快速找到和理解整本书,无需逐行传递记忆。

我们用生活中的例子来帮你更好理解 RNN 和 SSM 的区别。想象你在读一本书,时序嵌套的 RNN 每次只能读一行,然后把记忆传递到下一行,这种方法只适合处理短故事,故事一长,容易忘记前面的情节。而SSM 并行处理,同时打开所有页看到每行内容,这样就能快速找到和理解整本书,无需逐行传递记忆。
对应原文,我们已经讲完了简介和第二部分。你可能会问,看上去并行的SSM 就挺好的啊为啥不行呢?别忘了,这个系统还有两个强假设:线性+时不变。极大的限制了它的应用范围,因为实际系统大多为非线性、时变系统。Mamba本质上就是一个 SSM 模型的改进版,放开了这两个约束。

三、Mamba: 选择性 SSM

解决了 SSM 线性+时不变的缺陷

接下来咱们着重讲解什么是选择性 SSMMamba 主要体现在设计了一种机制,让状态空间具备选择性,达到了 Transformers 的建模能力,同时在序列长度上实现了线性扩展,也就是克服了 Transformers 的缺陷,可处理最长达百万长度的序列,而且效率贼高,与 GPU 硬件适配,比Transformers 快5倍,准确率相当甚至更好。这就是它为啥牛逼起来的原因啦。

核心就是搞懂这幅图,其实大致看看就明白,在时间序列模型中间设计了这么一坨非常类似LSMT的门结构,实现所谓的选择性,BC都带了t变成了时变参数,A虽然没有直接含t,但由于delat函数影响A,所以A其实也是时变的了。下面的蓝色部分就是所谓的选择机制,这个delat别小瞧,它就是前面离散函数,也是一个非线性的函数,一会有大用。要真正明白其中的细节,先要从增加选择性的动机开始讲,但其实简单理解就是把整个系统该用:
一个总开关 delat+若干个旋钮Bt,Ct ==非线性时变系统

下面的解释可以认为是对这种选择的合理化。

1.要解决什么问题

从某种角度看,序列建模的核心就是研究如何将长序列的上下文信息压缩到一个较小的状态中。比如,语言模型实际上就是在一个有限的词汇集合中不断进行转换。有统计表明,3500 多个常用中文字,3000个常用英文词能覆盖90%以上的日常用语。transformer 的注意力机制虽然很有效,但效率低,因为它需要存储整个上下文,导致推理和训练时间较长。前面讲的 SSM 递归模型可以并行处理,但因为它们的状态是有限的(单纯时不变导致),效率高但有效性受限于状态的压缩能力。

那能不能设计一种模型,平衡一下,实现这种类似的强选择能力。具体来说,本文关注两种能力:
一是抓重点的能力(选择性复制任务)。从大量信息中选择和记住关键的信息,忽略不相关的部分。类似于在人群中找到你的朋友或者在一篇文章中找到关键词。比如从下面句子中找出名词。

二是上下文联想/推理能力(诱导头任务)。在处理连续的信息时,能够保持逻辑一致
性和上下文的连贯性。比如下图的回答能力,只用了单样本学习。

这就像我们经常说一个人口才好,又能抓住重点,逻辑性又强

那具体怎么改进呢?当然还是在 SSM 基础上。前面我们说过,原来的 SSM 有个 LTI线性时不变系统的强假设(ABC是固定的),这样就导致难以有效的选择上下文信息。以下图为例,甭管输入x是啥,B自岿然不动,这不行,得想办法让它时变。

前面的全局卷积虽然能用不同的卷积核进行时序特征捕捉,但是缺乏内容感知,也就是不知道输入的重点和逻辑。而 transformer 人家本身是没有这些限制的,别说时不变,连线性系统假设都没有。这么一分析,改进的方向就很明确了哈。放开LTI模型的时不变约束,让模型参数依赖于输入内容不就行了吗?说起来简单,具体看看是怎么实现的。

2.怎么增加选择性

说穿了就是让 B和C由固定的变成了可变的,根据输入xt和它的压缩投影学习可变参数。A为了简化,自身还是不变的。蓝色部分(包括投影及其连线)就是所谓的选择机制,目的是根据输入内容选择性地记忆和处理信息,从而提高对复杂序列数据的适应能力。你看,这个思想是不是像极了LSTM,就是增加开关。

所谓的选择,其实人话理解,就是“掺和”。一次不够,用三条线给 B_t掺和了三次,给Ct掺和了两次,给A掺和了两次,看下面的算法因为函数 \tau 是非线性激活函数因此 delta 是非线性的,所以 ABC 都是非线性时变的,整个系统两个条件都放开了加了几个开关,多接了几条水管子。
(画图)演示

这里面的 deltat是前面离散化计算时的参数,我们刚才讲了。投影出来的三条蓝线其实就是S_B,S_C,S_delta 三个选择函数,共享一个投影模块(Project),主要是为了实现参数共享和计算效率。右边的 GPU SPAM、HBM 我们稍等再解释,主要和硬件实现相关。
来看看算法上是怎么实现的。如下面右图,不难就是分别用三个S函数根据输入把 B/C/delta都变成了时变的,这就是所谓的“掺和“过程,就这么简单。


再打个比方,左边就是直接拿一套固定的配方做菜,不管食材是什么。右边每次不同的食材调整配方,确保做出来的菜更适合当前的食材。你说哪个更香呢?

这么看 Mamba 的思想也不复杂啊,本质上就是拿 LSTM 的门控思想移植到了 SSM 模型上,放开了时不变的约束放成非线性系统。。

注意:这里的 B/L/N/D 符号乍一看让人很困惑,其实就是张量的维度。

B:批次大小(Batch size)。表示一次输入的数据量的大小。

L:序列长度(Sequence length)。表示每个序列中包含的时间步数。

N:特征维度(Feature dimension)。表示每个时间步的特征数量

D:输入特征维度(Inputfeature dimension)。

对左边的传统 SSM 模型,参数矩阵长这样,都是静止的

Mamba 的参数增加了L输入序列长度,因为是并行计算,且为时变参数,所以每个时间步的参数都不同,需要学习 L长序列时间步长的参数

其中步长大小 delta 像是个放大镜观察窗口,影响信息处理的焦点。步长较小时模型倾向于忽略具体的单词,而更多地依赖于之前的上下文信息。你可以简单的认为,就是靠着它,实现了注意力的选择。拿着放大镜忽远忽近的看。

另外,原文没有详细解释这几个选择函数,让人有些困惑。我这里都给你补上了。
SB(x)= LinearN(x),Sc(x)= LinearN(x),都是线性投影,这是种常见的神经网络操作,用于将输入数据转换到一个新的空间或维度。这里的 Linear 表示是用线性层来学习这几个函数。
SΔ(x)= BroadcastD(Linear(x)),广播是一个数组操作,它使得维度较小的数组能
够与维度较大的数组进行算术操作。
Ta= softplus,这是个平滑的非线性函数,通常用于网络中以添加非线性特征并帮助网络学习复杂的模式。

经过这样的优化设计,最终希望达到一个什么样的效果呢?图2给了一个示意图

左边是 LTI的效果,输出只能对规则的输入特征进行发现,而右边上面能自己找重了,带色的尽管开始间隔大小不一,但都能找出来排好队。右下是联想能力的体现再看到黑的后就想到以前后面应该跟着蓝色的。也就是说,对于非线性时变数据备了很强的特征捕捉能力。

3.核心原理:流体力学与李指数映射

明白了上面的内容,你只能算是知其然,还没有知其所以然。梗直哥带你从更高角度来理解 Mamba 的精髓,这部分内容的理解其实是哥的发挥,已然超出原文。Transformer 描述的是粒子运动,通过自注意力机制映射动态调整每个输入的权重,类似粒子间通过牛顿力学相互作用力来动态调整自己的轨迹。训练的过程,就是在用牛顿力学拟合粒子轨迹,每个输入(粒子)独立计算与其他输入的关系。
而 Mamba 描述的是流体运动,通过李指数映射来建模时空结构。流体运动描述的是连续介质中的分子集体行为,运动是整体的,内部各点之间有强烈的相互关系和依赖。流体的每个部分都受到整体流体运动的影响,通过内部压力、粘性等因素相互作用。这更符合记忆的本质,因为记忆系统具有连续性、动态变化性和整体关联性,这些特性与流体的性质非常相似。流体模型能够更好地描述记忆中的信息如何相互关联、如何随着时间和新信息的出现进行动态调整和整合李指数映射(Lie exponential map)是一种数学工具,用于描述和分析一个向量场如何沿着另一个向量场发生变化,比如流体力学、电磁场、广义相对论的时空结构等解决了动态系统中相互作用的描述。它是群论和微分几何中重要的概念,来源于李群和李代数的理论,是挪威数学家索菲斯 李引入的。

如果把记忆的流淌比作一个水流管道系统,可以看做一个“李群”,进行各种复杂变换(比如旋转、推移等)。固定矩阵A就是主管道(全局演变路径),类似于流体运动的全局关系,让系统状态更新有固定的全局路径和规则,因此能表现出更高的灵活性和适应性。Bt/Ct就是阀门或旋钮,delta这个离散化因子,就像是流体力学中的时间步长,决定流体运动的离散时间点。选择机制就像是根据具体情况选择和调整旋钮,控制流体在管道中的流动路径。
训练 mamba 的过程就是用李指数映射拟合流体力学动态系统,找到主管道 A,调整阀门和旋钮 Bt、Ct、At,获得最优流体流动路径,让模型能在高维特征空间中进行高效导航和决策。
想象一下:你站在输入 x_t和隐状态 h_t-1构成的向量场中,顺着记忆箭头(h_t-1的更新方向)的方向走,看其他箭头(系统各部分)是如何变化的。这就是流体力学中向量场间的相互作用。

Transformer 的自注意力机制粒子运动强调个体的独立性和动态调整,灵活性高,能动态调整权重,捕捉复杂的上下文依赖关系,但计算复杂度高,资源消耗大。Mamba流体运动强调整体的连续性和全局关系,借用独特的矩阵 A的固定性,提供了稳定性和确定性,通过李指数映射实现高效状态更新和决策。
我噻,绕了这么大一个弯子,其实就是在原来的 RNN 结构上增加了一些类似 LSTM 的门控机制嘛。idea 虽然不难,但难在认知深度是否到位,是否能够举一反三。此外,魔鬼在细节,明白了核心思想,我们接着再来看下。

4.实现细节和网络结构

这部分主要研究如何充分利用 GPU 实现选择性 SSM 的并行计算,也就是前面的图和算法。原文细节很多,大量引用了前人的工作,读起来有些费劲,尤其在没有阅读之前文章的情况下。
简单说,就是努力解决好“既要又要”“的问题,要立又要当立住表现力强的人设需要隐状态维度够大,而要当,速度和内存不能牺牲。为此,提出了三种创新的解决方案:内核融合、并行扫描和重计算。

1)所谓的内核融合:就是把离散化和循环在 GPU SRAM 内存中实现,快然后加载和存储参数 ABC矩阵都用 HBM 高带宽内存。这俩简写对 GPU 不熟的同学可能不知道,其实就是一种分层提升效率的新技术,前者快但内存带宽小,后者慢但是带宽大。这是随着 AI崛起的芯片新技术。

2)并行扫描:这是啥意思呢?本来 SSM 好不容易能用卷积并行运算了,但是放开 LTI假设后又回归 RNN 动态模型,每次 Bt不一样导致并行卷积不行了。Mamba为此做了改进,提出了并行扫描技术,scan 就是操作或处理的意思,
原文基本看不懂到底干了什么怎么实现的,看下图也很难理解。我人话讲下就懂了每个状态 H相当于一个人,看它对应的这条处理线程。自己忙活自己的,吃着碗里看着锅里,当别人的饭做好后,就抢过来用一下,所以某种程度上实现了并行计算。

3)重计算:这步是为了避免存储反向传播所需的中间状态,在输入从 HBM 加载到SRAM 时在反向通道中重计算。这部分的更多细节在附录 D中。简单小结:这部分讲解的就是内存管理、并行计算和动态计算方面的执行细节。开始看不懂不影响整篇文章主体内容的理解。可以先放放。

好,到这里我们总算把 Mamba 的核心原理讲完了,那它的网络结构具体是怎么实现的呢?是不是有点“干呼万唤始出来,犹抱琵琶半遮面”。
“Mamba”这个名字来源于黑曼巴蛇 (Black Mamba),以速度和致命著称。这种命名意在传达该架构的速度、灵活性和高效性,反映出它在处理和转换数据方面的强大能力。其实就是前面 selective SSM 的一种具体实现或者说封装。
看下面两幅图就都明白了。原文给出的这幅图讲解了它的来源,网络结构延续了 H3 作为标准的 SSM 模型的实现,简单说就是用线性投影+卷积 +SSM,这个只适用于 LTI 系统。现在改成时变系统了,怎么弄,又借鉴了门控 MLP的执行,通过梯形的投影操作实现数据准备。二者合成的 mamba就是右者。除了梯形外,还有激活函数进一步实现非线性。

下图是放大版,看的更清楚,修改了一下它用线性投影实现维度调整,以及部分特征提取与转换,输出时用于数据压缩。增加了卷积层捕捉局部的时间依赖性

Selective ssM(状态空间模型)相当于把时序链条又折叠回去,肚子里包含了sA(x)和 T_Δ。用来捕获更广泛的依赖性,包括长距离的时间依赖性和复杂的内容依赖关系。Silu 函数与算法中的 softplus 函数类似,都是用来增加非线性。其实这个 silu 是工程上人为进一步增加的非线性,增强模型表达力。此外,增加卷积模块是为了捕获局部时空特征。

封装后就是一个的模块,如同 transformer 的 decoder 一样可以实现进一步的堆叠,形成大模型。把这个模块和前面的框图对比学习,同时要清楚的意识到哪里是对应的哪些是工程化添加的边角料。当然,这也是为啥再单独起一个名字 Mamba 的原因毕竟和前面讲的 selective ssM 不完全一样了。
到目前为止,我们已经讲完了 3.4 部分,原文 3.5 部分是对上述结构的一些更具体解释,包括在特定情况下,可以退化为类似 RNN 门控机制。再看后面关于选择机制的解释,这篇文章的一大特点就是旁征博引,说实话读起来不太容易,估计很少有人能原汁原味的读懂,大多数都在道听途说或者直接调库拉倒。但真懂了,你的认知绝对不一样。这部分涉及更细的一些内容,不建议一开始一猛子扎太深容易晕,先抓整体逻辑。

接下来看看实验内容。

四、实验

对比 transformer/RNN和Mamba 的训练与推理性能。transformer 训练快推理慢,RNN 训练慢推理快,Mamba结合了二者的优点,都快。实验部分很全面也是一大特点。我们重点看结论。

1.合成任务验证选择机制

选择性复制任务要求模型能够记住并复制序列中的特定单词。表- Mamba 架构与选择性机制结合后的表现优秀,(S6):准确率为 99.8扩展序列长度任务要求模型看到一个二元组(如“Harry Potter”)时,能够记住“Harry并在序列中再次出现时预测“Potter”。Mamba架构,也就是最上面的棕色线,比其他方法要好两倍。

2、语言模型预训练

左图是较短右图是较长的序列长度,
对比了不同模型,横轴为 FLOPs 计算复杂度由低到高,纵轴为困惑度 Mamba 模型最低。它是第一个无需注意力机制就能在扩展定律 scaling Laws 上匹敌强大Transformer++模型的架构。

3.DNA 序列

由于大型语言模型的成功,人们开始探索将基础模型范式应用于基因组学。DNA被视为一种由有限词汇组成的离散序列,需要模型处理长程依赖。实验和图表展示了Mamba 架构在 DNA 建模任务中的卓越性能,特别是在处理长序列和扩展模型大小方面。

横轴为参数量,纵轴为困惑度。Mamba(橙色线)的困惑度左图随着参数数量的增加(从约 200K 到约 40M)显著下降,右图随着序列长度保持稳定。下面是物种 DNA分类任务的微调准确率和不同数据集上的扩展定律。随序列长度,Mamba性能更好。

4.音频例子

音频波形建模和生成问题也是序列建模任务。

5.训练推理效率分析

训练效率:Mamba 的扫描实现比标准实现快 40 倍,处理长序列时时间增长最慢(橙线)。对比蓝线,最右边512时,1ms/0.025ms=40倍
·推理效率:Mamba 在推理阶段的吞吐量比Transformers 高5倍,特别是在大批次处理时,显著优于其他模型。蓝色条的高度明显高于其他模型。此外,文章最后还给出了消融实验分析架构。

6.消融实验分析

主要结论包括:
Δ是最重要的参数,其次是B和C的组合使用,这个好理解,选择性主要就靠它来确定几个函数S_B,S_C,S_delta。随机初始化表现较好,复杂初始化效果较差。增大 N(SSM 状态维度)显著改善性能,成本增加微乎其微,但只有在B和C也选择性时才有效。这些发现验证了选择性 SSM 在语言建模任务中的有效性和优势。

五、代码实现

GitHub:https://github.com/state-spaces/mamba

Mamba 类:
主要用于实现选择性状态空间模型(SSM),通过一维卷积和状态更新来处理输入特征。
使用线性投影和激活函数来调整特征维度和计算时间步长。
通过选择性扫描函数来高效地更新状态。

六、小结与探讨

  1. Transformer注意力机制的窗口小了效果差,大了计算复杂度平方暴涨,的死穴:两难。时序问题空间化出现了瓶颈,单纯的注意力机制有缺陷,并非万能,不是机制本身有问题,而是实现方式。这促使人们思考更换视角。
  2. SSM 模型:从 LTI连续空间线性时不变系统讲起,类似 RNN 离散化,CNN 并行化,但都没离开线性+参数矩阵时不变两个假设。
  3. Mamba 原理:提出了选择机制,其实就是时序门控单元。通过离散化函数 delta 这个非线性总开关控制 ABC矩阵三个小旋钮开关,相当于放开了时不变约束,实现时变。与此同时,在选择性 SSM 这个核心模块之外,还通过增加激活函数进一步提升模型表征力,利用卷积层增强空间特征捕捉力。可以认为Mamba=RNN(变形GRU)+CNN+选择性注意力机制
  4. 思想精髓:流体力学系统+李指数映射+固定矩阵A最优主管道=独特的处理方法
    transformer 横行霸道7年了,七年之痒也该到了。凭什么注意力机制就是王者,记忆的问题还用时序解决就不行吗?只不过平衡好时空关系,兼顾准确与效率就可以了。Mamba 的出现让人们看到了一种新的可能,传统模型依然可以重见天日。无数成熟模型,依然可以老当益壮,重上战场,面对大模型的时代再创辉煌。从某种程度上说选择性机制又何尝不是一种注意力机制,这个视角看起来,Mamba 并没有丢掉它,而是换了一种方式结合了时序模型和注意力机制的优势,以另外一种面目示人。RNN 如此,更何况 LSTM 呢!

裸眼3D相关产品

随着AIGC等前沿技术的迅速发展,互联网正在逐步从2D转向3D,我们正在迎来一个体验升维的新时代。除了“人戴眼镜”的XR、元宇宙设备,联想也在探索“屏戴眼镜”的裸眼3D技术。这种技术使用户无需佩戴任何额外设备,就能体验到真实的3D效果。基于联想研究院的低延时双眼追踪、跨应用3D渲染引擎,以及业界首个支持4K超高清的实时2D内容转3D等技术,联想推出了全球首款27英寸4K裸眼3D显示器,并在1月份的国际消费电子展(CES)上进行了展示,持续引领下一代设备创新潮流。联想的裸眼3D显示引擎代表着当今显示技术的一个重要创新趋势,它以尖端的裸眼3D显示技术作为核心,创新性地构建了一个全面的3D系统级显示空间。这一技术的核心在于其能够无缝整合包括自主研发的实时高清2D转3D应用和跨应用渲染显示应用在内的一些列应用生态,从而使用户能够沉浸在一个逼真的3D环境中,体验3D世界中的生态内容

通过联想的这一革命性技术,用户能够体验到前所未有的3D视觉效果,无论是观看电影、玩游戏还是进行专业级的设计工作,都能获得更加立体和真实的感觉。此外,联想裸眼3D技术及解决方案能够支持丰富的3D生态资源,为用户提供广泛的3D内容选择,不仅增强了娱乐体验,也为专业应用,如教育、医疗和工业设计等领域开启了新的可能性。

值得一提的是,联想的裸眼3D显示技术及解决方案也具有很高的易用性。它能够智能识别用户的观看习惯,能够根据不同的观看角度和距离,实时调整3D效果,从而确保最佳的视觉体验。联想裸眼3D显示产品及技术解决方案的推出,不仅展示了联想在显示技术领域的创新实力,也为整个3D显示行业的发展开辟了新的道路。

相关链接:https://mp.weixin.qq.com/s/iYxyyWJfroIvbOPDg4AY1g

https://mp.weixin.qq.com/s/P52TiW0WM9rQtBe4nLMiiA

Real-Time Radiance Fields for Single-Image Portrait View Synthesis 论文

选自SIGGRAPH 2023实时渲染领域论文。文章实现了最新的单图像实时合成三维视角的技术。

论文题目:Live 3D Portrait: Real-Time Radiance Fields for Single-Image Portrait View Synthesis
论文链接:https://research.nvidia.com/labs/nxp/lp3d/

Paper PDF

本文提出了从单张图像实时推理渲染照片级 3D 表示的单样本方法,该方法给定单张 RGB 输入图像后,编码器直接预测神经辐射场的规范化三平面表示,从而通过体渲染实现 3D 感知的新视图合成。该方法仅使用合成数据进行训练,通过结合基于 Transformer 的编码器和数据增强策略,可以处理现实世界中具有挑战性的输入图像,并且无需任何特殊处理即可逐帧应用于视频。

INTRODUCTION

随着NeRF的提出,三维视觉技术得到快速的发展。三维重建也是非常有意义的工作,其中,单张肖像实现实时三维视角的合成将推动AR、VR、3D远程会议的发展。

基于此,作者提出了该技术的最新方法,该技术的原文表述是infer and render a photorealistic 3D representation from a single unposed image (e.g., face portrait) in real-time.

先来看现有的方法,一般用NeRF+GANs实现3D感知图像生成。其中比较有名的一项技术是EG3D,EG3D的提出者也是本论文的共同作者之一,本文的工作是在EG3D的基础上展开的。

EG3D提出了一种高效的三平面3D表示(triplane 3D representation)(具体细节会在后续给出),并且能够达到与2D GANs相同的实时渲染质量。训练完成后,测试时微调(test-time fine tuning)完成单图像三维重建。但这种方法会有一些问题:

  • NeRF的训练通常需要优化目标(careful optimization objectives)和3D先验(additional 3D priors)
  • 测试时优化需要准确的相机姿态作为输入或优化相机姿态
  • 上述两点优化时耗时的,限制了实时应用

与以往重复使用预训练的generator不同,本篇论文训练了一个端到端的编码器(encoder end-to-end)用于直接从单个输入图像预测三平面3D特征。与以往依赖于多视图真实图像的采集相比,本文不需要获取真实图像,也不需要PBR(physically-based rendering)绘制那样耗时。相反,作者使用预训练的3D GAN生成的多视图一致的合成数据来监督三平面编码器,以便进行新视图合成,再结合数据增强策略和基于Transformer的编码器搭建好模型。在文章中作者展示了对人脸和猫脸三维重建的结果,但作者表示任何3D感知图像generator适用的类别,该模型同样适用。

概括下文章的工作贡献:

  1. 提出了一种前馈编码器模型,直接从输入图像推断三平面3D表示。不需要测试时优化。
  2. 提出了一种新的策略,仅使用从预训练的3D感知图像生成器生成的合成数据
  3. 结合基于Transformer的编码器和实时增强策略,该方法可以处理具有挑战性的输入图像。

2. RELATED WORK

2.1 Light Fields and Image-Based Rendering

传统的方法要么需要许多视图样本,要么需要光场相机作为训练数据。最近提出的NeRF结合3D隐式表示,运用体渲染的方式合成视图,但仍需要大量输入照片。

2.2 Few-shot novel view synthesis

最近一些扩展NeRF的工作用3D隐式表示完成了单图像合成,用到3D卷积、Transformers 等方法。但是这些方法都不是实时生成新视图的,并且都需要多视图图像来训练模型。而作者的方法只需要从预先训练的3D GAN生成的合成图像,这种3D GAN是由单视图图像的集合训练的。

2.3 Learning with synthetic data

当没有基准真实数据(ground truth data )时,合成数据为训练深度学习模型提供了有用的监督。这往往还需要额外的步骤来适应真实图像。

2.4 3D-aware portrait generation and manipulation

最近,3D感知图像生成方法开始解决从单视图2D图像集合中无条件生成逼真的3D表示的问题。结合神经体积渲染(neural volumetric rendering)和生成对抗网络(GANs),最新的3D GAN方法能够生成高分辨率多视图一致图像。作者采用EG3D 的三平面3D表示,实现单视图新视图合成。

2.5 3D GAN inversion

GAN inversion在2D领域取得很大进展,现有的3D GAN inversion方法将给定的图像投影到预训练的StyleGAN2 latent space上,并且在测试时需要摄像机姿态( approximate camera pose )和生成器权重微调( generator weight tuning),以重建域外输入图像。与同时期的工作不同,作者的前馈编码器将未定位的图像作为输入,并且不需要针对摄像机姿态的测试时优化。

2.6 Talking-head generators

给出单个目标肖像和驱动视频,这种Talking-head生成方法主要通过视频数据集训练,侧重于通过操纵2D肖像中的头像姿势和表情来生成talking-head视频。因此,这种方法不预测视点渲染的体积表示和三维几何信息。所以不予比较。

3. PRELIMINARIES: TRIPLANE-BASED 3D GAN

NeRF采用完全隐式的表示,使用神经网络来表示整个三维空间的辐射场,但计算往往需要花费大量时间。首先,对前沿的3D GAN方法EG3D进行概述。EG3D从单视图图像集合和相应的噪声相机姿势中学习3D感知图像生成,EG3D使用混合三平面表示来调节神经体积渲染过程,其中三个典型平面 ��,��,�� 都存储了三个2D特征网格 (feature grids)。使用StyleGAN2生成器,EG3D将噪声向量和相机姿势映射到三平面表示 �∈R256×256×96,对应于3个轴对齐的平面,每个平面具有32个通道。这些特征调节神经体积渲染。

Our hybrid explicit–implicit tri-plane representation (c) is fast and scales efficiently with resolution, enabling
greater detail for equal capacity.

简而言之,将特征存储在正交的三平面(triplane)表示中,通过特征值叠加计算出特定空间点的颜色、体积密度,通过NeRF进行训练,训练得到的参数也保存在三平面表示中。

4. METHOD

作者的目标是将EG3D生成模型的信息提炼到一个前馈编码器的pipline中,这可以直接将未定位的图像映射到一个规范的三平面3D表示,这里的规范表示,对于人脸,头部的中心是原点。该pipline仅需要单次前馈网络传递,从而避免了花销大的 GAN inversion过程,同时允许实时重新渲染输入的任意视点。

作者的工作主要集中在图像到三平面编码器和相关的合成训练方法上,使用EG3D的MLP体积渲染器和超分辨率架构,端到端地训练所有组件。下图是整个模型的推理和训练部分,是文章的重点。

图3图 2:推理和训练管线。在推理阶段,我们以单张图像作为输入,使用 DeepLabV3 提取低分辨率特征。这些特征经过 ViT 和卷积输出,与高分辨率特征串联,再通过 ViT 和卷积解码为三平面表示,从而为体渲染过程提供条件,生成深度、特征、颜色和超分辨率图像。在训练阶段,我们从 EG3D 中采样一个身份,渲染两个监督视图。第一个视图作为编码器输入,预测三平面,然后根据这两个视角进行体渲染,并将渲染结果与 EG3D 的结果进行比较优化。

我们的目标是将训练好的 EG3D 生成模型知识蒸馏至前馈编码管线,该管线只需一次前馈网络传播即可将单张图像直接映射为规范的三平面 3D 表示,同时允许对输入在自由视角下进行实时渲染。我们的贡献集中于图像到三平面编码器和相关的合成数据训练方法。我们使用 EG3D 中的 MLP 体渲染器和超分辨率架构,并对所有组件进行端到端的训练。

TensoRF-将体素网格分解为向量-平面 张量积形式的低秩张量之和

TensoRF: Tensorial Radiance Fields 是2022 年ECCV上的论文

论文地址:https://arxiv.org/abs/2203.09517

源码地址:https://github.com/apchenstu/Te

主页: https://apchenstu.github.io/TensoRF/

张量辐射场是一种新颖的建模和重建辐射场的方法。跟NeRF使用多层感知机隐式建模场景表达的方式不同,TensoRF将场景建模为一个四维的张量,张量中的每一项代表了一个体素,体素内包含了体积密度和多维的特征信息。论文的中心思想是使用张量分解技术,将4D张量分解成多个低秩的张量分量,以小见大

从上图中可以看出,张量辐射场可以达到:

1. 更好的质量

2. 更快的速度

3. 更小的模型体积

张量辐射场除了渲染质量更好之外,与同时期使用体素方式的研究相比占用更少的内存使用。张量辐射场在30分钟内就可以完成重建,并且模型的大小小于4M,这比NeRF更快,以及更小巧。使用VM分解方式的可以达到10分钟的时间,以及更好的质量,模型大小小于75M。TensoRF是第一个从张量的角度来看待辐射场建模,并提出了辐射场重建作为一个低秩张量重建的问题

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks

https://nvlabs.github.io/eg3d/

将三维坐标对应的体素特征定义为三个正交投影平面的特征

目前的3D GAN要么过于计算密集型,要么缺少多视图一致性,该方法加强了计算效率并且提升了重建质量。使用了显式-隐式结构,不仅生成多视角一致性图片,还能生成高质量3D几何。通过解耦feature generation和neural rendering,该架构就可以用上SOTA的2D CNN生成器比如styleGAN2。

使用单视角2D图片集,无监督地生成高质量且视角一致性强的3D模型,一直以来都是一个挑战。现存的3D GANs要不计算量巨大,要不无法保证3D-consistent。前者限制了生成图片的质量,后者无法解决视角一致性的问题。这篇工作提出的新网络架构,能又快又好地生成3D geometry。

这篇工作提出了两个方法。首先,作者用显隐混合的方法,提高了时空效率,并有较高的质量。第二,提出了dual-discrimination策略,保证了多视角一致性。同时,还引入了pose-based conditioning to the generator,可以解耦pose相关的参数,保证了输出的视角一致性,同时忠实地重建数据集隐含的pose-correlated参数。

同时,这个框架能解耦特征生成和神经渲染,从而可以直接使用SOTA的2D GANs,比如StyleGAN2。

contribution

  • 引入一个基于三平面的3D GAN架构,计算效率高而且效果质量好
  • 提出一个3D GAN训练策略,通过dual discrimination和generator pose conditioning加强多视角一致性,建模出位置相关的属性分布(比如表情等)
  • 在FFHQ和AFHQ上有最佳的非条件3D感知视图合成结果,生成高质量3D几何

Tri-Plane Hybrid 3D Representation

我们需要一种高效且表达力强的3D表示方法,来训练高分辨率的GAN。

这里以单场景过拟合(SSO)来证明三平面表示法的有效性。

每个平面都是N×N×C的,其中C是通道数。

每次查询一个3D坐标x∈R3,将其投影至每个平面上,用双线性插值得到3个特征向量Fxy,Fxz,Fyz

将这3个特征向量累加后,通过一个轻量级的decoder,也就是一个小型MLP,输出RGB和Density

再用volume rendering得到最终图像

这样做的好处是,decoder规模很小,赋予了显式表示更强的表达能力,并减小了计算压力。

在新视角合成的实验上,三平面紧凑而富有表达力,以更低的计算成本,得到了更好的表现,三平面的时空成本是O(N2)的,而voxel是O(N3)的,最重要的是,用2D GANs生成planes,就能得到3D表示。对比NERF,通过显式的投影降低了计算复杂度同时没有减少表达性能。做了个对比实验,baseline是mip-nerf和voxel grid,这里的tri-plane实验中的MLP用了傅里叶feature编码。在同样地内存消耗下运算更快,在同样地结构下速度快且内存消耗少。

Pipeline

CNN Generator Backbone & Rendering

三平面的特征,是由StyleGANA生成的,同时Latent Code和相机参数会输入Mapping Network,生成一个Intermediate Latent Code

StyleGAN2被修改后,输出256×256×96256×256×96的特征图,之后被reshape成32通道的平面

接着从三平面采样,累加后,通过轻量级decoder,生成density和32通道的特征,然后由neural volume renderer生成2D特征图(而非RGB图)

Super Resolution

三平面仍不足以直接生成高分辨率图,因此添加了超分模块

使用了2个StyleGAN2的卷积层,上采样并优化32通道特征图,得到最终的RGB图像

Dual Discrimination

对StyleGAN2的discrimination做了两个修改

首先,添加Dual Discrimination以保证生成图片的视角一致性,即保证原始图片(低分辨率生成的)和超分后的图片的一致性,将低分辨率图片直接双线性上采样后,和超分图片concat形成6通道图片,真实图片也模糊后的自己拼接,也形成6通道图片,进行判别。

这样做,不仅能encourage最终输出和真实图片的分布匹配,也让神经渲染器尽可能匹配下采样的真实图片,并让超分图片和神经渲染保持一致。

其次,作者对discriminator输入了相机内外参,作为一个conditioning label,从而让generator学到正确的3D先验。

Modeling Pose-Correlated Attributes

真实世界数据集如FFHQ,相机姿态与其他参数(如表情)有关联

比如,相机角度与人是否微笑是有关系的,这会导致生成结果视角不一致

因此,为了更好的生成质量,需要将这些参数与相机姿态解耦

这篇工作使用了Generator Pose Conditioning解耦pose和其他参数

Mapping Network不仅接受Latent Code,还接受相机参数做为输入

给予backbone相机姿态作为先验,从而让视角可以和生成产生联系

也就是说,generator可以建模数据集中隐式的pose dependent biases,更忠实地反映数据集特征

为了避免在渲染时因相机移动产生视角不一致,在渲染时保持generator输入的相机参数不变

ICCV’23|全场景单目深度绝对距离估计

作者丨尹炜  转自丨极市平台

本文提出了一个统一相机空间(canonical camera space)变换模块,明确解决了尺度模糊性问题,并且可以轻松地嵌入到现有的单目模型中。配备了论文的模块,单目模型可以在800万张图像和数千个相机模型上稳定地训练,从而实现了对室外图像的零样本泛化,其中包含未见过的相机设置。该论文所提方法也是第二届单目深度估计挑战中的冠军方案,在比赛的各个场景上都排第一。

Arxiv: https://arxiv.org/abs/2307.10984

Github: https://github.com/YvanYin/Metric3D

大家好,在这里给大家分享一下我们最近被 ICCV2023 接受的工作《Metric3D: Towards Zero-shot Metric 3D Prediction from A Single Image》。如何从单张图像恢复出绝对尺度的深度,并且重建出带有绝对尺度的3D场景是一个长期待解决的问题。当前最先进的单目深度估计具体分为两类:

第一类方法的目标是恢复准确的绝对深度,但是这一类的方法泛化性比较差,只能处理单个相机模型,并且由于不同相机存在尺度模糊性,导致无法执行混合数据训练来提升域泛化性。第二类方法针对性解决深度模型的零样本泛化问题,如LeReS/MiDaS/DPT/HDN等文章的方法,经过大规模混合数据集训练,并约束模型只学习相对深度。因此,该类方法都没法恢复绝对尺度。

在这项工作中,论文表明零样本单目度量深度估计的关键在于大规模数据训练以及解决来自各种相机模型的尺度模糊性。论文提出了一个统一相机空间(canonical camera space)变换模块, 明确解决了尺度模糊性问题,并且可以轻松地嵌入到现有的单目模型中。配备了论文的模块,单目模型可以在800万张图像和数千个相机模型上稳定地训练,从而实现了对室外图像的零样本泛化,其中包含未见过的相机设置。

下图(论文首页图)通过两个下游的应用,即SLAM和物体测量,来展示了针对零样本的泛化性以及尺度恢复的准确性。可以看出测量的结构尺寸和GT非常接近。值得注意的是,mono-slam系统通过引入预测的深度,能够消除scale drift的问题,并且slam系统能够实现metric mapping.

主要贡献:

  1. 提出了一种标准空间相机变换(canonical camera space transformation)和对应的逆变换(de-canonical camera space transformation)方法来解决来自不同相机设置的深度尺度模糊性问题。这使得论文方法可以从大规模数据集中学习强大的零样本(zero-shot)单目度量深度模型;
  2. 在模型训练过程中,论文还提出了一种随机提议正则化损失函数,有效提高了深度准确性;
  3. 论文方法在第二届单目深度估计挑战中获得了冠军,在比赛的各个场景上都排第一。
  4. 论文的模型在7个零样本基准测试上达到了最先进的性能。它能够在户外进行高质量的3D度量结构恢复,并且在几个下游任务中受益,如单目SLAM、3D场景重构和测量学。

CVPR2023挑战赛结果:

方法:

1.什么是尺度模糊性?

论文针对混合数据中的尺度模糊性做了详细的讲解。如下图所示:

上图通过一个简单的例子来说明什么是尺度的模糊性。 不同相机在不同距离下拍摄的照片示例。仅从图像内容来看,人们可能会认为最后两张照片是由同一个相机在相似的位置拍摄的。但实际上,由于拍摄图片采用了不同焦距的相机,这些照片是在不同的位置拍摄的。因此,相机的内部参数的变化导致了尺度的不确定性。对于从单张图像估计度量是至关重要的,否则问题就是不适定的。

2.什么影响深度的预测?

针对相机的传感器尺寸、像素的大小、还有相机的焦距,论文有如下观察。

2.1 传感器尺寸和像素大小不会影响度量深度估计

如下图所示,当用不同像素大小的相机拍摄同一个物体时候,虽然像元大小不同,物体在图像的分辨率不同,但是距离是一致的。因此,不同的摄像机传感器不会影响度量深度的估计。此外,传感器的尺寸只是影响了图像拍摄的视野,因此也不会影响深度的估计。

2.2 焦距对于深度估计的准确性非常重要

如下图所示,由于焦距不同,不同距离的物体在相机上的成像大小相同,在网络训练的时候,相似的图像,但是标签却不一致,就导致了一对多的标签映射,因此会导致网络混淆,影响训练。

3.方法的pipeline

方法的pipeline如下图所示。

本文提出了2种训练方法。两种方法都可以很容易的嵌入到当前任意的单目深度估计的框架中。整个方法的核心思想就是建立一个标准相机空间��, 然后将所有的训练数据都映射到这个空间,那么,所有的训练数据都可以被看做是同一个相机拍摄的。论文提出了2种方法进行这种变换,一种是通过变换训练图像,另一种是变换变换GT label。详细如下:

方法1:将标签进行转换

深度的模糊性是针对深度的。因此,第一种方法直接通过转换ground truth深度标签来解决这个问题。在训练阶段,通过乘以一个缩放因子来转换深度标签。在推理阶段,预测的深度处于规范化空间,需要进行反规范化转换以恢复度量信息。

方法2:将输入图像转换

第二种方法是将输入图像转换为模拟规范相机成像效果。具体来说,在训练阶段训练图像根据焦距按比例缩放resize,相机光心也进行了调整,然后进行随机裁剪图像用于训练。在推理阶段,反规范化转换将预测深度调整回原始大小而不进行缩放。

4.监督

论文采用了各种约束。包括LeReS论文提出的pair-wise normal regression loss,VirtualNormal论文提出的虚拟法矢的loss,还有Scale-invariant Log loss。除此之外,该论文还提出了一种新的loss,叫随机提议标准化损失(RPNL)。尺度平移不变损失被广泛应用于仿射不变深度估计,但它会压缩细粒度深度差异,特别是在近距离区域。因此,论文从真值深度和预测深度中随机裁剪若干小块,然后采用中位绝对偏差标准化对它们进行处理。这样,可以增强局部对比度。整体loss如下。

�=�PWN+�VNL+�silog +�RPNL

实验

1.零样本泛化测试

以下的几个表格都是做的零样本泛化实验。其中表格1中,在NYU和KITTI上和当前在他们上fitting的SOTA方法做了对比,发现在不引入该数据做训练,模型就能够恢复出精确的尺度。表格3,论文做了更多的这种零样本泛化的对比,比较了6个数据集。

另外,论文与SOTA仿射不变深度估计方法在5个zero-shot基准上的比较。论文的模型明显优于以前的方法

2.下游应用实验

三维重建实验: 论文展示出,直接将预测的连续帧深度重建成点云,并与各类的方法做了对比,包括MVS的方法,放射不变形深度估计的方法,无监督深度估计的方法,videodepth 深度估计的方法等做了对比,发现整体重建精度上会更好。

SLAM实验: 在如下的表格中,论文的度量深度估计方法可以作为单目SLAM系统的强大深度先验。在KITTI数据集上,将论文的度量深度直接输入到最先进的SLAM系统Droid-SLAM中,结果显示论文的深度使得SLAM系统的性能显著提升。

在ETH3D SLAM数据集上,论文的深度同样带来了更好的SLAM性能,并且能够极大的缓解尺度漂移的问题。

从下图可以看出,droid-slam系统在输入预测的深度后,轨迹和GT更加接近,并且没有尺度漂移的问题,见下面第一个例子。

3.In-the-wild 测量实验

论文从Flickr下载了一些图片,通过从metadata中读取相机的像元大小以及焦距(以mm为单位),粗略估算出相机的焦距(以像素为单位),从而预测出metric depth,然后重建出点云。从点云中可以测量出一些结构的大小,发现和GT相差并不那么大。

4.更多的深度图展示:

总结

本文解决了从单目图像重构三维度量场景的问题。为了解决由不同焦距引起的图像外观深度不确定性,论文提出了一种规范化相机空间转换方法。使用论文的方法,可以轻松地合并由10,000个相机拍摄的数百万数据,以训练一个度量深度模型。为了提高鲁棒性,论文收集了超过800万数据进行训练。几个零样本评估展示了论文工作的有效性和鲁棒性。论文进一步展示了在随机收集的互联网图像上进行计量学测量以及在大规模场景上进行密集建图的能力。

eNERF-实时三维人体重建

浙大三维视觉团队提出ENeRF,首次实现动态场景的实时照片级渲染 (SIGGRAPH Asia 2022)

论文链接:https://arxiv.org/abs/2112.01517

论文代码:https://github.com/zju3dv/ENeRF

论文主页:https://zju3dv.github.io/enerf/

摘自: https://zhuanlan.zhihu.com/p/586595657

1.1 论文的问题描述

输入是多个相机在固定机位拍摄的某个动态场景的多目视频,论文希望能生成该动态场景的自由视点视频。该问题有许多应用,例如虚拟呈现,电影游戏制作等。

1.2 当前方法在这个问题上的局限性

为了支持自由视点视频的应用,自由视点视频的渲染效果需要足够逼真,生成制作需要足够快,生成后在用户端的渲染也需要足够快。

最近一些方法基于隐式神经表示,利用体渲染技术优化场景表示,从而制作自由视点视频。D-NeRF[Pumarola et al., CVPR 2021] 利用隐式神经表示恢复了动态场景的motions,实现了照片级别的真实渲染。但是,这一类方法很难恢复复杂场景的motions,他们训练一个模型需要从几小时到几天不等的时间。此外,渲染一张图片通常需要分钟级的时间。

基于图像的渲染技术克服了以上方法的一些问题。第一,对于动态场景,IBRNet[Wang et al., CVPR 2021]能够把每一帧图像都当作单独的场景处理,从而不需要恢复场景的motions。第二,基于图像的渲染技术可以通过预训练模型避免每一时刻的重新训练。但是,IBRNet渲染一张图片仍然需要分钟级的时间。

IBRNet[Wang et al., CVPR 2021]

1.3 我们的观察和对问题的解决

为了解决基于图像的渲染技术渲染过慢的问题,论文提出结合显式表示和隐式表示两者的优点。具体而言,我们观察到通过MVS方法预测显式表示,例如深度图像,通常是很快的。利用此显式表示去引导隐式表示的体渲染过程中的采样,能够大幅降低此前方法在空间内密集采样点(包括空地方的点和被遮挡的点)造成的计算开销,从而实现加速。

通过MVS方法快速计算新视角的深度,利用深度仅在物体表面进行采样计算辐射场

2. 论文方法

2.1 基于MVS方法预测新视角的深度图像

我们首先使用MVS方法预测新视角的深度图像。给定标定好的相机姿态,我们利用待渲染的视角空间上临近的图像建立级联代价体,使用3D卷积网络处理代价体获得深度图像以及置信区间。

建立级联代价体预测深度图像以及置信区间

2.2 在场景的表面附近预测辐射场

给定上一步预测的深度置信区间,我们在此区间内采样若干点,通过图像特征和3D卷积网络得到的3D特征体,泛化的预测这些采样点的辐射场和密度。

在深度区间内采样少量点,利用图像特征预测这些点的辐射场,使用体渲染技术得到渲染图像

2.3 使用RGB图像优化ENeRF

在得到渲染结果后,我们使用图像的均方差损失函数端到端的优化网络参数。我们实验发现仅使用RGB图像优化网络参数即可获得高质量的渲染结果。

使用RGB图像优化ENeRF

3. 实验分析

3.1 消融实验分析

我们提供了消融实验分析去研究论文方法的每一步带来的影响。

第一行展示了基线方法(与MVSNeRF[Chen et al., ICCV 2021]相似),每条光线采样128个点,这样有着好的渲染结果,但是渲染速度比较慢。直接降低采样点的数量后,会导致渲染质量显著下降。使用论文提出的采样方法(Depth-gui.)后,能提升渲染质量,同时基本保持比较快的渲染速度。

为了进一步提高渲染速度,论文使用了级联的设计(Cascade Cost Volume),通过我们仔细的设计,我们将速度从9.7FPS提升到20.31FPS。

此外我们研究了额外使用地面真值深度图像来监督网络学习,我们发现它对最后的渲染质量不会有很大的影响,这说明了论文方法使用RGB图像端到端优化的鲁棒性。

ENeRF的消融实验

3.2 与SOTA方法的对比

我们在DTU,NeRF Synthetic以及Real Forward-facing静态场景数据集以及ZJUMoCap和DynamicCap动态场景数据集上进行了和之前方法的比较,我们在渲染速度上实现了较大的提升,并且在渲染质量上取得了有竞争力的结果。

ENeRF与SOTA方法在静态场景上的可视化结果的对比
ENeRF与SOTA方法在静态场景上的量化结果对比
ENeRF与SOTA方法在动态场景上的可视化结果对比
ENeRF与SOTA方法在动态场景上的量化结果对比

条件控制扩散模型

参考:https://www.zhangzhenhu.com/aigc/Guidance.html

无论是 DDPM 还是 DDIM,这些扩散模型在生成图片时,都是输入一个随机高斯噪声数据, 然后逐步的产出一张有意的真实图片。这个过程中每一步都是一个随机过程,所以每次执行产出的图片都不一样, 生成的图像多样性非常好。 但这也是一个缺点:生成的图像不可控,无法控制这个生成过程并令其生成我们想要的图像内容

鉴于此,很多研究中在如何控制图像生成过程方面提出了很多有效的方案。 直觉的讲,我们可以在扩散过程中引入额外的信息来指导或者说控制整个扩散模型, 假设这个额外的信息为 y,它可以是一段文本、一张图片或者图像的类别标签。 引入 y 之后的模型就变成了一个以 y 为条件的条件概率分布。

自然而然地,接下来就需要探讨,引入y 之后对前向扩散过程和逆向采用过程分别有什么影响,需要做出什么调整。 首先看下对前向扩散过程的影响,先说结论:引入 y 之后,对前向扩散过程没有任何影响。 其实,从直觉上讲,前向扩散过程是对原始图片加噪声,直至变成纯噪声,这个过程显然与 y没有任何关系。 但做研究要严谨,还是需要给出数学证明的。 证明过程在论文 1 中已经给出。

条件扩散模型的前向过程与非条件扩散模型的前向过程完全一样

1、classifier guidance

OpenAI 的团队在 2021 年发表一篇论文 1 : A. Diffusion models beat gans on image synthesis ,在这篇论文中,提出一种利用图片类别标签指导图像生成的方案,称为 classifier guidance, 通过这种改进使扩散模型生成图像的质量大幅提升,并在 IS 和 FID 评分上超过了 GAN 模型, 所以你看论文的名字,简单直接。

论文的源码在: https://github.com/openai/guided-diffusion 。

实际上这篇论文做了很多改进,比如对UNET也做了改进。但这里我们只关注 guidance 部分。 原论文的推导过程比较繁杂,这里我们采用另一篇文章 2 的推导方案, 直接从 score function 的角度去理解。

虽然引入 classifier guidance 效果很明显,但缺点也很明显:

  1. 需要额外一个分类器模型,极大增加了成本,包括训练成本和采样成本。
  2. 分类器的类别毕竟是有限集,不能涵盖全部情况,对于没有覆盖的标签类别会很不友好

后来《More Control for Free! Image Synthesis with Semantic Diffusion Guidance》推广了“Classifier”的概念,使得它也可以按图、按文来生成。Classifier-Guidance方案的训练成本比较低(熟悉NLP的读者可能还会想起与之很相似的PPLM模型),但是推断成本会高些,而且控制细节上通常没那么到位。

2、Classifier-free guidance

引导函数的方法存在一些问题:1)额外的计算量比较多;2)引导函数和扩散模型分别进行训练,不利于进一步扩增模型规模,不能够通过联合训练获得更好的效果。

  • 提出了一个等价的结构替换了外部的classifier,从而可以直接使用一个扩散模型来做条件生成任务。

实际做法只是改变了模型输入的内容,有conditional(随机高斯噪声+引导信息的embedding)和unconditional两种采样输入。两种输入都会被送到同一个diffusion model,从而让其能够具有无条件和有条件生成的能力。

3、CLIP Guidance

Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., Sastry, G., Askell, A., Mishkin, P., Clark, J., Krueger, G., and Sutskever, I. Learning transferable visual models from natural language supervision. arXiv:2103.00020, 2021

Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. arXiv:2105.05233.[2](1,2)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.[3]

Jonathan Ho and Tim Salimans. Classifier-free diffusion guidance. 2022. arXiv:2207.12598.[4]

Alex Nichol, Prafulla Dhariwal, Aditya Ramesh, Pranav Shyam, Pamela Mishkin, Bob McGrew, Ilya Sutskever, and Mark Chen. Glide: towards photorealistic image generation and editing with text-guided diffusion models. 2022. arXiv:2112.10741.[5]

Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen. Hierarchical text-conditional image generation with clip latents. 2022. arXiv:2204.06125.[6]

Chitwan Saharia, William Chan, Saurabh Saxena, Lala Li, Jay Whang, Emily Denton, Seyed Kamyar Seyed Ghasemipour, Burcu Karagol Ayan, S. Sara Mahdavi, Rapha Gontijo Lopes, Tim Salimans, Jonathan Ho, David J Fleet, and Mohammad Norouzi. Photorealistic text-to-image diffusion models with deep language understanding. 2022. arXiv:2205.11487.

去噪扩散隐式模型(Denoising Diffusion Implicit Models,DDIM)

Paper: https://arxiv.org/abs/2010.02502

Code: https://github.com/ermongroup/ddim

摘自:扩散模型之DDIM

在 DDPM 中,生成过程被定义为马尔可夫扩散过程的反向过程,在逆向采样过程的每一步,模型预测噪声

DDIM 的作者发现,扩散过程并不是必须遵循马尔科夫链, 在之后的基于分数的扩散模型以及基于随机微分等式的理论都有相同的结论。 基于此,DDIM 的作者重新定义了扩散过程和逆过程,并提出了一种新的采样技巧, 可以大幅减少采样的步骤,极大的提高了图像生成的效率,代价是牺牲了一定的多样性, 图像质量略微下降,但在可接受的范围内。

对于扩散模型来说,一个最大的缺点是需要设置较长的扩散步数才能得到好的效果,这导致了生成样本的速度较慢,比如扩散步数为1000的话,那么生成一个样本就要模型推理1000次。这篇文章我们将介绍另外一种扩散模型DDIMDenoising Diffusion Implicit Models),DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。

前提条件:1.马尔可夫过程。2.微小噪声变化。

步骤一:在DDPM中我们基于初始图像状态以及最终高斯噪声状态,通过贝叶斯公式以及多元高斯分布的散度公式,可以计算出每一步骤的逆向分布。之后继续重复上述对逆向分布的求解步骤,最终实现从纯高斯噪声,恢复到原始图片的步骤。

步骤二:模型优化部分通过最小化分布的交叉熵,预测出模型逆向分布的均值和方差,将其带入步骤一中的推理过程即可。

文章中存在的一个核心问题是:由于1.每个步骤都是马尔可夫链。2.每次加特征的均值和方差都需要控制在很小的范围下。因此我们不得不每一步都进行逆向的推理和运算,导致模型整体耗时很长。本文核心针对耗时问题进行优化,一句话总结:在满足DDPM中逆向推理的条件下,找到一种用 xt  x0 表达 xt−1 且能能大幅减少计算量的推理方式。

代码实现:

DDIM和DDPM的训练过程一样,所以可以直接在DDPM的基础上加一个新的生成方法(这里主要参考了DDIM官方代码以及diffusers库),具体代码如下所示:

class GaussianDiffusion:
    def __init__(self, timesteps=1000, beta_schedule='linear'):
     pass

    # ...
        
 # use ddim to sample
    @torch.no_grad()
    def ddim_sample(
        self,
        model,
        image_size,
        batch_size=8,
        channels=3,
        ddim_timesteps=50,
        ddim_discr_method="uniform",
        ddim_eta=0.0,
        clip_denoised=True):
        # make ddim timestep sequence
        if ddim_discr_method == 'uniform':
            c = self.timesteps // ddim_timesteps
            ddim_timestep_seq = np.asarray(list(range(0, self.timesteps, c)))
        elif ddim_discr_method == 'quad':
            ddim_timestep_seq = (
                (np.linspace(0, np.sqrt(self.timesteps * .8), ddim_timesteps)) ** 2
            ).astype(int)
        else:
            raise NotImplementedError(f'There is no ddim discretization method called "{ddim_discr_method}"')
        # add one to get the final alpha values right (the ones from first scale to data during sampling)
        ddim_timestep_seq = ddim_timestep_seq + 1
        # previous sequence
        ddim_timestep_prev_seq = np.append(np.array([0]), ddim_timestep_seq[:-1])
        
        device = next(model.parameters()).device
        # start from pure noise (for each example in the batch)
        sample_img = torch.randn((batch_size, channels, image_size, image_size), device=device)
        for i in tqdm(reversed(range(0, ddim_timesteps)), desc='sampling loop time step', total=ddim_timesteps):
            t = torch.full((batch_size,), ddim_timestep_seq[i], device=device, dtype=torch.long)
            prev_t = torch.full((batch_size,), ddim_timestep_prev_seq[i], device=device, dtype=torch.long)
            
            # 1. get current and previous alpha_cumprod
            alpha_cumprod_t = self._extract(self.alphas_cumprod, t, sample_img.shape)
            alpha_cumprod_t_prev = self._extract(self.alphas_cumprod, prev_t, sample_img.shape)
    
            # 2. predict noise using model
            pred_noise = model(sample_img, t)
            
            # 3. get the predicted x_0
            pred_x0 = (sample_img - torch.sqrt((1. - alpha_cumprod_t)) * pred_noise) / torch.sqrt(alpha_cumprod_t)
            if clip_denoised:
                pred_x0 = torch.clamp(pred_x0, min=-1., max=1.)
            
            # 4. compute variance: "sigma_t(η)" -> see formula (16)
            # σ_t = sqrt((1 − α_t−1)/(1 − α_t)) * sqrt(1 − α_t/α_t−1)
            sigmas_t = ddim_eta * torch.sqrt(
                (1 - alpha_cumprod_t_prev) / (1 - alpha_cumprod_t) * (1 - alpha_cumprod_t / alpha_cumprod_t_prev))
            
            # 5. compute "direction pointing to x_t" of formula (12)
            pred_dir_xt = torch.sqrt(1 - alpha_cumprod_t_prev - sigmas_t**2) * pred_noise
            
            # 6. compute x_{t-1} of formula (12)
            x_prev = torch.sqrt(alpha_cumprod_t_prev) * pred_x0 + pred_dir_xt + sigmas_t * torch.randn_like(sample_img)

            sample_img = x_prev
            
        return sample_img.cpu().numpy()

这里以MNIST数据集为例,训练的扩散步数为500,直接采用DDPM(即推理500次)生成的样本如下所示:

同样的模型,我们采用DDIM来加速生成过程,这里DDIM的采样步数为50,其生成的样本质量和500步的DDPM相当:

完整的代码示例见https://github.com/xiaohu2015/nngen

其它:重建和插值

如果从直观上看,DDIM的加速方式非常简单,直接采样一个子序列,其实论文DDPM+也采用了类似的方式来加速。另外DDIM和其它扩散模型的一个较大的区别是其生成过程是确定性的。

Claude2:ChatGPT的替代产品知识更新到23年,代码数学显著提升,免费可用

网址:https://claude.ai/chats

Anthropic是一家专注于人工智能(AI)研究的公司,由OpenAI的前首席科学家Ilya Sutskever和Dario Amodei共同创立。Claude是Anthropic公司发布的基于transformer架构的大语言模型,被认为是最接近ChatGPT的商业产品。

Claude模型可以在Slack中免费使用,一度是我们团队使用的ChatGPT的最强替代者,对中文支持很好,意图理解也非常优秀。Claude 2的发布应该会很快会在Slack中体现。本次也推出了Claude Chat网页版,完全免费,支持直接根据PDF总结结果(最高不超过10MB的文档,单词数应该是7.5万以内都可以)。

Claude模型介绍

Claude是Anthropic公司开发的一系列大型语言模型。这些模型使用了Transformer架构,并通过无监督学习、人类反馈强化学习(RLHF)进行训练。Claude模型可以理解和生成人类语言,用于各种任务,如回答问题、写作、编辑和编程。

大多数人使用Claude的感受应该都是它与ChatGPT很像,对意图的识别和文本的生成都有很好的支持。相比较免费版本的ChatGPT(训练数据在2021年9月之前),Claude模型中包含更多的最新数据,因此就免费版本来说,Claude更好。

Claude 2 在哪些方面得到了加强?

总的来说,Claude 2 注重提高以下能力:

  • Anthropic 致力于提高 Claude 作为编码助理的能力,Claude 2 在编码基准和人类反馈评估方面性能显著提升。
  • 长上下文(long-context)模型对于处理长文档、少量 prompt 以及使用复杂指令和规范进行控制特别有用。Claude 的上下文窗口从 9K token 扩展到了 100K token(Claude 2 已经扩展到 200K token,但目前发布版本仅支持 100K token)。
  • 以前的模型经过训练可以编写相当短的回答,但许多用户要求更长的输出。Claude 2 经过训练,可以生成最多 4000 个 token 的连贯文档,相当于大约 3000 个单词。
  • Claude 通常用于将长而复杂的自然语言文档转换为结构化数据格式。Claude 2 经过训练,可以更好地生成 JSON、XML、YAML、代码和 Markdown 格式的正确输出。
  • 虽然 Claude 的训练数据仍然主要是英语,但 Claude 2 的训练数据中非英语数据比例已经明显增加。
  • Claude 2 的训练数据包括 2022 年和 2023 年初更新的数据。这意味着它知道最近发生的事件,但它仍然可能会产生混淆。

该研究进行了一系列评估实验来测试 Claude 2 的性能水平,包括对齐评估和能力评估两部分。

在模型对齐方面,该研究针对大模型的三个关键要求做了具体评估,包括:遵循指令、生成内容有用(helpfulness);生成内容无害(harmlessness);生成内容准确、真实(honesty)。

Claude 2和之前的Claude模型都是通用的大型语言模型,使用Transformer架构。Claude 2是该公司迄今为止最强大的系统,它代表了从早期的“有用且无害”的语言助手模型到现在的连续演进。Claude 2并没有从先前模型和研究中带来变革性的变化,而是代表了一种连续的演变和一系列小而有意义的改进,这些改进建立在Anthropic过去2年多的研究基础之上。

Claude 2有几个非常重要的更新值得关注。

编码能力提升很大:

Claude 2在Codex HumanEval(一项Python编码测试)上的得分从56.0%提高到71.2%。官方的演示视频中,你可以直接上传一个代码文件(js库),然后Claude就可以自动分析代码并给出这个库的使用方法。

最高支持10万tokens的输入和4000个tokens的输出:

尽管很早之前Anthropic就生成Claude最高支持10万tokens的输入,但是一直没有发布。今天的Claude2宣布正式支持10万tokens的输入,并且可以一次性输出4000个tokens,大约3000多个单词。

这应该是目前最高的上下文限制了(超过GPT-4的32K)。

更新的训练数据

这一点比ChatGPT好,尽管付费版本的GPT-4支持插件方式来访问最新的数据。但是插件尤其是网络插件很多时候会出问题。而Claude2则是已经使用了2023年初的新数据来训练模型了。所以,模型本身对2023年之前发生的重要事情与内容应该都是知道的。

尽管ClaudeAI不支持插件。但是官方说,它是支持与搜索工具连接的,包括网络和数据库等。同时,也可以直接将文档发给Claude来分析