AudioPaLM-可以听说的大模型

AudioPaLM,一个用于语音理解和生成的大型语言模型。AudioPaLM融合了基于文本和基于语音的语言模型,将PaLM-2和AudioLM集成到一个统一的多模式架构中,该架构可以处理和生成文本和语音,可以实现包括语音识别和语音到语音翻译。AudioPaLM继承了AudioLM保留说话人身份和语调等非语言信息的能力,以及仅存在于PaLM-2等文本大型语言模型中的语言知识。我们证明,使用纯文本大型语言模型的权重初始化AudioPaLM可以改善语音处理,成功地利用预训练中使用的大量文本训练数据来帮助语音任务。 由此产生的模型显著优于现有的语音翻译任务系统,并且能够为许多语言执行零样本语音到文本的翻译,这些语言在训练中没有看到输入/目标语言组合。

https://google-research.github.io/seanet/audiopalm/examples/

https://arxiv.org/html/2306.12925

AudioPaLM的核心是一个联合词汇表,它可以用有限数量的离散tokrn来表示语音和文本,结合任务的基本标记描述,允许在涉及任意交织的语音和文本的混合任务上训练单个仅解码器模型。这包括语音识别、文本到语音合成和语音到语音翻译,将传统上由异构模型解决的任务统一到单个架构和训练运行中。此外,由于AudioPaLM的底层架构是大型Transformer模型,因此我们可以使用在文本上预训练的大型语言模型的权重来初始化其权重,这允许其受益于诸如PaLM的模型的语言和常识知识。

图1:AudioPaLM模型,以语音到语音翻译和自动语音识别为例。我们采用一个预训练的纯文本模型(虚线),并扩展其嵌入矩阵来建模一组新的音频令牌,这里的token基于w2v-BERT 或者USM-v提取的,但token中同时含有语义信息和说话人声学信息【 k-means聚类之前不对嵌入进行归一化 ,用于保留说话人信息】。模型架构在其他方面没有改变:文本和音频令牌的混合序列作为输入被送入,并且模型解码文本或音频令牌。音频令牌通过后面的AudioLM阶段或SoundStorm转换回原始音频。

我们使用一个只有解码器的Transformer来建模由文本和音频令牌组成的序列。就模型而言,文本和音频只是任意整数的序列,因为输入在馈送到模型之前被标记化,并且任何输出在返回给模型的用户之前都被去token化。通过在有限的词汇表中用离散的标记来表示语音,我们可以构建一个多模态词汇表,它是这个音频词汇表和一个用于表示文本的SentencePiece的结合。因此,原则上,我们的设置和通常的纯文本解码器设置之间几乎没有区别,除了在我们的设置中,一些令牌代表音频和一些文本,并且我们使用预训练的纯文本检查点初始化我们的多模态模型。

方法

音频嵌入和令牌化

将原始波形转换为令牌。这涉及从现有的语音表示模型中提取嵌入,然后将这些嵌入离散化为有限的音频令牌集合。从w2v-BERT模型中提取嵌入,通过K-means进行离散化。在这项工作中,我们实验了以下方法来获得一组离散的音频令牌:

1、我们使用了一个w2v-BERT模型,该模型已经在多语言数据上进行了训练,其次,我们在执行k-means聚类之前不对嵌入进行归一化。虽然Borsos等人发现标准化在不降低性能的情况下删除了说话者身份信息,但我们发现在多语言环境中,标准化确实会导致性能下降保留了说话人的声学信息,所以这里的token可以认为是声学token+语义token】。该方法以25 Hz的速率产生令牌,令牌词汇表的大小为1024。

2、USM-v1:我们使用更高性能的通用语音模型(USM)编码器执行相同的过程,以替换w2v-BERT编码器。我们使用这个多语言语音编码器的最大2B参数变体,并从中间层提取嵌入。与w2v-BERT类似,该方法以25 Hz的速率生成令牌,令牌词汇表的大小为1024。

修改纯文本解码器以适应文本和音频

在Transformer解码器中,输入预处理后模型的第一层是标记嵌入矩阵 𝐄 ,它将整数值标记映射到密集嵌入;给定 t 标记的词汇表和大小为 m 的嵌入, 𝐄 是 t×m 矩阵,其第 i 行给出第 i 标记的嵌入。 另一个嵌入矩阵 𝐄′ 出现在最后的softmax层中,用于计算每个位置上所有标记的logit;它是一个 m×t 矩阵,与模型的 m 维输出相乘,以获得logit的 t 维向量,每个标记一个。 在PaLM架构中,这些矩阵具有共享变量,因此一个是另一个的转置,即 𝐄′=𝐄 。

解码器架构的其余部分对建模的令牌数量完全无关。 因此,我们只需要做一个小的修改,将纯文本模型转换为同时对文本和音频进行建模的模型:我们将嵌入矩阵 𝐄 的大小扩展为大小 (t+a)×m ,其中 a 是音频令牌的数量( 𝐄′=𝐄 的大小相应地改变)。

为了利用预训练的文本模型,我们通过向嵌入矩阵 𝐄 添加 a 新行来更改现有的模型检查点。实现细节是前 t 令牌(从零到 t )对应于SentencePiece文本令牌,而接下来的 a 令牌(从 t 到 t+a )表示音频令牌。 虽然我们可以重用预训练模型的文本嵌入,但新的音频嵌入是新初始化的,必须经过训练。我们发现有必要训练所有模型参数,而不是保持以前的权重固定。我们使用混合语音和文本任务进行训练。

3、将音频令牌解码为原始音频

为了从音频令牌合成音频波形,我们实验了两种不同的方法:i)自回归解码,遵循AudioLM的设置非自回归解码,ii) 使用最近提出的SoundStorm模型。在这两种情况下,音频令牌首先用于生成声音流令牌,然后用卷积解码器将其转换为音频波形。

AudioLM中的声学生成分两个阶段进行:先将音频token声音流令牌,然后再在合成语音“阶段2”是仅解码器的Transformer模型,其将AudioPaLM产生的音频令牌和语音调节作为输入,并生成SoundStream令牌,其可用于以所需语音实现语音,但比特率非常低。“阶段3”重建SoundStream的残差矢量量化器的更高级别,这增加了比特率并提高了音频质量。

SoundStorm提出了一种替代的非自回归解码方案,该方案应用了一种迭代方法,该方法在所有令牌上并行进行。SoundStorm产生的音频质量与AudioLM相同,但在语音和声学条件方面具有更高的一致性,同时速度快了两个数量级。

通过提供原始输入语音的一部分作为语音调节,该模型能够在将其语音翻译为不同语言时保留原始说话者的语。

实验

由于 AudioPaLM 是基于 Transformer 模型的大语言模型,它可以使用基础的文本预训练模型来初始化权重,从而受益于 PaLM 或 PaLM 2 等模型的语言和常识知识。由于统一的多模态架构,AudioPaLM 能够使用直接映射或组合任务的方式来解决语音识别、语音合成和语音翻译等问题。单一任务包括自动语音识别(ASR)、自动语音翻译(AST)、语音到语音翻译(S2ST)、文本到语音(TTS)和文本到文本机器翻译(MT)等。为了指定模型在给定输入上执行的任务,可以在输入前加上标签,指定任务和输入语言的英文名称,输出语言也可以选择加上。例如,[ASR French]表示执行法语的自动语音识别任务,[TTS English]表示执行英语的文本到语音任务,[S2ST English French]表示执行从英语到法语的语音到语音翻译任务,而组合任务的标签[ASR AST S2ST English French]表示依次进行从英语到法语的自动语音识别、自动语音翻译、语音到语音翻译。微调使用的数据集包含音频、音频的转录、音频的翻译、音频的翻译文本等。一个数据集可以用于多个任务,将同一数据集中的多个任务结合起来可以提高性能。

AudioPaLM 在语音翻译基准测试中展示了最先进的结果,并在语音识别任务上表现出竞争性能。利用 AudioLM 的语音提示,该模型还可以对未见过的讲话者进行 S2ST,超越现有方法,以客观和主观评估的方式衡量语音质量和声音保持。另外,该模型展示了零样本迁移的能力,可以使用训练中未曾出现过的语音输入/目标语言组合进行 AST。

SpeechTokenizer: Unified Speech Tokenizer for Speech Language Models

语音语言模型的统一语音标记器

https://github.com/ZhangXInFD/SpeechTokenizer

SpeechTokenizer: Unified Speech Tokenizer for Speech Language Models

SpeechTokenizer是一个统一的语音语言模型的语音分词器,它采用了编码器-解码器架构与残差矢量量化(RVQ)。统一语义和声学标记SpeechTokenizer在不同的RVQ层上分层地解开语音信息的不同方面。具体地,RVQ的第一量化器输出的代码索引可以被认为是语义令牌,并且其余量化器的输出主要包含音色信息,其用作对由第一量化器丢失的信息的补充。

目前的Speech Langauge Model(speech LM)大多依赖于语音的离散表示。具体来说,这些模型首先将连续的语音信号转换成离散的tokens,进而像处理文本一样以自回归的方式进行训练,再通过一个解码器将离散tokens恢复为语音。

比较常用的语音离散表示大致可分为两种:语义semantic token和 声学acoustic token。token如其名,通常认为semantic token建模语音中较为global的内容信息,它们来自于以mask langauge modeling为training objective的自监督预训练模型,比较常见的有HuBERT, W2VBERT等;acoustic token建模语音中的局部声学细节,通常来自于以reconstruction为training objective的neural audio codec,比较常见的有SoundStream, EnCodec。

基于这两种token,目前已有的speech LM建模范式大致可分为三类

  1. Semantic language models: 基于semantic token的自回归模型,常外接一个unit-vocoder来恢复语音,比如SpeechGPT。这类模型虽然可以完成一些语音内容相关的任务,但是它们产生的音质比较一般,并且无法完成一些副语言学相关的任务,比如音色转换等。
  2. Acoustic language models: 基于acoustic token的speech LM,比如VALL-E。这类模型产生的语音音质比较好,并且可以较好地完成一些比如zero-shot TTS的任务,但是会存在内容不准确的问题。
  3. Hierarchical speech language models: 这类模型由Semantic language models和Acoustic language models 级联而成,既可以产生比较精确的内容,也可以产生较好的音质,比如AudioPaLM。但是这类模型,建模阶段太多,较为复杂,需要两种tokenizer的参与;而且在semantic token和acoustic token之间其实存在有很大的信息冗余,会带来一些不必要的建模难度。

因此,如果想要打造好的speech LM,需要有一个理想的speech tokens,它应该具有以下两个特征:

  1. 和文本的对齐程度比较高
  2. 保留了语音中各个方面的信息

但是现有的speech tokens都不是专门为构建speech LM而设计的,并不清楚它们和speech LM的适配性。因此我们建立了SLMTokBench来评估不同类型speech token在构建speech LM方面的适用性。它从文本对齐程度和信息保留程度两个方面来量化分析speech tokens,具体评测方法可以看我们论文。通过SLMTokBench,我们发现semantic tokens和文本的对齐程度比较高,但是损失了语音中很大一部分说话人信息。acoustic tokens保留了语音中的各个方面信息,但是和文本的对齐程度不够高。因此,他们都不适合于构建speechLM。

方法

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

基于此,我们想统一semantic token和acoustic token,我们提出了SpeechTokenizer,它基于EnCodec架构,在不同的RVQ层上对语音信息进行解耦和分层建模,从而让第一层token建模语音中的内容信息,剩下几层token补充除内容信息之外的其他信息,如下图。这是首个专为speech LM设计的语音离散化工具。

具体实现方法为在EnCodec的整体框架上,使用HuBERT representation对RVQ-1的quantized output进行semantic guidance,从而达到第一层token建模语音中的内容信息的效果,并且残差结构会使得剩下的几层来补充内容信息之外的其他信息。使用EnCodec的基于卷积的编码器-解码器网络,该网络使用选定的步幅因子执行时间缩减。值得注意的是,我们已经用两层BiLSTM代替了最初在EnCodec编码器中的卷积块之后的两层LSTM,以增强语义建模能力。我们对附录B中的模型结构进行了消融研究。我们使用残差向量量化(RVQ)来量化编码器的输出,RVQ是一种可以在初始量化步骤之后使用不同码本来量化残差的方法。有关模型结构的更多详细信息,请参见附录D。 在训练期间,语义教师提供语义表示以指导残差量化过程。

并且基于SpeechTokenizer,我们可以统一上面讲的三种speech LM建模范式,从而构建unified speech language model(USLM),模型结构如下图

在SpeechTokenizer上构建一个统一的语音语言模型。它由自回归模型和非自回归模型组成,可以对语音信息进行分层建模。自回归(AR)模型通过对来自第一RVQ量化器的令牌进行建模来捕获内容信息。非自回归(NAR)模型通过从以第一层令牌为条件的后续量化器生成令牌来补充AR模型的语言信息。我们在零拍TTS任务上验证了统一语音语言模型的有效性。

回归(AR)模型通过对来自第一RVQ量化器的令牌进行建模来捕获内容信息。非自回归(NAR)模型通过从以第一层令牌为条件的后续量化器生成令牌来补充AR模型的语言信息。

NAR模型可以是条件流匹配[speech-Gen]、扩散模型 【Seed-TTS】等

在推理过程中,我们将文本输入转换为音素序列,将语音提示转换为语音标记。它们连接在一起形成AR和NAR模型的提示。在此基础上,AR模型生成第一级令牌,而NAR模型迭代地生成后续级别的令牌。由AR和NAR模型生成的令牌然后被连接以构造语音令牌矩阵。最后,我们使用SpeechTokenizer解码器来生成以完整令牌矩阵为条件的波形。

Speech Language Model Token Benchmark:

文本对齐评估:

下游模型采取语音令牌作为输入。具体来说,对于每个离散表示,我们首先建立一个嵌入矩阵,该矩阵可以随机初始化,也可以从离散化过程中获得的k均值质心矩阵或矢量量化码本中导出。我们使用嵌入矩阵来嵌入离散表示并获得连续表示,然后将其输入下游模型。我们在LibriSpeech train-clean-100子集上训练下游模型,并使用dev-clean子集来估计互信息。我们还计算了测试集上的单词错误率(WER)。

信息保存评估:

