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.

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 呢!

「理解和生成」的大一统 BILP

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

代码连接:https://github.com/salesforce/BLIP

Demo地址:https://huggingface.co/spaces/akhaliq/BLIP

「理解和生成」的大一统!华人一作提出BLIP模型,「视觉+语言」任务多项SOTA

视觉语言预训练(Vision-language pre-training)的相关研究在各种多模态的下游任务中已经证明了其强大的实力。

但目前的模型和方法还存在两个主要的缺陷:

1、从模型角度来看,大多数方法要么采用基于编码器的模型,要么采用编码器-解码器模型。然而,基于编码器的模型不太容易直接迁移到文本生成的任务中,如图像标题(image captioning)等;而编码器-解码器模型还没有被成功用于图像-文本检索任务。

2、从数据角度来看,大多数sota的方法,如CLIP, ALBEF, SimVLM 都是对从网上收集的图像-文本对(image-text pair)进行预训练。尽管可以通过扩大数据集的规模来获得性能上的提高,但研究结果显示,有噪声的网络文本对于视觉语言学习来说只能得到次优的结果。

为此,研究人员提出了一个新的模型BLIP(Bootstrapping Language-Image Pre-training),可以统一视觉语言理解和生成。

BLIP是一个全新的VLP框架,与现有的方法相比,能够覆盖范围更广的下游任务。

BLIP分别从模型和数据的角度引入了两点创新:

1、编码器-解码器的多模态混合(MED, Multimodal mixture of Encoder-Decoder),一个全新的模型架构,能够有效地进行多任务预训练和灵活的迁移学习。一个MED可以作为一个单模态编码器(unimodal encoder),或是基于图像的文本编码器(image-grounded text encoder),或是基于图像的文本解码器(image-grounded text decoder)。

该模型与三个视觉语言目标共同进行预训练,即图像-文本对比学习(image-text contrastive learning)、图像-文本匹配(image-text matching)和图像-条件语言建模(image-conditioned language modeling)。

2、标题和过滤(Captioning and Filtering,CapFilt),一种新的数据集boostrapping方法,可以用于从噪声图像-文本对中学习。将预训练的MED微调为两个模块:一个是给定网络图像产生合成标题的captioner,另一个是去除原始网络文本和合成文本中的噪声标题的Filter。

实验结果表明,通过captioner和filter的协作,BLIP模型能够在各种下游任务上取得了稳定的性能改进,包括图像-文本检索、图像标题、视觉问答、视觉推理和视觉对话。研究人员还发现,更多样化的caption会产生更大的性能收益。

将模型直接迁移到两个视觉语言任务时(文本-视频检索和videoQA),研究人员还实现了sota的zero-shot性能。

模型架构

BLIP采用Visual Transformer作为图像编码器,将输入的图像划分为patch,然后将patches编码为一个embedding序列,并用一个额外的[CLS]标记来代表全局图像特征。与使用预训练的目标检测器进行视觉特征提取相比,使用ViT更便于计算,并且已经逐渐成为主流。

为了预训练一个具有理解和生成能力的统一模型,研究人员提出了多模态混合编码器-解码器(MED),能够用于多任务。

1、单模态编码器(Unimodal encoder),对图像和文本分别进行编码。文本编码器(text encoder)与BERT相同,在文本输入的开头附加一个[CLS]标记,以总结句子。

2、以图像为基础的文本编码器(Image-grounded text encoder),通过在自注意力(SA)层和前馈网络(FFN)之间为文本编码器的每个Transformer块插入一个额外的交叉注意力(CA)层来注入视觉信息。一个特定任务的[Encode]标记被附加到文本上,[Encode]的输出embedding被用作图像-文本对的多模态表示。

3、以图像为基础的文本解码器(Image-grounded text decoder),用因果自注意力层(causal self-attention layer)替代编码器中的双向自注意力层。用[Decode]标记来表示一个序列的开始和结束。

三大损失函数

在预训练期间,BLIP联合优化三个目标,其中两个是基于理解的目标,一个是基于生成的目标。

每个图像-文本对只需要在计算量比较大的ViT中进行一次前向传递,并在text Transformer系统中进行三次前向传递。

1、图像-文本对比损失(Image-Text Contrastive Loss, ITC)激活了单模态编码器,目的是通过促进正向的图像-文本对与负向的图像-文本对有相似的表示,来对齐ViT和text Transformer的特征空间。在以前的研究中已被证明是改善视觉和语言理解的一个有效目标。研究人员遵循前人的ITC损失,引入了一个动量编码器来产生特征,并从动量编码器中创建软标签作为训练目标,以说明negative pairs中的潜在positive。

2、图像-文本匹配损失(Image-Text Matching Loss, ITM)激活了以图像为基础的文本编码器。它的目的是学习图像-文本的多模态表示以捕捉视觉和语言之间的细粒度对齐。ITM是一个二元分类任务,模型根据多模态特征使用一个ITM头(一个线性层)来预测一个图像-文本对是positive(匹配的)还是negative(不匹配的)。

为了找到信息量更大的否定词,研究人员采用了硬否定词挖掘策略,在一个batch中具有更高的对比相似度的否定词对更有可能被选来计算损失。

3、语言建模损失(Language Modeling Loss, LM)激活了以图像为基础的文本解码器,其目的是生成给定图像的文本描述。它优化了交叉熵损失,训练模型以自回归的方式最大化文本的概率。

在计算损失时,研究人员采用0.1的标签平滑度(label smoothing)。与其他用于VLP的MLM损失相比,LM损失使模型具有泛化能力,能够将视觉信息转换为连贯的标题。

CapFlit模块

研究人员使用标题和过滤(Captioning and Filtering, CapFilt)来提高文本语料库的质量。

其中包含了两个模块:一个是给定网络图像生成字幕的Captioner,另一个是去除噪声图像-文本对的Filter。

Captioner和Filter都是从同一个预训练的MED模型初始化的,并在COCO数据集上单独进行微调。微调是一个轻量级的程序。

具体来说,Captioner是一个以图像为基础的文本解码器。它以LM为目标进行微调,对给定的图像进行文本解码。给定网络图片Iw,Captioner生成合成captions,即每张图片一个caption。

Filter是一个以图像为基础的文本编码器。它根据ITC和ITM的目标进行微调,以学习文本是否与图像匹配。该Filter去除原始网络文本和合成文本中的噪音文本,如果ITM头预测一个文本与图像不匹配,则该文本被认为是噪音。

最后,研究人员将过滤后的图像-文本对与人工标注的文本对结合起来,形成一个新的数据集用它来预训练一个新模型。

实验结果

研究人员对比了在不同数据集上预训练的模型以证明CapFilt在下行任务中的有效性,包括图像-文本检索和图像标题任务,并进行了微调和zero-shot测试。

可以看到,CapFilt可以通过更大的数据集和更大vision backbone来进一步提高性能,也证实了它在数据规模和模型大小方面的可扩展性。

