Sequence Modeling With CTC

网址: https://distill.pub/2017/ctc/

在语音识别中,我们的数据集是音频文件和其对应的文本,不幸的是,音频文件和文本很难在单词的单位上对齐。除了语言识别,在OCR,机器翻译中,都存在类似的Sequence to Sequence结构,同样也需要在预处理操作时进行对齐,但是这种对齐有时候是非常困难的。如果不使用对齐而直接训练模型时,由于人的语速的不同,或者字符间距离的不同,导致模型很难收敛。

我们可以设计一个规则,比如“一个字符对应十个语音输入”。但是人们的语速是不同的,所以这种规则总是可以被打破的。另一种方法是手动将每个字符与其在音频中的位置对齐。从建模的角度来看,这工作得很好,我们知道每个输入时间步的基本事实。 然而,这对数据集的标注工作是非常耗时的。

这个问题不仅仅出现在语音识别中。我们在许多其他地方看到它。来自图像或笔画序列的手写识别就是一个例子。

CTC(Connectionist Temporal Classification 连接时序分类)是一种避开输入与输出手动对齐的一种方式,是非常适合语音识别或者OCR这种应用的。

给定输入序列 𝑋=[𝑥1,𝑥2,…,𝑥𝑇] 以及对应的标签数据 𝑌=[𝑦1,𝑦2,..,𝑦𝑈] ,例如语音识别中的音频文件和文本文件。我们的工作是找到 𝑋 到 𝑌 的一个映射,这种对时序数据进行分类的算法叫做Temporal Classification。

对比传统的分类方法,时序分类有如下难点:

  1. 𝑋 和 𝑌 的长度都是变化的;
  2. 𝑋 和 𝑌 的长度是不相等的;
  3. 对于一个端到端的模型,我们并不希望手动设计𝑋 和 𝑌 的之间的对齐。

CTC提供了解决方案,对于一个给定的输入序列 𝑋 ,CTC给出所有可能的 𝑌 的输出分布。根据这个分布,我们可以输出最可能的结果或者给出某个输出的概率。我们会要求CTC有效地完成下面这两件事。

1、损失函数:给定输入序列 𝑋 ,我们希望最大化 𝑌 的后验概率 𝑃(𝑌|𝑋) , 𝑃(𝑌|𝑋) 应该是可导的,这样我们能执行梯度下降算法;

2、测试:给定一个训练好的模型和输入序列 𝑋 ,我们希望输出概率最高的 𝑌 :

当然,在测试时,我们希望 𝑌∗ 能够尽快的被搜索到。

算法详解

给定输入 𝑋 ,CTC输出每个可能输出及其条件概率。问题的关键是CTC的输出概率是如何考虑 𝑋 和 𝑌 之间的对齐的,这种对齐也是构建损失函数的基础。所以,首先我们分析CTC的对齐方式,然后我们在分析CTC的损失函数的构造。

1.1 对齐

需要注意的是,CTC本身是不需要对齐的,但是我们需要知道 𝑋 的输出路径和最终输出结果的对应关系,因为在CTC中,多个输出路径可能对应一个输出结果,举例来理解。例如在OCR的任务中,输入 𝑋 是含有“CAT”的图片,输出 𝑌 是文本[C, A, T]。将 𝑋 分割成若干个时间片,每个时间片得到一个输出,一个最简答的解决方案是合并连续重复出现的字母,如图2.

这个问题有两个缺点:

  1. 几乎不可能将 𝑋 的每个时间片都和输出Y对应上,例如OCR中字符的间隔,语音识别中的停顿;
  2. 不能处理有连续重复字符出现的情况,例如单词“HELLO”,按照上面的算法,输出的是“HELO”而非“HELLO”。

为了解决上面的问题,CTC引入了空白字符 𝜖 ,例如OCR中的字符间距,语音识别中的停顿均表示为 𝜖 。所以,CTC的对齐涉及去除重复字母和去除 𝜖 两部分,如图3。

这种对齐方式有三个特征:

  1. 𝑋 与 𝑌 之间的时间片映射是单调的,即如果 𝑋 向前移动一个时间片, 𝑌 保持不动或者也向前移动一个时间片;
  2. 𝑋 与 𝑌 之间的映射是多对一的,一个或多个输入元素可以与单个输出元素对齐,但反之则不然,所以也有了特征3;
  3. 𝑋 的长度大于等于 𝑌 的长度。

1.2 损失函数

CTC对齐为我们提供了一种从每个时间步的概率到输出序列的概率的自然方法。

也就是说,对应标签 𝑌 ,其关于输入 𝑋 的后验概率可以表示为所有映射为 𝑌 的路径之和,我们的目标就是最大化 𝑌 关于 𝑥=𝑦 的后验概率 𝑃(𝑌|𝑋) 。假设每个时间片的输出是相互独立的,则路径的后验概率是每个时间片概率的累积,公式及其详细含义如图5。

上面的CTC算法存在性能问题,对于一个时间片长度为 𝑇 的 𝑁 分类任务,所有可能的路径数为 𝑁𝑇 ,在很多情况下,这几乎是一个宇宙级别的数字,用于计算Loss几乎是不现实的。在CTC中采用了动态规划的思想来对查找路径进行剪枝,算法的核心思想是如果路径 𝜋1 和路径 𝜋2 在时间片 𝑡 之前的输出均相等,我们就可以提前合并他们,如图6。

其中,横轴的单位是 𝑋 的时间片,纵轴的单位是 𝑌 插入 𝜖 的序列 𝑍 。例如对于单词“ZOO”,插入 𝜖 后为:

𝑍={𝜖,𝑍,𝜖,𝑂,𝜖,𝑂,𝜖}

我们用 𝛼𝑠,𝑡 表示路径中已经合并的在横轴单位为 𝑡 ,纵轴单位为 𝑠 的节点。根据CTC的对齐方式的三个特征,输入有9个时间片,标签内容是“ZOO”, 𝑃(𝑌|𝑋) 的所有可能的合法路径如下图:

图7:CTC中单词ZOO的所有合法路径

有两个有效的起始节点和两个有效的最终节点,因为序列开头和结尾的 𝜖ϵ 是可选的。完全概率是最后两个节点的和。现在我们可以有效地计算损失函数,下一步是计算梯度并训练模型。CTC损失函数相对于每个时间步的输出概率是可微的,因为它只是它们的总和和乘积。考虑到这一点,我们可以解析地计算损失函数相对于(未归一化的)输出概率的梯度,并从那里像往常一样运行反向传播。

对于数据集 𝐷 ,模型的优化目标是最小化负对数似然:

1.3 预测

当我们训练好一个RNN模型时,给定一个输入序列 𝑋 ,我们需要找到最可能的输出,也就是求解

𝑌∗=arg⁡max𝑌⁡𝑝(𝑌|𝑋)

求解最可能的输出有两种方案,一种是Greedy Search,第二种是beam search

1.3.1 Greedy Search

每个时间片均取该时间片概率最高的节点作为输出:

1.3.2 Beam Search

Beam Search是寻找全局最优值和Greedy Search在查找时间和模型精度的一个折中。一个简单的beam search在每个时间片计算所有可能假设的概率,并从中选出最高的几个作为一组。然后再从这组假设的基础上产生概率最高的几个作为一组假设,依次进行,直到达到最后一个时间片,下图是beam search的宽度为3的搜索过程,红线为选中的假设。

到目前为止,我们提到了CTC的一些重要属性。在这里,我们将更深入地了解这些属性是什么以及它们提供了什么样的权衡。

CTC的性质:

  1. 条件独立:CTC的一个非常不合理的假设是其假设每个时间片都是相互独立的,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。
  2. 单调对齐:CTC的另外一个约束是输入 𝑋 与输出 𝑌 之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。
  3. 多对一映射:CTC的又一个约束是输入序列 𝑋 的长度大于标签数据 𝑌 的长度,但是对于 𝑌 的长度大于 𝑋 的长度的场景,CTC便失效了。

MambaOut-视觉领域的探索

https://arxiv.org/pdf/2405.07992
GitHub – yuweihao/MambaOut: MambaOut: Do We Really Need Mamba for Vision?

作者的主要观点可以概括如下:

  1. Mamba架构的适用性:作者认为Mamba架构,具有类似于RNN的token混合器状态空间模型(SSM),最适合处理具有长序列和自回归特性的任务。
  2. Mamba在视觉任务中的表现:尽管Mamba被引入以解决注意力机制的二次复杂性问题,并应用于视觉任务,但在图像分类等任务中,其性能通常不如卷积神经网络和基于注意力的模型。
  3. Mamba在图像分类任务中的不必要性:作者提出,由于图像分类任务既不符合长序列也不符合自回归特性,因此引入Mamba是不必要的。
  4. Mamba在检测和分割任务中的潜力:尽管检测和分割任务不是自回归的,但它们符合长序列特性,因此作者认为探索Mamba在这些任务中的潜力是有价值的。
  5. MambaOut模型的构建与验证:为了验证上述假设,作者构建了一系列名为MambaOut的模型,这些模型在不使用Mamba核心token混合器SSM的情况下堆叠Mamba块。实验结果强烈支持作者的假设。
  6. MambaOut模型的性能:MambaOut模型在ImageNet图像分类任务上超越了所有视觉Mamba模型,表明Mamba对于图像分类任务确实不是必需的。然而,在检测和分割任务上,MambaOut未能达到最先进的视觉Mamba模型的性能,显示了Mamba在长序列视觉任务中的潜力。
  7. 未来研究方向:由于计算资源的限制,本文仅验证了Mamba在视觉任务上的概念。作者提出,将来可能会进一步探索Mamba和RNN概念,以及RNN和Transformers在大型语言模型(LLMs)和大型多模态模型(LMMs)中的集成。

结论:本文从概念上讨论了Mamba机制,并得出结论认为它非常适合具有长序列和自回归特性的任务。我们根据这些标准分析了常见的视觉任务,并认为在ImageNet图像分类中引入Mamba是不必要的,因为它不符合这两个特性。然而,对于与长序列特性相符合的视觉检测和分割任务,Mamba的潜力值得进一步探索。为了实证支持我们的观点,我们开发了MambaOut模型,这些模型采用了没有核心标记混合器SSM的Mamba块。MambaOut在ImageNet上超越了所有视觉Mamba模型,然而与最先进的视觉Mamba模型相比,它表现出明显的性能差距,从而验证了我们的主张。由于计算资源的限制,本文仅验证了视觉任务中的Mamba概念。将来,我们可能会进一步探索Mamba和RNN概念,以及将RNN和Transformers集成到大型语言模型(LLMs)和大型多模态模型(LMMs)中。