为了评估离散语音表示中语音信息的保留,我们将语音令牌转换回语音,并通过内容和音质的自动度量来评估重新合成的语音。我们训练一个单元-HiFIGAN(Polyak 等人,2021)在LibriSpeech数据集上将HuBERT单位转换为波形。值得注意的是,为了避免额外信息的干扰,我们在训练期间不提供任何说话人信息。对于Encodec令牌,我们使用Encodec解码器直接产生波形。通过使用Whisper en-medium模型转录重新合成的语音来计算WER来评估内容保存(拉德福 等人,2023年)。通过利用WavLM-TDNN(Chen 等人,2022)来计算合成语音和地面实况语音之间的说话人相似度。 我们从LibriSpeech测试集中随机抽取300个语音样本进行评估。

比较语义 & 声学令牌

我们使用HuBERT L9单元来表示语义令牌,使用EnCodec代码来表示声学令牌语义标记实现了与文本的高互信息,但其重新合成的语音具有低说话人相似性。声学标记实现低WER和高说话人相似度的再合成语音,但与文本的互信息低。

SpeechTokenizer

模型结构

我们的模型基于 RVQ-GAN 框架,遵循与 SoundStream和 EnCodec相同的模式。如图 2 所示,模型使用了 EnCodec 中基于卷积的编码器-解码器网络,通过选择的步长因子进行时间下采样。值得注意的是,我们将 EnCodec 编码器中卷积模块后原本使用的两层 LSTM 替换为两层 BiLSTM,以增强语义建模能力。我们在附录 B 中进行了模型结构的消融研究。我们使用残差矢量量化(RVQ)对编码器输出进行量化,这种方法可以在初始量化步骤后使用不同的码书对残差进行量化。模型结构的进一步细节可参见附录 D。在训练期间,一个语义教师为残差量化过程提供语义表示指导。

语义提炼

为了实现跨不同RVQ层的不同信息的分层建模,我们采用语义指导的第一个量化器,使其能够捕获内容信息。利用残差结构使得后续量化器能够补充剩余的非语言信息。

我们采用HuBERT(Hsu 等人,2021)作为我们在这项研究中的语义老师,因为HuBERT被证明包含大量的内容信息(Mohamed 等人,2022年)。我们介绍了两种类型的蒸馏:连续表示蒸馏和伪标签预测。

对于连续表示蒸馏,我们采用第9层HuBERT表示或所有HuBERT层的平均表示作为语义教师。训练目标是最大化RVQ第一层和语义教师表示的输出之间的所有时间步长在维度级别上的余弦相似性。形式上,连续蒸馏损失定义为:

其中 𝐐1 和 𝐒 分别表示RVQ第一层和语义教师表示的量化输出。 𝐀 表示投影矩阵, D 是语义教师表征的维度。上标 (:,d) 表示包括来自维度 d 处的所有时间步的值的向量。 cos⁡(⋅) 表示余弦相似性, σ⁢(⋅) 表示S形激活。这种连续蒸馏损失函数偏离了常用的方法,该方法基于学生和教师模型在同一时间步输出的表示来计算损失。附录C对这两种方法进行了比较分析。

对于伪标签预测,我们采用HuBERT单元作为目标标签。培训目标如下:

其中 𝐪1t 和 𝐮t 分别表示第一VQ层和HuBERT单元在时间步t的量化输出。 T 表示时间步长的数量, 𝐀 是投影矩阵。

Training Objective

我们的训练方法包括重建任务和语义蒸馏任务。在重建任务中,我们采用了GAN目标,优化了重建项,判别损失项和RVQ承诺损失的组合。在语义蒸馏任务中,训练目标涉及语义蒸馏损失项。在下文中, 𝐱 表示语音信号,并且 𝐱^ 表示通过网络重构的信号.

重建损失重建损失包括时域和频域损失。鉴别损失我们使用与HiFi-CodecYang等人(2023)相同的鉴别器,其中包括三个鉴别器:基于多尺度STFT(MS-STFT)的鉴别器;多周期鉴别器(MPD)和多尺度鉴别器(MSD)。鉴别器的更多详细信息可参见附录D。对抗性损失用于提高感知质量,并且它被定义为在多个鉴别器上和在时间上平均的在多个鉴别器的logits上的铰链损失。RVQ Commitment Loss 我们在预量化值和其量化值之间添加承诺损失 ℒw ,而不为量化值计算梯度。RVQ承诺损失被定义为: ℒw=∑i=1Nq∥𝐳i−𝐳qi∥22. ,其中 𝐳i 和 𝐳qi 分别表示对应码本中的当前残差和最近条目。

通常,生成器被训练以优化以下损失:

RVQ token中信息解耦的效果如何?

我们做了one-shot voice conversion的实验。具体做法为把source speech的RVQ-1 token和reference speech的RVQ-2:8 token拼在一起送到decoder中得到converted speech。我们发现这种简单拼接RVQ token的做法也可以有不错的音色转换的效果,说明信息解耦是比较成功的。可以到我们的demo page上听效果。

SpeechTokenizer能否直接应用到unseen langauge上?

SpeechTokenizer在训练过程中只见过英语,我们直接用它直接来tokenize 德语和中文speech。发现RVQ-1送到decoder得到的speech比较机械,没有音色和韵律,说明也有比较好的解耦效果,大家可以去project page听demo。从下面频谱图也可以看出RVQ-1得到的语音丢掉了一些如共振峰等特征。

SpeechGPT系列:语音大语言模型

开源:https://github.com/0nutation/SpeechGPT

SpeechGPT (2023/05) - Empowering Large Language Models with Intrinsic Cross-Modal Conversational Abilities
SpeechGPT(2023/05)-为大型语言模型提供内在的跨模态会话能力

SpeechGPT-Gen (2024/01) - Scaling Chain-of-Information Speech Generation
SpeechGPT-Gen(2024/01)-缩放信息链语音生成

SpeechAgents: Human-Communication Simulation with Multi-Modal Multi-Agent Systems
SpeechAgents:多模态多智能体系统的人机交互仿真

SpeechAlign:  
Aligning Speech Generation to Human Preferences
SpeechAlign: 使语音生成与人类偏好保持一致

paper:

   https://arxiv.org/abs/2401.03945 [SpeechAgents]
   https://arxiv.org/abs/2305.11000 [SpeechGPT]
   https://arxiv.org/abs/2401.13527 [SpeechGPT-Gen/SpeechGPT2]
   https://arxiv.org/abs/2404.05600 [SpeechAlign]

这算是复旦大学邱锡鹏组在这个领域一个成系列的工作,我们一个一个来看。SpeechGPT是一种基于深度学习的语言模型,它能够理解和生成自然语言。SpeechGPT是一种新型的大型语言模型,它不仅能够理解语音和文本,还能够在这两者之间自如转换。简单来说,它能够感知和表达情感,并根据上下文和人类指令提供多种风格的语音响应。无论是说唱、戏剧、机器人、搞笑还是低语,SpeechGPT都能够根据需要生成相应风格的语音。

SpeechGPT

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

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

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

这项技术的核心在于将连续的语音信号离散化,使其能够与文本模态统一,从而让模型具备感知和生成语音的能力。

SpeechGPT是一种大型语言模型,具有内在的跨模态会话能力,能够按照人类指令感知和生成多模型内容。本文首先利用离散语音表示构造了一个大规模的跨模态语音指令集SpeechInstruct。此外,我们采用了一个三阶段的训练策略,包括模态适应预训练跨模态指令微调,和链的模态指令微调。实验结果表明,SpeechGPT具有良好的多模态人机交互能力,并能在一个模型中处理多种模态。

模型训练过程:

第一阶段,使用LLaMA-7 B初始化,并在LibriLight语音单元上进一步预训练。第二阶段,使用上一步预训练的模型进行初始化,并在SpeechInstruct跨模态指令集上进一步微调。这是一个强大的基础模型,可以对齐语音和文本。第三阶段,在SpeechInstruct模态链指令集上进一步进行lora-finetuning。

数据集格式:

SpeechInstruct-cross-modal:跨模态指令集,mHuBERT从大规模英语ASR数据集中标记了大约900万个单元文本数据对。数据格式:

[
    {
        "prefix": "You are an AI assistant whose name is SpeechGPT.\n- SpeechGPT is a intrinsic cross-modal conversational language model that is developed by Fudan University.  SpeechGPT can understand and communicate fluently with human through speech or text chosen by the user.\n- It can perceive cross-modal inputs and generate cross-modal outputs.\n",
        "plain_text": "[Human]: Try to speak out this sentence, please. This is input: The alchemist rode in front, with the falcon on his shoulder.<eoh> [SpeechGPT]: <sosp><661><588><604><157><596><499><596><106><596><189><63><189><665><991><162><202><393><946><327><905><907><597><660><351><557><794><788><59><754><12><977><877><333><873><835><67><940><118><686><613><169><72><644><553><535><935><101><741><384><173><894><787><380><787><196><555><721><944><250><56><812><222><915><143><390><479><330><435><647><246><650><816><325><506><686><208><613><417><755><193><411><452><111><735><6><735><63><665><644><991><535><271><333><196><918><29><202><393><946><734><390><479><330><776><167><761><907><597><660><351><557><794><75><788><15><366><896><627><168><654><659><177><183><609><710><187><493><361><470><821><59><56><198><912><742><840><431><531><76><668><576><803><791><380><660><325><801><549><366><377><164><309><584><605><193><71><39><eosp><eoa> "
    },
]

SpeechInstruction-chain-of-modality:四种输入输出格式的思想链样式指令,即Speech Instruction-Speech Response、Speech Instruction-Text Response、Text Instruction-Speech Response和Text Instruction-Text Response。

[
    {
        "prefix": "You are an AI assistant whose name is SpeechGPT.\n- SpeechGPT is a intrinsic cross-modal conversational language model that is developed by Fudan University.  SpeechGPT can understand and communicate fluently with human through speech or text chosen by the user.\n- It can perceive cross-modal inputs and generate cross-modal outputs.\n",
        "plain_text": "[Human]: <sosp><661><987><511><732><951><997><111><982><189><63><665><991><535><101><741><173><945><944><503><641><124><565><734><870><290><978><833><238><761><907><430><901><185><403><557><244><583><788><663><969><896><627><143><515><663><969><660><691><251><412><260><41><740><677><253><380><382><268><506><876><417><755><16><819><80><651><80><651><80><987><588><eosp><eoh>. [SpeechGPT]: What is a bad term for poop?; [ta] A bad term for poop is excrement. It is usually used as a polite way to refer to fecal waste.; [ua] <sosp><497><63><264><644><710><823><565><577><154><331><384><173><945><29><244><326><583><728><576><663><969><896><627><143><38><515><663><24><382><251><676><412><260><41><740><677><253><382><268><876><233><878><609><389><771><865><641><124><878><609><423><384><879><487><219><522><589><337><126><119><663><748><12><671><877><377><385><902><819><619><842><419><997><829><111><666><42><277><63><665><644><389><771><685><437><641><124><258><436><139><340><11><59><518><56><948><86><258><436><139><340><347><376><940><118><944><878><173><641><124><362><734><179><961><931><878><609><423><384><879><219><522><866><337><243><935><101><741><822><89><194><630><86><555><105><79><868><220><156><824><998><870><390><422><330><776><663><969><523><105><79><799><220><357><390><479><422><330><776><485><165><86><501><119><716><205><521><787><935><101><741><89><194><664><835><67><940><118><613><417><755><902><415><772><497><eosp><eoa>."
    },
]

Introduction

在本文中,我们提出了SpeechGPT,一个大型的语言模型,具有内在的跨模态会话能力,能够感知和生成多模型内容。我们使用自监督训练的语音模型进行语音离散化,以统一语音和文本之间的模态。然后,离散的语音token扩展到LLM的词汇表中,从而赋予模型固有的感知和生成语音的能力。

为了使模型具有处理多模态指令的能力,我们构建了第一个语音-文本跨模态指令遵循数据集SpeechInstruct。具体地,我们将语音离散化为离散单元(Hsu 等人,2021),并基于现有的ASR数据集构建跨模态单元文本对。同时,我们使用GPT-4为不同的任务构建了数百条指令,以模拟实际的用户指令,如附录B所示。此外,为了进一步增强模型的跨模态能力,我们设计了模态链指令数据,即,该模型接收语音命令,以文本形式思考该过程,然后以语音形式输出响应。

为了更好地进行跨模态迁移和有效的训练,SpeechGPT经历了三个阶段的训练过程:模态适应预训练,跨模态指令微调和模态链指令微调。第一阶段使语音理解与离散语音单元连续任务的SpeechGPT。第二阶段采用SpeechInstruct来提高模型的跨模态能力。第三阶段利用参数有效的LoRA(Hu 等人,2021年)进行微调,以进一步调整模式。

SpeechInstruct Construction:

SpeechInstruct,一个语音文本跨模态解释跟随数据集。该数据集由两部分组成,第一部分称为跨模态指令[Cross-modal Instruction],第二部分称为模态链指令[Chain-of-Modality Instruction]。

Cross-modal Instruction数据集构造:

step1 数据收集: 收集了几个大规模的英语ASR数据集来构建跨模态教学,包括Gigaspeech(Chen et  al.,2021)、Common Voice(Ardila 等人,2020)和LibriSpeech(Panayotov 等人,2015年)。我们采用mHuBERT作为语音分词器,以将语音数据离散化为离散单元,并去除相邻帧的重复单元以获得缩减的单元。最终,我们获得了900万个单元文本数据对。

step2 任务描述生成:我们生成与语音-文本数据对兼容的ASR和TTS任务描述。与自我指导方法不同(Wang 等人,2022),我们通过零zero-shot 方法生成描述。具体来说,我们直接将附录A中所示的提示输入OpenAI GPT-4以生成任务描述。我们的生成方法为每个任务生成100条指令,附录B中显示了一些示例。

step3 数据构造Instruction Formatting :对于离散单元序列 U 及其相关联的转录 T ,我们基于概率 p 来确定它将被用于构造ASR任务还是TTS任务。随后,我们从step2相应的任务描述中随机选择一个描述 D 。表示为 (D,U,T) 。在此之后,使用模板[Human]:{D}。输入:{U}<eoh>。[SpeechGPT]:{T}<eos>。. 为了支持多轮对话,组装的指令以多轮对话的形式连接,遵守模型的最大输入长度。