在论文中研究人员还进行了更细致的分析,在广泛的视觉语言任务上取得了最先进的结果,如图像文本检索(平均召回率+2.7%@1)、图像标题(CIDEr+2.8%)和VQA(VQA score+1.6%)。

Inpaint Anything: Segment Anything Meets Image Inpainting

  • 论文链接:http://arxiv.org/abs/2304.06790
  • 代码库链接:https://github.com/geekyutao/Inpaint-Anything

4 月初,Meta 发布了史上首个图像分割基础模型–SAM(Segment Anything Model)。作为分割模型,SAM 的能力强大,操作使用方式也十分友好,比如用户简单地点击来选择对应物体,物体就会立即被分割出来,且分割结果十分精准。截至 4 月 15 号,SAM 的 GitHub 仓库的 Star 数高达 26k。

如何利用好如此强大的「分割一切」模型,并拓展到更加有实际需求的应用场景至关重要。例如,当 SAM 遇上实用的图像修补(Image Inpainting)任务会碰撞出什么样的火花?

来自中国科学技术大学和东方理工高等研究院的研究团队给出了令人惊艳的答案。基于 SAM,他们提出「修补一切」(Inpaint Anything,简称 IA)模型。区别于传统图像修补模型,IA 模型无需精细化操作生成掩码,支持了一键点击标记选定对象,IA 即可实现移除一切物体(Remove Anything)、填补一切内容(Fill Anything)、替换一切场景(Replace Anything),涵盖了包括目标移除、目标填充、背景替换等在内的多种典型图像修补应用场景。

主要功能:

尽管当前图像修补系统取得了重大进展,但它们在选择掩码图和填补空洞方面仍然面临困难。基于 SAM,研究者首次尝试无需掩码(Mask-Free)图像修复,并构建了「点击再填充」(Clicking and Filling) 的图像修补新范式,他们将其称为修补一切 (Inpaint Anything)(IA)。IA 背后的核心思想是结合不同模型的优势,以建立一个功能强大且用户友好的图像修复系统

IA 拥有三个主要功能:(i) 移除一切(Remove Anything):用户只需点击一下想要移除的物体,IA 将无痕地移除该物体,实现高效「魔法消除」;(ii) 填补一切(Fill Anything):同时,用户还可以进一步通过文本提示(Text Prompt)告诉 IA 想要在物体内填充什么,IA 随即通过驱动已嵌入的 AIGC(AI-Generated Content)模型(如 Stable Diffusion )生成相应的内容填充物体,实现随心「内容创作」;(iii) 替换一切(Replace Anything):用户也可以通过点击选择需要保留的物体对象,并用文本提示告诉 IA 想要把物体的背景替换成什么,即可将物体背景替换为指定内容,实现生动「环境转换」。IA 的整体框架如下图所示:

Inpaint Anything(IA)示意图。用户可以通过单击来选择图像中的任何物体。借助强大的视觉模型,如 SAM、LaMa 和 Stable Diffusion (SD) ,IA 能够平滑移除选定物体(即 Remove Anything)。进一步地,通过向 IA 输入文本提示,用户可以用任何想要的内容填充物体(即 Fill Anything)或者任意替换对象的物体(即 Replace Anything)

移除一切(Remove Anything)示意图

 「移除一切」步骤如下:

  • 第 1 步:用户点击想要移除的物体;
  • 第 2 步:SAM 将该物体分割出来;
  • 第 3 步:图像修补模型(LaMa)填补该物体。

填补一切

Text prompt: “a teddy bear on a bench”

image

Click on an object, type in what you want to fill, and Inpaint Anything will fill it!

  • Click on an object;
  • SAM segments the object out;
  • Input a text prompt;
  • Text-prompt-guided inpainting models (e.g., Stable Diffusion) fill the “hole” according to the text.

「填补一切」步骤如下:

  • 第 1 步:用户点击想要移除的物体;
  • 第 2 步:SAM 将该物体分割出来;
  • 第 3 步:用户通过文本示意想要填充的内容;
  • 第 4 步:基于文本提示的图像修补模型(Stable Diffusion)根据用户提供的文本对物体进行填充。

替换一切

替换一切(Replace Anything)示意图,图中使用的文本提示:a man in office

「填补一切」步骤如下:

  • 第 1 步:用户点击想要移除的物体;
  • 第 2 步:SAM 将该物体分割出来;
  • 第 3 步:用户通过文本示意想要替换的背景;
  • 第 4 步:基于文本提示的图像修补模型(Stable Diffusion)根据用户提供的文本对物体的背景进行替换。

Text prompt: “a man in office”

image

Click on an object, type in what background you want to replace, and Inpaint Anything will replace it!

  • Click on an object;
  • SAM segments the object out;
  • Input a text prompt;
  • Text-prompt-guided inpainting models (e.g., Stable Diffusion) replace the background according to the text.

Remove Anything 3D

Remove Anything 3D can remove any object from a 3D scene! We release some results below.

org.gif
mask.gif
result.gif

研究者随后在 COCO 数据集、LaMa 测试数据集和他们自己用手机拍摄的 2K 高清图像上对 Inpaint Anything 进行测试。值得注意的是,研究者的模型还支持 2K 高清图和任意长宽比,这使得 IA 系统在各种集成环境和现有框架中都能够实现高效的迁移应用

Segment Everything Everywhere All at Once

论文链接:https://arxiv.org/pdf/2304.06718.pdf

项目链接:https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

试玩地址:https://huggingface.co/spaces/xdecoder/SEEM

Meta 发布「分割一切」AI 模型 ——Segment Anything Model(SAM)。SAM 被认为是一个通用的图像分割基础模型,它学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mask,包括在训练过程中没有遇到过的物体和图像类型。这种「零样本迁移」的能力令人惊叹,甚至有人称 CV 领域迎来了「GPT-3 时刻」。

最近,一篇「一次性分割一切」的新论文《Segment Everything Everywhere All at Once》再次引起关注。在该论文中,来自威斯康星大学麦迪逊分校、微软、香港科技大学的几位华人研究者提出了一种基于 prompt 的新型交互模型 SEEM。SEEM 能够根据用户给出的各种模态的输入(包括文本、图像、涂鸦等等),一次性分割图像或视频中的所有内容,并识别出物体类别。该项目已经开源,并提供了试玩地址供大家体验。

该研究通过全面的实验验证了 SEEM 在各种分割任务上的有效性。即使 SEEM 不具有了解用户意图的能力,但它表现出强大的泛化能力,因为它学会了在统一的表征空间中编写不同类型的 prompt。此外,SEEM 可以通过轻量级的 prompt 解码器有效地处理多轮交互。

大型语言模型 (Large Language Model, LLMs) 的成功,如 ChatGPT,证明了现代人工智能模型在与人类互动中的重要性,并提供了人工通用智能 (AGI) 的一瞥。与人类互动的能力需要一个用户友好的界面,可以接受尽可能多类型的人类输入,并生成人类容易理解的响应。在自然语言处理 (NLP) 领域,这样的通用交互界面已经出现并发展了一段时间,从早期的模型如 GPT 和 T5,到一些更高级的技术,如提示和思维链。在图像生成领域,一些最近的工作尝试将文本提示与其他类型,如草图或布局相结合,以更准确地捕捉用户意图,生成新的提示并支持多轮人工智能交互。