一、Mamba 到底 OUT 了没?


文章首页展示方式非常赞的:
首先标题开宗明义,强调讨论点其实是 Mamba对 Vision 的应用?NLP 排除了,因为那就是纯纯的序列问题,Mamba 还是非常值得继续深入研究,还有很大水文的空间哈。其次,非常显著的给出了 github 代码连接,一句对科比的致敬也让技术型文章多了点人文色彩。它来自于科比 2016年4月 14日最后一场比赛后,为了感谢全场球迷有感而发脱口说的告别词。Mamba 原意是毒蛇,象征着科比在球场上的攻击性和坚韧不拔。后来几乎成了互联网上的一个梗。从 Transformer开始,AI界写论文都兴起玩梗了,既是为了宣传,也是为了突出与众不同,在万千文章中让人记住,用心良苦着实让人感动。但是不是Mamba 真的 OUT,咱们讲完就知道了。
第三,图1一目了然的给出了与 Mamba 模块的主要区别,就是干脆做减法去掉了 SSM 结构,右图体现了性能上的差别,注意这仅在ImageNet的分类任务上。没有 NLP 数据集,没有其他视觉任务,仅仅图像分类!

整个摘要的重点,也是结论性的东西,作者其实用斜体给你标出来了
1.long-sequence and autoregressive 这方面 Mamba 依然擅长,承认优点。
2.图像分类不是 autoregressive 自回归任务,也不是long-sequence,因此用不着 Mamba所以 MambaOut。比如在ImageNet 分类任务上
3还有第三个结论也很有意思,即使是视觉领域,目标检测和实例分割任务上 Mamba还OUT不了,依然有潜力。明白了吗?

二、如今该爱谁:Transformer、Mamba和MambaOUT

虽然标题大胆而耸人听闻,但引言部分还是很旗帜鲜明的给足了Mamba Credit。简单的说就Transformer 有硬伤,面对长序列时自注意力机制计算的复杂度会出现随窗口长度二次方增加的问题。

Mamba 模型的出现引起了 A1 社区的广泛兴趣,因为具有可并行训练和高效长序列推理的能力。除了 Mamba 外,很类似的还有 RWKV 模型大家也可以关注一下。最近这半年出来了一批模型。简单的说都是“RNN+注意力机制”相结合的产物,区别在于适用任务和架构设计上的差异,有的更专注于 NLP 任务,有的尝试用在视觉上。
整篇文章的研究重点其实就是前言中几行斜体字:

Do we really need Mamba for Vision? 视觉问题真得需要Mamba 模型吗Hypothesis 1:SSM 对于图像分类没有必要,因为该任务既不具有长序列特征也不具有自回归特征。
Hypothesis 2:sSM 可能对对象检测和实例分割有潜在好处,因为这些任务具有长序列特征,但不具有自回归特征。
重要的是三个问题:怎么分析的,模型怎么实现的,以及怎么用实验证明的。

第二部分相关工作简要小结了 Transformer 典型模型 BERT和 GPT系列,以及 ViT 强调了Transformer 中的注意力模块会随序列长度增加而扩展,带来显著的计算挑战。许多研究探索了各种策略来缓解这一问题,如低秩方法、内核化、token 混合范围限制和历史记忆压缩。这都是水文章的号方向。最近,RNN-like方法(特别是 RWKV和Mamba)因其在大规模语言模型中的出色表现而受到关注,这点到目前为止还是毋庸置疑的。

对于Transformer 的改进或者说平替,现在学界的一种典型思路就是回归传统模型,从故纸堆里找灵感。这篇文章的作者显然也认同这种观点,而且直接露骨的把它们称作 RNN-like 方法,其实最新的还有 xLSTM。但这种视角还是浅了,仅仅是从模型结构视角来看,做一种时序回归而已。第二段小结了 Mamba 最新的各种变体,包括 Vision Mamba 整合了 SSM 来开发类似ViT 的等向性视觉模型;VMamba 则利用 Mamba 构建类似 AlexNet和 ResNet 的分层视觉模型;LocalMamba 通过引入局部归纳偏置来增强视觉 Mamba 模型;

PlainMamba 旨在进一步提升等向性 Mamba 模型的性能,还有 EfficientVMamba等等。你看事实上大家这半年来以及像吸血鬼一样迅速扑上去搞 Mamba 了,把它作为Transformer 的平替。而这篇文章试图把自己打扮成“半血猎人“来拯救世界。你说它是Mamba吧,它说自己不是,你说它就是CNN吧,它非要把自己和Mamba比,还起了这么个名。有意思,也很拧巴。

三、核心原理

论文第三部分正式开始分析 Mamba优缺点,适合什么任务。直接看公式容易迷迷瞪瞪,不明觉厉:

1.Mamba 的本质回顾

文章中提到 Mamba 是个 token 混合器 mixer,这和我上期给大家讲的如出一辙,咱们当时是说“掺和”,看下图,B掺和了三次,C掺和了两次。

其实用流体力学视角 看 Mamba 更透彻,本质上就是当成一个记忆流淌的管道系统而 selective SSM 就是个带着总开关 delta + 两个阀门 BC + 主管道A的系统。因为A 与时间无关,因此隐藏状态 h可以视为固定大小的记忆,存储所有历史信息。固定大小意味着记忆不可避免地丢失,但保证了与当前输入集成的计算复杂性保持不变而通过总开关 delta + 两个阀门 BC 门控机制实现了一种选择性注意力机制。这种设计更加的高效,从更抽象的数学角度理解,是用李指数隐射拟合数据,替换了原有的牛顿力学运动方程。

2.自注意力机制的类别

相比之下,Transformer 中的自注意力机制更加复杂,如下图有两种:一种叫因果模式,其实就是只能看过去,不能看未来,只有记忆没有未卜先知;另一种是全可见模式,左右都知道。Transformer 本质上两种都可以,因果模式的比如 GPT,全可见的比如 BERT,前者适合自回归用来生成和预测,以史为鉴,后者适合理解,左顾右看瞻前顾后。

按照这种分类,Mamba的选择性机制算那种呢?显然不是全可见模式,看公式就知道是因果模式,但和 Transformer 的有什么不同呢?

下图展示了 Transformer 因果注意力与 Mamba 中因果注意力的区别,前者是组合(叠加)之前所有的记忆,记忆无损但复杂度增加,越累越长,计算复杂度同样为0(L^2):后者融合之前的记忆到新的隐藏状态,记忆有损但复杂度恒定

基于 Mamba 的这种特性,显然它适用于以下特征的任务

·特征 1:任务涉及处理长序列,因为复杂度低,更高效

·特征 2:任务需要因果 token 混合模式。

但这样以来还怎么 OUT 呀!于是他们反向思考:首先,什么时候不需要长序列呢?视觉作为空间数据,那种最不需要呢?你说是鸡蛋里挑骨头也好,逆向思维也好。既然逻辑上它擅长长序列,那就说明短序列一般,那咱们就摁着短序列搞不就成了。
其次,什么时候不需要因果注意力呢?什么问题需要全局可见注意力呢?着这个方向搞,不也能证明 Mamba不行吗?这种创新的思维方式确实聪明,典型的田忌赛马思路,你打你的,我打我的,拉到我擅长的地方打,你还打得过吗?

3.视觉任务的特点分析

在视觉识别任务中,感觉上图像分类就不属于长序列任务,因为主要关注整体特征空间特征就够了,目标也只是粗犷的类别标号,因此不涉及什么序列信息,而且需要全局信息。但是目标检测和语义分割则不一定,比如要考虑边缘的连贯性,因此可能有序列问题。但是,这种假设或者感觉怎么证明呢?首先,文章针对图像分类任务,做了全可见模式和因果模式性能的分析实验。如图所示:

左图是全可见模式,横纵轴互相都能看,BERT和ViT 的自注意力机制都是这种。中间图是因果模式,GPT的自注意力机制和 Mamba的 SSM 是这种,比如y3 只能看到x1-x3,看不见 x4-x5。右图显示以 ViT 为例,将自注意力机制从全可见模式切换到因果模式后,性能有所下降,说明对于图像分类问题,用因果模式没必要。
既然注意力机制的类型明确了,在图像分类这一亩三分地上干掉 Mamba 的可能性暴增。但老问题又回来了,怎么确定它是不是长序列任务呢?整篇文章最有点数学理论含量,也是最有看点的就是32关于图像处理任务是否属于长序列问题的分析。

分析的切入点选择了 Transformer 的浮点运算次数公式,也就是一个Transformer 块的
计算量:
FLOPs = 24D2L + 4DL2
其中 L是 token 长度(即输入序列的长度),D 是通道维度(即特征维度),加号前后分别代表线性复杂度和二次复杂度。为什么要看这个,因为Transformer的硬伤不就是长序列运算量随着窗口长度暴涨吗?针对具体任务,如果我们能知道它们的计算量是不是对L敏感,那不就知道它是不是需要长序列建模了吗?
这个公式可能没几个人熟悉,也不知道怎么来的呢?我们来拆解下加深理解,因为它对理解这篇文章的核心思想非常关键。
在 Transformer 模型中,自注意力机制是计算量最大的部分。为了估算 Transformer 块的计算量(即浮点运算次数,FLOPS),需要考虑自注意力机制和前馈神经网络(FFN)的计算。

在 ViT 中图像首先被分割成多个固定大小的 patches,每个的大小通常为 16×16 像素
Token 数:假设输入图像大小为 224 x 224,则生成的 token 数为(器)=14×14 =196.
每个这样的 patch 通道被展平成一个长向量,RGB 三通道就是 16163=768,然后通过一个线性投影层(粉色的)映射到高维空间,也就是通道维度D,它是个指定的超参数。

对于 ViT-S,常见的通道维度 D为 384。对图像分类任务L=196,远小于6D=6384=2304,因此不涉及长序列建模。

目标检测和实例分割问题:在COCO 数据集上推理图像大小为800×1280,生成的token 数约为 4000,大于 6D=6384=2304,因此涉及长序列建模。

这个结论和我们先前的直觉分析是一致的:图像分类模型不需要处理非常长的序列来捕捉远距离的依赖关系,序列长度L相对较短,模型的注意力窗口不需要很大。