Chain-of-Modality Instruction数据集构造:

语音指令生成: 由于缺乏语音输入和语音输出的指令数据,我们训练了一个文本到单元【text-to-unit】生成器来将文本指令数据转换为语音指令数据。具体地,文本到单元生成器采用Transformer编码器-解码器架构。我们在跨模态教学中对LibriSpeech unit-text pairs进行了训练。 我们从moss-002-sft-data数据集中选择了37,969个响应长度小于35个单词的样本,通过文本到单元生成器将它们的指令和响应转换为单元序列。结果,我们获得了由语音指令、文本指令、文本响应和语音响应组成的37,969个四元组,表示为 (S​p​e​e​c​h​I,T​e​x​t​I,T​e​x​t​R,S​p​e​e​c​h​R) 。

使用上述四元组,我们可以为四种输入输出格式构建思维链风格的指令,即语音指令-语音响应,语音指令-文本响应,文本指令-语音响应和文本指令-文本响应。其相应模板可参见附录C

Model Structure:

模型由三个主要组件组成:离散单元提取器大语言模型单元声码器。在这种架构下,LLM可以感知多模态输入并生成多模态输出。

离散单元提取器 离散单元提取器利用隐藏单元BERT(HuBERT)模型(Hsu 等人,2021)以将连续语音信号变换成离散单元的序列。HuBERT是一种自监督模型,它通过基于应用于模型中间表示的k均值聚类来预测掩蔽音频片段的离散标签来学习。它具有1-D卷积层和Transformer编码器的组合,将语音编码为连续的中间表示,k-means模型进一步将这些表示转换为聚类索引序列。随后,去除相邻的重复索引,得到表示为 U=(u1,u2,…,uT) 、 ui∈0,1,…,K−1 、 ∀1≤i≤T 的离散单元序列,其中 K 表示簇的总数。

LLM:采用Meta AI LLaMA(Touvron 等人,2023)模型作为我们的大型语言模型。LLaMA包括嵌入层、多个Transformer块和LM头层。LLaMA中的参数总数范围从7 B到65 B。从1.0万亿个令牌的广泛训练数据集中,LLaMA在各种NLP基准测试中与更大的175 B GPT-3相比表现出了竞争力。

Unit Vocoder:训练了一个多说话人 unit  HiFi-GAN来解码语音信号, 离散表示。 HiFi-GAN架构由生成器 𝐆 和多个鉴别器 𝐃 组成。该生成器使用查找表(LUT)来嵌入离散表示,并且嵌入序列由一系列由转置卷积和具有扩张层的残差块组成的块进行上采样。 扬声器嵌入被连接到上采样序列中的每个帧。 该滤波器具有多周期鉴别器(MPD)和多尺度鉴别器(MSD)。

Training:

为了将语音离散表示纳入LLM,我们首先扩展词汇表和相应的嵌入矩阵。我们将培训过程分为三个阶段。第一阶段是对未配对语音数据进行模态自适应预训练。第二阶段是跨模态教学微调。第三阶段是模态链教学微调。

扩大词汇 给定大小为 |V| 的原始LLM词汇表 V ,为了将语音离散表示集成到LLM中,我们用大小为 |V′|=K 的单元标记 V′ 的附加集合来扩展词汇表。扩展词汇表 V′′ 是原始词汇表 V 和新词 V′ 的联合:V′′=V∪V′

我们将原始词嵌入矩阵表示为 E∈ℝ|V|×d ,其中 d 是词嵌入的维数。为了适应扩展的词汇表,我们需要创建一个随机初始化的单词嵌入矩阵 E′∈ℝ|V′′|×d 。 我们通过将 E 的值复制到 E′ 的前 |V| 行来保留原始的单词嵌入:E′[0:|V|,:]=E

Stage 1: Modality-Adaptation Pre-training

为了使LLM能够处理离散单元模态,我们利用未标记的语音语料库在下一个令牌预测任务中训练LLM。这种方法与LLM的文本预训练目标一致。 给定由语音 U1,U2,…,Um 和表示为 L1 的LLM组成的未标记语音语料库 C ,负对数似然损失可以公式化为:

其中, m 是数据集 C 中的语音的数量, nj 是语音 Uj 中的离散单元标记的数量,并且 ui,j 表示第j个语音中的第i个单元标记

Stage 2: Cross-modal Instruction Fine-Tuning 

跨模态教学微调 在这个阶段,我们利用配对数据对齐语音和文本模态。我们将SpeechInstruct中的跨模态指令与moss-002-sft数据集混合以导出混合数据集 I ,其由样本 T1,T2,…,Tx 组成。我们在 I 上对从第一阶段获得的模型 L 进行微调。

由 t1,t2,…,tnj 组成的每个样本 Tj 通过连接前缀和文本来形成。训练目标是最小化负对数似然,损失计算只考虑文本部分,忽略前缀,可以格式化为:

其中 x 是语料库 I 中的样本数, yj 是样本 Tj 中的标记总数, pj 是 Tj 的前缀部分中的标记数,并且 ti,j 表示 Tj 中的第i个单词

Stage 3: Chain-of-Modality Instruction Fine-Tuning

获得阶段2中的模型之后,我们利用参数有效的低秩自适应(LoRA)(Hu 等人,2021年),以微调它的链的模态教学SpeechInstruct。我们将LoRA权重(适配器)添加到注意力机制中,并训练新添加的LoRA参数。我们采用与阶段2相同的损失函数。

附录A:Prompts to Generate Task Description

ASR:
You are asked to come up with a set of 100 diverse task instructions about automatic speech
recognition, which is about recognizing speech.
Here are the requirements:
1. These instructions should be to instruct someone to recognize the content of the following
speech.
2. Try not to repeat the verb for each instruction to maximize diversity.
3. The language used for instruction also should be diverse. For example, you should
combine questions with imperative instructions.
4. The type of instructions should be diverse.
5. The instructions should be in English.
6. The instructions should be 1 to 2 sentences long. Either an imperative sentence or a
question is permitted.
List of 100 tasks:
TTS:
You are asked to come up with a set of 100 diverse task instructions about text to speech,
which is about recognizing speech .
Here are the requirements:
1. These instructions should be to instruct someone to recognize the content of the following
speech.
2. Try not to repeat the verb for each instruction to maximize diversity.
3. The language used for instruction also should be diverse. For example, you should
combine questions with imperative instructions.
4. The type of instructions should be diverse.
5. The instructions should be in English.
6. The instructions should be 1 to 2 sentences long. Either an imperative sentence or a
question is permitted.
List of 100 tasks:

附录B:Examples of Task Description【gpt生成的一些例子】

ASR:
Begin by converting the spoken words into written text.
Can you transcribe the speech into a written format?
Focus on translating the audible content into text.
Transcribe the speech by carefully listening to it.
Would you kindly write down the content of the speech?
Analyze the speech and create a written transcription.
Engage with the speech to produce a text-based version.
Can you document the speech in written form?
Transform the spoken words into text accurately.
How about putting the speech’s content into writing?
TTS:
Can you please read this sentence out loud?
Recite the following words as if you were speaking normally.
Project your voice to clearly articulate this statement.
Would you mind speaking these words as naturally as possible?
Whisper the given sentence softly.
Enunciate each word in this sentence with precision. How would you express this sentence in
 a conversational tone?
Could you please relay the message below verbally?
Emphasize the key points while reading the sentence.
Sing the text provided in a melodic voice.

附录C: Chain-of-Modality Instructions Templates

Speech Instruction-Speech Response:
[Human]: This is a speech instruction: {SpeechI}. And your response should be speech.
 You can do it step by step. You can first transcribe the instruction and get the text Instruction.
Then you can think about the instruction and get the text response. Last, you should speak the
 response aloud <eoh>. [SpeechGPT]: [tq] {TextI}; [ta] {TextR}; [ua] {SpeechR}<eoa>.
Speech Instruction-Text Response:
[Human]: This is a speech instruction: {SpeechI}. And your response should be text. You
 can do it step by step. You can first transcribe the instruction and get the text instruction.
Then you can think about the instruction and get the text response. <eoh>. [SpeechGPT]:
[tq] {TextI}; [ta] {TextR}<eoa>.
Text Instruction-Speech Response:
[Human]: This is a text instruction: {TextI}. And your response should be speech. You can
 do it step by step. You can think about the instruction and get the text response. Then you
should speak the response aloud <eoh>. [SpeechGPT]: [ta] {TextR}; [ua] {SpeechR}<eoa>.
Text Instruction-Text Response:
[Human]: This is a text instruction: {TextI}. And your response should be text. You can
 think about the instruction and get the text response. [SpeechGPT]: [ta] {TextR}<eoa>.

SpeechAgents:多模态多智能体系统的人机交互仿真

SpeechAgents是一个基于多模态LLM的多智能体系统,旨在模拟人类的交流。与现有的基于LLM的多Agent系统不同,SpeechAgents使用多模态LLM作为单个Agent的中央控制,并使用多模态信号作为Agent之间交换消息的媒介。 此外,我们提出了多代理调整,以提高LLM的多代理功能,而不影响一般的能力。为了加强和评估人类通信仿真的有效性,我们建立了人类通信仿真基准。实验结果表明,SpeechAgents可以模拟人类交流对话一致的内容,真实的节奏,丰富的情感和表现出良好的可扩展性,即使多达25个代理,这可以适用于任务,如戏剧创作和音频小说生成。

图3:SpeechAgents中单个代理的训练和推理过程的图示。实心箭头表示推理过程中的数据流。在一个代理的回合中,它接收包括场景、背景、角色、简档和来自语音消息流库的消息流的输入。智能体的输出包括其内部思想、生成的语音响应和相应的风格。然后将具有样式的响应写入语音消息流库。虚线箭头表示训练过程中的数据流。从人类通信模拟基准测试中的脚本解析的代理轨迹指令以图中代理输入和输出的串联的形式可视化地表示,并用于多模态LLM的多代理调整。

Hmuan-Communication Simulation Benchmark构建过程概述。我们通过创建模拟人类交流的各种场景来启动这一过程。随后,为每个场景生成包含各种角色的角色池。然后从池中选择角色,并根据所涉及的特定场景和角色生成通信脚本。最终,通过文本到语音转换来制作多模态人类沟通脚本。

SpeechGPT-Gen[SpeechGPT2]: 缩放信息链语音生成

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

SpeechGPT 2是一种端到端的语音对话语言模型,类似于GPT-4 o。它可以感知和表达情感,并根据上下文和人类指令提供各种风格的适当语音响应,如说唱,戏剧,机器人,搞笑和耳语。为了解决冗长语音序列的问题,SpeechGPT 2采用了超低比特率语音编解码器(750 bps),该编解码器对语义和声学信息进行建模。它使用多输入多输出语言模型(MIMO-LM)。目前,SpeechGPT 2仍然是一个基于回合的对话系统。我们正在开发实时SpeechGPT 2的全双工版本,并且已经取得了一些有希望的进展。

得益于有效的语音建模,当前的语音大语言模型(SLLM)在上下文语音生成和对未知说话人的有效泛化方面表现出了卓越的能力。然而,流行的信息建模过程是由某些冗余,导致语音生成效率低下。我们提出了信息链生成(CoIG),在大规模语音生成的语义和感知信息解耦的方法。在此基础上,我们开发了SpeechGPT-Gen,这是一个在语义和感知信息建模方面具有80亿参数的SLLM。它包括一个基于LLM的自回归模型用于语义信息建模和一个采用流匹配的非自回归模型用于感知信息建模 [感知信息建模主要关注的是与感官输入(如视觉、听觉等)直接相关的信息处理,非自回归模型通常用于感知信息建模中,因为这些模型可以并行处理数据,更加适合需要实时处理或低延迟的应用场景]。此外,我们引入了新的方法,注入语义信息的先验分布,以提高流匹配的效率。 大量的实验结果表明,SpeechGPT-Gen在zero-shot文本到语音,zero-shot语音转换和语音到语音对话方面表现出色,强调了CoIG在捕捉和建模语音的语义和感知维度方面的卓越能力。

SpeechGPT-Gen基于信息链生成方法,依次进行语义建模和感知建模。SpeechTokenizer(Zhang 等人,2023 b)用于提取语义表示和感知表示。SpeechGPT-Gen由用于语义建模的基于LLM的自回归模型和用于感知建模的基于流匹配的非自回归模型组成。

Speech Tokenization:

SpeechTokenizer(Zhang 等人,2023 b)是基于残差矢量量化(RVQ)的语音标记化方法,并且跨不同RVQ层分层地解开语音信息的不同方面。具体地,第一RVQ量化器生成包含语义信息的令牌,而后续量化器补充剩余的感知信息。 SpeechTokenizer将单声道音频信号表示为 作为输入,其中 d 表示持续时间, fs⁢r 表示采样率。 SpeechTokenizer的输出包括用于对应RVQ层的 Q=8 分层RVQ令牌 (q1,…,qQ) 和 Q 码本 (C1,…,CQ) 。 qi∈ℝT 表示长度为 T 的一维序列。 RVQ令牌 qi 可以由码本 Ci∈ℝK×H 嵌入,从而产生连续矢量序列 vi∈ℝT×H ,其中 vij=Ci⁢(qij) 用于 i∈1,…,Q 、 j∈1,…,T 。 表示为 v1:8=∑i=1Qvi 的来自所有RVQ层的连续表示的总和包含语音内的所有信息。 我们利用来自第一RVQ层 q1 的标记作为包含语义信息的表示,并且利用从第二层到最后一层 v2:7=∑i=2Qvi 求和的连续向量作为包含感知信息的表示。

LLM用于语义建模:

SpeechGPT是一个大型的跨模态语言模型,可以执行跨模态指令跟随和语音到语音对话,表现出出色的语音语义建模能力。 利用HuBERT(Hsu 等人,2021)将语音离散化为单元,SpeechGPT执行模态适应预训练,跨模态指令微调和模态链指令微调。我们通过用SpeechTokenizer RVQ-1令牌 q1 替换HuBERT离散单元来使用SpeechGPT进行语音语义建模。 对于模型结构,我们采用LLaMA 2 – 7 B-Chat作为预训练的LLM。 对于训练数据,我们采用SpeechTokenizer RVQ-1令牌来表示语音,并遵循SpeechInstruct的过程和设置来构造训练数据集 D ,包括跨模态指令集和模态链指令集。我们使用Multilingual  Librispeech 、Gigaspeech(Chen 等人,2021)、Commonvoice(Ardila 等人,2020)和Librispeech(Panayotov 等人,2015年)构建跨模态指令集。 对于训练,我们跳过模态适应预训练,并使用跨模态指令集 I 对LLaMA 2 – 7 B-Chat执行跨模态指令微调。 在模态链指令微调中,我们选择全参数微调而不是模态链指令集上的LoRA微调。 这两个培训阶段的培训目标可以格式为:

感知建模的流程匹配:

给定语音 s 、语义表示 v1 、感知表示 v2:8 和由SpeechTokenizer提取的完整信息表示 v1:8=v1+v2:8 ,感知建模是指在给定提示语音 a 和语义表示 v1 的情况下预测完整表示 v1:8 。 我们提出了两种感知建模的流匹配模式:显式链和隐式链

SpeechAlign :使语音生成与人类偏好保持一致

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

本文首先分析编解码器语言模型中的分布差距,强调它如何导致训练阶段和推理阶段之间的差异,从而对性能产生负面影响,从而解决这一差距。然后,我们探索利用从人类反馈中学到的知识来弥合分布差距。我们介绍了 SpeechAlign,这是一种迭代式自我改进策略,可将语音语言模型与人类偏好保持一致。SpeechAlign 涉及构建一个偏好编解码器数据集,将黄金编解码器令牌与合成令牌进行对比,然后进行首选项优化以改进编解码器语言模型。这个改进周期是迭代进行的,以稳步将弱模型转换为强模型。通过主观和客观评估,我们表明 SpeechAlign 可以弥合分布差距并促进语音语言模型的持续自我改进。此外,SpeechAlign 具有强大的泛化功能,适用于较小的模型。

大模型基本概念

什么是Base模型?什么是chat模型?什么是instruct?什么是4Bit?什么是AWQ模型?

大模型库中的basechatinstruct4bit等通常指的是不同类型或配置的预训练语言模型。它们的区别主要在于训练目标、用途和模型参数的精度。以下是对这些术语的解释:

1. Base 模型 (base)

  • 定义Base模型通常是指未经特定任务微调的基础预训练模型,在训练过程中最初被开发和优化的,它旨在平衡性能和资源消耗。
  • 用途这些模型通常用于进一步的微调,以适应特定任务或应用场景。如:智能对话、文本内容生成等
  • 特点:它们包含了大量通用知识,但没有针对特定任务进行优化。

2. Chat 模型 (chat)

  • 定义Chat模型专门为对话系统(聊天机器人)设计和优化
  • 用途:用于生成自然语言对话,能够理解上下文并生成连贯且有意义的回复。如:聊天机器人、智能助力
  • 特点:通常经过大量对话数据微调,具备更好的上下文理解能力和对话生成能力。

3. Instruct 模型 (instruct)

  • 定义Instruct模型是为遵循指令或完成特定任务而设计和优化的模型
  • 用途:用于执行具体指令,如回答问题、生成文本、翻译等任务。
  • 特点:经过指令数据集微调,能够更好地理解和执行用户提供的指令。

4. 4-bit 模型 (4bit)

  • 定义:4-bit模型使用低精度(4位)进行量化,以减少内存占用和计算资源需求。
  • 用途:适用于资源受限的环境,如移动设备或嵌入式系统,同时保持较高的性能表现。
  • 特点:通过量化技术显著减少了模型大小和计算复杂度,但可能会牺牲部分精度。

5. AWQ 模型 (选择性量化)

AWQ即激活值感知的权重量化(Activation-aware Weight Quantization),是一种针对LLM的低比特权重量化的硬件友好方法。通过保护更“重要”的权重不进行量化,从而在不进行训练的情况下提高准确率。

我们的方法基于这样一个观察:权重并非同等重要,仅保护1%的显著权重可以大大减少量化误差。然后,我们建议通过观察激活而不是权重来搜索保护显著权重的最佳通道缩放。AWQ不依赖于任何反向传播或重构,因此可以很好地保留LLMs在不同领域和模态中的泛化能力,而不会过度拟合校准集。AWQ在各种语言建模和特定领域基准上优于现有工作。由于更好的泛化能力,它在面向指令调整的LMs上实现了出色的量化性能,并且首次在多模态LMs上取得了成功,论文地址

AutoAWQ 是一个易于使用的 4 比特量化模型包。 与 FP16 相比,AutoAWQ 将模型速度提高了 3 倍,并将对内存需求降低了 3 倍。 AutoAWQ 实现激活感知权重量化 (AWQ) 算法来量化 LLM。 AutoAWQ 是在 MIT 的 LLM-AWQ 基础上创建和改进的。

6、GPT-Q:GPT模型的训练后量化

GPTQ 是一种针对4位量化的训练后量化 (PTQ) 方法,主要关注GPU推理和性能。

该方法的思想是通过将所有权重压缩到4位量化中,通过最小化与该权重的均方误差来实现。在推理过程中,它将动态地将权重解量化为float16,以提高性能,同时保持内存较低。具体操作包括以下几个步骤:

缩放:将输入张量x除以缩放因子scale。这一步是为了将x的值范围调整到预期的量化范围。

四舍五入:将缩放后的结果四舍五入到最近的整数。这一步是为了将x的值离散化,即将其转换为整数。

限制范围:使用torch.clamp函数将四舍五入后的结果限制在0和maxq之间。这一步是为了确保量化后的值不会超出预期的量化范围。反缩放:将量化后的张量减去零点zero,然后乘以缩放因子scale。这一步是为了将量化后的值恢复到原始的值范围。

7、GGUF | GGML

GGUF是GGML的新版本。尽管 GPTQ 在压缩方面表现出色,但如果你没有运行它所需的硬件,它对 GPU 的依赖性可能会成为一个缺点。

GGUF是一种量化方法,是LLM库的C++复制品,支持多种LLM,如LLaMA系列和Falcon等。它允许用户在 CPU 上运行 LLM,同时将其部分层次转移到 GPU 上以加速运行。尽管使用 CPU 通常比使用 GPU 进行推理要慢,但对于在 CPU 或 Apple 设备上运行模型的人来说,这是一种非常好的格式。特别是我们看到出现了更小、更强大的模型,如 Mistral 7B,GGUF 格式可能会成为一种常见的格式它提供了从2到8位精度的不同级别的量化。我们可以获取原始的LLaMA模型,将其转换为GGUF格式,最后将GGUF格式量化为较低的精度。

8、PTQ 训练后量化(Post-Training Quantization)

PTQ是一种常用于深度学习领域的量化技术。它的基本原理是在模型训练后,通过对模型进行量化,将模型的浮点数权重和激活转换为较低精度的表示,从而减小模型大小和计算复杂度,同时保持模型的精度损失较小。PTQ方法分为两类:只量化模型权重的方法和同时量化权重和激活的方法,像后面要说的AQLM就是第一类方法

9、 QAT 训练感知的量化

QAT 的基本思想是根据该层权重的精度将输入量化为较低的精度。QAT 还负责在下一层需要时将权重和输入相乘的输出转换回较高的精度。这个将输入量化为较低精度,然后将权重和输入的输出转换回较高精度的过程也称为“伪量化节点插入”。这种量化被称为伪量化,因为它既进行了量化,又进行了反量化,转换成了基本操作。

10、AQLM (Additive Quantization LM)

增量语言模型量化(AQLM)于2024年2月发布,已经集成到了HuggingFace中。现有的仅权重量化算法在技术上可以将模型权重量化到2位范围。然而,它们未能有效地保持模型的准确性。AQLM是一种新的仅权重后训练量化(PTQ)算法,为2比特/每参数范围设定了新的技术水平。与现有方法相比,它还提供了更小的基准改进,适用于3位和4位范围。具体来说,AQLM优于流行的算法如GPTQ,以及更近期但较不知名的方法如SpQR和QuIP#。

总结

  • base 模型是通用基础模型,适合进一步微调以适应特定任务。
  • chat 模型专为对话系统设计,擅长生成自然语言对话。
  • instruct 模型专为执行具体指令设计,擅长理解和执行用户提供的任务。
  • 4bit 模型通过低精度量化技术减小了内存占用和计算复杂度,适合资源受限环境。

AnyGPT:具有离散序列建模的统一多模态大语言模型

code:  https://github.com/OpenMOSS/AnyGPT
paper: https://arxiv.org/abs/2402.12226
Demos: https://junzhan2000.github.io/AnyGPT.github.io/

AnyGPT,一种任意到任意的多模态语言模型,它利用离散表示来统一处理各种模态,包括语音、文本、图像和音乐。AnyGPT可以稳定地训练,而无需对当前的大型语言模型(LLM)架构或训练范式进行任何更改。相反,它完全依赖于数据级预处理,促进新模式无缝集成到LLMs中,类似于新语言的合并。基础模型将四种模态对齐,允许不同模态和文本之间的多式联运转换。此外,我们基于各种生成模型构建了AnyInstruct数据集,其中包含任意模态相互转换的指令。它由108k个多回合对话样本组成,这些样本错综复杂地交织在各种模态中,从而使模型能够处理多模态输入和输出的任意组合。经过此数据集的训练,我们的聊天模型可以进行免费的多模式对话,其中可以随意插入多模式数据。实验结果表明,AnyGPT能够促进任何到任何多模态对话,同时实现与所有模态的专用模型相当的性能,证明离散表示可以有效且方便地统一语言模型中的多个模态。

基本模型可以执行各种任务,包括文本到图像、图像字幕、自动语音识别(ASR)、零触发文本到语音(TTS)、文本到音乐和音乐字幕。我们可以按照特定的指令格式执行推理。

所有的模态都转换为离散token

提出了一个可以统一训练的综合框架。 如图1所示,该框架由三个主要组件组成:( 1 )多模态分词器,( 2 )作为主干的多模态语言模型,以及( 3 )多模态de-tokenizer。  分词器将连续的非文本模态转换为离散的标记,这些标记随后被排列成多模态交织序列。 然后,使用下一个标记预测训练目标通过语言模型训练序列。 在推理过程中,多模态令牌被解码回其原始表示的相关的多模态token。 为了丰富生成的质量,可以部署多模态增强模块来对生成的结果进行后处理,包括语音克隆或图像超分辨率等应用。 

AnyInstruct多模态交错指令数据合成过程:

生成108k多轮对话数据,每个对话都交错包含text、speech、image、music模态的数据

1.Generation of text-based conversations incorporating multimodal elements.

•脑暴100个meta topics覆盖大量的音视元素相关场景,再用GPT-4扩展至20000个特定主题 •提示LLM生成基于这些主题的具体对话场景,由于LLM在生成多模态元素时有局限,准备了一些样例尽量包含多个模态 •根据场景使用GPT-4生成多轮对话,多模态用详细的文字进行表述’

2.用DALL-E-3、MusicGen、微软TTS API根据用户提示和模型的文本回复生成对应模态的数据。

最终包含205k图片,503k语音,113k音乐

模型预训练数据:

为了实现从任何模态到任何其他模态的生成,至关重要的是要在这些模态之间保持良好的数据一致。不幸的是,这种数据非常稀缺。为了解决这一挑战,我们构建了一个以文本为中心的双峰对齐数据集。在这里,文本是作为一个重要的中介桥梁之间的差距差距各种形式。通过将不同的模态与语言模型中的文本模态对齐,我们的目标是实现所有模态之间的相互对齐。

预训练数据分布,按令牌计数分段,内部部分指示模态,中间部分详细说明数据类型,外部部分指定单个数据集。

Image & Text :我们利用来自LAION-2B的图像-文本对(Schuhmann 等人,2022)、LAION-COCO(lai,2022 b)、LAION-Aesthetics(lai,2022 a)和JouneyDB(Pan 等人,2023年)。LAION-2B提供了与来自网络的嘈杂替代文本配对的图像,而LAION-COCO代表了其中的600 M子集,由BLIP标题。我们通过过滤文本质量、图像纵横比和剪辑得分等来细化这些数据集,产生了3亿对的高质量语料库。为了提高整体图像生成的保真度,我们用高质量的LAION-Aesthetics子集和Midjourney的合成数据集ColonneyDB补充了我们的数据。

Speech & Text :我们收集了几个大规模的英语自动语音识别(ASR)数据集,Gigaspeech  (Chen et al., 2021), Common Voice (Ardila et al., 2020), and Multilingual LibriSpeech(MLS) (Pratap et al., 2020). 共同构成了57,000小时的语音文本对语料库,涵盖了各种各样的说话人,领域和录音环境。

Music&Text:从互联网上抓取了超过一百万个音乐视频,开始了广泛的数据收集过程。核心步骤涉及使用Spotify API将这些视频的标题与相应的歌曲进行匹配。随后,我们为每个音乐音频收集了一组全面的元数据,包括视频标题、描述、关键字、播放列表名称和Spotify歌词。该元数据被格式化为JSON并输入GPT-4处理。GPT-4作为智能字幕生成器的作用至关重要;它利用嘈杂的元数据提取有意义的信息,并将其简洁地概括为连贯的句子。这种方法使我们能够为大量的音乐音频生成高质量的文本字幕,有效地减少了数据集中幻觉的发生。

Tokenization

Image Tokenizer:

使用SEED tokenizer:

ViT encoder 224x224input 16x16patches

Causal Q-Former 32token

VQ Codebook Codebook大小8192

MLP 将视觉code解码至生成空间的embedding(与unCLIP-SD对齐)

UNet decoder复原图像

Speech Tokenizer:

采用具有残差矢量量化(RVQ)的编码器-解码器架构

•RVQ 8层,每层codebook大小1024

•每秒编码为50帧,10s即500×8 •量化器第1层捕捉语义信息,
2~8层编码副语言细节 •AnyGPT中使用LLM处理第1层语义token,
其余层由声音克隆模型提供?(VALLE中表示声音主要受第1层影响),因此Speech这块新增的token数是1024

Music Tokenizer :