本文提出了一种通用的提示方案,可以通过多种类型的提示(如文本、点击、图像)与用户交互,进而构建一个通用的 “分割一切” 的模型 SEEM。该模型采用 Transformer 编码器-解码器结构,将所有查询作为提示输入到解码器中,并使用图像和文本编码器作为提示编码器来编码所有类型的查询,从而使视觉和文本提示始终保持对齐。

此外,该模型还引入了记忆提示来缩减以前的分割信息,并与其他提示进行通信,以增强互动性。与 SAM 等其他工作不同的是,该模型支持多种提示类型,具有零样本泛化能力。实验结果表明,SEEM 在许多分割任务中具有强大的性能,包括封闭集和开放集全景分割、交互式分割、接地分割以及使用多种提示的分割任务。

在变形金刚的合影中把「擎天柱」分割出来:

图片

还能对一类物体做分割,比如在一张景观图片中分割出所有建筑物:

图片

SEEM 也能轻松分割出视频中移动的物体:

图片

这个分割效果可以说是非常丝滑了。我们来看一下该研究提出的方法。

方法概述

该研究旨在提出一个通用接口,以借助多模态 prompt 进行图像分割。为了实现这一目标,他们提出了一种包含 4 个属性的新方案,包括多功能性(versatility)、组合性(compositionality)、交互性(interactivity)和语义感知能力(semantic-awareness),具体包括

1)多功能性该研究提出将点、掩码、文本、检测框(box)甚至是另一个图像的参考区域(referred region)这些异构的元素,编码成同一个联合视觉语义空间中的 prompt。

2)组合性通过学习视觉和文本 prompt 的联合视觉语义空间来即时编写查询以进行推理。SEEM 可以处理输入 prompt 的任意组合。

3)交互性:该研究引入了通过结合可学习的记忆(memory) prompt,并通过掩码指导的交叉注意力保留对话历史信息。

4)语义感知能力:使用文本编码器对文本查询和掩码标签进行编码,从而为所有输出分割结果提供了开放集语义。

架构方面,SEEM 遵循一个简单的 Transformer 编码器 – 解码器架构,并额外添加了一个文本编码器。在 SEEM 中,解码过程类似于生成式 LLM,但具有多模态输入和多模态输出。所有查询都作为 prompt 反馈到解码器,图像和文本编码器用作 prompt 编码器来编码所有类型的查询。

具体来说,该研究将所有查询(如点、框和掩码)编码为视觉 prompt,同时使用文本编码器将文本查询转换为文本 prompt,这样视觉和文本 prompt 就能保持对齐。5 种不同类型的 prompt 都能都映射到联合视觉语义空间中,通过零样本适应来处理未见过的用户 prompt。通过对不同的分割任务进行训练,模型具有处理各种 prompt 的能力。此外,不同类型的 prompt 可以借助交叉注意力互相辅助。最终,SEEM 模型可以使用各种 prompt 来获得卓越的分割结果。

除了强大的泛化能力,SEEM 在运行方面也很高效。研究人员将 prompt 作为解码器的输入,因此在与人类进行多轮交互时,SEEM 只需要在最开始运行一次特征提取器。在每次迭代中,只需要使用新的 prompt 再次运行一个轻量级的解码器。因此,在部署模型时,参数量大运行负担重的特征提取器可以在服务器上运行,而在用户的机器上仅运行相对轻量级的解码器,以缓解多次远程调用中的网络延迟问题。

如上图 3(b)所示,在多轮交互中,每次交互包含一个人工循环和一个模型循环。在人工循环中,人接收上一次迭代的掩码输出,并通过视觉 prompt 给出下一轮解码的正反馈或负反馈。在模型循环中,模型接收并更新记忆 prompt 供未来的预测。

SEEM 是一种采用通用编码器-解码器架构的模型, 但具有复杂的查询和提示交互, 如图3(a) 所示。给定输入图像 , 首先使用图像编码器提取图像特征 , 然后 SEEM 解码器基于与视觉、文本和记忆提示、 交互的查询输出  来预测掩模  和语义概念 。

在训练期间,  被复制用于全景分割、指代分割和交互分割。

在推断时,可学习的查询从相同的权重集合初始化,从而实现 zero-shot 组合。这种设计受到 X-Decoder 的成功实践的启发,但不同之处是,这允许使用具有以下属性的通用图像分割模型:

多功能

除了文本输入外,SEEM 还引入了视觉提示来处理所有的非文本输入,例如点、框、涂鸦和另一幅图像的区域引用等。

当文本提示无法准确识别正确的分割区域时,非文本提示就能够提供有用的补充信息,帮助准确定位分割区域。 以往的交互式分割方法通常将空间查询转换为掩模,然后将它们馈送到图像骨干网络中,或者针对每种输入类型(点、框)使用不同的提示编码器。然而,这些方法存在重量过大或难以泛化的问题。

为了解决这些问题,SEEM 提出了使用视觉提示来统一所有非文本输入。这些视觉提示以令牌的形式统一表示,并位于同一视觉嵌入空间中,这样就可以使用同一种方法来处理所有非文本输入。 为了提取这些视觉提示的特征,该模型还引入了一个称为“视觉采样器”的方法,用于从输入图像或引用图像的特征映射中提取特定位置的特征。

此外,SEEM 还通过全景和引用分割来持续学习通用的视觉-语义空间,使得视觉提示与文本提示能够自然地对齐,从而更好地指导分割过程。在学习语义标签时,提示特征与文本提示映射到相同的空间以计算相似度矩阵,从而更好地协同完成分割任务。

可组合

用户可以使用不同或组合的输入类型表达其意图,因此在实际应用中,组合式提示方法至关重要。

然而,在模型训练时会遇到两个问题。首先,训练数据通常只涵盖一种交互类型(例如,无、文本、视觉)。其次,虽然我们已经使用视觉提示来统一所有非文本提示并将它们与文本提示对齐,但它们的嵌入空间仍然本质上不同。

为了解决这个问题,本文提出了将不同类型的提示与不同的输出进行匹配的方法。在模型训练后,SEEM 模型变得熟悉了所有提示类型,并支持各种组合方式,例如无提示、单提示类型或同时使用视觉和文本提示。值得注意的是,即使是从未像这样训练过的样本,视觉和文本提示也可以简单地连接并馈送到 SEEM 解码器中。

可交互

SEEM 通过引入记忆提示来进行多轮交互式分割,使得分割结果得到进一步优化。记忆提示是用来传递先前迭代中的分割结果,将历史信息编码到模型中,以在当前轮次中使用。