在实例分割和目标检测任务中,虽然图像同样被分割成 patches,并作为序列输入到模型中,但不仅需要识别图像中的对象,还需要确定对象的位置和边界。由于输入图像通常更大,生成的 tokens 数量(序列长度L)也更多。需要捕捉远距离的依赖关系,例如物体的边缘和不同部分之间的关系。模型需要处理较长的序列,自注意力机制的窗口需要更大,以捕捉这些复杂的依赖关系。

3.3 和 3.4 进一步讨论了视觉识别任务是否需要因果注意力以及 SSM 机制的必要性。其实结论已经很明显了,既然它和长序列没有关系,那就是理解任务,当然需要全可见型注意力机制,不需要时序记忆,而需要空间全局可见的高屋建瓴。

因此本文主要 IDEA 在于验证了两个假设假设 1:在 ImageNet 上的图像分类任务中引入 SSM 没有必要,因为这个任务不需要长序列建模或自回归特性。
假设 2:尽管目标检测和分割任务不需要自回归特性,但由于这些任务涉及长序列建模,因此值得探索 SSM 在这些任务中的应用潜力。
明白了分析的过程,咱们看看模型架构。

  1. 模型架构
    下图展示了 MambaOut 模型的总体框架以及 Gated CNN 块的具体结构。整体框架类似于 ResNet,通过降采样逐步减少特征图的尺寸,同时增加特征的抽象层次。

输入图像大小为 HxWx3,表示图像的高度、宽度和 RGB 三个颜色通道。采用了分层架构,共有四个阶段,每个阶段进行特征提取和降采样。每个阶段包含若干个 GatedCNN 块,用于特征提取。每个阶段之间有降采样操作,将特征图的大小逐渐减小,从而增加特征的抽象层次。通道维度为D1,D2,D3,D4。

右侧是基本组件,Gated CNN块包含两个线性层、中间夹一个卷积层和归一化层,通过残差连接实现输入和输出的融合。和 Mamba块的区别在于前者没有 SSM(状态空间模型)。

MambaOut 的架构与 Swin Transformer 和 DenseNet 在分层结构和降采样方面有相似之处,但在特征提取和信息混合机制上有所不同。MambaOut使用 GatedCNN块而 Swin Transformer 使用窗口注意力机制的 Transformer块,DenseNet 则使用密集连接的卷积层。这些差异决定了它们在处理不同任务时的特性和优势。

这么看,MambaOut 实际上就是在 Gated CNN 基础上的优化版本,通过结构简化和实验验证。更准确的说主要就是和 Mamba 做针对性的对比而已,在视觉识别任务中进行了优化和验证。
结论:如果说 Mamba是回归RNN+新型注意力机制,那 Mamba0ut 其实是回归CNN+新型注意力机制。
既然如此,读到这里时其实产生了很大的困惑,这不就是纯纯的CNN吗?不就是 ResNet 吗?它怎么还好意思叫 MambaOUT呢?这个 Gated CNN 神奇到哪里了呢?确实,网络结构上的改进比较小,但人家起作用了啊。魔鬼在细节:

对比左边的 ResNet,两大微小的区别:

一是使用线性层进行升维操作,使得 Gated CNN 块能够在特征空间中进行更灵活的变换,这与传统的 ResNet 中主要使用卷积操作进行特征提取有所不同。

二是跳线增加了非线性激活函数可以被看作一种简单的门控机制,根据输入值调整输出信息量。增加了模型的非线性能力,使得模型能够学习更复杂的特征。

5.代码实现

第 4.1 节更侧重于解释模型设计和架构上的区别,为后续章节的实验结果分析提供背景和依据。
来看代码实现,Gated CNN块通过线性变换、卷积操作和残差连接,实现了对输入特征的扩展、局部特征提取和信息保留。结合了深度卷积网络和残差网络的优点,同时通过门控机制(如激活函数)来控制信息流。

外部结构是个四级堆叠,具体看 Github。重点看这段代码,整体比较简单,因为去掉了 SSM。需要注意的事只对部分通道进行深度卷积,看看是怎么实现的。这里的conv_channels 定义了要进行深度卷积的通道数,conv_ratio 是一个控制参与卷积的通道比例的参数。这意味着卷积操作只在部分通道上进行,而不是所有通道。

四、 实验效果


1、图像分类比较
4.2 汇报了在 ImageNet 上图像分类的比较。太细节实现的我们跳过,可以看原文。着重结果分析,比较了MambaOut,VMamba及其他基于卷积和注意力机制的模型在ImageNet 上的表现如表1所示。

这个表看着很吓人,比较了几十种模型及其变体的性能,但其实结论并不复杂:

1.SSM 有没有对图像分类意义不大,因为时序关系不重要。
2.不如最新的 CAFormer-M36 使用简单的可分离卷积和原始注意力机制,比所有同等大小的视觉 Mamba 模型高出超过1%的准确率85.2%。人家才是纯种的CNNtransformer 啊。

2.目标检测和实例分割

使用标准的 COCO 数据集,Mamba0ut 作为 Mask R-CNN 的主千网络使用,结果尽管 MambaOut 在 COCO 上的目标检测和实例分割任务中可以超越一些视觉 Mamba模型,但它仍然落后于最先进的视觉 Mamba模型,例如 VMamba 和LocalVMamba。这种性能差距强调了在长序列视觉任务中整合 Mamba 的好处。当然,与最先进的卷积-注意力混合模型 TransNeXt相比51.7%%,视觉 Mamba 仍表现出显著的性能差距49.2%。仍然需要努力!这个合理也不合理,两点:

1.Transformer优化了多少年了,Mamba 才多久

2.即使是实例分割问题,所谓的长序列建模,但序列长度并没有 NLP那么长,因此效果有限正常。

3.语义分割的比较
结论与实例分割类似,SSM 模块在这些任务中的重要性,同时也验证了Mamba0ut在某些情况下的有效性。视觉 Mamba 需要进一步展示其在长序列建模任务中的强大性能,以在语义分割任务中实现更强的性能。

五、小结与探讨:What canlsay!

本文主要的贡献在于:
1.定量分析论证了图像分类任务不是长序列建模问题,而目标检测和实例分割是。前者不需要 RNN 这种机制,因此MambaOut,后者 OUT不了。
2.借鉴 Mamba的 GatedCNN 结构微调了 ResNet,实现了一种新型全局可见注意力机制下的改进版模型。

GPT-4o背后的语音技术

5月14日凌晨,OpenAI推出了最新的生成模型GPT-4o,带来了一系列震撼的功能,用技术彻底颠覆了产品形态。产品最大的亮点在于:以近乎完美的交互方式,为每位用户带来GPT-4级别的智能体验。在语音方面,GPT-4o做到了实时低延迟,平均响应时间与人类反应速度相当,输出的语音能够理解极度贴合对话上下文,能够理解人类的情感情绪,听觉质量上佳,与真人无异。

OpenAI的博客:https://openai.com/index/hello-gpt-4o/

GPT-4o是一个any2any的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。限于篇幅,本文主要谈谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。

当我们主要关注文本和语音模态时,GPT-4o其实就是一个语音语言模型(speech language model, SLM)。该SLM同时具备语音理解能力和语音合成能力,输入端和输出端均支持文本和语音的混合多模态。那么,这一SLM应该如何实现呢?在大语言模型(large language model, LLM)滥觞的今日,不难想到这样一种方法:将连续的语音数据离散化成如同单词(或者称token,词元)一样的表示,并入到LLM的词表中,再走一遍训练LLM的老路。

基于上述思想来构建SLM,需要解决以下几个问题:

  1. 语音如何离散化?
  2. 如何让LLM理解语音的token?加入语音token之后,LLM在语音数据的理解上是否具有涌现性?
  3. LLM如何合成/解码语音?

接下来,我们按图索骥,分别看看上述三个问题应该如何解决。看完现有的方案之后,也会谈谈一些关于工程实现的思考以及新兴语音技术对于游戏业务的影响。最后,我会给出一个完整的roadmap来收束全文。

语音的离散化:向LLM看齐!

在谈及语音离散化之前,我们先来看看语音和文本作为两种不同的模态,有什么区别,有什么联系。这直接关系到后文建模方法的选择以及离散化特征的关注点。

语音和文本的差别主要体现在:文本离散、序列短、信息密度高(几乎每个词都包含语义);语音则连续、序列长、信息密度低。语音序列长、信息密度低的特点,意味着语音数据有很大的压缩空间,这一点和图像非常类似。因此,一些用于图像的离散化压缩方法也可以用在语音上。

除了差异,语音和文本也有一定的联系:语音是文本的超集,既包含文本内容(说话人说了什么,也就是语义信息),也包含语音特有的音色、韵律、语速等声学信息(也叫做副语言)。既然语音包含文本,那么在NLP中预训练语言模型也可以用来建模语音中的上下文依赖关系,从而得到语音的离散化token。基于这些方法得到的token主要包含语音的语义信息。

花开两朵,各表一枝。我们先来看看语音的语义token如何获取。

语义token:  用MLM建模语音的上下文依赖

语音的语义建模方法,最常用到的就是BERT的MLM方法,比较经典的工作有三个:wav2vec 2.0[1]、HuBERT[2]和w2v-BERT[3]。

类似于BERT,wav2vec 2.0[1]在隐空间(latent space)随机mask了一定比例的语音输入,然后用基于对比学习的训练目标学习帧的表征。值得注意的一点是,对比学习中目标帧的离散化处理是一个非常巧妙的操作,它将无限的连续特征空间坍缩为有限的离散空间,让帧特征的鲁棒性更强了。这在语音领域上非常有用的trick,允许模型接受带有噪声的语音作为输入。

图1:wav2vec 2.0的模型架构

wav2vec 2.0只是借用了BERT中mask的操作,训练目标大体上是基于对比学习的范式。那么,能直接用BERT的MLM建模目标来得到高质量的语音表征吗?其后的HuBERT[2]做的就是这个事情。HuBERT[2]的核心点在于使用简单的KMeans聚类方法为语音数据抽取离散化的分类标签,也就是文中所说的hidden unit/acoustic unit。有了分类标签,然后就是用BERT的MLM loss来学习语音数据中内在的上下文依赖关系。对于KMeans聚类对初始值和K值高灵敏的特点,作者设计了ensemble和iterative refinement方法予以解决。前者就是多个聚类模型ensemble,后者就是先在基于MFCC的聚类标签上进行学习,学习到一定程度时,在模型学习到的表征重新聚类,再做一次BERT的学习。