对于音乐,我们采用Encodec(D’efossez 等人,2022),具有使用残差矢量量化(RVQ)量化的潜在空间的卷积自动编码器,作为音乐令牌化器。

•RVQ 4层,每层codebook2048 •每秒编码为50帧 •不同之处在于LLM会依次预测每帧4层的token,然后再下一帧

Language Model Backbone

为了将多模态离散表示合并到预先训练的LLMs中,我们使用新的模态特定令牌扩展词汇表,从而扩展相应的嵌入和预测层,新合并的参数随机初始化。 来自所有模态的标记联合收割机以形成新的词汇表,其中每个模态在语言模型内被训练以在共享的表征空间中对齐。

•统一的多模态语言模型:通过特定模态的tokenizer,可以将多模态数据压缩为离散的token序列,并使用LLM的next token prediction loss训练,天然地统一各种任务形式 • •使用LLaMA-2-7B作为backbone

Multimodal Generation:

为了高质量生成采用2阶段框架,语义信息建模和感知信息建模。LLM在语义层面生成经过融合对齐的内容,然后NAR模型在感知层面将语义token转换成高保真的多模态内容,达到效果与效率间的平衡

•Image
使用Diffusion Model解码SEED tokens生成图片

•Speech
使用SoundStorm从SpeechTokenizer的semantic tokens生成acoustic tokens(LLM生成第1层,SoundStorm生成2~7层?),再用SpeechTokenizer解码生成语音
具备Zero-shot的声音克隆功能

•Music
使用Encodec解码生成音频

Instruction Tuning

实验:

局限性和未来工作:

任意到任意多模式LLM基准测试:任何对任何多模态大型语言模型(LLMs)领域是一个新兴的研究领域。然而,缺乏一个专门的基准来评估模型在多个维度上的能力,以及减轻潜在风险,这是一个相当大的挑战。因此,必须制定一个全面的基准。

增强LLMs:尽管具有离散表示的多模态LLMs可以稳定地训练,但与单模态训练相比,观察到更高的损失,从而阻止了每种模态的最佳性能。改进多模态融合的潜在策略可能涉及扩展LLMs和标记器或采用混合专家(莫伊)架构,以更好地管理不同的数据并优化性能。

更好的Tokenizer:可以从各种角度来增强 Tokenizer ,包括采用上级码本训练方法,开发更具凝聚力的多模态表示,以及在各种模态中应用信息解纠缠。

更长的上下文:多模态内容,例如图像和音频,通常跨越广泛的序列。例如,AnyGPT将音乐建模限制在5秒,这大大限制了其音频输出的实际用途。此外,对于任何对任何多模态对话,扩展的上下文允许更多数量的会话交换,从而丰富交互的深度和复杂性。

ChatTTS

https://github.com/2noise/ChatTTS/blob/main/docs/cn/README.md
https://2noise.com/
https://github.com/libukai/Awesome-ChatTTS
  1. 对话式 TTS: ChatTTS 针对对话式任务进行了优化,能够实现自然且富有表现力的合成语音。它支持多个说话者,便于生成互动式对话。
  2. 精细的控制: 该模型可以预测和控制精细的韵律特征,包括笑声、停顿和插入语。
  3. 更好的韵律: ChatTTS 在韵律方面超越了大多数开源 TTS 模型。我们提供预训练模型以支持进一步的研究和开发。

数据集和模型

  • 主模型使用了 100,000+ 小时的中文和英文音频数据进行训练。
  • HuggingFace 上的开源版本是一个在 40,000 小时数据上进行无监督微调的预训练模型。
###################################
# Sample a speaker from Gaussian.

rand_spk = chat.sample_random_speaker()
print(rand_spk) # save it for later timbre recovery

params_infer_code = ChatTTS.Chat.InferCodeParams(
    spk_emb = rand_spk, # add sampled speaker 
    temperature = .3,   # using custom temperature
    top_P = 0.7,        # top P decode
    top_K = 20,         # top K decode
)

###################################
# For sentence level manual control.

# use oral_(0-9), laugh_(0-2), break_(0-7) 
# to generate special token in text to synthesize.
params_refine_text = ChatTTS.Chat.RefineTextParams(
    prompt='[oral_2][laugh_0][break_6]',
)

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code,
)

###################################
# For word level manual control.

text = 'What is [uv_break]your favorite english food?[laugh][lbreak]'
wavs = chat.infer(text, skip_refine_text=True, params_refine_text=params_refine_text,  params_infer_code=params_infer_code)
torchaudio.save("output2.wav", torch.from_numpy(wavs[0]), 24000)

模型组成:LlamaModel、DVAE(VQVAE)、VOCOS声码器

文本控制

  • 1. Input Text : 需要转换的文本,支持中文和英文混杂
  • 2. Refine text : 是否对文本进行口语化处理
  • 3. Text Seed : 配置文本种子值,不同种子对应不同口语化风格
  • 4. 🎲 : 随机产生文本种子值
  • 5. Output Text : 口语化处理后生成的文本

音色控制

  • 6. Timbre : 预设的音色种子值
  • 7. Audio Seed : 配置音色种子值,不同种子对应不同音色
  • 8. 🎲 : 随机产生音色种子值
  • 9. Speaker Embedding : 音色码,详见 音色控制

情感控制

  • 10. temperate : 控制音频情感波动性,范围为 0-1,数字越大,波动性越大
  • 11. top_P :控制音频的情感相关性,范围为 0.1-0.9,数字越大,相关性越高
  • 12. top_K :控制音频的情感相似性,范围为 1-20,数字越小,相似性越高

系数控制

  • 13. DVAE Coefficient : 模型系数码
  • 14. Reload : 重新加载模型系数

播放控制

  • 15. Auto Play : 是否在生成音频后自动播放
  • 16. Stream Mode : 是否启用流式输出
  • 17. Generate : 点击生成音频文件
  • 18. Output Audio : 音频生成结果
  • 19. ↓ : 点击下载音频文件
  • 20. ▶️ : 点击播放音频文件

示例控制

  • 21. Example : 点击切换示例配置

快速体验

网址类型
Original Web原版网页版体验
Forge WebForge 增强版体验
LinuxPython 安装包
Samples音色种子示例
Cloning音色克隆体验

热门分支

功能增强

项目Star亮点
jianchang512/ChatTTS-ui提供 API 接口,可在第三方应用中调用
6drf21e/ChatTTS_colab提供流式输出,支持长音频生成和分角色阅读
lenML/ChatTTS-Forge提供人声增强和背景降噪,可使用附加提示词
CCmahua/ChatTTS-Enhanced支持文件批量处理,以及导出 SRT 文件
HKoon/ChatTTS-OpenVoice配合 OpenVoice 进行声音克隆

功能扩展

项目Star亮点
6drf21e/ChatTTS_Speaker音色角色打标与稳定性评估
AIFSH/ComfyUI-ChatTTSComfyUi 版本,可作为工作流节点引入
MaterialShadow/ChatTTS-manager提供了音色管理系统和 WebUI 界面

FunAudioLLM:人类和LLMs之间自然交互的语音理解和生成基础模型

https://funaudiollm.github.io/  [阿里团队]
arxiv.org/abs/2407.04051

[Paper] [Code] [Modelscope:SenseVoiceCosyVoice] [HuggingFace: SenseVoice]

我们介绍FunAudioLLM,本报告介绍了FunAudioLLM,这是一个旨在增强人类与大型语言模型之间的自然语音交互的框架(LLMs)。其核心是两个创新模型:SenseVoice用于高精度多语言语音识别,情感识别和音频事件检测;CosyVoice用于多语言,音色和情感控制的自然语音生成。SenseVoice具有极低的延迟并支持50多种语言,而CosyVoice在多语言语音生成、零触发语音生成、跨语言语音克隆和指令遵循功能方面表现出色。与SenseVoice和CosyVoice相关的模型已经在Modelscope和Huggingface上开源,沿着相应的训练,推理和微调代码发布在GitHub上。 通过将这些模型与LLMs集成,FunAudioLLM可以实现语音翻译、情感语音聊天、交互式播客和富有表现力的有声读物叙述等应用,从而推动语音交互技术的发展。

SenseVoice支持多语言语音识别,其训练时间超过30万小时。具体来说,SenseVoice-Small在推理方面非常高效,其中识别延迟小于80 ms,分别比Whisper-Small和Whisper-large快5倍和15倍以上,SenseVoice-Large支持50多种语言的高精度ASR。此外,SenseVoice支持丰富的转录,包括最先进的情感识别、音频事件检测、反向文本标准化(Pusateri 等人,2017)和标点符号(Chen 等人,2020年)。

语音生成模型,CosyVoice,可以生成多语言的语音,这是超过17万小时和五种语言,包括中文(ZH),英语(EN),日语(JP),广东话(Yue)和韩语(KO)的训练。CosyVoice生成的样本可以实现低于2%的WER和超过75%的说话人相似度,达到人类平价的质量水平。CosyVoice支持零样本上下文学习,这使得语音克隆只需要3秒的提示语音。音色、情感、韵律和风格可以在语言内部或跨语言复制。我们还发布了一个指令模型,它可以控制说话者身份,说话风格(例如,情感)和其他具有自然纹理指令的细粒度语言特征。

Speech-to-Speech Translation:

通过集成SenseVoice、LLMs和CosyVoice,我们可以毫不费力地执行语音到语音翻译(S2ST)。

Emotional VoiceChat 情感语音聊天:

通过集成SenseVoice、LLMs和CosyVoice,我们可以开发一个情感语音聊天应用程序。

Interactive Podcast 互动播客:通过集成SenseVoice,一个基于LLM的多智能体系统,具有实时世界知识,以及CosyVoice,我们可以创建一个交互式播客。

有声书:通过LLMs的分析能力来构建和识别书籍中的情感,并将其与CosyVoice合成,我们实现了具有增强表现力的有声读物。

CosyVoice:

在推理阶段概述CosyVoice模型。概括地说,CosyVoice包括一个自回归Transformer,用于为输入文本生成相应的语音标记,一个基于ODE的扩散模型,流匹配,用于从生成的语音标记重建Mel频谱,以及一个基于HiFiGAN的声码器,用于合成波形。虚线模块在特定模型用途中是可选的,例如跨语言、SFT推理等。[论文]

图1:所提出的CosyVoice模型的概述。(a)演示了 𝒮3
标记器,其中虚线模块仅在训练阶段使用。(b)是CosyVoice的示意图,由文本到令牌LLM和令牌到语音流匹配模型组成。 S、E和T表示“start of sequence”、“end of sequence”和“turn of speech”标记。虚线表示推理阶段的自回归解码。(c)提供了我们的流匹配模型的放大视图,该模型以概率密度路径上的时间步长 t处的说话者嵌入 𝐯、语义标记 μ、掩蔽语音特征 X~和中间状态 Xt为条件。
图2:(a)零触发上下文学习和(B)跨语言语音克隆的序列构建。LID表示目标语言标识符。

CosyVoice由四个组件组成,即文本编码器、语音分词器[ speech tokenizer]、大语言模型和条件流匹配模型。具体地说,文本编码器用于对齐文本和语音token的语义空间,而  speech tokenizer 用于提取语义记号,如图1(a)所示。我们采用一个大的语言模型来学习整个文本编码和语音标记序列,将TTS重新表述为一个给定文本作为提示的自回归序列生成问题。然后,如图1(c)所示,利用条件流匹配模型,通过最佳路径上的去噪过程将语音令牌转换为Mel频谱图 。2020)用于以所生成的Mel频谱图作为输入来合成波形。

语音的受监督语义令牌 [ speech tokenizer] :

采用有监督的自动语音识别(ASR)模型来导出用于语音的有监督的语义语音( 𝒮3 )分词器。该模型是我们专有的SenseVoice ASR模型的微调版本。它接受了多语言音频数据的训练,并具有丰富的音频内容理解能力。 与原始ASR模型不同,我们将编码器分为两部分,并在它们之间插入矢量量化层。给定Mel频谱图 X 作为输入,其经历位置编码和 Encoder1 以获得上下文感知表示 H :

然后,一个矢量量化器(VQ)参与获得离散令牌。 对于帧 l 处的隐藏表示 𝐡l ,码本 C 中的最近嵌入的索引被视为该时间步处的语音令牌 μl :

语音令牌的对应码本嵌入被用作量化的隐藏表示 H¯={𝐜μ1,𝐜μ2,…,𝐜μL} ,并通过剩余的编码器层 Encoder2 :

 在 Encoder2 之后,接下来是基于transformer的ASR解码器,预测文本标签的后验概率:

TTS的大型语言模型:

我们将TTS任务表述为具有大型语言模型的自回归语音令牌生成问题(LLM)。对于LLM,序列构建是最重要的事项,其构建如下:

S and E denote the start and end of sequence, respectively.T is “turn of speech” tokens. 𝐯 is a speaker embedding vector extracted from the speech X with a pre-trained voice-print model2. The text encodings Y¯={𝐲¯u}u⁣∈⁣[1:U] is obtained by passing the text through a Byte Pair Encoded (BPE) tokenizer and text encoder:

由于文本和语音标记位于不同的语义层,因此文本编码器用于对齐它们的语义空间并有利于LLM建模。 在文本编码和语音标记 {μl}l⁣∈⁣[1:L] 之间插入开始标识符T报告问题,语音标记 {μl}l⁣∈⁣[1:L] 是用2.1中描述的监督语义标记器提取的。在训练阶段,我们采用教师强迫方案,其中左移序列作为模式输入,原始序列作为期望输出。 注意,在训练期间仅考虑语音标记的交叉熵损失和:

Optimal-transport Conditional Flow Matching:

在CosyVoice中,采用最优传输条件流匹配模型(OT-CFM)来学习Mel谱图的分布,并以生成的语音令牌为条件从其生成样本。 与扩散概率模型(DPM)相比,OT-CFM可以实现更好的性能,具有更简单的梯度,更容易的训练和更快的生成.

  在连续时间归一化流(CNF)中,从先验分布 p0⁢(X) 到Mel谱图 q⁢(X) 的数据分布构造概率密度路径。 概率密度路径由依赖于时间的矢量场 νt⁢(X):[0,1]×ℝL∗D→ℝL∗D 定义,其通过以下常微分方程(ODE)生成流 ϕt :