不同于之前的工作使用一个网络来编码掩模,SEEM 采用掩模引导的交叉注意力机制来编码历史信息,这可以更有效地利用分割历史信息来进行下一轮次的优化。值得注意的是,这种方法也可以扩展到同时进行多个对象的交互式分割。

语义感知

与之前的类别无关的交互式分割方法不同,SEEM 将语义标签应用于来自所有类型提示组合的掩码,因为它的视觉提示特征与文本特征在一个联合视觉-语义空间中是对齐的。

在训练过程中,虽然没有为交互式分割训练任何语义标签,但是由于联合视觉-语义空间的存在,掩膜嵌入(mask embeddings)和 视觉取样器 (visual sampler)之间的相似度矩阵可以被计算出来,从而使得计算出的 logits 可以很好的对齐,如图3(a)所示。

这样,在推理过程中,查询图像就可以汇集多个示例的信息。

实验结果

该研究将 SEEM 模型与 SOTA 交互式分割模型进行了实验比较,结果如下表 1 所示。

作为一个通用模型,SEEM 实现了与 RITM,SimpleClick 等模型相当的性能,并且与 SAM 的性能非常接近,而 SAM 用于训练的分割数据是 SEEM 的 50 倍之多。

与现有的交互式模型不同,SEEM 是第一个不仅支持经典分割任务,还支持各种用户输入类型的通用接口,包括文本、点、涂鸦、框和图像,提供强大的组合功能。如下表 2 所示,通过添加可组合的 prompt,SEEM 在 cIoU,mIoU 等指标上有了显著的分割性能提升。

我们再来看一下交互式图像分割的可视化结果。用户只需要画出一个点或简单涂鸦,SEEM 就能提供非常好的分割结果

也可以输入文本,让 SEEM 进行图像分割

还能直接输入参考图像并指出参考区域,对其他图像进行分割,找出与参考区域一致的物体:

Zero-shot video object segmentation using the first frame plus one stroke:

总结

本文介绍了 SEEM,该模型可以同时对所有语义进行全局分割,并且可以与用户互动,接受来自用户的不同类型的视觉提示,包括点击、框选、多边形、涂鸦、文本和参考图像分割。这些提示 (prompt) 通过提示编码器映射到联合视觉-语义空间中,使我们的模型适用于各种提示,并可以灵活地组合不同的提示。通过大量实验证明,该模型在几个开放和交互分割基准测试上表现出竞争力。

当然,SEEM 并不是完美的,其存在的两个主要限制为:训练数据规模有限SEEM 不支持基于部分的分割。我们通过利用更多的训练数据和监督,可以进一步提高模型性能,而基于部分的分割可以在不改变模型的情况下无缝地从中学习。最后,非常感谢 SAM 提出的分割数据集,这是是非常宝贵的资源,我们应该好好利用起来。

MPViT : Multi-Path Vision Transformer for Dense Prediction

https://arxiv.org/abs/2112.11010(CVPR2022)

https://github.com/youngwanLEE/MPViT

Introduction

  • 在这项工作中,作者以不同于现有Transformer的视角,探索多尺度path embedding与multi-path结构,提出了Multi-path Vision Transformer(MPViT)
  • 通过使用 overlapping convolutional patch embedding,MPViT同时嵌入相同大小的patch特征。然后,将不同尺度的Token通过多条路径独立地输入Transformer encoders,并对生成的特征进行聚合,从而在同一特征级别上实现精细和粗糙的特征表示。
  • 在特征聚合步骤中,引入了一个global-to-local feature interaction(GLI)过程,该过程将卷积局部特征与Transformer的全局特征连接起来,同时利用了卷积的局部连通性和Transformer的全局上下文。

Vision Transformers for dense predictions.

  • 密集的计算机视觉任务,如目标检测和分割,需要有效的多尺度特征表示,以检测或分类不同大小的物体或区域。Vision Transformer(ViT)构建了一个简单的多阶段结构(即精细到粗糙),用于使用单尺度patch的多尺度表示。然而ViT的变体专注于降低自注意的二次复杂度,较少关注构建有效的多尺度表示。
  • CoaT通过使用一种co-scale机制,同时表示精细和粗糙的特征,允许并行地跨层注意,从而提高了检测性能。然而,co-scale机制需要大量的计算和内存开销,因为它为基础模型增加了额外的跨层关注(例如,CoaT-Lite)。因此,对于ViT体系结构的多尺度特征表示仍有改进的空间。

Comparison to Concurrent work.

  • CrossViT利用了不同的patch大小和单级结构中的双路径,如ViT和XCiT。然而,CrossViT的分支之间的相互作用只通过[CLS]token发生,而MPViT允许所有不同规模的patch相互作用。此外,与CrossViT(仅限分类)不同的是,MPViT更普遍地探索更大的路径维度(例如,超过两个维度),并采用多阶段结构进行密集预测。

Method

Conv-stem

输入图像大小为:H×W×3,两层卷积:采用两个3×3的卷积,通道分别为C2/2,C2,stride为2,生成特征的大小为H/4×W/4×C2,其中C2为stage 2的通道大小。

  • 说明:每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。
  • In LeViT , a convolutional stem block shows better low-level representation (i.e., without losing salient information) than non-overlapping patch embedding.

从stage 2到stage 5,作者在每个阶段对所提出的Multi-scale Patch Embedding(MS-PatchEmbed)和Multi-path Transformer(MP-Transformer)块进行堆叠

Multi-Scale Patch Embedding

通过改变stride和padding来调整token的序列长度。也就是说,可以输出具有不同patch大小的相同大小(即分辨率)的特征。因此,作者并行地形成了几个具有不同卷积核大小的卷积patch embedding层。例如,如图1所示,可以生成相同序列长度的不同大小的vision token,patch大小分别为3×3,5×5,7×7。

由于具有相同通道和滤波器大小的连续卷积操作扩大了接受域,并且需要更少的参数,在实践中选择了连续的3×3卷积层。为了减少参数量,在实践中选择了两个连续的3×3卷积层代替5×5卷积。对于triple-path结构,使用三个连续的3×3卷积,通道大小为C’,padding为1,步幅为s,其中s在降低空间分辨率时为2,否则为1。

  • 说明:为了减少模型参数和计算开销,采用3×3深度可分离卷积,包括3×3深度卷积和1×1点卷积。
  • 每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。

接着,不同大小的token embedding features 分别输入到transformer encoder中。

Multi-path Transformer

原因:Transformer中的self-attention可以捕获长期依赖关系(即全局上下文),但它很可能会忽略每个patch中的结构性信息和局部关系。相反,cnn可以利用平移不变性中的局部连通性,使得CNN在对视觉对象进行分类时,对纹理有更强的依赖性,而不是形状。

因此,MPViT以一种互补的方式将CNN与Transformer结合起来。

  • 为了表示局部特征 
  • 采用了一个 depthwise residual bottleneck block,包括1×1卷积、3×3深度卷积和1×1卷积和残差连接。
  • 为了减轻多路径结构的计算负担,使用了CoaT中提出的有效的因素分解自注意:

Global-to-Local Feature Interaction

将局部特征和全局特征聚合起来:

为了保持可比性的参数和FLOPs,增加路径的数量需要减少通道C或层数L(即,transformer encoder的数量)。作者通过减少C而不是L,从单路径(即CoaT-Lite baseline)扩展到triple-path。在消融研究中,验证了减少C比减少L获得更好的性能(见表5)。由于stage2的特征分辨率较高,导致计算成本较高,作者在stage2中将triple-path模型的路径数设置为2。从stage3开始,三路径模型有3条路径。

作者还发现,虽然 triple-path和双路径在ImageNet分类中产生相似的精度,但 triple-path模型在密集预测任务中表现出更好的性能。因此,建立了基于 triple-path结构的MPViT模型。MPViT的详细情况见表1。

Experiments

Ablation study

对MPViT-XS的每个组件进行消融研究,以研究提出的多路径结构对图像分类和使用Mask R-CNN检测的有效性。

Exploring path dimension.

位置编码系列(NLP and CV领域)

NLP中的位置编码

转载:让研究人员绞尽脑汁的Transformer位置编码

总体结构

Bert问世后瞬间引爆了NLP领域,同时也让Transformer火了起来,Transformer中特征提取的方式不是传统的CNN,RNN等,而是用attention的形式,这种模式被用在AI的各个领域中,包括CV和语音等。attention提取特征的效果非常好,可以非常有效的提取到上下文的信息,但是在NLP中会有个问题:attention提取特征的时候,当前这个字对上下文的其他字的关联性可以很好的体现出来,但是其他字的位置在哪里都可以,在这个字的前面、后面都可以,间隔的距离也没有要求。但其实这跟我们平时表达的语言肯定是矛盾的,于是在Transformer中加入了位置编码。

虽然说起来主要就是绝对位置编码和相对位置编码两大类,但每一类其实又能衍生出各种各样的变种,为此研究人员可算是煞费苦心、绞尽脑汁了,此外还有一些不按套路出牌的位置编码。本文就让我们来欣赏一下研究人员为了更好地表达位置信息所构建出来的“八仙过海,各显神通”般的编码方案。

绝对位置编码

形式上来看,绝对位置编码是相对简单的一种方案,但即便如此,也不妨碍各路研究人员的奇思妙想,也有不少的变种。一般来说,绝对位置编码会加到输入中:在输入的第k个向量  \(xk\)中加入位置向量  \(pk\)变为\(xk+pk\),其中\(pk\)只依赖于位置编号k。

训练式

很显然,绝对位置编码的一个最朴素方案是不特意去设计什么,而是直接将位置编码当作可训练参数,比如最大长度为512,编码维度为768,那么就初始化一个512×768的矩阵作为位置向量,让它随着训练过程更新。现在的BERT、GPT等模型所用的就是这种位置编码,事实上它还可以追溯得更早,比如2017年Facebook的《Convolutional Sequence to Sequence Learning》就已经用到了它。

对于这种训练式的绝对位置编码,一般的认为它的缺点是没有外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。但笔者最近的研究表明,通过层次分解的方式,可以使得绝对位置编码能外推到足够长的范围,同时保持还不错的效果,因此,其实外推性也不是绝对位置编码的明显缺点。

三角式

三角函数式位置编码,一般也称为Sinusoidal位置编码,是Google的论文《Attention is All You Need》所提出来的一个显式解:

递归式

原则上来说,RNN模型不需要位置编码,它在结构上就自带了学习到位置信息的可能性(因为递归就意味着我们可以训练一个“数数”模型),因此,如果在输入后面先接一层RNN,然后再接Transformer,那么理论上就不需要加位置编码了。同理,我们也可以用RNN模型来学习一种绝对位置编码,比如从一个向量p0出发,通过递归格式pk+1=f(pk)来得到各个位置的编码向量。

ICML 2020的论文《Learning to Encode Position for Transformer with Continuous Dynamical Model》把这个思想推到了极致,它提出了用微分方程(ODE)dpt/dt=h(pt,t)的方式来建模位置编码,该方案称之为FLOATER。显然,FLOATER也属于递归模型,函数h(pt,t)可以通过神经网络来建模,因此这种微分方程也称为神经微分方程,关于它的工作最近也逐渐多了起来。

理论上来说,基于递归模型的位置编码也具有比较好的外推性,同时它也比三角函数式的位置编码有更好的灵活性(比如容易证明三角函数式的位置编码就是FLOATER的某个特解)。但是很明显,递归形式的位置编码牺牲了一定的并行性,可能会带速度瓶颈。

相乘式

刚才我们说到,输入xk与绝对位置编码pk的组合方式一般是xk+pk,那有没有“不一般”的组合方式呢?比如xk⊗pk(逐位相乘)?我们平时在搭建模型的时候,对于融合两个向量有多种方式,相加、相乘甚至拼接都是可以考虑的,怎么大家在做绝对位置编码的时候,都默认只考虑相加了?

很抱歉,笔者也不知道答案。可能大家默认选择相加是因为向量的相加具有比较鲜明的几何意义,但是对于深度学习模型来说,这种几何意义其实没有什么实际的价值。最近笔者看到的一个实验显示,似乎将“加”换成“乘”,也就是xk⊗pk的方式,似乎比xk+pk能取得更好的结果。具体效果笔者也没有完整对比过,只是提供这么一种可能性。关于实验来源,可以参考《中文语言模型研究:(1) 乘性位置编码》

相对位置编码

相对位置并没有完整建模每个输入的位置信息,而是在算Attention的时候考虑当前位置与被Attention的位置的相对距离,由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。对于相对位置编码来说,它的灵活性更大,更加体现出了研究人员的“天马行空”。

经典式

相对位置编码起源于Google的论文《Self-Attention with Relative Position Representations》,华为开源的NEZHA模型也用到了这种位置编码,后面各种相对位置编码变体基本也是依葫芦画瓢的简单修改。

一般认为,相对位置编码是由绝对位置编码启发而来,考虑一般的带绝对位置编码的Attention:

XLNET式

XLNET式位置编码其实源自Transformer-XL的论文《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》,只不过因为使用了Transformer-XL架构的XLNET模型并在一定程度上超过了BERT后,Transformer-XL才算广为人知,因此这种位置编码通常也被冠以XLNET之名。

T5式

T5模型出自文章《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,里边用到了一种更简单的相对位置编码。思路依然源自展开式(7)(7),如果非要分析每一项的含义,那么可以分别理解为“输入-输入”、“输入-位置”、“位置-输入”、“位置-位置”四项注意力的组合。如果我们认为输入信息与位置信息应该是独立(解耦)的,那么它们就不应该有过多的交互,所以“输入-位置”、“位置-输入”两项Attention可以删掉,而piWQW⊤Kp⊤j⊤实际上只是一个只依赖于(i,j)的标量,我们可以直接将它作为参数训练出来,即简化为