图2:HuBERT的模型架构

既然对比学习可以学习语音的语义表征,BERT的MLM也可以,那将二者结合起来,会不会有互补的效果呢?w2v-BERT[3]做的就是这个事情。注意到:HuBERT中语音的离散token不是端到端获得的,需要用KMeans算法对特征进行离线聚类,而wav2vec 2.0又正好提供了音频帧的量化离散表征,HuBERT和wav2vec 2.0很容易就能缝合在一起。缝合的方法也是显然的:前面若干层做类似wav2vec 2.0的对比学习,学习出HuBERT要用的离散表征,然后在后面若干层做类似HuBERT的MLM训练。

图3:w2v-BERT的模型架构

声学token:压缩+离散

上一部分介绍的预训练模型做的是上下文关系的预训练,学习到的表征主要包含与上下文相关的语义信息。要想将语音的token还原成为真正具有真人表现力的信号,还需要有包含音色、韵律、语速等副语言信息的声学特征。声学特征的学习在很大程度上参考了图像领域的工作,用到的主要是类似于VQVAE[4]、VQGAN等的离散化压缩方法,并针对语音数据的特性做了优化。这一部分比较经典的工作就是SoundStream[5]和Encodec[6],二者的工作高度类似,我们放在一起来看。

说到压缩,最先想到的模型当然就是AutoEncoder(自编码器)。为提升压缩效率,有利于数字传输和存储,以及离散化建模的要求,压缩模型中还需要包含量化(quantization),将连续的音频信号转换为离散的数值。基于上述考虑,模型大体上应该是VQVAE[4]的结构。为了平衡VQ(Vector Quantization,向量量化)与音频实时高保真传输的矛盾,通常采用多个残差连接的codebook来进行量化,这个就是所谓的RVQ(具体分析过程可以参见知乎文章)。采用RVQ的好处主要有两个:其一,区分不同quantization block的分工,第一个block包含最重要的语义信息,后续的block包含还原语音的副语言信息;第二,模型训练时可随机采样前面若干个block来训练,保持一定精度,实现对比特率的动态适应。

总而言之,SoundStream[5]/Encodec[6]其实就是一个RVQ-VAE,它们所建模的语音离散化token包含了层次化的语义信息和声学信息。

图4:Encodec的模型架构

语音的统一表征?

不难发现,虽然说SoundStream[5]和Encodec[6]这样的基于RVQ-VAE的压缩建模方法包含了语音的声学特征,但其中也不可避免地带入了语义特征。二者提取的实际上更像是一种语义特征和声学特征的混合体。基于此,SpeechTokenizer[7]在二者的基础上,引入了语义引导信息来解耦语义特征和声学特征。语义特征和声学特征的解耦对于最终的语音合成有着相当的重要性。SpeechTokenizer的具体做法是:使用HuBERT[2]的特征对RVQ1的特征做语义蒸馏,其余部分保留声学信息。

图5:SpeechTokenizer的模型架构


语音的其他表征:MEL依旧有用!

上述的语音离散表征,不管是基于HuBERT[2]的语义token,还是基于Encodec[6]的声学token,它们都是直接基于原始的音频波形抽取的。除此之外,也可以基于语音的中间表征来抽取。最典型的语音中间表征就是梅尔谱(MEL spectrogram,下文简称MEL)。梅尔谱本身就对语音进行了压缩,将梅尔谱类比于图像,使用单码本的VQ也可以达到与SoundStream和Encodec那样类似的压缩程度。这种MEL+VQ的做法在各种语音合成模型中也相当常见。我们在语音合成部分会详细介绍。

让LLM理解语音token!

有了上面所说的语义token和声学token之后,其实就可以利用它们来构建语音层面的语言模型了。比较经典的工作有:谷歌的AudioLM[8]和AudioPaLM[9]、字节的SALMONN[10]、复旦的SpeechGPT[11]/SpeechGPT-Gen[12]/SpeechAlign[13]、阿里的LauraGPT[14]和新加坡国立大学的NextGPT[15]。它们的做法其实都大差不差,我们看几个就知道是怎么回事了。

AudioLM:最初的SLM

见名知义,AudioLM[8]构建的是语音层面的语言模型——给定一段语音,模型预测后续的语音。输入侧和输出侧都只有语音模态。这个任务形式和GPT-4o非常类似,不会经历ASR->LM->TTS的过程,而是直接从语音上下文中推理语义信息,再结合声学信息合成贴合上下文的高表现力语音。而上文所述的语义token和声学token正好就能满足这个任务的要求。

AudioLM的具体做法是:用SoundStream[5]提取声学token,用w2v-BERT[3]提取语义token,模型主体就是一个常规的GPT,词表包含所有的声学token和语义token。它的建模过程也相当有意思,有很大的参考意义:先做最重要的语义建模,然后先预测SoundStream的前若干层特征,建模粗糙的声学特征,在预测SoundStream的剩余层特征,建模声音的细节信息,最后基于所有的声学token还原为语音。这种层次化的建模在诸如VALL-E[16]这样的语音合成模型中也非常常见。

图6:AudioLM的tokenizer

图7:AudioLM的建模流程

当然,AudioLM[8]仅仅关注语音模态,LM也很常规,不具备如同GPT-4o一样强悍的指令遵循能力和对话能力,语音对话的连贯性和表现力都相当弱。但这一工作仍然具有相当的启发性和开拓性,证明了:即使是常规的LM,照样也能理解语音token。

AudioPaLM[9]:整合LLM

这个就是AudioLM的后续了,谷歌将常规的LM替换成已经训练好的、具有强大文本理解能力和生成能力的大语言模型——PaLM-2[17],既继承了AudioLM保留副语言的能力,又融合了PaLM-2强大的语义理解能力和推理能力。而且,该模型的词表同时包含大语言模型的token和语音token,可以同时做语音理解任务和合成生成任务,第一将这些任务整合在一个模型中进行解决。

不过,需要指出地是,文中的语音token embedding是直接输入到Transformer中的,并没有使用音频编码器做一次转换。而且,AudioPaLM的训练更加接近文本多任务的T5,并未用到复杂的、丰富多样的指令来表达任务的意图,还不能算是真正严格的instruction fine-tuning。

图8:AudioPaLM的模型架构

SALMONN[10]:让LLM理解语音

这是字节跳动和清华大学电子系(也是我们实验室)的合作成果。虽然这个工作的目的是让LLM能够理解语音,还不能生成语音,但它的训练方法和LLM比较接近,而且在诸多语音相关的任务上都显示出了涌现性,可以用作universal的特征提取器,这对于构建高质量的、包含语音-文本多模态的指令微调数据集具有相当大的意义。

图9:SALMONN的模型架构

SpeechGPT/SpeechGPT-Gen/SpeechAlign:向LLM的训练方法看齐

这算是复旦大学邱锡鹏组在这个领域一个成系列的工作,我们一个一个来看。

SpeechGPT[11]做的也是兼具语音理解能力和语音生成能力的多模态模型。在模型的训练上,SpeechGPT大幅度向LLM看齐,使用了三段式的训练方法:第一阶段先做模态适应的预训练,其实就是拿ASR的语音数据来做预训练;第二阶段和第三阶段都是指令微调,不过根据指令模态的不同,细分为了跨模态的指令微调和模态链指令微调。指令微调的数据集都是来自ASR数据集。描述任务需求的指令由GPT-4生成。

在我看来,这个工作还是相当偏学术化的作品,文中有不少点都有值得商榷的地方:第一,语音的离散化仅仅用了HuBERT[2],模型只能看到语音的语义特征,这对模型合成语音的音质和表现力有非常大的影响,demo的语音也验证了我的判断;第二,指令微调数据集的构造上有问题。他们用的是ASR数据集,其实更好的选择应该是TTS数据集,可惜高质量的TTS数据集实在是太少了。ASR数据集中的文本和语音可能并不是严格对齐的,GPT-4产生的meta-prompt和语音本身的特征也有可能是对不上的,比如prompt要求大声朗读,但语音本身可能是特定低沉的。meta-prompt本身就无法做到足够复杂丰富,不能描述到语音的一些细粒度信息。

这一部分,最好要有像诸如SALMONN[10]这样的多模态语音理解模型的介入,像DALLE3一样丰富指令的多样性。至于语音方面,可以考虑引入zero-shot的语音合成模型或者变声模型来做合成数据。第三,文中的训练方法也没有与人类偏好做对齐。

图10:SpeechGPT的模型架构

对于上面的第一个问题,作者在其后的SpeechGPT-Gen[12]中做了解决。解决思路的核心点就是:让模型不仅看到语音的语义token,也要看到语音的声学token。具体做法是:SpeechGPT的HuBERT特征替换成了SpeechTokenizer[7]中的语义特征,用SpeechGPT这一LLM来自回归地建模语义特征,有了语义特征之后,再使用Flow-Matching这样的扩散模型来建模声学特征。这里选用Flow-Matching扩散模型,可能是受了SD3和Voicebox/Audiobox的影响。为了增强两阶段建模的依赖关系,作者将语义特征的先验信息注入到第二阶段扩散模型的先验分布中。可以看到,这里语音的解码其实也是一种层次化渐进式解码。

图11:SpeechGPT-Gen的模型架构

SpeechAlign[13]做的则是SLM与人类偏好的对齐,彻底地向LLM的训练方法看齐。该工作构建了对比gold token和合成token的encodec数据集,然后进行偏好优化来进行改进。使用的偏好优化方法包括RLHF和Chain of Hindsight。

图12:SpeechAlign的流程图

简单总结一下上面这些工作中值得关注的点:

  1. 要想让LLM输出上下文连贯的高表现力语音,必须要让LLM看到语义token和声学token,只有语义token,那语音就会显得呆板机械,只有声学token,那语音就不知所云;
  2. LLM的指令微调同样可以迁移到语音-文本多模态领域中,LLM的指令微调同样可以带来如同NLP一样的涌现性;
  3. 高质量指令微调数据集的构建应该是最大的瓶颈!一下子让LLM同时做语音理解和语音生成,难度非常大。不如分步进行。
  4. 如果要分步进行的话,要先实现一个类似于SALMONN[10]那样的多模态理解模型和一个强大的Zero-shot TTS模型。前者用于给语音数据打上丰富的标签,可以是情感情绪、韵律、音高、语速,也可以是口音、意图和说话环境;后者则用于生成高质量的语音数据。毕竟,高质量的、文本和语音严格对齐的TTS数据实在是太少了,尤其是中文领域。有了这两个模型的加持,我们其实就能够构造出高质量的指令微调数据集。我不知道OpenAI是否有SALMONN这样的模型,但OpenAI的OpenVoice模型应该足够为其提供高质量的语音数据了。