流匹配模型(The flow matching model)用于估计条件概率 P(S|X, v, Sref)。其中,X 和 v 分别表示语音片段和说话人嵌入,S 和 Sref 分别表示目标和参考语音的梅尔频谱。该模型使用卷积 Transformer U-Net 来确定最优传输 ODE 中先验分布与目标分布之间的矢量场。在推理阶段,只需五到十次迭代即可生成令人满意的梅尔频谱图。此外,还采用无分类器指导技术,通过屏蔽 70% 到 100% 的前置特征条件来增强上下文学习能力。

在从预测的梅尔频谱图合成波形时,我们使用改进的 HiFTNet 声码器,以支持流式生成。

可以实现的任务:

(a)零触发上下文学习和(B)跨语言语音克隆的序列构建。LID表示语言标识符。

Multi-lingual Voice Generation 【多语言的语音合成】

Zero-shot In-context Generation 零样本上下文生成

CosyVoice模型具有零触发的上下文学习能力,允许仅用简短的参考语音样本复制任意语音。这个过程需要仔细构造令牌语言模型(LM)的输入序列,如图2所示。 对于同一语言的提示语音和输入文本,我们将它们合并成一个统一的输入,将提示语音标记视为预生成的。利用该输入序列,自回归LM迭代地预测后续令牌,直到其遇到针对前一元素的“序列结束”令牌E。 然而,当提示语音和输入文本在语言上不同时,我们省略与提示相关联的文本和标记,以防止原始语言的韵律特征影响目标语言。 重要的是要注意,提示文本(对应于提示语音的内容)可以通过人工注释或ASR模型(如SenseVoice)转录。与提示文本类似,提示令牌是使用 𝒮3 tokenizer从提示语音中提取的。在生成语音标记之后,它们被附加在提示标记之后,形成流匹配模型的复合条件。此外,说话人嵌入和梅尔声谱图的提示语音,以进一步提高音色和环境的一致性。

Instructed Voice Generation指令语音生成:

Speaker Identity Control、细粒度控制、Style Control、情感丰富的声音生成、Speaker Fine-tune、Speaker Interpolation

为了进一步实现对CosyVoice的可控性,我们尝试集成额外的指令微调(Ji 等人,2023年)。CosyVoice-instruct扩展了CosyVoice-base,具有增强的后续功能。具体地说,它支持对诸如说话人身份(即,说话者的特征)、说话风格(包括情感、性别、语速和音调)以及细粒度的副语言特征。这些功能包括插入笑声、呼吸、边笑边说以及强调某些单词的能力。

SenseVoice:

SenseVoice 是具有音频理解能力的音频基础模型,包括语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)或声学事件检测(AED)。提出了具有不同大小和架构的两个模型以适应不同的要求:SenseVoice-Small,用于快速语音理解的仅编码器语音基础模型,以及SenseVoice-Large,编码器-解码器(Vaswani 等人,2017)语音基础模型,用于更准确的语音理解,支持更多语言。

SenseVoice模型概述。SenseVoice是一个语音基础模型,具有多种语音理解功能,包括ASR、LID、SER和AED。SenseVoice-Small是一种用于快速语音理解的仅编码器语音基础模型,SenseVoice-Large是一种编码器-解码器语音基础模型,用于更准确的语音理解,支持更多语言。

𝐞LID 、 𝐞SER 、 𝐞AEC 、 𝐞ITN/NoITN 是四个特殊标记的嵌入:

⟨LID⟩ 表示LID任务。如果 ⟨LID⟩ 被放置 ,则模型被训练以预测输出的对应位置处的语言标记。 在训练阶段,我们根据概率0.8用真实语言标记随机替换 ⟨LID⟩ ,以便模型可以预测语言标记,或者在推理阶段配置指定的语言标记。

⟨SER⟩ 表示SER任务。如果 ⟨SER⟩ 被放置,则训练模型以预测输出的对应位置处的语音情感标签。

⟨AEC⟩ 表示AEC任务。如果 ⟨AEC⟩ 被放置 ,则模型被训练以预测输出的对应位置处的音频事件标签。

⟨ITN⟩ 或 ⟨NoITN⟩ 指定转录样式。如果提供了 ⟨ITN⟩ ,则模型被训练为使用反向文本规范化(ITN)和标点符号进行转录。如果提供了 ⟨NoITN⟩ ,则模型被训练为在没有ITN和标点符号的情况下转录。

在训练阶段,利用交叉熵损失对LID、SER和AEC任务进行优化。ASR任务使用CTC损失来优化

SenseVoice-Large是一个自回归编码器-解码器模型,用于多语言ASR和多语音理解任务。与Whisper类似(拉德福 等人,2023),SenseVoice-Large通过解码器的输入令牌序列来指定任务。具体来说,我们通过分别包括 ⟨LID⟩ 、 ⟨SER⟩ 、 ⟨AED⟩ 令牌来指定是否预测具有时间戳的语言、语音情感和音频事件。与SenseVoice-Small相比,SenseVoice-Large的优势在于转录准确性和支持大量语言(50+)。

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

  • 多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。
  • 富文本识别:
    • 具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。
    • 支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。
  • 高效推理: SenseVoice-Small 模型采用非自回归端到端框架,推理延迟极低,10s 音频推理仅耗时 70ms,15 倍优于 Whisper-Large。
  • 微调定制: 具备便捷的微调脚本与策略,方便用户根据业务场景修复长尾样本问题。
  • 服务部署: 具有完整的服务部署链路,支持多并发请求,支持客户端语言有,python、c++、html、java 与 c# 等。

推理效率:

表1. 比较了SenseVoice、Paraformer和Whisper的模型结构、参数规模、支持的语言和推理效率。SenseVoice-small采用非自回归架构,与Whisper相比,它在推理效率方面具有显着优势。

性能评测:

我们在开源基准数据集(包括AISHELL-1、AISHELL-2、Wenetspeech、Librisepeech和Common Voice)上比较了SenseVoice和Whisper的多语言识别性能和推理效率。使用A800机器进行推理效率评估。SenseVoice-small采用非自回归端到端架构,推理延迟极低-与Whisper-small相比快7倍,与Whisper-large相比快17倍。

1、文本识别:[在开源基准数据集(包括 AISHELL-1、AISHELL-2、Wenetspeech、Librispeech 和 Common Voice)上比较了 SenseVoice 与 Whisper 的多语言语音识别性能和推理效率。在中文和粤语识别效果上,SenseVoice-Small 模型具有明显的效果优势。]

2、情感识别

SenseVoice也可以用于离散情感识别。支持快乐、悲伤、愤怒和中立。我们在7个流行的情感识别数据集上对其进行了评估。SenseVoice-Large可以在大多数数据集上接近或超过SOTA结果,即使没有目标语料库微调。

由于目前缺乏被广泛使用的情感识别测试指标和方法,我们在多个测试集的多种指标进行测试,并与近年来 Benchmark 上的多个结果进行了全面的对比。所选取的测试集同时包含中文 / 英文两种语言以及表演、影视剧、自然对话等多种风格的数据,在不进行目标数据微调的前提下,SenseVoice 能够在测试数据上达到和超过目前最佳情感识别模型的效果。

我们还在测试集上对多个开源情感识别模型进行对比,结果表明,SenseVoice-Large 模型可以在几乎所有数据上都达到了最佳效果,而 SenseVoice-Small 模型同样可以在多数数据集上取得超越其他开源模型的效果。

3、事件检测

SenseVoice-Small和SenseVoice-Large模型都可以检测到语音中的音频事件,包括音乐、掌声、笑声。SenseVoice-Large可以预测音频事件的开始和结束位置,而SenseVoice Small只能预测音频中发生了什么(只有一个事件),但是,它可以检测更多的事件,例如在人机交互过程中可能发生的咳嗽,打喷嚏,呼吸和哭泣。

尽管 SenseVoice 只在语音数据上进行训练,它仍然可以作为事件检测模型进行单独使用。我们在环境音分类 ESC-50 数据集上与目前业内广泛使用的 BEATS 与 PANN 模型的效果进行了对比。SenseVoice 模型能够在这些任务上取得较好的效果,但受限于训练数据与训练方式,其事件分类效果专业的事件检测模型相比仍然有一定的差距。

限制:

1、SenseVoice有一些需要解决的局限性。首先,对于资源不足的语言,ASR性能通常要低得多。其次,SenseVoice不是为流式转录而设计的。因此,未来的工作可能会集中在开发基于SenseVoice的流式语音理解模型。

2、CosyVoice也有一些限制。首先,它支持的语言数量有限。虽然它可以根据明确的指令表达情感和说话风格,但它不能根据文本的语义内容推断出适当的情感或风格。此外,CosyVoice在唱歌时表现不佳。在保持声音原有音色的同时,实现富有表现力的情感变化仍有改进的空间。

3、另一个限制是FunAudioLLM中的两个创新模型没有使用LLMs进行端到端的训练。这种流水线方法可能会引入错误传播,这可能会影响整体性能。

sensevoice 推理代码:

    def inference(
        self,
        data_in,
        data_lengths=None,
        key: list = ["wav_file_tmp_name"],
        tokenizer=None,
        frontend=None,
        **kwargs,
    ):


        meta_data = {}
        if (
            isinstance(data_in, torch.Tensor) and kwargs.get("data_type", "sound") == "fbank"
        ):  # fbank
            speech, speech_lengths = data_in, data_lengths
            if len(speech.shape) < 3:
                speech = speech[None, :, :]
            if speech_lengths is None:
                speech_lengths = speech.shape[1]
        else:
            # extract fbank feats
            time1 = time.perf_counter()
            audio_sample_list = load_audio_text_image_video(
                data_in,
                fs=frontend.fs,
                audio_fs=kwargs.get("fs", 16000),
                data_type=kwargs.get("data_type", "sound"),
                tokenizer=tokenizer,
            )
            # print(audio_sample_list)
            time2 = time.perf_counter()
            meta_data["load_data"] = f"{time2 - time1:0.3f}"
            speech, speech_lengths = extract_fbank(
                audio_sample_list, data_type=kwargs.get("data_type", "sound"), frontend=frontend
            )
            time3 = time.perf_counter()
            meta_data["extract_feat"] = f"{time3 - time2:0.3f}"
            meta_data["batch_data_time"] = (
                speech_lengths.sum().item() * frontend.frame_shift * frontend.lfr_n / 1000
            )

        speech = speech.to(device=kwargs["device"])
        speech_lengths = speech_lengths.to(device=kwargs["device"])
        print("speech", speech.shape, speech_lengths)
        language = kwargs.get("language", "auto")
        language_query = self.embed(
            torch.LongTensor(
                [[self.lid_dict[language] if language in self.lid_dict else 0]]
            ).to(speech.device)
        ).repeat(speech.size(0), 1, 1)
        print("language_query", language_query.shape)
        use_itn = kwargs.get("use_itn", False)
        textnorm = kwargs.get("text_norm", None)
        if textnorm is None:
            textnorm = "withitn" if use_itn else "woitn"
        textnorm_query = self.embed(
            torch.LongTensor([[self.textnorm_dict[textnorm]]]).to(speech.device)
        ).repeat(speech.size(0), 1, 1)
        print("textnorm_query", textnorm_query.shape)
        speech = torch.cat((textnorm_query, speech), dim=1)
        speech_lengths += 1
        print("speech_add_textnorm", speech.shape, speech_lengths)
        event_emo_query = self.embed(torch.LongTensor([[1, 2]]).to(speech.device)).repeat(
            speech.size(0), 1, 1
        )
        print("event_emo_query", event_emo_query.shape)
        input_query = torch.cat((language_query, event_emo_query), dim=1)
        print("input_query", input_query.shape)
        speech = torch.cat((input_query, speech), dim=1)
        speech_lengths += 3
        print("speech_final", speech.shape, speech_lengths)

        # Encoder
        encoder_out, encoder_out_lens = self.encoder(speech, speech_lengths)
        print("encoder_out", encoder_out.shape, encoder_out_lens)
        if isinstance(encoder_out, tuple):
            encoder_out = encoder_out[0]

        # c. Passed the encoder result and the beam search

        # 束搜索和CTC解码
        ctc_logits = self.ctc.log_softmax(encoder_out)

        results = []
        b, n, d = encoder_out.size()
        if isinstance(key[0], (list, tuple)):
            key = key[0]
        if len(key) < b:
            key = key * b
        for i in range(b):

#对每个 batch 样本提取 CTC logits 输出的前 encoder_out_lens[i] 帧。
#使用 argmax 找到每个时间步概率最大的类别 ID (yseq)。
#使用 torch.unique_consecutive 去除连续的重复类别 ID(CTC 解码中的常见步骤,用于去除重复的符号)。
            x = ctc_logits[i, : encoder_out_lens[i].item(), :]
            yseq = x.argmax(dim=-1)
            yseq = torch.unique_consecutive(yseq, dim=-1) # 使用 torch.unique_consecutive 去除连续的重复类别 ID(CTC 解码中的常见步骤,用于去除重复的符号)

            ibest_writer = None
            if kwargs.get("output_dir") is not None:
                if not hasattr(self, "writer"):
                    self.writer = DatadirWriter(kwargs.get("output_dir"))
                ibest_writer = self.writer[f"1best_recog"]

#使用 mask 去掉 CTC 解码中的 blank ID。
#将整数 ID 列表转化为对应的字符或单词(通过 tokenizer.decode)。
            mask = yseq != self.blank_id
            token_int = yseq[mask].tolist()

            # Change integer-ids to tokens
            text = tokenizer.decode(token_int)

            result_i = {"key": key[i], "text": text}
            results.append(result_i)

            if ibest_writer is not None:
                ibest_writer["text"][key[i]] = text

        return results, meta_data

CTC使用blank id来对齐不同长度的输入和输出:

  • 在语音识别等任务中,输入的语音帧数往往远多于输出的字符数。CTC 通过引入 blank ID 来解决这个问题,使模型能够生成对齐(alignment),从而允许输入长度大于输出长度。
  • blank 用来表示在某个时间步模型没有输出任何字符,或者保持上一个字符的状态不变。