说白了,它仅仅是在Attention矩阵的基础上加一个可训练的偏置项而已,而跟XLNET式一样,在vj上的位置偏置则直接被去掉了。包含同样的思想的还有微软在ICLR 2021的论文《Rethinking Positional Encoding in Language Pre-training》中提出的TUPE位置编码。

DeBERTa式

DeBERTa也是微软搞的,去年6月就发出来了,论文为《DeBERTa: Decoding-enhanced BERT with Disentangled Attention》,最近又小小地火了一把,一是因为它正式中了ICLR 2021,二则是它登上SuperGLUE的榜首,成绩稍微超过了T5。

其实DeBERTa的主要改进也是在位置编码上,同样还是从展开式(7)(7)出发,T5是干脆去掉了第2、3项,只保留第4项并替换为相对位置编码,而DeBERTa则刚刚相反,它扔掉了第4项,保留第2、3项并且替换为相对位置编码(果然,科研就是枚举所有的排列组合看哪个最优):

不过,DeBERTa比较有意思的地方,是提供了使用相对位置和绝对位置编码的一个新视角,它指出NLP的大多数任务可能都只需要相对位置信息,但确实有些场景下绝对位置信息更有帮助,于是它将整个模型分为两部分来理解。以Base版的MLM预训练模型为例,它一共有13层,前11层只是用相对位置编码,这部分称为Encoder,后面2层加入绝对位置信息,这部分它称之为Decoder,还弄了个简称EMD(Enhanced Mask Decoder);至于下游任务的微调截断,则是使用前11层的Encoder加上1层的Decoder来进行。

SuperGLUE上的成绩肯定了DeBERTa的价值,但是它论文的各种命名真的是让人觉得极度不适,比如它自称的“Encoder”、“Decoder”就很容易让人误解这是一个Seq2Seq模型,比如EMD这个简称也跟Earth Mover’s Distance重名。虽然有时候重名是不可避免的,但它重的名都是ML界大家都比较熟悉的对象,相当容易引起误解,真不知道作者是怎么想的…

其他位置编码

绝对位置编码和相对位置编码虽然花样百出,但仍然算是经典范围内,从上述介绍中我们依然可以体会到满满的套路感。除此之外,还有一些并不按照常规套路出牌,它们同样也表达了位置编码。

CNN式

尽管经典的将CNN用于NLP的工作《Convolutional Sequence to Sequence Learning》往里边加入了位置编码,但我们知道一般的CNN模型尤其是图像中的CNN模型,都是没有另外加位置编码的,那CNN模型究竟是怎么捕捉位置信息的呢?

如果让笔者来回答,那么答案可能是卷积核的各项异性导致了它能分辨出不同方向的相对位置。不过ICLR 2020的论文《How Much Position Information Do Convolutional Neural Networks Encode?》给出了一个可能让人比较意外的答案:CNN模型的位置信息,是Zero Padding泄漏的!

我们知道,为了使得卷积编码过程中的feature保持一定的大小,我们通常会对输入padding一定的0,而这篇论文显示该操作导致模型有能力识别位置信息。也就是说,卷积核的各向异性固然重要,但是最根本的是zero padding的存在,那么可以想象,实际上提取的是当前位置与padding的边界的相对距离。

不过,这个能力依赖于CNN的局部性,像Attention这种全局的无先验结构并不适用,如果只关心Transformer位置编码方案的读者,这就权当是扩展一下视野吧。

复数式

复数式位置编码可谓是最特立独行的一种位置编码方案了,它来自ICLR 2020的论文《Encoding word order in complex embeddings》。论文的主要思想是结合复数的性质以及一些基本原理,推导出了它的位置编码形式(Complex Order)为:

代表词j的三组词向量。你没看错,它确实假设每个词有三组跟位置无关的词向量了(当然可以按照某种形式进行参数共享,使得它退化为两组甚至一组),然后跟位置k相关的词向量就按照上述公式运算。

你以为引入多组词向量就是它最特立独行的地方了?并不是!我们看到式(11)(11)还是复数形式,你猜它接下来怎么着?将它实数化?非也,它是将它直接用于复数模型!也就是说,它走的是一条复数模型路线,不仅仅输入的Embedding层是复数的,里边的每一层Transformer都是复数的,它还实现和对比了复数版的Fasttext、LSTM、CNN等模型!这篇文章的一作是Benyou Wang,可以搜到他的相关工作基本上都是围绕着复数模型展开的,可谓复数模型的铁杆粉了~

融合式

无偶独有,利用复数的形式,笔者其实也构思了一种比较巧的位置编码,它可以将绝对位置编码与相对位置编码融于一体,分享在此,有兴趣的读者欢迎一起交流研究。

简单起见,我们先假设qm,kn是所在位置分别为m,n的二维行向量,既然是二维,那么我们可以将它当作复数来运算。我们知道,Attention关键之处在于向量的内积,用复数表示为

来赋予[x,y]绝对位置信息,那么在Attention运算的时候也等价于相对位置编码。如果是多于二维的向量,可以考虑每两维为一组进行同样的运算,每一组的θ可以不一样。

这样一来,我们得到了一种融绝对位置与相对位置于一体的位置编码方案,从形式上看它有点像乘性的绝对位置编码,通过在q,k中施行该位置编码,那么效果就等价于相对位置编码,而如果还需要显式的绝对位置信息,则可以同时在v上也施行这种位置编码。总的来说,我们通过绝对位置的操作,可以达到绝对位置的效果,也能达到相对位置的效果,初步实验显示它是可以work的,但还没有充分验证,欢迎大家尝试交流。

Chain of Thought

paper: https://arxiv.org/abs/2201.11903

  • zero-shot:输入问题,等待输出结果
  • CoT:输入问题并提示Let’s think step by step
  • Manual-CoT: 是一种few shot方法,所以构造了一些模板Q&A(模板A中也有Let’s think step by step),然后再给出问题并提示Let’s think step by step
  • Auto-CoT:采样多个问题,每个问题提示Let’s think step by step,让模型给出答案。然后拼接所有生成的Q&A并给出最终问题,并提示Let’s think step by step

为什么需要CoT?

问题可以分为两类:一类是容易回答的,没有太多逻辑推理的,比如:天气如何?面包几块钱?另一类是需要长链条的逻辑推理的问题:数学等。

当语言模型的规模指数级增大时,它解决常规问题的能力有了很大的提升,然而它解决逻辑推理的问题的能力却提升很小。而CoT就是帮助解决这样的问题,它的核心思想是:不要光给出答案,把推理过程也给出来。如下图所示,关键在于构造的prompt要包含推理过程:

为什么延长推理过程就有效呢?这可能是因为语言模型token-by-token的特点。

标准的prompt可以被视为大模型能力的下限,如何提取大模型学到的知识的问题是一个难点,标准的prompt是一个很好的起点,但却绝不是终点。

多模态|BLIP 、CoCa and BeiTv

BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

代码: https://github.com/salesforce/BLIP