既然我们在上面的篇幅中论述了语音理解多模态模型的构建,那我们在下一部分就重点关注zero-shot TTS模型,它对高质量指令微调数据集的构建同样至关重要。同时,LLM解码语音的方法也能从zero-shot TTS方案中得到不少的启发。

LLM如何合成语音:Zero-shot TTS

前面说到,SLM词表中包含了语音的语义token和声学token。语义token保证生成语音与对话上下文的连贯性,声学token保证了合成语音的质量和表现力。要想做到合成上下文连贯的高自然度语音,有两个问题必须要解决:

  1. 语音既有语义token,又有声学token,应该要如何解码成语音?
  2. SLM在合成语音的过程中是否能够遵循多轮对话中的文本指令和语音指令?这个很重要!这允许模型根据用户的即时要求来生成语音回复。比如说,OpenAI演示视频中出现的:“将语速提高两倍”、“采用更加机械化的语气”这样的要求。

对于第一个问题,以VALL-E[16]为代表的诸多zero-shot TTS模型给出了不同的解决方案,这些方案虽有不同,但也有不可忽视的共同点;对于第二个问题,以VoiceLDM[18]和ParlerTTS[19]为代表的text/prompt-guided zero-shot TTS工作给出了肯定的答案。简单解释一下text/prompt-guided zero-shot TTS是怎么回事,通常的语音合成就是将文本(transcription)转换成声音,该任务在transcription之外,又增加了description的输入,来描述合成语音的情感情绪、口音、语气、语速、音高、说话环境、氛围等等信息。我们逐个来看这些工作。

Zero-shot TTS

2023年以来,学术界和工业界出了不少具备in-context learning(zero-shot/few-shot)能力的TTS模型。这些TTS模型通常会将低信息密度、长序列的连续语音数据压缩为高信息密度的tokens或者latents(其实就是码本中具体的token embedding)。这些模型本质上做的事情就是:如何高效实现语音tokens/latents到音频波形的映射。

这些模型给出的解决方案基本上都遵循一个准则:语义token和声学token层次化解码,先语义后声学,或者先解码成MEL再后接声码器,并且非必要不做自回归(毕竟自回归上线虽高,但太吃数据了)!我们一个个来看。

基于声学token或语义token的工作

先是微软的VALL-E[16]。这是zero-shot TTS的开山之作,首次在TTS任务上采用了上万小时的数据。它采用Encodec将语音转换为离散的token,然后用GPT在token上做语言模型的任务。但是,语音毕竟不是文本,如果直接在语音的所有特征上都做自回归的话,那训练的成本会相当高。考虑到Encodec RVQ特征的层次性,低层特征表示语义内容这样的重要特征,高层特征则表征声学细节。前者具有比较强的上下文依赖关系,适合用自回归来建模,后者诸如音色这样的特征,具有全局性,用非自回归特征也可以搞定,所以就有了VALLE中自回归+非自回归的层次建模方式。

图13:VALL-E的模型架构

尽管VALL-E[16]在用GPT建模token的上下文关系的时候,基于token的层次化特性做了分治处理,可能是限于当前语音数据集的规模(几万小时可能不够),这种GPT自回归的难度还是相当大的,解码过程存在常见的错误传播现象,鲁棒性非常差,极其不稳定。根据Ilya Sutskever此前对于自回归的论述,GPT自回归相比于BERT这种双向结构是非常data-hungry的,万小时的数据可能不够。根据本人以及一些同行的经验,VALL-E模型这一类的自回归模型,也包括tortoise-tts[20]和xtts v2,要想显出威力,至少要有十几万小时的数据才行。

既然GPT自回归的难度这么大,就有不少人想方设法地来降低GPT学习的难度了。他们的解决方案也非常类似:给GPT提供额外的条件信息不就行了。比较典型的工作就是微软的RALL-E[21]和吉利的HAM-TTS[22]。RALL-E先生成了时长信息和音高信息,作为GPT自回归的先验,之所以会补充时长和音高,这大概是受到FastSpeech2[23]这样的非自回归模型的启发,这两个指标的引入,有助于提升合成的鲁棒性;HAM-TTS则是补充了基于HuBERT的语义信息。值得注意地是,HAM-TTS将模型的训练数据扩充到了65万小时,其中有50万小时的数据是合成数据。合成数据也能大幅度提升合成语音的音质。

图14:RALL-E的模型架构,框出来的就是辅助信息

图15:HAM-TTS的模型架构

说到VALL-E的后续改进,VoiceCraft不得不提。我愿意称之为“优雅的VALL-E”。它的优雅主要体现在两个方面:casual masking和delayed stacking。所谓的causal masking,是为了用自回归GPT架构来做语音编辑任务,就是把被mask的部分移动到序列末尾去预测,一套架构同时做合成和编辑任务;所谓的delay stacking,是为了适配自回归和RVQ,通过delay错位让当前码本的token预测正好可以利用前面那些token的预测结果,比起VALL-E那样自回归和非自回归缝合在一起的结构要优雅不少。

图16:VoiceCraft的建模流程

基于声学/语义latents的工作

我们通常所说的语音token是离散的。如果使用对应码本中的embedding来表示语音的话,它也可以是连续的低维度的latent变量。既然是低维度的连续latent变量,那图像合成领域中大火的LDM(latent diffusion model,其实就是stable diffsion 1&2采用的模型)模型[]自然也可以用到语音的合成上。这方面的经典工作有很多,比如说:NaturalSpeech 2&3[25, 26]、AudioLDM 2[27]、VoiceLDM[18]。但这里面只有NaturalSpeech2用到了语音离散化部分提及的声学/语义token,NaturalSpeech3的属性分解形式的VQ更像是另一种形式的RVQ。我们先来看NaturalSpeech 2&3,其他的工作后面再来看。

首先是NaturalSpeech 2[26],它基本上就是VALL-E的连续版本。它用的latent也是来自Encodec,对其中不同层次的latent做了求和,然后将其作为扩散模型的训练目标。值得注意地是,扩散模型和FastSpeech2一样也用了时长和音高作为合成的先验条件。这一点也被后来的RALL-E采用。该工作中的扩散模型采用WaveNet实现,同时预测不加噪的latent和后验均值,和图像合成领域的扩散模型在实现方式上还是有所不同的。

图17:NaturalSpeech2的模型架构

然后是NaturalSpeech 3[26],还是非自回归的,而且非自回归的正统性味道更加浓厚,借用了不少FastSpeech2和megatts1&2(后面会讲)[27, 28]的设计思想。像megatts 1&2一样,同样采用(自)监督信号对语音token编码的内容做了限制,而不再像是VALL-E/NaturalSpeech2那样一把抓。相应地,语音token化的方法也用VQ就行。具体而言,文章将语音信号分解为时长、内容、韵律和细节四个部分,然后每个部分用离散化的扩散模型来建模。不过,原文使用GRL来促进语音属性的分解,这一点的靠谱程度存疑。我也尝试过文章的FACodec,但效果很差。三级扩散模型级联的结构,预测起来似乎也非常麻烦。

图18:NaturalSpeech3的模型架构

基于MEL谱+VQ的TOKEN的工作

当然,也有不少工作用了MEL谱作为中间特征,然后在梅尔谱的基础上,或是用VQ提供离散token,或是用CNN来提取连续latent。对于MEL+VQ的工作,有tortoise-tts[20]、xtts 1&2、megatts1&2[28, 29]、base TTS[30]。对于MEL+latents的工作,有:AudioLDM 1&2[27]、StyleTTS 1&2[31, 32]。我们来简单看看是它们是怎么做的。

Tortoise-tts[20]。该工作是著名的开源英文TTS模型。其作者目前在OpenAI就职,同时也是GPT-4o的重要Contributor(他自个儿在博客中说的)。Tortoise-tts使用MEL+VQVAE的方法得到语音的MEL token,然后对MEL token以及text token做GPT自回归建模。对于语音的解码,自然也是分为两步:先是用扩散模型将MEL token转换为MEL谱,这一步和文生图很像,用扩散模型是很自然的选择;然后用声码器将MEL谱转换为音频波形。tortoise-tts和VALL-E的主体都是自回归建模,二者的不同主要在于token的不同。

图19:tortoise-tts的模型架构

MegaTTS 1&2[28, 29]。字节跳动的MegaTTS系列对语音token编码信息做了显式的信息压缩处理,让语音token仅编码上下文依赖强的韵律信息,然后用GPT自回归来建模语音的韵律。对于其他方面的信息,模型的处理显得较为常规:音色一般具有全局性,使用单一的音色编码器从参考音频中提取就性;对于文本语义内容的处理,模型在很大程度上参考了非自回归的FastSpeech 2。

对于语音的解码,也是分为两步:先通过MEL decoder还原为MEL谱,然后通过声码器解码为音频波形。MegaTTS 2和1总体上类似,在音色编码(音素级编码、多条参考音频)、语音提示长度(扩展同speaker语音上下文长度硬train,音频prompt长度更长)和时长建模(也用GPT自回归)上做了改进,同时堆了更大规模的数据。剪映的后端TTS模型用的就是megatts2。该工作在各论文的评测中表现也都不错。

图20:megatts1的模型架构

基于MEL谱+VAE的latents的工作

AudioLDM 1&2[27]。AudioLDM 1&2使用的语音latents是一致的,均通过MEL+VAE获得。既然是连续的latents,使用扩散模型来建模也合情合理。解码过程也相当简单:VAE decoder获得梅尔谱,然后用声码器转换为音频波形。该系列工作的核心创新点是利用多模态模型统一了扩散模型条件输入侧的信息:AudioLDM 1用CLAP统一了文本模态和音频模态,用单模态的音频数据就能完成模型的训练;AudioLDM 2则包含了图像、文本、转录文本等更多模态,模型泛用性也更强,既能做语音合成,也能做音乐生成、音频事件生成。

图21:AudioLDM 1的模型架构

图22:AudioLDM2的模型架构