去除重复和冗余:

  • 语音帧与字符之间的对齐并不是一一对应的,CTC 会允许模型在多个时间步中输出相同的字符,同时在其他时间步输出 blank
  • 解码过程中,当遇到连续的相同字符时,只保留第一个字符,忽略重复出现的字符和 blank,这帮助去除冗余。
  • 例如,模型输出可能是 [a, blank, blank, a, a, blank, t, blank, blank],最终解码结果会变为 "a, t"

xLSTM-改进长短期记忆网络

Github: https://github.com/AI-Guru/xlstm-resources

LSTM(长短期记忆网络)已经存在很长时间了。它们已被应用于相当多与序列相关的任务,例如文本生成和翻译,甚至生成图像字幕。

它们的缺点是无法并行化以利用强大的现代 GPU。这一限制为利用 GPU 进行大规模并行训练和推理的 Transformer 的出现铺平了道路。

如果我们现在尝试改进和并行化 LSTM,它们能成为构建下一代LLM的工具吗?

这正是论文“ XLSM——扩展长短期记忆网络”所回答的问题, XLSM 代表“扩展”长短期记忆。他们通过在架构中提出两个新模块,即 sLSTM 和 mLSTM 来实现这一点。

xLSTM Figure

一、LSTM 回顾

1、一个生动的例子

原始 LSTM 主要是为了解决 RNN 时序反向传播中的梯度消失和爆炸问题而提出的。为了方便大家看清楚,我们来看一个生动的例子。

在这样一个时序模型中,输入为x,隐层变量为s,输出为y,LSTM 相比 RNN 增加了条时间链条c,用来保存长期记忆。

LSTM 的核心原理就在于设计了多个门控机制协调短期记忆和长期记忆。其中f1为遗忘门,如同橡皮擦,根据昨天的记忆st-1和今天输入xt决定删除哪些旧记忆sigmoid 函数取值为0时相当于制除操作;f2 使用 tanh 函数取值在(-1,1)之间,作用不是遗忘,而是把这两天发生的事情进行梳理和归纳,然后像铅笔一样增加记忆,因此称为输入门。右边显示了它们的各自计算公式。同时保持长短期记忆链,并相互更新,这就是 LSTM 成功的秘密了。

2、记忆的原理和公式

其实静下心来看,st改用 ht表示。ft就是遗忘门,只是进行了展开;it就是输入门,zt对应输入门中 tanh 函数部分。三者分别都加了非线性激活函数,共同作用生成新的 cell 迭代,也就是公式(2)。这和刚才我们的介绍都是一致的。另外还加了输出门,长短期记忆链条之间的第三种连接,o对应前面例子中的y。公式(3)是h链条的更新公式。

所谓的门控机制,其实就是一种时序上的注意力机制,相当于把不同时间信息进行“掺和”,是对时序信息的一种选择性控制。从这个视角看,与transformer和 Mamba 都异曲同工之妙。核心思想都是选择性控制信息流动,更好地处理时序数据或序列信息。门控机制通过固定的结构和参数来控制信息流,而注意力机制通过动态计算权重来控制信息流。因此,门控机制可以看作是一种特定形式的时序注意力机制,对不同时间步的信息进行选择性控制和“掺和。可以认为是一种约束版或者简化版的注意力机制。

3、为啥歇菜了?

尽管曾经取得了巨大的成功,LSTM 有三个主要局限性:
1 在处理长序列时效率低:
2 记忆容量有限;
3 不能并行处理数据。
这也是为什么能让 transformer后来者居上的原因,因为借助网络模块堆叠、参数规模扩充和 GPU 并行处理拼算力,有针对性的借鉴了上述问题。但显然不止transformer这一条路。原有的门控机制还有很大的潜力可挖,本文就是有针对性的一条条进行了创新和优化。先来看初级改造版本。

二、初级版:sLSTM 改进注意力机制

针对上述问题的第一个改进版本叫 sLSTM,目的是改善决策能力。改动不大,主要有三点:

1.输入门和遗忘门的激活函数从 sigmoid 改成了指数函数(红色部分)。

2.引入了归一化状态 nt(公式9),相应的隐层 h_t的计算方式变了,改成了c_t/n_t也就是公式(10)

3.还引入了一个额外状态 mt来进一步稳定门控,这个稍后讲。

你肯定好奇,这么做的原因是什么啊?原文没有细讲,而是直接给出了选择。我猜也是试出来的,但是不是瞎试。首先,如下图所示,指数函数相比于sigmoid 函数,具有更大的输出范围和更大的梯度(右图黄色,左图红色),可以减轻梯度消失问题使得梯度在反向传播过程中不会迅速减小,从而使得模型在训练时能够更有效地更新权重。其次,指数函数的增长速度比 sigmoid 函数快,对输入变化更加敏感。因此,可以更迅速地强烈的调整输入和遗忘门的输出,使得模型能够更快地捕捉到输入信息的变化,更加选择性地记住或忘记信息,从而提高模型的记忆和遗忘能力。第三,这种强烈的选择性,让模型能够更准确地保留重要信息和丢弃不重要的信息。在特定任务(如长序列的最近邻搜索或稀有事件预测)中表现得尤为显著,能够显著提升模型性能。

引入归一化和状态 mt都是为了稳定,因为指数激活函数可能导致数值过大而溢出前者相当于搞了个大分母。后者通过下面的公式进行:

第一个式子使用了log,指数函数的逆运算,相当于降一级运算,然后取最大值,意思就是输入门和遗忘门都别太猛。类比生活中,无论是新鲜记忆,还是想遗忘的事情,情绪太激动了都不好,一定要心平气和,基本上就是这个意思。

然后根据 m_t再调整输入门和遗忘门,相当于设置了一个缓冲区。隐射到生活中,正应了那句话:忍一时风平浪静,退一步海阔天空。很多事,稍微放放,别那么激动,从容淡定,反倒更理智,处理起来更有效。落实到公式上,甭管f还是i,先找到log最大值,然后在指数上剪掉,相当于避免了溢出。
附录 A中数学进一步证明在前向传播中用f’_t和i’_t替换 f_t和 i_t不会改变整个网络的输出,也不会改变参数损失的导数。这部分推导不是人看的,猫一眼知道就行了,当然这也是人家这个团队牛逼之处,数学玩的贼溜,或者说LSTM 比起transformer 更高级的地方,理论基础扎实,而不只是拼工程拼资源。

增加了这么些公式相当于增加了新的记忆单元,它们之间通过连接从长短期记忆状态,借助门控(阀门)i,f,o进行记忆混合。门控就是选择,也是一种时序注意力机制的体现。
讲完了初级版改进,咱们来看看中级版。

三、中级版:mLSTM 改进内存处理

解决了敏感度,某种程度上也是长序列处理效率问题,为了增强LSTM 的存储能力文章将 LSTM 的记忆单元从一个标量 c增加到短阵C。而且在这里引入了 transformer键值对的概念,更新规则如下:
Ct=Ct-1+vtktT
这就有点意思了哈,“千古文章一大抄,你抄我也超”,互相借鉴形成你中有我我中有你的态势。在将输入投影到键和值之前,mLSTM 进行层归一化,使得均值为零。同时,将协方差更新规则,也就是优化器(比如adam)整合到LSTM 框架中,遗忘门对应于衰减率,输入门对应于学习率,而输出门则缩放检索到的向量。最终形成了下面的选代公式:

与前面 SLSTM 对比,最大的区别之一就是状态和权重参数都变成了矩阵形式,对应的运算变成了向量矩阵乘法和哈达玛积,公式(21)。区别之二是增加了q_t,k_t,v_t这种键值对的计算公式(22-24),优化了自注意力机制,多了好几个权重矩阵增强了模型表达能力。其他的公式基本没变,也就是说记忆单元没变,只是每个单元相当于扩容了记忆的容量。
此外,需要注意的是,这种框架可以使用多头模式,头与头之间没有记忆混合,因此可以充分并行,无形中提升了并行能力。到此,针对传统LSTM 三大弱点的改进都已经实现。

小结一下,似乎影影绰绰能看到两个思路:一是固本守住传统,在原有框架下优化提升挖掘潜力,强化门控机制的有效性,无论是修改激活函数、稳定状态,还是记忆单元矩阵化提升容量;二是开源拿来主义,引入自注意力机制中 QKV的计算模式,增强模型的记忆和检索能力。
不过这还没完,咱们来看看高级版有什么重要的发现和设计。

四、高级版:xLSTM 大模型

既然 transformer 牛通,通过简单堆叠形成的大模型效果好,为什么不把这种思想贯彻到 LSTM 中,形成 LSTM 结构的模块堆叠呢,是不是效果也会不错?这就涉及传说中的 Cover 定理啦。它及其行生的高维空间中非线性映射理论确实是现代大模型设计的重要理论依据之一。尤其是在深度学习和大规模神经网络的设计中,这些理论起到了关键作用。

1、cover定理-大模型设计理论基础

Cover定理可以定性的描述为:当空间的维数D越大时,在该空间的N个数据点间的线性可分的概率就越大

在大模型中,激活函数(如 ReLU、Sigmoid、Tanh等)通过非线性变换将数据映射到高维空间,使得模型可以捕捉复杂的模式和特征,增强模型的表达能力。深度网络的权重矩阵和激活函数共同作用,将输入数据逐步映射到越来越高的维度。这使得在低维空间中难以分离的模式在高维空间中变得线性可分。Transformer模型就是通过多头注意力机制在高维空间中进行并行处理,使得不同位置的特征可以相互影响和结合从而提高了模型的性能。
Cover 定理为这些设计提供了理论支持,解释了为什么通过高维空间中的非线性映射可以提高模型的性能。现代大模型的设计,如 BERT、GPT等,都在不同程度上利用了这些理论基础。

2、核心模块和工作原理

既然你们都能这么干,xLSTM 想我为什么不能啊!因此它干了下面两件事:
1.非线性总结(压缩信息)【左图】:通过残差块在高维空间中对历史信息进行非线性总结使得不同的历史或上下文信息更容易分离。
2.线性映射回原始空间【右图】:完成高维空间中的处理后,再将数据线性映射回原始空间这一过程利用了高维空间中的优势,使得模型能够更好地分离和记忆历史信息。
具体到怎么升维呢,设计了下面两种结构:

左边是先在原始空间中总结信息,然后映射到高维空间,再返回原始空间。看图从下往上输入 sLSTM,然后向上投影,也就是用一个倒着的梯形矩阵升维,处理后再降维。右边是先映射到高维空间,总结信息后再返回原始空间。也就是输入直接上投影,再用 mLSTM 处理,然后再降维。
先干后变,还是先变后干这个好理解,但你肯定好奇为啥左边适合sLSTM,右边适合 mLSTM模型呢?主要原因是在高维空间中的记忆容量更大,因此用有矩阵化记忆单元的mLSTM更合适,而在低维空间处理 sLSTM 更合适。
想了解关于这两个基础模块的更多细节,可以到附录图 9/10 中看到,我给你列到这里了,咱们一个个详细解释它们的细节和用处.

PF=3/4 和 PF=4/3:投影因子(Projection Factor),分别将输入维度缩小为原来的3/4,将输入维度扩大 4/3 倍。
GN(GroupNorm):组归一化(Group Normalization)。在每一组内进行归一化有助于加速训练和提高模型稳定性,特别是在小批量(batch)训练时。

Swish 一种平滑的非线性激活函数,可以帮助模型学习到更复杂的模式。

Conv4:卷积层,卷积核大小为 4。提取局部特征,
LN(LayerNorm):层归一化,帮助稳定和加速训练过程。SLSTM 单元中i,f,z,0:分别表示输入门(input gate)、遗忘门 (forget gate)细胞状态更新(cell update)和输出门(output gate)。NH=4:表示有 4 个头(heads)。此外,将输入分成块,使用块对角线结构进行线性变换,有助于捕捉局部相关性。这些结构与从上一个隐藏状态中得到的递归门预激活(circular arrows)一致。

整个逻辑过程为:输入先LN整理,然后一分为二。一部分卷积提取特征,激活非线性变换,另一部分直接输入sLSTM。这里所有运算都采用了4个头的多头并行进制,每个头可以专注于捕捉输入数据的不同特征或模式,从而使模型能够更全面地理解数据。
内部采用块对角线结构,在计算时可以并行处理,从而显著降低计算复杂度和内存需求;每个子矩阵(块)主要关注输入数据的一部分能够更好地捕捉局部特征;结构化的稀疏性,这有助于减少过拟合。
在sLSTM图中的箭头表示信息在不同时间步之间的流动和处理,代表的是与先前时刻状态的混合计算。这部分相当于记忆的重新组合。然后组内归一化、降维、再激活、再降维,然后与残差相加再输出。
类似的,我们看看另一种基础模块:

PF=1/2 和 PF=2:投影因子(Projection Factor)。前者将输入维度缩小一半,后者将输入维度扩大两倍。
LSkip 是个跳线,类似于残差连接,可以帮助梯度更好地传递,防止梯度消失和爆炸。这里相当于冇两种跳线残差
mLSTM 单元中的 q、k、v分别表示査询(query)、键(key)和值(value),我们刚讲过,都是从输入中生成的,用于计算注意力权重和进行信息检索。
BS=4:块大小为 4 的块对角投影矩阵。

整体逻辑上与前面刚讲的模块大差不差,咱们就不一一过了。整体上都是充分利用了残差堆叠结构,层归一化技术等稳定网络,通过升降维度实现空间变换,激活函数非线性变换,然后利用 LSTM 进行记忆混合,主或者说时序上的选择性自注意力机制计算,采用多头和块对角模式实现并行处理,当然也没少了用卷积提取特征。

3、与Transformer 的对比

有了这两种基本构建模块,通过堆叠增加模型的深度,能够逐层提取更高层次的特征。最终,整个堆叠结构作为一个端到端的模型进行训练,通过反向传播优化所有层的参数。使用这些模块的堆叠设计是现代深度学习型中常见且有效的做法。换句话说,你 transformer 能干的我xLSTM 现在都能干了,有啥嘛?!而且老子内部有清晰而明确的逻辑结构,有数学公式的严密推导,效率更高,而你transformer 内部就是个乱七八糟的自注意力机制和交叉注意力机制,黑盒子,大量的参数是浪费掉的,低效,训练难推理难,从效率和准确率上都不如我也就make sense了。与Transformer不同,xLSTM 网络在计算复杂度和内存复杂度上随着序列长度呈线性关系。由于xLSTM 的记忆压缩性,它非常适合在工业应用和边绿设备上实现。