本文是 ALBEF 原班人马做的,基本可以看做吸收了 VLMo 思想的 ALBEF。训练的 loss 和技巧都与 ALBEF 一致,属于 ALBEF 的后续工作。

本文motivation主要有两个:一是之前多模态预训练模型结构要么是基于编码器,不能直接用于生成任务,要么是基于编码解码器,在检索类任务上不方便,本文设计的结构包含单模态编码器、视觉指导文本编码器、视觉指导文本解码器,可以方便地用对比学习、ITM(Image-Text Matching ( ITM ): 图文匹配任务,针对的是图文交互流,即判断当前pair是不是匹配(就是个分类任务))、LM(生成式任务)三个预训练任务训练不同的模块,也容易迁移到各种下游任务中;二是之前的很多工作通过扩充了网上搜集的图文对的预训练数据(GCC、SBU、CC12M),提高了模型效果,但忽略了其中有很多不对齐的噪声情况,本文用一个boostrapping的方法,用captioner为网络图片生成描述,用filter过滤掉不配对的数据,从而降低噪声,更高效地利用网络上的数据。

关键的改进:

1. 模型结构上整合了 ALBEF 和和 VLMo。VLMo 参数共享,但是不存在单独编码器;ALBEF 存在单独编码器但是部分参数不共享。这篇论文存在单独的 vision encoder 和 text encoder。多模态的参数是以 cross-attention 模块插入到文本编码器实现的,cross-attention 模块享受文本编码器的参数(可以看 col 2 和 col3)

2. 增加了解码器(参考 col 4),为了做生成任务。解码器拿到视觉特征和未掩码的语言特征,过一个 casual self-attention 层,做 GPT 用的那种 lm 任务。这里区别于 MLM 的那种 mask 机制,是通过 causal self-attention 来实现因果推理的,我此时还不熟悉这个过程。

3. 除了上面的主要部分,还有一个重要的部分是利用训练好的模型生成伪标签。将训练好的模型里的不同的部分拿出来在 COCO 上稍微微调一下,decoder 部分可以生成文本,算 ITM loss 的那个模块可以做 image-text pair 的过滤,通过输出打分、置信度的方式。在实验中,BLIP 的解码能力似乎很强,用这种范式生成的文本不仅人看着觉得不错,用于自训练后也可以涨点 2-3,非常显着。

   一个例子是 stable diffusion 的官方博文里提到了,他们在做微调时,会遇到数据集只有图片没有 caption 的情况,比如 pokeman 数据。他们用 BLIP 来做caption生成,然后微调 stable diffusion 发现效果很好。

   另一个例子是知名的开源多模态数据集 LAION,他们也用了 BLIP 来辅助制作数据集。他们的过程在官网公布了,可以参考。

总结:个人感觉模型部分的改进可能有用可能没有用,但是解码器输出的 caption 确实是不错。以至于很多下游任务都拿 BLIP 来生成 caption。

CoCa

Contrastive Captioners are Image-Text Foundation Models

代码: https://github.com/lucidrains/CoCa-pytorch

它也是 ALBEF 的后续工作,模型非常像。区别在于:

1. 图像用了 attentional pooling,这在本文的实验中有效

2. 去掉了 ITM loss,目的是加快训练,原本文本需要 forward 2-3 次,去掉 ITM loss 之后只需要 forward 一次就可以了。在 ALBEF 中,ITM 需要完整的 text,而 MLM 需要掩码,所以是两次输入。在 BLIP 中,ITC 一次,ITM 因为在文本模型中插入了新的模块,所以得单独做前向。而 LM 因为用了既多了新的模块又得用 causal self-attention 所以又得单独做一次。在 CoCa 中,为了完成 captioning loss 和 ITC loss,只需要做一次前向即可。GPT 中把 cls-token 放在最后面就可以得到全局表征来做 ITC loss 了。

简单快速的方法可以有效地 scale,而我们知道复杂的模型设计、loss 设计经常不如简单地放大模型、增加数据有效。参考凯明的 FLYP。

这种画图的方式很不错,很直观。可以参考,以后也画成这样。

总结:

简单有效的结构设计,我对 CoCa 的印象是简单有效。它的峰值性能我没有感觉很炸裂,可能是模型、数据 scale 之后自然的结果。但是它的 zero-shot 性能让我印象很深刻,在 imagenet 上微调不微调的差距很小,这一点非常非常关键。

读到 coca,我对多模态的疑问还有两点:

1. mixture of experts 的结构没有在本文中得到应用,但我感觉是个相当有前途的结构

2. 双向的生成 loss 还是没人做,谁说只能图像辅助文本?

BeiTv

(BEiT-3) Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks

论文的卖点是大一统。在 introduction 章节详细介绍了大一统指的是统一模型、loss 和数据。我觉得可以简单地概括为:用统一的 multi-way transformer (mixture of experts ) 架构和单个 masked modeling loss,将任意模态看做是同一个模态来建模。

具体而言,它指的是在将任意模态输入网络后,都表现为 list of tokens,直接将它们看做是相同的模态来做 masked modeling 就好了。如果想要拿过去做下游任务的话,直接将需要的那部分模型拿出来即可。比如做视觉任务就拿视觉模型,做语言任务就拿语言模型。如果是做多模态任务,可以灵活地模拟不同的需求,比如:1. 做生成任务可以拿多模态部分的参数出来 2. 做图文检索可以单独取出视觉部分和语言部分来模拟 CLIP。不仅仅是能做任意任务,还继承了前作的优点,比如 CLIP 这种弱跨模态交互带来的计算效率的优势。

总结:

Neural Corpus Indexer—文档检索

paper:https://arxiv.org/abs/2206.02743

神经语料库索引for文档检索

最近一篇Neural Corpus Indexer基于transformer的文档检索引发了争论。【知乎】所指论文为NeurIPS2022 Outstanding Paper A Neural Corpus Indexer for Document Retrieval。 根据OpenReview上的Revisions记录,Rebuttal阶段的最后修改应该是https://openreview.net/references/pdf?id=y45TgWUfyF,此时Table 1内容为:

但Camera Ready版本是https://openreview.net/references/pdf?id=-bt0HSi9__,此时Table 1的内容为:

特别值得注意的是,在Rebuttal阶段,作者的General Response指出他们的工作即使去掉query generation进行公平比较,也远胜于基线:

但是根据Camera Ready版本的Table 1(见上)和Table 3

NCI(Base) w/ QG是65.86 NCI(Large) w/ QG是66.23 NCI(Base) w/o QG是46.41。如果NCI(Large) w/o QG像w/ QG的设置一样只比Base高0.37,那么它将低于Table 1中的SEAL(Large),而根据General Response,作者认可SEAL是w/o QG的设置。

反思:其实在机器学习里面,如果你的实验有了好的结果,尤其是特别好的结果,那么90%的情况都是有bug造成的。所以在效果比较好的情况时候一定要去仔细检查,看看是否有数据泄漏的情况。这个错误是比较常见的。

文本检索:在一堆的文本里面,将那些跟Query相关的文档找出来。是信息检索里最大的分支。相关信息检索的会议有:SigIR、WSDN、KDD、 NeurIPS (这个 NeurIPS 上文本检索的文章比较少,是一个偏算法的会议)

摘要:

当前最主流的的文档检索解决方案主要是基于索引检索方法,索引就是指对文档做一下哈希值或者embedding,但是索引很难直接针对最终检索目标结果进行优化。 因为哈希是一个固定的算法,或者词嵌入也不一定是根据用户最终的目标来做训练的。在这篇论文中,我们的目标是展示一个端到端的深度神经网络网络统一训练和检索阶段,可以显着提高召回率。在检索方面,召回率相比于准确率更加重要,因为需要把相关的文档全部都找出来,不希望遗漏。在这个文章中,作者提出了一个基于equence-to-sequence network(NCI),针对特定的query来说直接生成相关文档的id。为了提升NCI性能,提出了一个解码器(refix-aware weight-adaptive decoder),还使用了一些其他技术:query的生成、带语义的文档的ID和一致性的正则表达项。

摘要的写法比较常见:该领域之前的方法是怎样的,我们使用一个神经网络做一个端到端的学习,从原始的数据直接生成你要的一个结果。

导言:

文档检索和排序是标准网络搜索引擎的两个关键阶段。 第一,文档检索阶段就是给定一个query,来查询相关的候选文档,然后进行排名阶段为每个文档提供更精确的排名分数。 排名阶段通常由深度神经网络,将每对查询和文档作为输入并预测它们的相关性分数。 然而,一个精确的排名模型是非常昂贵的(对每一个查询对都要去预测分数),所以通常只有一百或一千个检索的候选结果。 因此,召回性能文档检索阶段对网络搜索引擎的有效性至关重要。(检索的这几百个候选结果应该要把所有相关的都包含进来才好)。

其实除了检索的召回率很重要,对于一个检索系统来说,性能是十分重要的,作者在这没有提到,对于一个搜索引擎来说,文档数量在千百亿以上,这个也是这篇文章的一个硬伤,就是太贵了。

现有的文档检索方法可以分为两类,即term-based和基于语义的方法。基于 term 术语的检索方法一般会构建一个倒排索引对整个网络语料库(可以认为就是一个字典,字典里的每个key就是查询,key的值就是对应这个文档id(key出现在该文档中))这个方法非常高效,但它们几乎无法捕获文档语义并且无法检索到类似的不同措辞的文件(比如我输入“文件”,找到的结果只是含有该“文件“的文档,对于文件的相似表达”file“,无法检索到)。 因此,提出了基于语义的方法 来减轻这种差异。基于语义的方法就是把query和文档分别映射成向量(使用twin-tower architecture架构)。然后使用近似K紧邻搜索感兴趣的的K个文档。这种方法的缺点:对于精确匹配exact match,(苹果13和苹果12)表现不好。另外就是ANN近邻算法某些情况(query和文档之间的关系复杂)下也不太好。

端到端的相关工作:一个是DSI,Differentiable Search Index,文本到文本的生成,一个纯transformer,DSI 中的解码器没有充分利用文档标识符的层次结构。第二个SEAL 通过利用段落中的所有 n-gram 作为其标识符id。

twin-tower architecture

Neural Corpus Indexer

神经语料库索引器 (NCI) 是一种序列到序列的神经网络模型。 该模型将查询作为输入并输出最相关的文档标识符 (docid),它可以通过大量<query, docid>对进行训练。

下图就是这个模型的示意图。每次用户输入的是查询query,模型输出的是docID。那文本检索中的文档在哪?文档不可能作为输入送进模型,因为文档数量太大了,开销比较大。这个模型预测的时候不会看到文档的信息,但是做检索肯定需要模型知道各个文档的信息,所以就需要把这些文档全部放入这个模型。所以这部分数据分为两部分,一部分就是<query,docID>查询对。另一部分就是大量的被检索的文档<doc,docID>,因为模型预测的是query到docid的映射,所以需要让模型记住文档和docid的关系,常见做法就是用<doc,docid>无标号的数据去让模型记住全部的文档,当然这里可以把一个<doc,docID>对拆分成多个<query,docid>对,就是把doc里的句子给拆分成query会比较好做一些。模型的设计里有一些比较重要的点:(1)如何设计一个docID,而并非简单的数字,最好docID能够表示doc之间的语义信息。(2)如何将文档分出比较好的query,使得文档自己的语义和它的ID之间做好映射。同时分出的query能够跟预测时候的用户查询query有一定的相似性。(3)模型如何设计?编解码器和loss

NCI示意图

上图就是对应的三个关键点。

  • 如何生成语义的ID:层次Kmeans算法

首先,上图中所有的灰点都代表不同的文档,首先对所有的文档做一个K-means聚类(k=3),不同的类给与不同的id(1,2,3),作为文档id的前缀,如果某个类里面的文档数量多于某个阈值C,他就会对这个类进一步做K-means,继续分出K个子类和对应的id。因此如果两个文档的前缀相近,表示俩个文档的距离比较近。这种层次化标号的好处是如果面对10000中类别标号,直接用一个softmax来对其分类是不好的,有了层次化的标号,就可以分层次预测类别。

  • 从文本生成query

1、DocT5Query:sequence to sequence的模型,将Doc 翻译成 Query的模型。如何使用:将用于检索的文档输入到该模型,来获得多个query的输出(随机采样方法)。

2、Document as Query,像DSI一样,先把每个文档最先的64个term词作为一个query。然后随机在文档的随机位置选择10组,每组64个词作为query。(共11个query)

Prefix-aware weight-adaptive decoder:

r0,r1,r2就是不同层次的类别的id。相比传统的解码器,作者更加考虑到了r0,r1,r2之间的相对位置关系,因此解码器的输入不再是r0,r1,而是包含位置的(1,r0),(2,r1)。实验表明包含位置的解码器输入对于模型提升很大!!!!

另外作者认为在解码器的最后的softmax的全值W对于不同的ri是一样的,这样是不好的,因此希望不同的r对应不同权重。

因此新的Wi如下所示:不仅包含Wi,也包含前面的r0到ri-1的这些信息。

损失函数:

1、增加一个对比学习损失函数,希望同一个query生成的id之间相似度更加接近一些。

2、标准的 cross entropy损失函数

实验

数据集(问答数据集文档来自wiki):

评价指标:

1、Recall@N:表示在获得的N个结果中有没有自己想要的文档

2、MRR: 表示返回结果的排序情况,我们想要的文档在所有结果中的排序情况

结果:

消融实验

性能:在32G的v100上面,时延在100ms还是可以的,但是吞吐量只有50多个query对于搜索引擎来说是不能忍受的。工业部署上还是有一定的距离。

缺点:1、大数据集:目前只是在32万的文档上训练结果,但要是真的用于web搜索,数以亿计的文档需要的模型会很大。2、推理的时延和吞吐量 3、面对新的文档,如何去更新模型?