StyleTTS 1&2[31, 32]。StyleTTS系列的模型一众zero-shot TTS模型显得比较老派,整体结构基本上沿袭了非自回归的FastSpeech 2,不同之处在于增加了基于参考音频抽取的风格信息。说是风格,其实跟megatts的音色很像。StyleTTS 2的工作则将风格进一步拆分成声学风格和韵律风格。训练时的风格信息由音频提供,推断时的风格信息则由扩散模型提供。StyleTTS 2通过一个扩散模型桥接了文本韵律和语音风格之间的联系,摆脱推断时对参考音频的依赖。不用参考音频其实对产品的意义还挺大的,要都用现实世界中真人尤其是名人的声音作为参考音频,那这势必会引起版权纠纷。这种纠纷在国内国外都有相关的事件。最近寡姐投诉OpenAI的事件就是一例。

图23:StyleTTS 1的模型架构

图24:StyleTTS 2的模型架构

TTS对指令的遵循

SLM不仅要合成合乎上下文语义的高表现力语音,合成的语音还要符合用户的即时要求。一些text-guided zero-shot TTS的工作值得参考。这些工作一般都是在已有的zero-shot TTS模型或者text-to-audio模型上改造而来,同时吸收transcription和description两路条件。其中的重点还是在于数据集的构建。这方面的工作有:PromptTTS[33]、InstructTTS[34]、ParlerTTS[19]、VoiceLDM[18]和Audiobox[35]。我们主要谈谈ParlerTTS和VoiceLDM。

ParlerTTS[19]。VALL-E/VoiceCraft的增强版,通过T5编码器和cross-attention旁路引入了描述性文本的信息。该工作的目的是想使用自然语言prompt来指定说话风格和环境信息,摆脱对参考音频的依赖。描述性标签文本的收集过程也显得相当朴素:通过定制化的监督式模型获取语音数据的口音特征、录音质量特征、音高语速特征。然后用LLM将这些特征转换为自然语言的描述。在我看来,这个工作有这么几点局限性吧:其一,缺乏情绪标签;其二,语音描述性标签的收集并不具备通用性,较为繁琐,远不如一个强大的多模态语音理解模型来得实在。文章demo虽然达到了预期的效果,但场景似乎局限在朗读的情景中。

图25:ParlerTTS的模型架构

VoiceLDM[18]。在VoiceLDM1的基础上增加了转录文本的输入。这个工作和AudioLDM 1很像,同样使用CLAP注入语音的描述性信息。不同地是,为了做TTS任务,该工作通过cross-attention旁路增加了transcription的信息。

图26:VoiceLDM的模型架构

TTS总结

林林总总说了这么多zero-shot的TTS方法,我想说明的结论有这么几点:

  1. 在LLM大行其道、scaling law大显神威的时代,TTS模型的训练数据规模已经突破了万小时,甚至达到了数十万小时的级别。在大数据的加持下,TTS任务上也涌现出了in-context learning能力。
  2. 语音信息的解码通常都要层次化或者多步进行,不能一步到位。自回归、扩散模型和流匹配都能在TTS中发挥作用;
  3. 借鉴NLP instruction fine-tuning和文生图的经验,TTS模型同样可以遵循文本指令或者语音指令,合成符合用户即时要求的语音,摆脱对参考音频的依赖,这或许也能规避一些知识产权的困扰(比如最近有名的寡姐投诉OpenAI事件)。同时,用户也能在对话过程中随时切换语音回复的风格,这一点在OpenAI的demo中有很明确的体现。另外,不知道大家有没有注意,GPT-4o合成的语音是可以是放映所处的声学环境的:有一段语音背后似乎是有钢琴声的。
  4. text-guided zero-shot TTS在模型架构上和zero-shot TTS有非常大的相似性。但训练数据可能较为缺乏。先开发zero-shot TTS,再用类似SALMONN那样的多模态理解模型来打标签(类似DALLE3的做法),这样数据集构造方式,可能会是更好的选择。

另外,对于语音的解码方案,我倾向于是这样的:

  1. 如果要做流式推理,外接类似HIFIGAN这样的声码器的方式可能不是好的选择。HIFIGAN并不天然支持流式解码。相反地,诸如SoundStream和Encodec这样的方法,同时有流式变体和非流式变体;
  2. 先做语义token的解码,这个解码大概率是自回归解码。语义token毕竟是建模上下文依赖关系,自回归方法已经在NLP上证明了这一点;
  3. 然后做声学token的解码,扩散或者flow-matching可能是更好的选择。扩散模型或者流匹配可以很好地修补语音的细节;

当然,除了上面讲到的,zero-shot TTS还有很多值得研究的方法。限于篇幅,仅列举于此,不再详述:HierSpeech++[36]、base TTS[30]、Voicebox/Audiobox[35]、UniAudio[37]、Make-a-Voice[38]等等。

其他问题

对于GPT-4o模型,如果仅仅聚焦于语音多模态,还有下面的问题值得关注:

  1. 语音交互如何做到低延迟?大概率要求流式切片处理,主要工作在于工程优化,用C++重写算子。推理框架的话,用tensorrt、mnn这些都行。上下文所述的音频离散化方法,诸如SoundStream和Encodec,其实也支持流式处理。
  2. 语音对话中的打断如何实现?个人认为有两种可能的方案:turn-based和流式处理。所谓的turn-based方案,是比较工程化的,简答概括一下就是:检测是否有停顿,如果一段时间内没有声音,模型就开始返回语音回复。另一种流式方案,则是:模型一直在接受用户的流式语音输入,判断是否应该输出语音回复,一个充分训练的模型应该是能够准确预测出语音词表中的[START]和[END]的。

对游戏配音业务的思考

text/prompt-guided zero-shot TTS方法对游戏的AI配音意义重大。主要体现在:

  1. 用自然语言提示去合成音色稳定的语音,摆脱对参考音频的依赖,在业务中能够更加灵活,至少比克隆已有人物/角色的语音的方式更加方便,更不容易出戏。举个例子,在开放世界剧情类游戏的研发阶段,我们会设定一些profile赋予NPC,让玩家跟NPC聊天。我们曾经用克隆《原神》、《崩坏:星穹铁道》已有角色的方式赋予这些NPC角色语音,但放在那些欧美背景的NPC中,就是很有违和感,没有现实世界中的accent,不够decent。
  2. 剧情任务中的配音会更加真人化、更有沉浸感。过年期间过《崩坏:星穹铁道》花火和黑天鹅的同行任务的时候,部分NPC角色会有六公主的翻译腔,这是花火行于欢愉命途的恶趣味,空气中顿时充满了快活的味道。如果走bv2、gsv的语音克隆方案,应该是很难有这种效果的。而且,玩家在剧情任务中势必会经过不同的地势地貌,至少室内、室外的声音听起来是有不同的。室内的声音至少会有回响、混响的吧。这种感觉语音克隆方案也是无法做到的。

全文总结

总结一下本文说谈的内容,我认为GPT-4o语音多模态的实现可能是走了以下的技术路线:

  1. audio & text tokenizer的实现应该是语音离散化部分所用的技术,例如SoundStream、Encodec、SpeechTokenizer,或者是MEL+VQ最后配合声码器来解码;参考zero-shot TTS、AudioLM/AudioPaLM、SpeechGPT-Gen等工作的结果,LLM中语音token的解码应该是要走层次化或者多步的方法,先解码语义特征,再解码声学特征,或者是先解码MEL,再加一个HIFIGAN这样的声码器。另外,如果做audio/speech/music这样的通用声合成的话,可能也能通过prompt来控制。AudioLDM2虽然做了这方面的工作,但audio/music和speech的参数其实是不一样的,说到底还不是同一个模型。
  2. 对于指令微调,数据集的构造非常重要,大概率要用到合成数据。其一,网络上高质量语音数据的量级远远不及文本,直接拿ASR数据来做肯定会影响模型合成语音的音质;其二,大语言模型合成的instruction往往触及不到语音的细粒度特征,这样的instruction其实无法准确详尽地描述text和speech之间的关系。因而,需要引入强大的zero-shot TTS模型合成高质量语音,然后用多模态语音理解模型来为合成语音打标签,当然也可以评分做筛选什么的。
  3. 最后是要让大模型的输出对齐人类的偏好。这方面的方法有很多,有DPO、PPO什么的,都可以用。

图27:全文总结,可能的roadmap

参考文献

[1] Baevski A, Zhou Y, Mohamed A, et al. wav2vec 2.0: A framework for self-supervised learning of speech representations[J]. Advances in neural information processing systems, 2020, 33: 12449-12460.

[2] Hsu W N, Bolte B, Tsai Y H H, et al. Hubert: Self-supervised speech representation learning by masked prediction of hidden units[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, 29: 3451-3460.

[3] Chung Y A, Zhang Y, Han W, et al. W2v-bert: Combining contrastive learning and masked language modeling for self-supervised speech pre-training[C]//2021 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU). IEEE, 2021: 244-250.

[4] Van Den Oord A, Vinyals O. Neural discrete representation learning[J]. Advances in neural information processing systems, 2017, 30.

[5] Zeghidour N, Luebs A, Omran A, et al. Soundstream: An end-to-end neural audio codec[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, 30: 495-507.

[6] Défossez A, Copet J, Synnaeve G, et al. High fidelity neural audio compression[J]. arXiv preprint arXiv:2210.13438, 2022.

[7] Zhang X, Zhang D, Li S, et al. Speechtokenizer: Unified speech tokenizer for speech large language models[J]. arXiv preprint arXiv:2308.16692, 2023.

[8] Borsos Z, Marinier R, Vincent D, et al. Audiolm: a language modeling approach to audio generation[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2023.

[9] Rubenstein P K, Asawaroengchai C, Nguyen D D, et al. Audiopalm: A large language model that can speak and listen[J]. arXiv preprint arXiv:2306.12925, 2023.

[10] Changli Tang, Wenyi Yu, Guangzhi Sun, Xianzhao Chen, Tian Tan, Wei Li, Lu Lu, Zejun Ma, Chao Zhang. SALMONN: Towards Generic Hearing Abilities for Large Language Models

[11] Zhang D, Li S, Zhang X, et al. Speechgpt: Empowering large language models with intrinsic cross-modal conversational abilities[J]. arXiv preprint arXiv:2305.11000, 2023.

[12] Zhang D, Zhang X, Zhan J, et al. SpeechGPT-Gen: Scaling Chain-of-Information Speech Generation[J]. arXiv preprint arXiv:2401.13527, 2024.

[13] Zhang D, Li Z, Li S, et al. SpeechAlign: Aligning Speech Generation to Human Preferences[J]. arXiv preprint arXiv:2404.05600, 2024.

[14] Chen Q, Chu Y, Gao Z, et al. Lauragpt: Listen, attend, understand, and regenerate audio with gpt[J]. arXiv preprint arXiv:2310.04673, 2023.

[15] Wu S, Fei H, Qu L, et al. Next-gpt: Any-to-any multimodal llm[J]. arXiv preprint arXiv:2309.05519, 2023.

[16] Wang C, Chen S, Wu Y, et al. Neural codec language models are zero-shot text to speech synthesizers[J]. arXiv preprint arXiv:2301.02111, 2023.

[17] Anil R, Dai A M, Firat O, et al. Palm 2 technical report[J]. arXiv preprint arXiv:2305.10403, 2023.

[18] Lee Y, Yeon I, Nam J, et al. VoiceLDM: Text-to-Speech with Environmental Context[C]//ICASSP 2024-2024 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2024: 12566-12571.

[19] Lyth D, King S. Natural language guidance of high-fidelity text-to-speech with synthetic annotations[J]. arXiv preprint arXiv:2402.01912, 2024.

[20] Betker J. Better speech synthesis through scaling[J]. arXiv preprint arXiv:2305.07243, 2023.

[21] Xin D, Tan X, Shen K, et al. RALL-E: Robust Codec Language Modeling with Chain-of-Thought Prompting for Text-to-Speech Synthesis[J]. arXiv preprint arXiv:2404.03204, 2024.

[22] Wang C, Zeng C, Zhang B, et al. HAM-TTS: Hierarchical Acoustic Modeling for Token-Based Zero-Shot Text-to-Speech with Model and Data Scaling[J]. arXiv preprint arXiv:2403.05989, 2024.

[23] Ren Y, Hu C, Tan X, et al. Fastspeech 2: Fast and high-quality end-to-end text to speech[J]. arXiv preprint arXiv:2006.04558, 2020.

[24] Rombach R, Blattmann A, Lorenz D, et al. High-resolution image synthesis with latent diffusion models[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2022: 10684-10695.

[25] Shen K, Ju Z, Tan X, et al. Naturalspeech 2: Latent diffusion models are natural and zero-shot speech and singing synthesizers[J]. arXiv preprint arXiv:2304.09116, 2023.

[26] Ju Z, Wang Y, Shen K, et al. NaturalSpeech 3: Zero-shot speech synthesis with factorized codec and diffusion models[J]. arXiv preprint arXiv:2403.03100, 2024.

[27] Liu H, Tian Q, Yuan Y, et al. AudioLDM 2: Learning holistic audio generation with self-supervised pretraining[J]. arXiv preprint arXiv:2308.05734, 2023.

[28] Jiang Z, Ren Y, Ye Z, et al. Mega-tts: Zero-shot text-to-speech at scale with intrinsic inductive bias[J]. arXiv preprint arXiv:2306.03509, 2023.

[29] Jiang Z, Liu J, Ren Y, et al. Mega-tts 2: Zero-shot text-to-speech with arbitrary length speech prompts[J]. arXiv preprint arXiv:2307.07218, 2023.

[30] Łajszczak M, Cámbara G, Li Y, et al. BASE TTS: Lessons from building a billion-parameter text-to-speech model on 100K hours of data[J]. arXiv preprint arXiv:2402.08093, 2024.

[31] Li Y A, Han C, Mesgarani N. Styletts: A style-based generative model for natural and diverse text-to-speech synthesis[J]. arXiv preprint arXiv:2205.15439, 2022.

[32] Li Y A, Han C, Raghavan V, et al. Styletts 2: Towards human-level text-to-speech through style diffusion and adversarial training with large speech language models[J]. Advances in Neural Information Processing Systems, 2024, 36.

[33] Guo Z, Leng Y, Wu Y, et al. Prompttts: Controllable text-to-speech with text descriptions[C]//ICASSP 2023-2023 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2023: 1-5.

[34] Yang D, Liu S, Huang R, et al. Instructtts: Modelling expressive TTS in discrete latent space with natural language style prompt[J]. arXiv preprint arXiv:2301.13662, 2023.

[35] Vyas A, Shi B, Le M, et al. Audiobox: Unified audio generation with natural language prompts[J]. arXiv preprint arXiv:2312.15821, 2023.

[36] Lee S H, Choi H Y, Kim S B, et al. HierSpeech++: Bridging the Gap between Semantic and Acoustic Representation of Speech by Hierarchical Variational Inference for Zero-shot Speech Synthesis[J]. arXiv preprint arXiv:2311.12454, 2023.

[37] Yang D, Tian J, Tan X, et al. Uniaudio: An audio foundation model toward universal audio generation[J]. arXiv preprint arXiv:2310.00704, 2023.

[38] Huang R, Zhang C, Wang Y, et al. Make-a-voice: Unified voice synthesis with discrete representation[J]. arXiv preprint arXiv:2305.19269, 2023.

扩散模型DiT:纯Transformer架构替换传统的U-Net主干

DiT原文: https://arxiv.org/abs/2212.09748 Code:https://github.com/facebookresearch/DiT Huggingface:https://huggingface.co/spaces/wpeebles/DiT

DiT扩散模型,出自谢赛宁与Sora研发之一威廉·皮波尔斯合著的一篇论文《Scalable diffusion models with transformers》,它不仅将 Transformer 成功应用到了扩散模型上,还深入探究了transformer架构在扩散模型上的scalability能力。

核心思想:提出了一种新的(可扩展)扩散模型架构,称为 DiT,该架构使用 Transformer 替换了传统的 U-Net 主干。

扩散模型大部分是采用UNet架构来进行建模,UNet可以实现输出和输入一样维度,所以天然适合扩散模型。扩散模型使用的UNet除了包含基于残差的卷积模块,同时也往往采用self-attention。自从ViT之后,transformer架构已经大量应用在图像任务上,随着扩散模型的流行,也已经有工作尝试采用transformer架构来对扩散模型建模,这篇文章我们将介绍Meta的工作DiTScalable Diffusion Models with Transformers,它是完全基于transformer架构的扩散模型,这个工作不仅将transformer成功应用在扩散模型,还探究了transformer架构在扩散模型上的scalability能力其中最大的模型DiT-XL/2在ImageNet 256×256的类别条件生成上达到了SOTA(FID为2.27)

DiT基本沿用了ViT的设计,如下图所示,首先采用一个patch embedding来将输入进行patch化,即得到一系列的tokens。其中patch size属于一个超参数,它直接决定了tokens的数量,这会影响模型的计算量。DiT的patch size共选择了三种设置:𝑝=2,4,8。注意token化之后,这里还要加上positional embeddings,这里采用非学习的sin-cosine位置编码。

将输入token化之后,就可以像ViT那样接transformer blocks了。但是对于扩散模型来说,往往还需要在网络中嵌入额外的条件信息,这里的条件包括timesteps以及类别标签(如果是文生图就是文本,但是DiT这里并没有涉及)。要说明的一点是,无论是timesteps还是类别标签,都可以采用一个embedding来进行编码。DiT共设计了四种方案来实现两个额外embeddings的嵌入,具体如下:

  1. In-context conditioning:将两个embeddings看成两个tokens合并在输入的tokens中,这种处理方式有点类似ViT中的cls token,实现起来比较简单,也不基本上不额外引入计算量。
  2. Cross-attention block:将两个embeddings拼接成一个数量为2的序列,然后在transformer block中插入一个cross attention,条件embeddings作为cross attention的key和value;这种方式也是目前文生图模型所采用的方式,它需要额外引入15%的Gflops。
  3. Adaptive layer norm (adaLN) block:采用adaLN,这里是将time embedding和class embedding相加,然后来回归scale和shift两个参数,这种方式也基本不增加计算量。
  4. adaLN-Zero block:采用zero初始化的adaLN,这里是将adaLN的linear层参数初始化为zero,这样网络初始化时transformer block的残差模块就是一个identity函数;另外一点是,这里除了在LN之后回归scale和shift,还在每个残差模块结束之前回归一个scale,如上图所示。

论文对四种方案进行了对比试验,发现采用adaLN-Zero效果是最好的,所以DiT默认都采用这种方式来嵌入条件embeddings。

虽然DiT发现adaLN-Zero效果是最好的,但是这种方式只适合这种只有类别信息的简单条件嵌入,因为只需要引入一个class embedding;但是对于文生图来说,其条件往往是序列的text embeddings,采用cross-attention方案可能是更合适的。 由于对输入进行了token化,所以在网络的最后还需要一个decoder来恢复输入的原始维度,DiT采用一个简单的linear层来实现,直接将每个token映射为𝑝×𝑝×2𝐶的tensor,然后再进行reshape来得到和原始输入空间维度一样的输出,但是特征维度大小是原来的2倍,分别用来预测噪音和方差。

注意这里先进行LayerNorm,同时也引入了zero adaLN,并且decoder的linear层也采用zero初始化。 仿照ViT,DiT也设计了4种不同规模的模型,分别是DiT-S、DiT-B、DiT-L和DiT-XL,其中最大的模型DiT-XL参数量为675M,计算量Gflops为29.1(256×256图像,patch size=4时)。

在具体性能上,最大的模型DiT-XL/2采用classifier free guidance可以在class-conditional image generation on ImageNet 256×256任务上实现当时的sota。

虽然DiT看起来不错,但是只在ImageNet上生成做了实验,并没有扩展到大规模的文生图模型。而且在DiT之前,其实也有基于transformer架构的扩散模型研究工作,比如U-ViT,目前也已经有将transformer应用在大规模文生图(基于扩散模型)的工作,比如UniDiffuser,但是其实都没有受到太大的关注。目前主流的文生图模型还是采用基于UNet,UNet本身也混合了卷积和attention,它的优势一方面是高效,另外一方面是不需要位置编码比较容易实现变尺度的生成,这些对具体落地应用都是比较重要的。

FunAudioLLM –阿里通义音频生成大模型

FunAudioLLM:https://github.com/FunAudioLLM
CosyVoice开源仓库:https://github.com/FunAudioLLM/CosyVoice
CosyVoice在线体验:https://www.modelscope.cn/studios/iic/CosyVoice-300M
SenseVoice开源仓库:https://github.com/FunAudioLLM/SenseVoice
SenseVoice在线体验:https://www.modelscope.cn/studios/iic/SenseVoice

人类对自身的研究和模仿由来已久,在我国2000多年前的《列子·汤问》里就描述了有能工巧匠制作出会说话会舞动的类人机器人的故事。声音包含丰富的个体特征及情感情绪信息,对话作为人类最常使用亲切自然的交互模式,是连接人与智能世界至关重要的环节。近日,阿里通义实验室发布并开源了语音大模型项目FunAudioLLM,旨在深化人类与大型语言模型(LLMs)之间的自然语音交互体验。这一框架的核心是两个创新模型:SenseVoiceCosyVoice

CosyVoice【TTS】 致力于自然语音生成,支持多语言、音色和情感控制,在多语言语音生成、零样本语音生成、跨语言声音合成和指令执行能力方面表现卓越。

  • 多语言合成:采用了总共超15万小时的数据训练,支持中英日粤韩5种语言的合成,合成效果显著优于传统语音合成模型。
  • 极速音色模拟:仅需要3~10s的原始音频,即可生成模拟音色,甚至包括韵律、情感等细节。在跨语种的语音合成中,也有不俗的表现。
  • 富文本或自然语言的细粒度控制:支持以富文本或自然语言的形式,对合成语音的情感、韵律进行细粒度的控制,合成音频在情感表现力上得到明显提升。

SenseVoice 则专注于高精度多语言语音识别ASR、情感辨识和音频事件检测。

  • 多语言识别:采用超过40万小时数据训练,支持超过50种语言,识别效果上优于Whisper模型,中文与粤语上提升50%以上。
  • 富文本识别:
    • 具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。
    • 支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。
  • 推理速度:SenseVoice-Small模型采用非自回归端到端框架,推理延迟极低,10s音频推理仅耗时70ms,15倍优于Whisper-large。

应用场景

基于SenseVoice和CosyVoice模型,FunAudioLLM可支持较多的人机交互应用场景,例如音色情感生成的多语言语音翻译、情绪语音对话、互动播客、有声读物等。

同音交传:模拟音色与情感的多语言翻译

通过结合SenseVoice、LLMs以及CosyVoice,我们可以无缝地进行语音到语音的翻译(S2ST)。需要注意的是,原始录音在文本中会以粗体显示。这种集成化的方法不仅提升了翻译的效率和流畅性,而且通过感知语音中的情感和语调,它能够在译文中复现原始语音的情感色彩,让对话的交流更加真实和动人。

无论是多语种的会议通译、跨文化的交流沟通,还是为非母语者提供即时语音翻译服务,这一技术都将大大缩小语言差距和沟通中的信息减损。

强情感交互的语音对话

通过融合SenseVoice、大型语言模型(LLMs)和CosyVoice,能够支持开发一款情感语音聊天应用程序。

当SenseVoice解析出情绪/情感/咳嗽等副语言信息后,大模型输出相对应的反馈情绪,并由CosyVoice合成出适当的声音情绪,从而完成舒适自然的对话交互过程。在以下示例中,用户和助手的所有对话内容均由CosyVoice合成。

专属AI博客电台

通过将SenseVoice、基于LLM的具有实时世界知识的多代理系统和CosyVoice整合,我们能够创造一个互动式播客电台。

在这样的播客中,SenseVoice利用其高精度多语言语音识别功能,实时捕捉AI播客和用户的对话,甚至能够辨识环境音效和情感。LLM多代理系统则能够处理SenseVoice提供的语音数据,实时更新世界知识库,确保话题和信息的及时性和准确性。

在交互中,用户可以随时打断AI播客的对话,引导主题方向等,CosyVoice将用于生成AI播客的语音,具备多种语言、音色和情感的控制能力,为听众带来丰富多彩的听觉体验。

有声读物

借助LLMs出色的分析能力,可对书籍内容进行结构化并识别其中的情感,再与CosyVoice的语音合成技术结合,我们能够实现具有更高表现力的有声读物。

LLMs深入理解文本,捕捉每一个情感波动和故事弧线,而CosyVoice则将这些情感细腻地转化为语音,带有特定的情绪色彩和强调,为听众提供一个不仅丰富多彩而且情感充沛的听觉体验。

这样的有声读物不再是单一无变化的朗读,而是一场充满情感与生动表达的听觉盛宴,让每个故事和角色都栩栩如生。

技术原理解析

CosyVoice

CosyVoice是一款基于语音量化编码的语音生成大模型。它对语音进行离散化编码,并依托大模型技术,实现自然流畅的语音生成体验。与传统语音生成技术相比,CosyVoice具有韵律自然、音色逼真等特点。CosyVoice支持多达5种语言,同时还支持以自然语言或富文本形式对生成语音进行情感等维度的细粒度控制。研究团队提供了基模型CosyVoice-300M、经过SFT微调后的模型CosyVoice-300M-SFT、以及支持细粒度控制的模型CosyVoice-300M-Instruct,可满足不同场景下的使用需求。

生成语音客观指标:

研究团队分别在开源中文数据集Aishell3以及英文数据集LibriTTS上,通过语音识别测试了合成音频的内容一致性。通过与原始音频以及最近大火的ChatTTS对比,可以发现CosyVoice的合成音频在内容一致性上更高,并且没有很少存在幻觉额外多字的现象。CosyVoice很好地建模了合成文本中的语义信息,达到了与人类发音人相当的水平。此外,通过对合成音频进行重打分,能够进一步降低识别的错误率,甚至在内容一致性和说话人相似度上超越人类。

情感控制能力:

研究团队还使用预训练的情感分类模型评价了CosyVoice的情感控制能力,主要包括高兴/悲伤/生气/害怕/反感等5种高表现力的语音情感。
测试结果表明,CosyVoice-300M本身具备一定从文本内容中推断情感的能力,经过细粒度控制训练的模型CosyVoice-300M-Instruct在情感分类中的得分更高,具备更强的情感控制能力。

SenseVoice

SenseVoice是一个基础语音理解模型,具备多种语音理解能力,涵盖了自动语音识别(ASR)、语言识别(LID)、情感识别(SER)以及音频事件检测(AED)。

该模型旨在提供全面的语音处理功能,从而支持构建更复杂的语音交互系统。

SenseVoice-Small是一款仅含编码器的轻量级基础语音模型,设计用于快速语音理解。

它可以快速处理语音数据,并在有需要时迅速做出响应,适用于对延迟敏感的应用场合,如实时语音交互系统。SenseVoice-Large则是一个包含编码器和解码器的大型基础语音模型。这个版本的SenseVoice专注于更精确的语音理解,拥有对更多语言的支持能力。它适合于对识别精度有更高要求的场景,可以处理更复杂的语音输入,并生成更为准确的结果。

多语言语音识别性能

研究团队在开放源数据集上比较了SenseVoice和Whisper的多语言识别性能和推理效率,包括AISHELL-1、AISHELL-2、Wenetspeech、Librispeech和Common Voice。

推理效率评估是在A800机器上进行的。SenseVoice-Small采用非自回归端到端架构,由此带来的推理延迟极低——相比之下,它比Whisper-Small快7倍,比Whisper-Large快17倍。

语音情感识别性能

SenseVoice也可以用于离散情绪识别,目前支持的情绪类型包括高兴、悲伤、愤怒和中性。团队在7个流行的情绪识别数据集上对其进行了评估。即使没有对目标语料库进行微调,SenseVoice-Large都能在大多数数据集上达到或超越最新的最佳结果(SOTA)。

音频事件检测性能

SenseVoice-Small与SenseVoice-Large模型都能在语音中检测音频事件,包括音乐、掌声和笑声。

SenseVoice-Large模型除了能够预测音频事件的类型,还能精准识别事件发生的起始和结束位置。

与之相比,SenseVoice-Small模型虽然仅能预测音频中发生的事件类型(仅限于一个事件),但它能够检测到更多种类的事件,诸如在人机互动过程中可能出现的咳嗽、打喷嚏、呼吸和哭泣等。

目前,与SenseVoice和CosyVoice相关的模型已在ModelScope和Huggingface上开源,同时在GitHub上发布了相应的训练、推理和微调代码。

torchrun-torch多机多卡分布式训练命令

https://pytorch.org/docs/stable/elastic/run.html

torchrun 提供了作为 torch.distributed.launch 的功能的超集,并具有以下附加功能:

  1. Worker failures are handled gracefully by restarting all workers.
    通过重新启动所有工作进程来优雅地处理工作进程故障。
  2. Worker RANK and WORLD_SIZE are assigned automatically.
    工作器 RANK 和 WORLD_SIZE 自动分配。
  3. Number of nodes is allowed to change between minimum and maximum sizes (elasticity).
    允许节点数量在最小和最大大小之间变化(弹性)。

torchrun 是setup.py中 entry_points 配置中声明的主模块torch.distributed.run的Python控制台脚本。它相当于调用 python -m torch.distributed.run 。

torchrun启动单机多卡DDP并行训练:

启动方式:

  • 使用 torchrun 命令来启动程序
  • torchrun –standalone –nproc_per_node=gpu XXX.py
  1. --standalone 代表单机运行
  2. --nproc_per_node=gpu 代表使用所有可用GPU。等于号后也可写gpu数量n,这样会使用前n个GPU

如果想要进一步指定要运行的 GPU,可以通过 CUDA_VISIBLE_DEVICES 设置GPU可见性,比如:

CUDA_VISIBLE_DEVICES=2,3 torchrun –standalone –nproc_per_node=gpu multi_gpu_torchrun.py

多机多卡

torchrun –nproc_per_node=4 –nnodes=3 –node_rank=0 –master_addr=192.168.0.101 –master_port=29500 test_mpi.py

1.指定每个节点(机器)上的进程数,这里是4个。意味着每个机器将启动4个进程来参与分布式训练。 –nproc_per_node=4 【一般设置为为节点GPU数量】

2.指定总共的节点数,这里是3个。意味着总共有3个机器参与分布式训练。

--nnodes=3

3.指定当前节点(机器)的排名,这里是0。排名从0开始,用于在分布式环境中区分不同的节点。

--node_rank=0 【0代表主节点】

4.指定主节点的IP地址,这里是192.168.0.101(更根据实际修改)。主节点用于协调分布式训练过程。

--master_addr=192.168.0.101

5.指定主节点的端口号,这里是29500。主节点使用指定的端口来与其他节点进行通信。

–master_port=29500

6.单机运行

--standalone

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是第一个从张量的角度来看待辐射场建模,并提出了辐射场重建作为一个低秩张量重建的问题