4、适用场景

对比 mLSTM 和 SLSTM 两种模块,前者方便并行化,后者由于记忆混合(隐藏状态之间的连接),无法并行化。论文开发了一种快速的CUDA实现,通过 GPU 内存优化到寄存器级别,这种实现通常比 mLSTM 慢不到两倍。

那你肯定会问,现在有这两种基础结构,分别什么时候用呢?给你几个原则:

sLSTM:需要高精度和复杂特征提取的任务,计算资源充足且不需要并行化的应用对延迟敏感但不受并行化限制的场景,例如,实时语音识别系统,因为它有记忆混合

mLSTM:图像识别、视频处理等需要高效并行计算的任务,计算资源有限且需要高效利用内存的应用,例如,嵌入式系统、移动设备上:需要在工业环境或边缘设备上部署的任务,例如,工业自动化、物联网设备上的智能应用。因为它并行化好。

五、 实验论证

实验详实是这类大牛文章的最大特点,本文集中在 NLP 任务上,与大量模型进行了对比。主要包括四大类。我们直接看结论。

1、合成任务和长程任务

每行表示一种模型,包括Lama、Mamba等7种模型的 12 中变体,xLSTM[0:1]:主要是SLSTM 块,xLSTM[1:0]:主要是 mLSTM块,xLSTM[1:1]:均衡使用 mLSTM 和SLSTM 块。每列表示一种任务,包括上下文敏感、确定性上下文无关、正则,最后是多数任务,也是正则。
使用 SLSTM 和 mLSTM 的组合(如xLSTM[1:1])在大多数任务上表现出色,特别是在复杂和状态跟踪任务上。

再来看不同模型在多查询联想记忆任务中的性能对比。横轴模型的尺寸,纵轴验证准确率,xLSTM1:1表现最佳,越难越好,Lama等Transformer 模型在较小和中等难度任务中表现优越。Mamba 略强。真是“长江后浪推前浪,一浪更比一浪强”

2、验证集困惑度比较

这个图展示了在使用 158 个Token 训练的 SlimPajama 数据集上,下一词预测性能比较。横轴为模型参数量,纵轴为验证困惑度,总体趋势都差不多,但xLSTM 明显更好。说明其在语言建模任务中的优势。

3、大规模语言建模实验

这个图展示了在使用 300B 个 Token 训练的 SlimPajama 数据集上,不同模型在下一词预测任务中的验证困惑度(Validation Perplexity)比较,特别是对长序列的外推性能。横轴为 token 数量,也就是序列长度。

4、语言基准测试

在使用 300B 个 Token 训练的 SlimPajama数据集上,不同模型在下一词预测任务中的验证困感度(Validation Perplexity)随参数数量变化的情况。验证困感度越低,表示模型的预测性能越好。

·所有模型的验证困感度随着参数数量的增加而下降,说明更大参数的模型在下一词预测任务上表现更好。
xLSTM 的优势:xLSTM 模型(特别是xLSTM[7:1]和xLSTM[1:0])在所有参数数量下都表现出色,验证困惑度较低,说明其在语言建模任务中的性能优越。
模型对比:xLSTM 模型比 Mamba 表现好,而 Mamba比Lama 表现好。这表明xLSTM 在处理大规模语言建模任务时,具有明显的优势。

七、小结

1.LSTM 的缺陷:作为一种时序建模的思想,它通过常量sigmoid 门控机制实现了对记忆的重组,循环训练和推理。但传统架构面临长期记忆处理效率低、记忆存储量小、并行化困难三大硬伤。
2.xLSTM 的原理:借助指数门控混合记忆和新内存结构,LSTM增强为 sLSTM和mLSTM。二者的结合构成了xLSTM 模块,进一步堆叠可以实现大模型化

3.实验对比:xLSTM 在语吉建模上相比于诸如Transformers和State Space Models等最新方法表现良好。扩展法则表明,更大的xLSTM 模型将是当前基于Transformer 技术的大型语言模型的有力竞争者。

4.未来发展:俗话说“以史为鉴,可以知兴替”LSTM 辉煌的过去证明了它在时序建模领域的王者地位,借助 xLSTM 的再度起,它很有可能深度影响其他深度学习领域,如强化学习、时间序列预测或物理系统建模等领域。

当 xLSTM 也能扩展到数十亿参数时,为我们展示了大模型发展的更多可能。一种架构可能过时,可能被不断超越,但是一种思想,一种理论却能不断推陈出新,与时俱进。正如文章最后的小结和预言。LSTM 能走多远,到目前为止,我们可以清晰的回答:”至少可以与当前的 SOTA技术(如Transformers或State Space Models)一样远

提示工程指南

https://github.com/dair-ai/Prompt-Engineering-Guide

https://www.promptingguide.ai/zh

提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。

研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计、研发强大的工程技术,实现和大语言模型或其他生态工具的高效接轨。

提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。

基于对大语言模型的浓厚兴趣,我们编写了这份全新的提示工程指南,介绍了大语言模型相关的论文研究、学习指南、模型、讲座、参考资料、大语言模型能力以及与其他与提示工程相关的工具。

🌐 Prompt Engineering Guide (Web Version)

📺 YouTube Mini Lectures on Prompting Engineering

We’ve partnered with Maven to deliver the following live cohort-based courses on prompt engineering:

  • LLMs for Everyone (Beginner) – learn about the latest prompt engineering techniques and how to effectively apply them to real-world use cases.
  • Prompt Engineering for LLMs (Advanced) – learn advanced prompt engineering techniques to build complex use cases and applications with LLMs.

Happy Prompting!

大模型系列教程

https://github.com/liguodongiot/llm-action?tab=readme-ov-file

目录

LLM训练

LLM训练实战

下面汇总了我在大模型实践中训练相关的所有教程。从6B到65B,从全量微调到高效微调(LoRA,QLoRA,P-Tuning v2),再到RLHF(基于人工反馈的强化学习)。

LLM预训练/SFT/RLHF…参数教程代码
Alpacafull fine-turning7B从0到1复现斯坦福羊驼(Stanford Alpaca 7B)配套代码
Alpaca(LLaMA)LoRA7B~65B1.足够惊艳,使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调,效果比肩斯坦福羊驼
2. 使用 LoRA 技术对 LLaMA 65B 大模型进行微调及推理
配套代码
BELLE(LLaMA/Bloom)full fine-turning7B1.基于LLaMA-7B/Bloomz-7B1-mt复现开源中文对话大模型BELLE及GPTQ量化
2. BELLE(LLaMA-7B/Bloomz-7B1-mt)大模型使用GPTQ量化后推理性能测试
N/A
ChatGLMLoRA6B从0到1基于ChatGLM-6B使用LoRA进行参数高效微调配套代码
ChatGLMfull fine-turning/P-Tuning v26B使用DeepSpeed/P-Tuning v2对ChatGLM-6B进行微调配套代码
Vicuna(LLaMA)full fine-turning7B大模型也内卷,Vicuna训练及推理指南,效果碾压斯坦福羊驼N/A
OPTRLHF0.1B~66B1.一键式 RLHF 训练 DeepSpeed Chat(一):理论篇 
2. 一键式 RLHF 训练 DeepSpeed Chat(二):实践篇
配套代码
MiniGPT-4(LLaMA)full fine-turning7B大杀器,多模态大模型MiniGPT-4入坑指南N/A
Chinese-LLaMA-Alpaca(LLaMA)LoRA(预训练+微调)7B中文LLaMA&Alpaca大语言模型词表扩充+预训练+指令精调配套代码
LLaMAQLoRA7B/65B高效微调技术QLoRA实战,基于LLaMA-65B微调仅需48G显存,真香配套代码
LLaMAGaLore60M/7B突破内存瓶颈,使用 GaLore 一张4090消费级显卡也能预训练LLaMA-7B配套代码

⬆ 一键返回目录

LLM微调技术原理

对于普通大众来说,进行大模型的预训练或者全量微调遥不可及。由此,催生了各种参数高效微调技术,让科研人员或者普通开发者有机会尝试微调大模型。

因此,该技术值得我们进行深入分析其背后的机理,本系列大体分七篇文章进行讲解。

peft方法

LLM微调实战

下面给大家分享大模型参数高效微调技术实战,该系列主要针对 HuggingFace PEFT 框架支持的一些高效微调技术进行讲解。

教程代码框架
大模型参数高效微调技术实战(一)-PEFT概述及环境搭建N/AHuggingFace PEFT
大模型参数高效微调技术实战(二)-Prompt Tuning配套代码HuggingFace PEFT
大模型参数高效微调技术实战(三)-P-Tuning配套代码HuggingFace PEFT
大模型参数高效微调技术实战(四)-Prefix Tuning / P-Tuning v2配套代码HuggingFace PEFT
大模型参数高效微调技术实战(五)-LoRA配套代码HuggingFace PEFT
大模型参数高效微调技术实战(六)-IA3配套代码HuggingFace PEFT
大模型微调实战(七)-基于LoRA微调多模态大模型配套代码HuggingFace PEFT
大模型微调实战(八)-使用INT8/FP4/NF4微调大模型配套代码PEFT、bitsandbytes

⬆ 一键返回目录

LLM分布式训练并行技术

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。

而利用AI集群,使深度学习算法更好地从大量数据中高效地训练出性能优良的大模型是分布式机器学习的首要目标。为了实现该目标,一般需要根据硬件资源与数据/模型规模的匹配情况,考虑对计算任务、训练数据和模型进行划分,从而进行分布式训练。因此,分布式训练相关技术值得我们进行深入分析其背后的机理。

下面主要对大模型进行分布式训练的并行技术进行讲解,本系列大体分九篇文章进行讲解。

⬆ 一键返回目录

分布式AI框架

分布式训练网络通信

待更新…

LLM训练优化技术

  • FlashAttention V1、V2
  • 混合精度训练
  • 重计算
  • MQA / GQA
  • 梯度累积

LLM对齐技术

  • PPO(近端策略优化)
  • DPO
  • ORPO

⬆ 一键返回目录

LLM推理

LLM推理框架

LLM推理优化技术

LLM压缩

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。 模型压缩主要分为如下几类:

  • 剪枝(Pruning)
  • 知识蒸馏(Knowledge Distillation)
  • 量化

LLM量化

本系列将针对一些常见大模型量化方案(GPTQ、LLM.int8()、SmoothQuant、AWQ等)进行讲述。

LLM剪枝

结构化剪枝

  • LLM-Pruner(LLM-Pruner: On the Structural Pruning of Large Language Models)
  • LLM-Shearing(Sheared LLaMA: Accelerating Language Model Pre-training via Structured Pruning)

非结构化剪枝

  • SparseGPT(SparseGPT: Massive Language Models Can be Accurately Pruned in One-Shot)
  • LoRAPrune(LoRAPrune: Pruning Meets Low-Rank Parameter-Efficient Fine-Tuning)
  • Wanda(A Simple and Effective Pruning Approach for Large Language Models)
  • Flash-LLM(Flash-LLM: Enabling Cost-Effective and Highly-Efficient Large Generative Model Inference with Unstructured Sparsity)

LLM知识蒸馏

Standard KD:

使学生模型学习教师模型(LLM)所拥有的常见知识,如输出分布和特征信息,这种方法类似于传统的KD。

  • MINILLM
  • GKD

EA-based KD:

不仅仅是将LLM的常见知识转移到学生模型中,还涵盖了蒸馏它们独特的涌现能力。具体来说,EA-based KD又分为了上下文学习(ICL)、思维链(CoT)和指令跟随(IF)。

In-Context Learning:

  • In-Context Learning distillation

Chain-of-Thought:

  • MT-COT
  • Fine-tune-CoT
  • DISCO
  • SCOTT
  • SOCRATIC CoT

Instruction Following:

  • Lion

低秩分解

低秩分解旨在通过将给定的权重矩阵分解成两个或多个较小维度的矩阵,从而对其进行近似。低秩分解背后的核心思想是找到一个大的权重矩阵W的分解,得到两个矩阵U和V,使得W≈U V,其中U是一个m×k矩阵,V是一个k×n矩阵,其中k远小于m和n。U和V的乘积近似于原始的权重矩阵,从而大幅减少了参数数量和计算开销。

在LLM研究的模型压缩领域,研究人员通常将多种技术与低秩分解相结合,包括修剪、量化等。

  • ZeroQuant-FP(低秩分解+量化)
  • LoRAPrune(低秩分解+剪枝)

LLM数据工程

LLM Data Engineering

预训练语料处理技术

llm-pretrain-pipeline
  • 数据收集
  • 数据处理
    • 去重
    • 过滤
    • 选择
    • 组合

LLM微调高效数据筛选技术

提示工程

  • Zero-Shot Prompting
  • Few-Shot Prompting
  • Chain-of-Thought (CoT) Prompting
  • Automatic Chain-of-Thought (Auto-CoT) Prompting
  • Tree-of-Thoughts (ToT) Prompting

LLM算法架构

llm-famliy
llm-famliy

LLM应用开发

大模型是基座,要想让其变成一款产品,我们还需要一些其他相关的技术,比如:向量数据库(Pinecone、Milvus、Vespa、Weaviate),LangChain等。

LLM国产化适配

随着 ChatGPT 的现象级走红,引领了AI大模型时代的变革,从而导致 AI 算力日益紧缺。与此同时,中美贸易战以及美国对华进行AI芯片相关的制裁导致 AI 算力的国产化适配势在必行。本系列将对一些国产化 AI 加速卡进行讲解。

⬆ 一键返回目录

AI编译器

AI编译器是指将机器学习算法从开发阶段,通过变换和优化算法,使其变成部署状态。

框架:

  • MLIR
  • XLA
  • TVM

AI基础设施

AI加速卡

AI集群

待更新…

AI集群网络通信

待更新…

  • 分布式训练网络通讯原语
  • AI 集群通信软硬件

LLMOps

LLM生态相关技术

LLM面试题

正在收集中…

⬆ 一键返回目录

服务器基础环境安装及常用工具

基础环境安装:

常用工具: