Seed-TTS 字节跳动-高质量通用语音生成模型

A Family of High-Quality Versatile Speech Generation Models [字节跳动]

https://bytedancespeech.github.io/seedtts_tech_report/

Seed-TTS,一个大规模的自回归文本到语音(TTS)模型家族,能够生成与人类语音几乎不可区分的语音。Seed-TTS是语音生成的基础模型,具有良好的语音上下文学习能力,在说话人相似度和自然度方面的性能在客观和主观评价上都与真实人类语音相匹配。通过微调,我们在这些指标上获得了更高的主观分数。Seed-TTS提供了对各种语音属性(如情感)的上级可控性,并且能够为现实中的说话者生成高度表达性和多样化的语音。此外,我们提出了一种自蒸馏方法的语音分解,以及强化学习方法,以提高模型的鲁棒性、说话人相似性和可控性。 我们还提出了一个非自回归(NAR)的 Seed TTS模型的变体,命名为 Seed -TTSDiT,它利用了一个完全基于扩散的架构。与以前的基于NAR的TTS系统不同,Seed-TTSDiT不依赖于预先估计的音素持续时间,并且通过端到端处理来执行语音生成。我们证明了这种变体在客观和主观评价中与基于语言模型的变体具有可比性,并展示了其在语音编辑中的有效性。

图1. Seed-TTS推理流水线概述。(1)语音分词器从参考语音中学习标记。(2)自回归语言模型基于条件文本和语音生成语音令牌。(3)扩散Transformer模型以由粗到细的方式在给定生成的语音标记的情况下生成连续语音表示。(4)声学声码器从扩散输出产生更高质量的语音。

主要贡献如下:

1、Seed-TTS,这是一系列语音生成模型,能够生成高度表达性的类人语音。我们证明, Seed- TTS实现SOTA的性能在多个评估数据集。在zero-shot speech in-context learning (ICL)设置下,我们表明Seed-TTS能够生成与人类语音难以区分的鲁棒、相似和高度动态的语音。

2、提出了一种新的用于音色解耦的Seed-TTS自蒸馏扩展,并在语音转换任务中验证了SOTA的性能。

3、针对Seed-TTS模型,提出了一种新的基于RL的训练后扩展方法,从整体上提高了模型的性能。

Seed-TTS主要功能:

  • 高质量语音生成: Seed-TTS采用了先进的自回归模型和声学声码器技术、能够生成接近人类自然语音的高质量语音。模型在大量数据上进行训练,学习到丰富的语音特征和语言模式,从而能够合成清晰、流畅、自然的语音输出
  • 上下文学习: 该模型具备出色的上下文学习能力,可以在理解给定文本的上下文基础上、生成与上下文风格和语义相匹配的语音。无论是连续的对话还是单独的句子,Seed-TTS都能够保持语音的连贯性和一致性
  • 情感控制:Seed-TTS能够根据文本内容或额外的情感标签,控制生成语音的情感色彩用户可以指定语音中应表达的情感,如愤怒、快乐、悲伤或惊讶等,模型会相应地调整语音的音调、强度和节奏,以匹配所选情感比如:把情感标签加入text token 或者 作为扩散模型的条件输入
  • 语音属性可控:除了情感,Seed-TTS还允许用户控制其他语音属性,包括语调、节奏和说话风格。用户可以根据应用场景的需求,调整语音使其更正式或非正式 或者更具戏剧化效果【比如:其他语音属性加入text token 或者 作为扩散模型的条件输入
  • 零样本学习能力(Zero-shot Learnina):即使没有特定说话者的训练数据,SeedTTS也能够利用其在大量数据上训练得到的泛化能力,生成高质量的语音。此能力使得Seed-TTS能够快速适应新的说话者或语言,而无需额外的训练过程
  • 语音编辑:Seed-TTS支持对生成的语音进行编辑,包括内容编辑和说话速度编辑用户可以根据需要修改语音中的特定部分,或调整语速以适应不同的听众或应用场景。
  • 多语种支持:模型设计支持多种语言的文本输入、能够生成相应语言的语音,使得Seed-TTS可以服务于全球化的应用,满足不同语言用户的需求
  • 语音分解:Seed-TTS通过自我蒸馏方法实现了语音的属性分解。例如可以将语音的音色与其他属性(如内容和情感)分离,为语音合成提供了更高的灵活性和控制力,允许用户独立地修改和重组语音的不同组成部分

Seed-TTS 是一种基于自回归 Transformer 模型,如图 1 所示。我们的系统由四个主要构建模块组成:语音分词器、分词语言模型、分词扩散模型和声学声码器我们强调,Seed-TTS 在大量数据上进行训练(数据量级比之前最大的 TTS 系统大得多),以实现强大的泛化能力和新兴能力。

Seed-TTS方法:

Seed-TTS是基于自回归transformer-based(LLaMA:decoder only)的模型,如图1所示。我们的系统由四个主要的构建块:一个语音tokenizer,一个token语言模型,一个token扩散模型,和一个声学声码器。我们强调,Seed-TTS是在大量数据(比以前最大的TTS系统大的数量级)上训练的,以实现强大的泛化和涌现能力。

首先,语音标记器将语音信号转换为一系列语音标记,然后使用类似于 BASE TTS所描述的方法对标记语言模型进行训练。我们研究了连续和离散语音标记器,发现标记器的设计对整个系统的性能至关重要。语言模型是在成对的文本序列和语音标记上训练的。在推理过程中,模型自回归地生成语音标记。请注意,在本技术报告中,我们专注于语音生成任务,因此文本序列的损失是被掩蔽的。这些生成的标记随后由扩散模型处理,以增强声学细节。然后输出通过声学声码器处理,以预测最终的波形。

具体流程如下: 首先语音tokenizer将语音信号转换为语音token序列,在该语音token序列上训练token语言模型,我们研究了连续和离散语音token器,发现 tokenizer 的设计对整个系统的性能至关重要。语言模型在文本和语音token的配对序列上训练。在推理过程中,它自回归地生成语音token。这些生成的令牌,然后用扩散模型进行处理,以增强声学细节。输出被传递到声学声码器以预测最终波形。 声学声码器使用类似于Kumar等人【High-Fidelity Audio Compression with Improved RVQGAN】,并单独进行训练

与基于文本的语言模型类似,Seed-TTS经历三个训练阶段:预训练,微调和后训练。预训练阶段的目标是最大限度地提高场景和说话人的覆盖率,同时为通用语音建模建立一个强大的骨干。如前所述,在该阶段,Seed-TTS利用了比先前的语音生成模型大数量级的大量训练数据和模型规模。

微调阶段包括说话人微调和指令微调。说话人微调的重点是提高选定说话人组的表现,而指令微调的目的是提高可控性和交互性。后期训练通过RL进行,从整体上改进了模型。

我们观察到 Seed-TTS 模型相较于之前的模型有两个主要优势。首先,Seed-TTS 在不同场景下(包括如喊叫、哭泣或高度情感化的语音等具有挑战性的情境)展示了出色的语音合成自然度和表现力。在开发过程中,我们在被认为对于以前的 TTS 系统难以或无法处理的情境中对模型进行了严格测试,结果显示其相对于之前的最先进系统具有明显的优势。

其次,Seed-TTS解决了基于语言模型的TTS系统中普遍存在的稳定性问题,这些问题阻碍了它们在现实世界中的部署。稳定性是通过token和模型设计改进、增强的训练和推理策略、数据扩充和训练后强化学习的组合来实现的。因此,Seed-TTS在测试集上实现了显著更好的鲁棒性。

作为语音生成的基础模型,Seed-TTS可以执行各种任务,例如语音ICL【 zero-shot voice continuation】,可控TTS,跨语言TTS,语音转换,音色生成和说话风格转换。

ICL(上下文学习)结果,也称为零样本语音延续。ICL 被定义为生成一个具有与短参考语音片段相同音色和韵律的全新口语表达。这些 ICL 结果是通过使用预训练的 Seed-TTS 模型对音频和文本提示进行延续而获得的。

Experiments

Zero-shot in-context learning

采用了词错误率(WER)和说话人相似度(SIM)指标进行客观评价。我们确保每个样本包含同一说话人说出的一个参考话语和一个目标话语。所提出的Seed-TTS系统用于基于参考语音生成目标文本的语音作为音频提示。通过这种方式,我们可以直接将合成语音与来自真实的人类的地面真实语音进行比较。参考发音的持续时间范围从3到20秒。

值得注意的是,较低的WER不一定会导致说话者相似性的主观分数提高。我们凭经验观察到,较低的WER通常表明该模型产生更“标准化”的语音,这更容易被ASR系统识别,但以牺牲其他期望的质量为代价。例如,在提示语音包含强口音或高表达力的情况下,从生成的语音获得较低的WER通常指示在模型的输出空间中具有有限变化的较不带口音的语音,这可能听起来不太自然并且当在主观评估中测量时具有降低的说话者相似性。

言语理解评估

我们通过在生成的语音上训练ASR模型来进一步验证Seed-TTS的生成质量。为此,我们生成了LibriSpeech 960小时训练集的合成版本通过“文本波洗牌”策略,并使用合成语料库从头开始训练ASR模型,然后我们使用该模型在原始LibriSpeech开发和测试集上转录语音。具体地说,我们通过采用训练集中的每个话语作为音频提示来生成训练集中的每个话语的合成版本,以使用来自训练集中的随机采样的文本来合成新句子,同时确保所有话语和文本仅被采样一次。通过这种方式,我们创建了一个合成LibriSpeech训练语料库,该语料库保持与原始语料库相同的总说话者和内容信息,以使用WeNet工具包。我们采用了12层挤压成形器作为ASR编码器和3层双向Transformer作为ASR解码器。ASR基线模型也在原始LibriSpeech训练语料库上训练。所有模型均使用相同的超参数进行训练,例如:每个模型都在LibriSpeech开发和测试集上进行了测试,结果如表2所示。

对于干净集,即,dev_cleantest_clean,使用合成数据训练的模型实现了与使用真实的数据训练的模型非常相似的ASR性能。在有噪声的dev_othertest_other集合上分别观察到1.81%和1.6%的绝对WER下降,我们推测这是由于Seed-TTS在生成过程中倾向于减少背景噪声,从而导致对噪声的鲁棒性降低。这一结果表明,在语音理解模型的开发中使用合成数据的潜力,这进一步推动了语音理解和生成的统一。

说话人相似性分析:

为了验证合成语音中音色的保真度,我们使用与上述相同的混排方法生成了 VoxCeleb1 测试集中的英语语句,并使用基于 WavLM 的说话人验证模型获取了它们的说话人嵌入。我们在图 3 中使用 t-SNE绘制了 25 位说话人真实语音和合成语音的说话人嵌入分布图。

我们观察到,同一说话者的真实语音和合成语音的嵌入可靠地聚集在一起,这表明 Seed-TTS 生成的语音在质量和说话者相似性方面与真实人类语音非常接近。

说话人微调

我们在 Seed-TTS 预训练模型的基础上进行了说话人微调(SFT)。在该实验中,我们选择了 5 位说话者(3 位女性和 2 位男性),每位说话者的语音数据时长在 1 到 10 小时之间。我们使用这些说话者的总计 20 小时的合并数据对 Seed-TTS 进行微调,并引入了一个额外的说话人索引标记,用于在推理时选择目标说话者的音色。对于这些选定的说话者,我们使用 WER(词错误率)和 SIM(相似度)客观指标以及主观 CMOS(主观质量评分)研究,评估了微调模型(Seed-TTS SFT)与基础预训练模型(Seed-TTS ICL)生成的语音效果。对于基础模型,每位说话者使用了随机采样的 20 秒语音片段作为音频提示。说话人微调实验的结果在表 3 中进行了汇报。

通过指令微调实现可控性

为了进一步增强说话人微调模型的可控性,我们尝试集成了额外的指令微调(IFT)。IFT 使模型能够灵活控制生成语音的各个方面,例如表现力、语速、风格、情感等。在本报告中,我们仅以情感控制为示例进行展示。

为了验证情感可控性,我们训练了一个类似于Chen等人的语音情感识别(SER)模型,选择了四个主要情感(即,愤怒、高兴、悲伤和惊讶),并测量了从合成语音预测情绪的准确性。我们为每种情绪生成并评估了100个话语,其中合成文本的主题被设计为与目标情绪相匹配。

结果总结于表4中。我们发现,即使没有一个明确的控制信号, Seed-TTSSFT 仍然获得了中等精度的情绪控制。我们推测这是因为该模型能够根据所提供的文本内容推断出适当的目标情感。当与附加的控制信号结合时,获得了显著提高的精度。

低延迟推理和流处理

TTS模型在实际应用中的部署从多个角度提出了一些实际挑战。例如,在基于聊天的应用中,等待时间和第一分组延迟对于用户体验是必不可少的。在时间和内存上的计算开销对于服务并发性是至关重要的。与传统TTS型号相比,Seed-TTS采用了明显更大的型号尺寸,为部署带来了额外的障碍。为了解决这些挑战,我们采用了各种技术来降低推理成本和延迟。

具体地说,我们解决了模型部署的三个方面。首先,实现了一种因果扩散结构,该结构使流处理能够在扩散模块中进行,并显著降低了处理延迟和首包延迟。 其次,我们采用稠度蒸馏(Song 等人,2023)和改进的流量匹配算法Esser 等人(2024),以降低扩散模型的计算成本。另一方面,我们研究了在语言模型侧减少内存和计算消耗的常用方法。

部署模型和离线模型之间的比较。

模型扩展

我们进一步提出了两个扩展的TTS模型,以提高其性能和扩大其适用性。首先,我们介绍了一种自蒸馏的方法,旨在增加音色的可控性。随后,我们提出使用强化学习来全面提高模型的能力。

自蒸馏的语音分解:

语音分解是指将语音分解为各种独立的、分离的属性的过程。该功能允许TTS系统灵活地合成来自不同说话者的具有不同音色、韵律和内容组合的语音,这对于零样本语音转换和因子化零样本TTS等应用至关重要。大多数现有方法通过特征工程特定损失函数或精确的网络架构调整实现属性解耦。然而,将这些方法集成到像Seed-TTS这样的通用语音生成系统中可能具有挑战性。

我们提出了一个自蒸馏方案来实现属性解耦。这种方法的核心原理是创建受控语音对,这些语音对共享大多数信息,但在一个或几个特定的目标属性上有所不同。利用这样的数据对,沿着对模型架构的微小更新,使得Seed-TTS模型能够实现高质量的属性解耦。鉴于Seed-TTS可以为几乎任何说话者生成高质量的零样本生成,生成这些具有不同目标属性的数据对是简单的。在这份报告中,我们特别强调了音色分解的过程和结果。

我们注意到,在Seed-TTS生成过程中,通过在扩散模块中引入说话人扰动,我们能够获得具有相同内容和韵律模式但音色发生变化的合成语音。我们将原始句子和音色改变的句子分别表示为 So⁢r⁢i 和 Sa⁢l⁢t 。

我们使用这些增强的合成数据对重新训练Seed-TTS系统中的扩散模型。具体地,在训练期间,从 Sa⁢l⁢t 提取的令牌被用作网络的输入。从 So⁢r⁢i 提取的音色参考也被集成为扩散输入的一部分。 该网络被优化以恢复从 So⁢r⁢i 中提取的声码器嵌入。值得注意的是, Sa⁢l⁢t 和 So⁢r⁢i 共享相同的内容和韵律,但音色不同。为了恢复 So⁢r⁢i ,网络必须忽略嵌入在来自 Sa⁢l⁢t 的令牌序列中的音色,并且仅依赖于所提供的音色嵌入。这种方法允许我们使用额外的音色参考来修改音色,同时保留原始内容和韵律。我们发现这种直接的方法使得Seed-TTS系统能够实现高质量的音色解缠结。

通过强化学习的偏好偏向

RL已被证明是文本和图像处理中的有效学习范例。我们比较了使用外部奖励模型的RL方法,如近端策略优化和REINFORCE,以及不使用外部奖励模型的RL方法,如DPO。我们的研究结果表明,这两种方法都是有效的。前者允许对特定语音属性进行清晰的控制,而后者受益于更简单的实现。在本报告中,我们展示了前一种方法的有效性。

具体来说,我们使用REINFORCE来微调两个版本,这两个版本基于原始的零触发ICL模型( Seed-TTSICL ),使用不同的奖励函数: Seed-TTSRL-SIM-WER ,使用SIM和WER客观指标作为奖励,以提高说话人相似性和鲁棒性, Seed-TTSRL-SER ,使用SER模型的准确性作为奖励,以提高情感可控性。

完全基于扩散的语音生成【去除token语言模型】

提出了一种仅基于扩散的Seed-TTS模型的变体,表示为 Seed-TTSDiT 。在该变型中,我们去除了扩散模型和声学表征器【acoustic tokenizer】之间的依赖性,使得扩散模型直接将高斯噪声转换成纯粹基于输入文本的声码器的潜在表示。

在我们修改后的 Seed-TTSDiT 设计中,我们直接在扩散模型中采用端到端处理。与估计音素级持续时间相反,该模型预先估计生成的语音的总持续时间。然后优化该模型以估计音频和文本之间的局部对齐。通过这种方式, Seed-TTSDiT 可以动态调整每个音素的持续时间,从而产生高度自然的语音。

我们发现 Seed-TTSDiT 在正确训练时能够预测输入语音的适当总持续时间。然而,不是以这种方式训练,而是选择直接向模型提供总持续时间,这实现了可用于内容编辑和语速编辑的若干附加的期望属性。为此,在训练过程中,扩散模型接收音频提示、目标文本以及一段高斯噪声的片段,所有样本的总时长都相同。模型预测生成语音的潜在表示,保持相同的总时长,然后通过声码器转换成波形。

与采用生成下一个token语言建模的方法相比,纯扩散模型具有更简单的流水线。作为非流模型, Seed-TTSDiT 自然支持内容编辑的应用。在内容编辑任务中,我们屏蔽了一定比例的音频,并使用模型根据每个测试样本提供的文本恢复被屏蔽的部分。

模型应用、局限性和安全性

尽管Seed-TTS具有这些功能,但它仍有一些局限性。虽然观察到了紧急行为,但该模型有时在需要细致入微的情感和上下文理解的场景中存在局限性。此外,尽管使用大量数据进行了训练,但场景覆盖率仍有改进的空间。例如,当前的Seed-TTS模型在唱歌或给出包含背景音乐或过度噪音的提示时表现不佳,通常会产生不一致的背景,例如完全忽略音乐。

考虑到滥用可能会造成有害的社会影响,我们在相关产品中实施了多项安全程序,以防止在该模型的开发和潜在部署过程中发生滥用。例如,我们开发了一种针对语音内容和扬声器音色的多步验证方法,以确保注册音频仅包含授权用户的语音。此外,我们实现了一个多层次的水印方案,这是强制性地包括在创建的内容,如视频背景水印和内容描述中的水印的各个层次。

paraformer-工业级非自回归端到端语音识别模型

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

代码:https://github.com/modelscope/FunASR/

摘要:

Transformers在 ASR 领域占据主导地位。虽然能够产生良好的性能,但它们使用自回归(AR)解码器来逐一生成令牌,这在计算效率上是低效的。为了加快推理速度,可以使用非自回归 (NAR) 方法,例如单步 NAR 的设计是为了实现并行生成。然而,由于输出标签之间的独立性假设,单步 NAR 的性能不如 AR 模型,尤其是在大规模语料库的情况下。改进single-step NAR 面临两个挑战:首先是准确预测输出 token 的数量并提取隐藏变量;其次,增强输出标签之间相互依赖性的建模。为了应对这两个挑战,我们提出了一种快速且准确的并行Transformer,称为 Paraformer。该模型属于单步非自回归模型。这利用基于连续积分和激发的预测器来预测令牌的数量并生成隐藏变量。然后,扫视语言模型(GLM)采样器生成语义嵌入,以增强 NAR 解码器对上下文相互依赖进行建模的能力。最后,我们设计了一种策略来生成负样本以进行最小错误率训练,以进一步提高性能。使用公共 AISHELL-1、AISHELL-2 基准和工业级 20,000 小时任务的实验表明,所提出的 Paraformer 可以达到与最先进的 AR Transformer相当的性能,并且加速超过 10 倍。

1. Paraformer使用基于CIF的predictor预测输出标签的个数并产生隐变量;【文献18】

2. GLM sampler用于产生语义向量增强非自回归模型对上下文的建模能力;【文献19】

3. 最后作者设计了一个策略产生负例,并用MWER损失训练使模型的识别能力进一步提升。【文献20】

介绍:

过去几年,端到端(E2E)模型在自动语音识别(ASR)任务上的性能已经超越了传统层级系统。存在三种流行的 E2E 方法:连接主义时间分类 (CTC)、循环神经网络转换器 (RNN-T) 和基于注意力的编码器-解码器 (AED) 。其中,AED 模型由于其卓越的识别精度而在 ASR 的 seq2seq 建模中占据主导地位。例如 Transformer 和 Conformer。虽然性能良好,但此类 AED 模型内的自回归 (AR) 解码器需要一一生成令牌,因为每个令牌都以所有先前的令牌为条件。因此,解码器的计算效率低下,并且解码时间随着输出序列长度线性增加。为了提高效率并加速推理,有人提出使用非自回归(NAR)模型并行生成输出序列。

基于推理时需要的迭代次数,NAR 模型可以分为迭代模型或单步模型。在前者中,A-FMLM 是单步自回归模型的最早尝试,旨在通过不断迭代来预测以未屏蔽标记为条件的屏蔽标记。由于需要预先定义目标令牌长度,性能受到影响。为了解决这个问题,Mask-CTC 和变体提出通过 CTC 解码来增强解码器输入。即便如此,这些迭代 NAR 模型需要多次迭代才能获得有竞争力的结果,限制了实践中的推理速度。最近,提出了几种单步 NAR 模型来克服这一限制。它们通过消除时间依赖性同时生成输出序列。虽然单步 NAR 模型可以显着提高推理速度,但其识别精度明显不如 AR 模型,尤其是在大规模语料库上评估时。

前面提到的单步非自回归模型主要关注如何预测输出标签的个数和准确提取隐变量。和机器翻译通过predictor预测输出标签个数相比,ASR预测输出标签个数确实比较难,因为有很多的潜在影响因素,比如说话人的语速、静音、噪音。另一方面,经过作者的观察和分析,单步非自回归模型相比自回归模型具有更多的替换错误,如下图1。作者认为缺少上下文依赖信息导致预测标签个数准确率差不多,但替换错误上升明显(AR和vanilla NAR比较),尤其是单步自回归模型的条件独立假设。另外,所有的非自回归模型都是在学术基准阅读音频上实验的,并没有验证这些模型在工业基准数据上的效果。这篇论文的目标是提升单步非自回归模型的识别效果,使其达到和自回归模型相同的水准,并在大规模工业级数据上验证。

图1

文章提出了一个又快又准的并行transformer模型,可以克服上面提到的两个挑战。首先,不像前面的基于CTC的工作,作者提出了使用基于CIF【continuous integrate-and-fire】的predictor网络评估目标长度并产生隐变量。对于第二个挑战,作者设计了基于GLM【glancing language mode】的sampler模块增强非自回归解码器对输出上下文的建模能力。这个工作受到了机器翻译工作的启发。作者另外设计了一个包含负例的策略,利用MWER损失指导模型学习提升模型性能。

Paraformer是第一个在性能上可以和自回归模型媲美,并且在大规模数据集上相比自回归模型有10倍+的推理速度提升。

方法

整体框架

如上图所示,整个框架包含五个模块:encoder、 predictor、sampler、decoder、loss function。其中Encoder和自回归模型的Encoder一样,本文使用SAN-M【multihead-attention的部分换成了san-M】和FFN,也可以使用conformer等结构。Predictor用于生成声学特征指导解码。Sampler模块使用声学特征和标签特征生成语义特征【用于学习输入的上下文内容语义信息,增强非自回归解码器对输出上下文的建模能力】。Decoder和自回归解码器相同,只不过这里是双向解码器[类似bert]。解码器包含多个SAN-M、FNN和cross MHA模块。除了CE loss,还会使用MAE loss训练predictor,MWER损失也一起参与模型训练。

整个流程阐述:
输入音频为X,长度为T;音频对应的文本标签为Y,长度为N。Encoder的输入为X,输出为H。Predictor的输入为H,输出为预测的输出标签长度N’并生成声学向量Ea。第一轮解码Decoder的输入为H和Ea,输出为Y’。图中红色虚线Pass1标记部分表示输入Ea,但是并不对这个输入进行反向传播学习。第二轮解码前会首先经过Sampler模块。Sampler模块在声学向量Ea和输出标签向量Ec之间进行采样得到语义向量Es。其中Char指的是标签Y。采样过程依赖Y和Y’之间的距离。第二轮解码Decoder的输入为H和Es,输出为Y’‘,这次进行反向传播学习。此次反向传播学习指导decoder学习上下文语音信息,同时也会指导predictor和encoder的学习。Sampler使用Y’进行距离计算不会进行反向传播学习。最后输出的Y’’会被采样为MWER训练生成负例候选。使用N和N’计算MAE。MWER、MAE和CE loss一起作为loss进行训练。
推理时,sampler模块是不激活的,并且双向并行解码器只使用声学向量Ea和隐向量H通过一轮输出最终的预测结果。尽管decoder在每次训练时会前向推理两次,但是因为在推理时只进行了一次所以并不会使计算复杂度变大。

Encoder:

SAN‑M(Memory Equipped Self‑Attention)是一种将自注意力(Self-Attention)与 DFSMN 记忆模块融合的结构,最初用于 增强 Transformer 的上下文捕捉能力,尤其在 ASR 任务中表现出色。它通过在每个 Transformer 注意力块中嵌入 FSMN 类型的 记忆增强路径,来充分结合 Transformer 的远程依赖和 FSMN 的局部惯性记忆优势

DFSMN 通过引入跳跃连接和记忆步长改进了 FSMN 架构。它由三部分组成:一个线性投影、一个记忆单元以及一个从记忆单元到下一个隐藏子层的权重连接。DFSMN 的关键元素是可学习的类 FIR 记忆块,它们用于将长上下文信息编码为固定大小的表示。因此,DFSMN 能够在不使用循环反馈的情况下对序列数据中的长期依赖关系进行建模。第l-th 记忆块中的操作采用以下形式:

这里, 𝐌 是记忆块。 𝐡t 和 𝐩tℓ 分别表示 ReLU 层和线性投影层的输出。 𝐦t 表示第 ℓ 个记忆块的输出 。 N1 和 N2ℓ 分别表示第 ℓ 个记忆块的回顾和前瞻顺序 ,而 s1 和 s2 是它们各自的步幅因子。

其中 𝐘 表示 SAN-M 的输出。单向 SAN-M 意味着自注意力和 DFSMN 记忆块本身都是单向的。

DFSMN 记忆块和自注意力的输出都是通过对特征向量加权然后求和来计算的重要的区别在于如何得出权重。对于 DFSMN 记忆模块而言,权重是上下文无关(CI)系数,我们可以将其视为学习整个数据集的统计平均分布。虽然单层的感受野较小,但仍然可以通过堆叠多层来建模长距离依赖关系。

(a) 自注意力机制能够学习全序列内的长程依赖关系,但学习到的特征并不一定总是长期依赖的,尤其是在编码器中。(b) DFSMN 记忆模块倾向于学习局部依赖关系。同时,它们的计算效率更高,也比自注意力机制更灵活。(c) 自注意力机制学习的是专注于单个特征的长期上下文依赖关系,而 DFSMN 记忆模块则从整个数据集的统计平均分布中学习局部项依赖关系,这意味着它们在实践中可能更具鲁棒性。

Predictor

Predictor由两个卷积层组成,输出的float weight α 在0~1之间。作者通过累计此权重预测输出标签的长度。MAEloss定义为:

其实就是将所有α 进行了累加,加起来的长度就是预测的长度。LOSS就是真实长度和预测长度差的绝对值。作者引入了CIF机制产生声学向量。CIF是一个软的(非0/1,可以是小数)和单一对齐的,在AED模型中作为流式解决方案的实现。声学向量的生成时,CIF对权重α 进行累计,如果超过了设定的阈值β ,说明某一个声学向量的边界确定了。对边界之内的向量H根据权重α 进行缩放累计即可得到某一个声学向量。此过程重复直到结尾,可得到所有的声学向量。如下图所示:

在训练时权重α会根据N进行缩放(比如累计的α为N’,使用N/N’对所有的α 进行缩放,使用缩放后的α计算声学向量Ea。缩放是为了让的Ea维度和Ec的维度保持一致),但是在推理时无法进行缩放,导致训练和推理之间存在不一致。为了弥补这个不一致,作者提出了使用动态阈值β而不是固定阈值。计算公式如下:

下面是一个向上取整,所以分子小于等于分母,阈值β < = 1 。

Sampler 【参考字节Glancing Transformer

非自回归模型的另一个核心问题是如何增强模型对上下文建模能力,现有的通用的单轮自回归模型 (vanilla-NAR) 为了高效计算效率,模型中 decoder 去除了显式的 Dependency 建模,从而在处理同音替换错误的能力会弱很多GLM目的就是更好的学习输出序列的上下文语义关系,利用上下文进行当前的文本预测 学习输出标签之间的依赖关系

在普通的单步非自回归模型中,优化的目标为:

然而,正如上面所说的,单步非自回归模型中的输出标签独立性假设导致模型识别效果不如自回归模型。GLM模块的loss定义如下:

其中GLM(Y,Y′)表示Sampler模块在Ea​和Ec​中选中Ec​替换Ea​对应的Y′′中token的集合;GLMˉ(Y,Y′)表示Sampler模块在Ea​和Ec​中未选中Ec​替换Ea​对应的Y′′的token的集合;GLM(Y,Y′)的定义如下:

上面公式的含义是从Ec​中采样⌈αd(Y,Y′)⌉个向量替换对应位置的Ea​,生成新的向量为Es​。其中α是控制采样率的采样因子,越大表示使用Ec​替换Ea​的概率越大。该采样概率应该在最初模型效果不好时设置的稍微大一些,然后随着整个的训练过程的进行逐渐减小。为了达到这个目的,作者简单实用汉明距离,其定义为:

也就是,最开始的时候模型学习不好,d会比较大,当模型学习越来越好时,d也逐渐减小。表示最开始训练时,使用较多的Ec​替换Ea​,也就是上下文信息更多和准确,减小模型的学习难度;当模型学习的越来越好时,使用较少的标签信息迫使模型进一步学习。

总结,sampler模块结合了标注标签向量Ec​,实现方法是随机替换Ea​中⌈αd(Y,Y′)⌉个向量生成新的含有语义的向量Es​。训练并行decoder使用语义上下文GLM(Y,Y′)预测目标标签GLMˉ(Y,Y′),使模型学习输出标签之间的依赖关系

补充Glancing Transformer 原理:

自回归模型中最为常用的训练方式是最大似然估计(MLE),不少非自回归模型也直接使用 MLE 进行训练。但是非自回归模型的输出方式是并行的,输出语句中的任何部分在输出之前都无法获得输出语句中其余词的确切值。所以直接使用 MLE 训练并行输出的非自回归模型无法有效地建模输出语句中词之间的依赖关系。值得注意的是,词之间依赖关系的建模对输出通顺的语句至关重要,拥有良好生成质量的自回归模型和多轮迭代解码的模型均对这种依赖关系进行了有效的建模。

直接训练完全并行生成来学习目标语句中词之间的依赖关系对模型并不友好。一种更为简单有效的依赖关系学习方式是根据部分输入词预测其余目标词。但是这种学习方式需要部分目标词作为输入,不符合非自回归模型并行生成的要求。作者观察到随着模型自身更好地学习到词之间的依赖关系,模型对于依赖关系的学习可以逐渐摆脱使用目标语句部分词作为输入的需求。基于以上观察,Glancing Transformer(GLAT)利用了一种 glancing language model 的方法,通过渐进学习的方式进行词之间依赖关系的建模。在渐进学习的过程中,模型会先学习并行输出一些较为简单的语句片段,然后逐渐学习整句话的单步并行生成。

具体地,在第一次解码的时候,和常规的非自回归模型一样,模型使用完全并行解码的方式输出语句。然后将第一次解码得到的输出和训练数据中的目标语句进行对比。如果输出和目标语句差距较大,说明模型在训练中难以拟合该训练样本,因此这时 GLAT 会选择提供更多目标词作为输入来帮助学习词之间依赖关系。反之,如果输出和目标语句比较接近,则模型自身已经较好地学习了如何并行生成该目标语句,所需要的目标词数量也相应减少。

在第二步解码之前,模型的解码器可以得到部分目标词作为输入,这些词的数量由第一步的解码结果所决定。这时,模型在并行输出之前可以获得部分目标词的确切值,所以在学习输出剩余目标词的过程中就可以对目标语句中词之间的依赖关系进行建模。

随着训练的进行,模型对数据拟合程度更高,因此能够更准确地生成目标语句。与此同时,需要作为解码器输入的目标语句中的词的数量会越来越少,在训练后期逐渐接近学习完全并行生成的训练场景(例如上图右边的例子)。具体的方法细节和实现方式可以参考论文。

Loss Function:

一共定义了三个loss:CE、MAE、MWER。训练时进行联合训练:

对于MWER,具体的计算公式如下:

非自回归模型使用贪婪搜索,所以只有一个输出路径。正如前面提到的,在使用MWER训练时作者使用负例采样策略通过随机遮蔽top1分值标签产生多个候选路径。

MWER代码实现:https://gist.github.com/TeaPoly/234429e6c2d74d10fcb4987bc541d528

在训练阶段,为克服贪婪推理带来的路径多样性不足,Paraformer 采用 Minimum Word Error Rate(MWER)训练,其中:

  1. MWER 损失目标是最小化期望词错误率,需要多条候选路径参与比较;
  2. 但 NAR 模型贪婪解码只产生单条路径,这时就需要人为生成多条候选路径

于是引入 负例采样策略”(Negative Sampling)

  • 给定模型输出的 logit 序列,先得到首候选分布;
  • 然后随机遮蔽(mask)每个位置上概率最高的 token(top1);
  • 遮蔽后重新预测该位置(随机或第二选 token),这样对每个采样得到一条新的路径;
  • 重复 N 次,便可以生成多条“看似真实但含小变动”的候选路径。

实验

实验设置

在AISHELL-1、AISHELL-2以及工业级2wh数据集上验证上述方法的效果。其中工业级的测试集有两个:普通30h、远场15h。具体的工业级语料介绍可以参考文献21和28。RTF的测试在NVIDIA tesla V100上完成。

结果如上表格。在上述两个测试集上的测试都是在ESPNET框架上实现的,不包含LM和预训练模型。
AISHELL-1 的AR baseline参考文献15,效果在所有AR模型中是最好的(排除使用更多数据知识的模型)。因为作者当前的目标是通过模型结构提升模型效果而不是通过数据。普通的NAR和Paraformer的结构相同,但是没有Sampler。

结论:
1. 普通NAR的表现超过了其它的NAR工作,比如文献15和文献12
2. 普通NAR模型的表现比AR模型稍微差一些,因为缺乏了输出标签之间的上下文信息。
3. Paraformer通过使用基于GLM的Sampler模块对普通NAR模型增强,得到了和AR模型相近的识别表现。
4. Paraformer模型在dev和test测试上的CER分别为:4.6%和5.2%,推理速度比AR基线模型快12倍

工业级2wh数据集

结果如上表格所示,进行了多个扩展实验。动态β表示2.2节中的动态阈值,CTC表示带有LM的DFSMN-CTC-sMBR系统,参考文献32。RTF在OpenNMT上进行评估。
实验有两个模型,一个41M的一个63M的。AR基线模型中attention的维度为256,和文献21一致。这里的结论和前面有所不同。

结论

  1. 可以看到在大型数据集上,普通NAR模型和AR模型的识别效果差距很大(AISHELL上差别较小)。
  2. 普通NAR模型虽然和CTC都有输出标签独立假设限制,但是普通NAR模型效果优于CTC效果。
  3. 普通NAR模型结合GLM时,效果提升。
  4. 当进一步结合MWER训练方法时,效果进一步提升。
  5. Paraformer模型效果和AR模型效果很接近,差别在相对2%以内,但是推理速度提升10倍+。
  6. Paraformer结合动态β \betaβ,效果进一步提升。因为相比固定阈值,动态阈值减少了推理和训练的不一致,更准确地提取了声学向量信息。
  7. 将模型变大时,得到了和前面相似的结论。Paraformer相比普通NAR模型效果提升;和AR模型效果相当,但是推理速度提升10倍+。
  8. Paraformer-63M和AR transformer-41M模型相比较,尽管Paraformer模型较大,但是Paraformer推理速度更快。也就是说,在远场测试集上Paraformer-63M模型相比AR transformer-41M模型,识别效果相对提升6.0%,并且推理速度提升7.4倍。 也就是,在实际生产中,可以通过使用较大的Paraformer模型达到比AR模型更好的识别效果以及更快的推理速度。

对采样因子α的超参数测试结果参见上表格。和预期相同α变大时,模型效果变好,因为在训练时提供了更多的上下文信息;然而如果该参数太大会导致训练和测试不一致。基本上,α 在0.5~1.0之间的表现比较稳定。

  1. 在小型训练集上普通NAR和AR模型的识别性能差别不大,但是在工业级大数据集上差距明显。这是第一个在大规模工业级数据上验证NAR模型效果的研究。
  2. Paraformer相比普通NAR模型识别效果相对提升11%,和精细训练的AR模型效果相当。

分析:见文章第一张图。普通NAR模型相比AR模型,插入错误多一点,但是删除错误少一点。说明普通NAR模型的predictor预测输出的标签个数较准确。然而替换错误比较多,侧面反应两者性能差距很大。作者认为这是由普通NAR模型的条件独立假设造成的。Paraformer模型相比普通NAR模型替换错误下降很多,也暗示了识别效果提升很多。作者认为这是由于GLM模块使NAR模型学习到了标签之间的依赖关系。Paraformer模型相比AR模型替换错误稍微多一些,也暗示着识别准确率稍微差一些。作者认为AR模型中基于LM的beam search解码扮演了很重要的角色,相比GLM效果更好。为了减少这个性能差距,作者将在未来工作中在Paraformer模型上结合外部语言模型。

个人思考/疑问

  1. MWER loss没看懂,需要看文献20.
  2. Char 的 Embedding使用的torch.nn.Embedding,直接学习嘛?还是预设值好的。
  3. 端到端语音识别中的Embedding,例如wenet框架的token 的 Embedding能不能使用NLP领域用文字训练得到的Embedding,如果能的话为啥主流的不是这种的,这个Embedding不比直接学习更好嘛?
  4. wenet的重打分架构,decoder能不能直接根据CTC N-best结果得到矫正的识别结果,相当于做矫正/纠错?
  5. Paraformer能不能直接结合在当前的wenet框架中,使用conformer那套encoder,而不是SAN-M。从文章结论看,可以使用更大的模型训练Paraformer,效果比之前的模型效果好,且推理速度快,是一个可以实践的方向。
  6. Paraformer结构能不能和wenet重打分那套结合?Pafaformer的输出替代CTC的那一支,然后再加上decoder部分的重打分。这样相当于有了两个decoder。按道理就是训练会慢,但是推理应该还好吧?可能可行。——》Paraformer输出只有一个结果,重打分啥啊。。这个做不了。但是decoder可以作为纠错模型对结果进行纠错。
  7. 作者提出的在外面再结合一个语言模型应该是可行的。

[18] L. Dong and B. Xu, “CIF: Continuous integrate-and-fire for end-to-end speech recognition,” in ICASSP 2020-2020 IEEE Interna-tional Conference on Acoustics, Speech and Signal Processing(ICASSP). IEEE, 2020, pp. 6079–6083.
[19] L. Qian, H. Zhou, Y. Bao, M. Wang, L. Qiu, W. Zhang, Y. Yu,and L. Li, “Glancing transformer for non-autoregressive neural machine translation,” arXiv preprint arXiv:2008.07905, 2020.
[20] R. Prabhavalkar, T. N. Sainath, Y. Wu, P. Nguyen, Z. Chen, C.-C. Chiu, and A. Kannan, “Minimum word error rate training for attention-based sequence-to-sequence models,” in 2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018, pp. 4839–4843

大模型基本概念

什么是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 界面

Deepseed 深度学习优化库综述

https://github.com/microsoft/DeepSpeed

教程文档:https://www.deepspeed.ai/

DeepSpeed是一个由微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。它通过多种技术手段来加速训练,包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。DeepSpeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。此外,deepspeed基于pytorch构建,只需要简单修改即可迁移。DeepSpeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等等。

DeepSpeed有四大创新支柱:

DeepSpeed提供了一系列系统创新,使大规模DL培训变得有效和高效,大大提高了易用性,并在可能的规模方面重新定义了DL培训景观。这些创新,如ZeRO,3D-Mecelism,DeepSpeed-MoE,ZeRO-Infinity等都属于DeepSpeed-Training支柱。了解更多:DeepSpeed-Training

DeepSpeed汇集了张量、流水线、专家和ZeRO-parallelism等并行技术的创新,并将其与高性能自定义推理内核、通信优化和异构内存技术相结合,以前所未有的规模实现推理,同时实现无与伦比的延迟、吞吐量和成本降低。这种推理系统技术的系统组成DeepSpeed-Inference。了解更多:DeepSpeed-Inference

为了进一步提高推理效率,DeepSpeed为研究人员和从业者提供了易于使用和灵活组合的压缩技术,以压缩他们的模型,同时提供更快的速度,更小的模型大小,并显着降低压缩成本。此外,SoTA在压缩方面的创新,如ZeroQuant和XTC,都包含在DeepSpeed-Compression支柱下。了解更多:DeepSpeed-Compression

DeepSpeed库将DeepSpeed训练、推理和压缩支柱中的创新和技术实现并打包到一个易于使用的开源存储库中。它允许在单个训练,推理或压缩管道中轻松组合多种功能。DeepSpeed库被DL社区广泛采用,并已用于启用一些最强大的模型(请参阅DeepSpeed采用)。

Model Implementations for Inference(MII)是一个开源的存储库,通过减轻应用复杂系统优化技术的需求,使所有数据科学家都可以访问低延迟和高吞吐量的推理。开箱即用,MII为数千种广泛使用的DL模型提供支持,使用DeepSpeed-Inference进行优化,可以使用几行代码进行部署,同时与其香草开源版本相比,实现了显着的延迟减少。

DeepSpeed已与几种不同的流行开源DL框架集成,例如:

https://huggingface.co/docs/transformers/deepspeed

https://www.zhihu.com/people/deepspeed

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 声码器,以支持流式生成。

关于最优传输条件流匹配模型的补充:

最优传输条件流匹配(Optimal Transport Conditional Flow Matching,OT-CFM)是一种用于生成模型的流匹配方法,它旨在学习将输入分布和目标分布之间的条件映射。与传统扩散模型(DPM)不同,OT-CFM的优化目标是基于最优传输理论(Optimal Transport,OT)进行的。通过构建和学习流场,OT-CFM能够高效地生成目标数据。

问题背景:给定输入分布 X0​ 和目标分布 X1,最优传输的目标是找到一个时间相关的流动函数 ϕt 【t介于0-1之间】​ 使得它能够逐渐将输入分布 X0​ 演变为目标分布 X1​。这个流动由常微分方程(ODE)定义:

其中 vt是一个时间相关的速度场(或流场)。ϕt(X)表示输入数据 X 在时间 t 的状态。

优化目标:OT-CFM 的核心是通过学习流场 vt​ 使得生成过程遵循最优传输路径。为此,定义最优传输条件流匹配的目标函数:

最优传输路径下的流场与中间状态:

流场的估计与学习:为了学习最优传输的流场 vt​,引入一个神经网络 vtθ​ 对 vt​ 进行参数化。具体步骤如下:

时间调度策略:为了使生成过程更稳定,文章引入了一个时间调度 t 的变换函数:

这个变换函数可以更均匀地分配时间步,提高生成效果。

可以实现的任务:

(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 模型能够在这些任务上取得较好的效果,但受限于训练数据与训练方式,其事件分类效果专业的事件检测模型相比仍然有一定的差距。

训练数据:

SenseVoice的训练集

下图展示了用于训练 SenseVoice 模型的数据集概览。

SenseVoice-Small 模型在一个包含约 30 万小时音频数据的庞大语料库上进行了训练,覆盖了包括中文、粤语、英语、日语和韩语在内的 5 种语言。为了进一步增强 SenseVoice-Large 的多语言能力,训练语料库中额外加入了 10 万小时多语言数据。为了从语音数据中获取丰富的转录标签,我们利用了开源的音频事件检测(AED)模型和语音情感识别(SER)模型,生成伪标签,从而构建了一个内容丰富的大规模转录数据集。具体而言,AED 数据集包含了 1.5 亿条音频,而 SER 数据集则包含了 3000 万条音频。

【 SER 模型 :https://modelscope.cn/models/iic/emotion2vec_plus_large

【 AED模型 :https://github.com/qiuqiangkong/audioset_tagging_cnn/tree/master

CosyVoice 的训练集

为了训练 CosyVoice 模型,我们积累了一个包含多种语言的大量数据集。在整个收集过程中,我们利用专门的内部工具进行语音检测、信噪比 (SNR) 估计、说话人分类和分离。随后,使用 SenseVoice-Large 和 Paraformer 生成伪文本标签。这些标签在力对齐 (FA) 模型的帮助下经过优化过程,这有助于消除低质量的数据并提高标点符号的准确性。表 4 列出了各种语言的训练数据持续时间的全面细分。

对于 CosyVoice-instruct 模型,我们使用指令训练数据对 CosyVoice-base 进行了微调,而无需在自回归语言模型中加入说话人嵌入。表 5 显示了不同类型指令的训练数据的持续时间。

限制:

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"

大模型系列教程

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面试题

正在收集中…

⬆ 一键返回目录

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

基础环境安装:

常用工具:

多模态视觉-语言大模型的架构演进

https://zhuanlan.zhihu.com/p/693885420

A Survey on Multimodal Large Language Models

https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models

多模态视觉-语言大模型的架构演进

本文回顾了多模态LLM (视觉-语言模型) 近一年来的模型架构演进,对其中有代表性的工作进行了精炼总结.这篇综述一张图总结了多模态LLM的典型架构:

BLIP

【2022.01发布】https://arxiv.org/abs/2201.12086

统一视觉-语言理解和生成,使用captioner+filter高效利用互联网有噪数据

Refer to caption
我们使用Captioner(Cap)为Web图像生成合成标题,并使用Filter(Filt)删除嘈杂的标题。

模型架构:

  • Image/text encoder: ITC loss对齐视觉和语言表征,基于ALBEF提出的momentum distillation
  • Image-grounded text encoder: ITM loss建模视觉-语言交互,区分positive/negative图文对,使用hard negative mining挖掘更高相似度的负例优化模型
  • Image-grounded text decoder: LM loss实现基于图像的文本解码,将双向self-attention替换为causal self-attention
Refer to caption

BLIP-2

【2023.01发布】https://arxiv.org/abs/2301.12597

使用相对轻量的Q-Former连接视觉-语言模态,通过两阶段训练:第1阶段基于冻住的视觉编码器,第2阶段基于冻住的LLM

Refer to caption
BLIP-2的框架概述。我们按照两阶段策略预训练轻量级Querying Transformer,以弥补模态差距。第一阶段从冻结图像编码器引导视觉语言表示学习。第二阶段从冻结的LLM引导视觉到语言的生成学习,这使得零拍摄指令的图像到文本生成成为可能

第1阶段:同样优化ITC/ITM/LM loss,使用不同的self-attention mask,query和text端共享self-attention参数,使得可学习的query embedding提取与text语义最相关的视觉表征;使用BERT-base初始化,32个768维的query作为信息瓶颈

  • ITC:计算每个query与text的相似度,取最大的;使用batch内negatives,不再使用momentum queue
  • ITM:对每个query与text的分类logits取平均,使用hard negatives mining挖掘难负例
  • LM:text token和frozen image encoder不能直接交互,要求query能提取有益的视觉特征
Refer to caption

第2阶段:可基于decoder-only/encoder-decoder LLM进行适配,FC层对齐维度

Refer to caption

LLaVA

【2023.04发布】https://arxiv.org/abs/2304.08485

  • 使用仅文本模态的GPT-4生成视觉-语言指令遵循数据,用于微调多模态LLM
    • 使用图片的dense captions和bounding boxes作为prompt,可以生成对话、细节描述、复杂推理等指令
  • CLIP ViT-L/14 + Vicuna,使用简单的线性层进行映射
    • 更复杂的:Flamingo中gated cross-attention,BLIP-2中的Q-former

Qwen-VL

【2023.08发布】https://arxiv.org/abs/2308.12966

支持中英双语、多图像输入

Qwen-7B + OpenCLIP ViT-bigG,输入图像直接resize到视觉编码器输入

位置感知的VL adapter:使用基于Q-former的单层的cross-attention,将图像特征维度压缩到256,在query-key pairs中引入2D绝对位置编码增强位置信息

图像输入:<img>256-dim图像特征</img>

bounding box输入输出:<box>(X_topleft, Y_topleft), (X_bottomright, Y_bottomright)</box>, <ref>…</ref>标记box所指内容

三阶段训练:

stage1. 预训练:基于大规模、弱标注、网络爬取的图像-文本对,输入分辨率224×224,冻住LLM,训练ViT和Q-former,主要目的是模态对齐

stage2. 多任务预训练:基于7种下游视觉-语言理解任务的高质量、细粒度标注数据训练,输入分辨率448×448,图像/文本数据交错,训练整个模型

stage3. 指令微调:提升指令遵循和多轮对话能力,冻住ViT,训练LLM和Q-former

Qwen-VL-Plus和Qwen-VL-Max提升了视觉推理能力、图像细节的识别/提取/分析能力(尤其是文本导向的任务)、支持高分辨率和极端纵横比的输入图像;在部分中文场景超过了GPT-4V和Gemini

InternLM-XComposer

【2023.09发布】https://arxiv.org/abs/2309.15112

交错图文构成:自动在输出文本中插入合适的图片

EVA-CLIP ViT + InternLM-7B + Q-former (将图像特征压缩到64个embedding)

两阶段训练:

stage1. 预训练:冻住ViT,训练LLM和Q-former

stage2. 监督微调:包括多任务训练和指令微调,冻住ViT和LLM,训练Q-former,对LLM进行LoRA微调,增强指令遵循和图文混排能力

Fuyu-8B

【2023.10发布】https://huggingface.co/adept/fuyu-8b

模型架构和训练过程简单,易于scaling;支持任意图像分辨率;推理速度快

decoder-only的transformer,没有专门的图像编码器;image patch直接线性映射到transformer第一层

LLaVA-1.5

【2023.10发布】https://arxiv.org/abs/2310.03744

仍使用MLP作为模态连接,突出了训练的数据高效性

CogVLM

【2023.11发布】https://arxiv.org/abs/2311.03079

深度视觉-语言模态融合,而不影响LLM原有的语言能力:冻住LLM和ViT,在attention和FFN层训练一份视觉专家模块

CogAgent

【2023.12发布】https://arxiv.org/abs/2312.08914

针对GUI场景的多模态理解和导引,使用高分辨率-低分辨率双编码器,支持1120×1120的屏幕输入

高分辨率分支使用更轻量的ViT,基于cross-attention将高分辨率图像特征与LLM每层进行融合

VILA

【2023.12发布】https://arxiv.org/abs/2312.07533

探索了视觉-语言模型训练的设计选择:

  1. 预训练阶段冻住LLM虽然能取得较好的zero-shot性能,但上下文学习能力依赖对LLM的微调
  2. 图文交错的预训练数据是有益的,只用图文数据对效果不够好
  3. 将纯文本的指令微调数据加入SFT阶段有助于缓解纯文本任务的能力退化,同时也能够增强视觉-语言任务的准确性

LLaVA-Next

【2024.01发布】https://llava-vl.github.io/blog/2024-01-30-llava-next/

相对于LLaVA-1.5,保持了极简的设计和数据高效性:

  1. 提高了输入图像的分辨率 (4x),支持3种纵横比:672×672, 336×1344, 1344×336
  2. 更好的视觉推理和OCR能力:更好的指令微调数据配比
  3. 更好的多场景视觉对话:更好的世界知识和逻辑推理
  4. 更高效的部署和推理:SGLang

动态高分辨率:视觉编码器支持336×336的图像输入,对于672×672的图像,按照{2,2}的grid split成4个图像patch过encoder,downsample到336×336也过encoder,特征拼接作为visual tokens输入到LLM中

收集高质量用户数据,包括真实场景中反映用户更广泛意图的指令数据,利用GPT-4V进行数据构造

多模态文档/图表数据,增强文档OCR和图表理解能力

InternLM-XComposer2

【2024.01发布】https://arxiv.org/abs/2401.16420

提出了新的模态对齐方法partial LoRA:只在image token上添加LoRA参数,保证预训练语言知识的完整性,这样一个更轻量的视觉编码器同样有效

OpenAI CLIP ViT-L/14 + InternLM2-7B + partial LoRA (rank=256)

两阶段训练:

stage1. 预训练:冻住LLM,微调ViT和partial LoRA模块,包括通用语义对齐(理解图像基本内容)、世界知识对齐(进行复杂的知识推理)、视觉能力增强(OCR、物体定位、图表理解)

stage2. 监督微调:微调整个模型,包括多任务训练、自由形式图文排布

InternLM-XComposer2-4KHD

2024.04发布了4KHD版本:https://arxiv.org/abs/2404.06512

支持动态分辨率(336px → 4K (3840×1600)):改进了patch division范式,保持训练图像原有的纵横比,自动变化patch数目,基于336×336的ViT配置layout

动态图像划分:将输入图像resize and pad到336的整数倍宽高

结合图像的global和local视角:global视角由输入直接resize到336×336,使用sep token分隔两种视角的token

图像2D结构的换行符:可学习的\n token分隔图像token行

Mini-Gemini

【2024.03发布】https://arxiv.org/abs/2403.18814

使用双视觉编码器提取低分辨率embedding作为query,高分辨率特征区域作为key/value,两者之间做cross-attention,输出挖掘的tokens作为prompt前缀,输入到LLM做推理,外接图像解码器生成图像(SDXL)

LLaVA-NeXT系列

LLaVA-1.5

23年10月,LLaVA-1.5发布,通过在视觉和语言模态间添加简单的MLP层实现了训练样本高效性,为多模态大模型在低数据业务场景的落地提供了可能。

[2310.03744] Improved Baselines with Visual Instruction Tuning

LLaVA-NeXT

24年1月,LLaVA-NeXT(1.6)发布,在1.5的基础上保持了精简的设计和数据高效性,支持更高的分辨率、更强的视觉推理和OCR能力、更广泛场景的视觉对话。模型分为两阶段训练:阶段1预训练只训练连接层,阶段2指令微调训练整个模型。

LLaVA-NeXT: Improved reasoning, OCR, and world knowledge

  • 动态高分辨率AnyRes:如上图,为了让模型能感知高分辨率图像的复杂细节,对图像进行网格划分。比如,对于672×672的图像,一方面按2×2的网格切分为4张336px的输入图像送给ViT编码成特征,另一方面将图像直接resize到336px进行编码,最后将两部分特征合并输入到LLM中,这样模型具备了全局和局部的视觉推理能力。
  • 指令数据混合:一方面保证指令数据具有高质量、多样性,反映真实场景的广泛用户意图;另一方面,补充文档和表格数据,提升模型的OCR和图表理解能力。
  • 扩大LLM尺寸:考虑了7B、13B、34B的LLM。

24年5月,团队发布基于更强LLM的LLaVA-NeXT版本,支持LLaMA3(8B)和Qwen1.5(72B/110B)。更大的LLM提供更好的视觉世界知识和逻辑推理能力,最大的模型接近GPT-4V的性能,同时保证了训练高效性。

LLaVA-NeXT: Stronger LLMs Supercharge Multimodal Capabilities in the Wild

LLaVA-NeXT-Video

24年4月,LLaVA-NeXT-Video发布,展现出强大的zero-shot视频理解能力。LLaVA-NeXT中的高分辨率图像动态划分可以很自然地迁移到视频模态用来表示视频的多帧,使得只在图文模态上训练的LLaVA-NeXT能在视频任务上泛化。此外,推理时的长度泛化用于有效处理超出LLM最大长度的长视频输入。基于LLaVA-NeXT-Image模型,作者发布了在视频数据上监督微调的LLaVA-NeXT-Video,以及在AI反馈的监督下使用DPO偏好对齐的LLaVA-NeXT-Video-DPO。使用SGLang部署和推理,支持可扩展的大规模视频推理。可以想到,这有助于海量视频的高效文本标注,催生了未来更强大视频生成模型。

LLaVA-NeXT: A Strong Zero-shot Video Understanding Model

  • AnyRes:可以将N帧视频看作{1xN}的网格,而LLM的最大长度限制了可以处理的帧数,很自然地会考虑对图像进行下采样减少每帧token数,但作者发现为保证效果仍只能处理16帧。
  • 长度泛化:基于LLM的长度外推技术(RoPE的线性扩展),推理时扩展2倍,从之前的16帧扩展到56帧,大大提升了模型分析长视频序列的能力。
  • 基于LLM反馈的DPO偏好优化:偏好数据由LLM生成,视频表示为详细的说明文字,带来了很大的性能增益。
  • 对于视频数据的微调,作者进行了ablation study:(1) 在LLaVA-NeXT图像级指令微调后,继续在视频级指令上增量微调;(2) 在LLaVA-NeXT图像级预训练后,在图像级和视频级数据联合微调,每个batch数据包含一种类型或者混合两种类型,实验表明混合图像和视频模态数据效果最佳。

指令微调Ablation Study


团队还分享了视觉指令微调过程中除数据之外的因素的ablation study,从模型架构、视觉表征、训练策略角度进行分析。

LLaVA-NeXT: What Else Influences Visual Instruction Tuning Beyond Data?

  • 模型架构:扩展LLM比扩展视觉编码器更有效,视觉输入配置(分辨率、token数)比视觉编码器大小更关键。
    • 学习率:为了训练更稳定,视觉编码器的学习率通常应该比LLM学习率小10倍~5倍,更大的LLM需要更小的学习率,尽量避免loss跑飞。
    • 视觉编码器:相较于模型大小,基于分辨率、token数的视觉特征支持编码更多的视觉细节,预训练数据支持编码更多的视觉知识,作用更重要。
  • 视觉表征:分辨率、特征空间视觉token数都重要,相对来说扩展分辨率更有效,建议使用AnyRes时下采样。
    • 对于更高分辨率图像或者更长的视频,AnyRes需要更多的格子。比如,对于超过768×768的图像,以前的方案首先resize到768×768会导致细节丢失。这里考虑划分成更多的格子,然后对编码的特征进行双线性插值(下采样)到更小的特征,以防止视觉token数过多。
  • 训练策略:在互联网级低质数据上大规模预训练后,指令微调前,增加一个阶段,使用一些高质量合成数据增强知识。

LLaVA-NeXT-Interleave

24年6月,LLaVA-NeXT-Interleave发布,提出图文交错格式可以作为通用模版统一不同的视觉模态,比如单图像(multi-patch)、多图像(multi-image)、视频(multi-frame)、3D(multi-view)。在保证LLaVA-NeXT单图像输入的性能下,可以提高其它模态任务的性能,而且在不同模态任务上具有初步的迁移能力。这种大一统的模型支持更广泛真实场景的应用,比如多页PPT的总结和问答、生成图像编辑的提示词、多文档的汇总和比较。

LLaVA-NeXT: Tackling Multi-image, Video, and 3D in Large Multimodal Models

作者在训练策略上进行了ablation study:

  • 从LLaVA-NeXT单图像模型继续训练,从stage2单图像指令微调后的模型开始训练效果更好,可以继承单图像任务的指令遵循能力。
  • 两种组织格式:将所有图像token放在最前面,在文本中使用特殊token指代图像 (in-the-front),将图像token放在其原来的位置,与文本交错 (interleaved)。实验表明,在训练阶段混合两种格式有助于在推理阶段这两种格式都取得更好的性能。

InternVL系列

InternVL-1.0

23年12月,上海AI Lab @OpenGVLab发布InternVL。该工作在模态对齐中视觉编码器和LLM之间在参数规模和特征表征能力上存在较大的差距,自然地提出扩大视觉端的参数量到6B (InternViT-6B),然后使用不同质量的图文数据逐渐与LLM对齐。此外,连接层的参数量也扩大了,类似Q-Former,这里设计了一个8B的语言中间件QLLaMA,使用Chinese-LLaMA的参数初始化增强其跨语言理解能力,新增96个可学习query token和cross-attention层 (1B),实现视觉和语言模态进一步对齐。

[2312.14238] InternVL: Scaling up Vision Foundation Models and Aligning for Generic Visual-Linguistic Tasks

下图是InternVL的三阶段渐进式训练策略,训练数据质量逐渐提高,最开始使用大规模有噪的图文对进行对比预训练 (类似CLIP),接着加入冻结参数的QLLaMA连接件,只学习cross-attention,使用图文匹配/对比/生成loss (类似BLIP),最后引入LLM进行监督微调,赋予多模态对话和问答能力。

InternVL训练的多阶段性赋予其内在的多功能性,通过灵活组合不同模块,可以支持各种视觉-语言任务,如下图。

这里值得讨论的一个点在于,InternVL为了让视觉端和语言端参数量平衡,对视觉端和连接层都进行了scale up。一个很自然的问题是,视觉端真的需要这么heavy的参数量吗?因为当前最新的LLaVA-NeXT仍然使用约300M的ViT和轻量的MLP连接层,仅通过扩展LLM提升多模态任务性能。我的个人拙见是,视觉理解包括感知和推理,感知部分可能并不需要那么大的参数量,而推理部分作用于high-level的视觉特征,通过微调LLM赋予其理解推理视觉模态的能力,所以为了性能、效率和稳定性的平衡,似乎这里scale up必要性不是很强,当然这里值得深入实验的验证和讨论。看到这篇论文中的图,让我想到了22年Google的Coca论文,作者把文本解码器按层对半划开,浅层一半用于文本单模态,深层一半用于图文多模态,可以看到下图视觉端参数量占比也相当高。

[2205.01917] CoCa: Contrastive Captioners are Image-Text Foundation Models

InternVL-1.5

24年4月,InternVL-1.5发布,综合性能更强,且支持推理时高达4K的分辨率。

[2404.16821] How Far Are We to GPT-4V? Closing the Gap to Commercial Multimodal Models with Open-Source Suites

上图为模型整体架构,采用了类LLaVA的ViT+MLP+LLM范式,结合了增强的InternViT-6B-448px-V1.5和中英双语InternLM2-Chat-20B,总体参数约26B。相比于InternVL-1.0,在输入端支持了动态高分辨率,连接层改为轻量的MLP,使用pixel shuffle操作将输出的视觉token数减为1/4。训练分为两阶段,预训练阶段训练InternViT和MLP映射,随后微调整个模型。

  • 这里不再使用Q-Former作为连接层的原因,可以参考作者 @Weiyun 大佬的回答:多模态大语言模型(MLLM)为什么最近的工作中用BLIP2中Q-Former结构的变少了? – Weiyun的回答 – 知乎,大致意思是说相比于MLP,Q-Former参数量大收敛更慢,数据量小的场景无法达到LLaVA-1.5这样的性能,而且提高数据量和计算量,Q-Former也没有明显的性能优势。
  • 这里的pixel shuffle操作来源于16年的一篇论文,本质是对特征元素进行重排列,将 (𝐶×𝑟2,𝐻,𝑊) 的特征变换为 (𝐶,𝐻×𝑟,𝑊×𝑟) ,对特征进行了空间维度的上采样,但通道维度缩小为原来的 1/𝑟2 。这里输出的视觉token数可以理解为通道数,主要目的是通过提升特征维度换取更少的token数,从而可以支持更高的图像分辨率。这样,448×448的输入图像,patch size=14,总共有32×32=1024个token,设置上采样系数r=2,则该图像可以表示为256个token。

接着我们来看InternVL-1.5的三个重要改进:

  • InternViT增强:V1.2版本去掉了模型的最后3层,将分辨率扩展为固定448×448,而V1.5进一步扩展为动态448×448,即每张训练图像可分块,每块大小为448×448,支持1~12个块。此外,还增强了数据规模、质量和多样性,提高了OCR和高分辨率处理能力。
  • 动态高分辨率:基于图像的分辨率和纵横比,将图像切分为448×448的分块,训练阶段最多12块,测试阶段可以外推到40块,即4K分辨率,这样模型训练和推理能适应多种分辨率和纵横比,避免了强行resize带来的失真和细节丢失。如下图,具体来说,对于一张800×1300的图像,从预定义的纵横比中匹配一个最接近的纵横比2:3,然后将图像resize到896×1344,并切分为多个448×448的图像块,再添加一个缩略视图 (直接resize到448×448) 用于图像全局理解。
  • 高质量中英双语数据集:包含自然场景、图表、文档、对话等多样化的数据,借助LLM实现数据集英文到中文的转换。

此外,翻译的prompt值得我们学习:

System:
You are a translator proficient in English and {language}. Your task is to translate the following English text into {language}, focusing on a natural and fluent result that avoids “translationese.” Please consider these points:
1. Keep proper nouns, brands, and geographical names in English.
2. Retain technical terms or jargon in English, but feel free to explain in {language} if necessary.
3. Use {language} idiomatic expressions for English idioms or proverbs to ensure cultural relevance.
4. Ensure quotes or direct speech sound natural in {language}, maintaining the original’s tone.
5. For acronyms, provide the full form in {language} with the English acronym in parentheses.
User:
Text for translation: {text}
Assistant:
{translation results}

作者在ablation study部分研究了更大的LLM是否需要更大的视觉编码器,实际上是针对我们上面对InternVL-1.0视觉端参数量的问题的实验。实验对比了LLaVA-NeXT和InternVL-1.2,两者都使用34B的LLM,在尽量保证对比公平的条件下,实验证明更大的视觉模型能提供模型解决多模态任务的整体性能(不过原论文好像没有给具体数据?)。团队后续也发布了蒸馏版的视觉模型InternViT-300M-448px,与LLaVA-NeXT的视觉端保持了同等规模。

MiniCPM-V系列

MiniCPM-V是 @面壁智能 发布的一系列支持高效端侧部署的多模态LLM。

MiniCPM-V 2.0

24年4月,MiniCPM-V 2.0发布,仅有2.8B参数,整体性能超过了Yi-VL 34B、CogVLM-Chat 17B、Qwen-VL-Chat 10B等更大的开源模型,OCR能力突出,支持中英双语对话,部分指标接近Gemini Pro。
视觉编码器使用SigLIP SO400M/14-384px,LLM使用MiniCPM-2.4B,连接层使用Flamingo中的Perceiver Resampler (类似Q-Former使用可学习query提取显著视觉信息,但不以输入文本为条件)。基于自研的RLHF-V实现可信行为对齐,在缓解多模态幻觉问题上接近GPT-4V。基于自研的LLaVA-UHD支持高达1344×1344的分辨率和任意纵横比输入。基于自研的VisCPM实现跨语言的多模态能力泛化,进而有良好的中英双语能力。此外,该模型在端侧部署内存开销较小、速度较快,即便是处理高分辨率的图像。官方还提供了安卓端部署的mlc-MiniCPM示例。

MiniCPM-Llama3-V 2.5

24年5月,MiniCPM-Llama3-V 2.5发布,总共8B参数,整体性能超过了GPT-4V-1106、Gemini Pro、Qwen-VL-Max、Claude 3等闭源模型,OCR和指令遵循能力进一步增强 (增强了全文本OCR提取、表格到Markdown转换等功能),支持超过30种语言对话,在量化、编译优化、高效推理等加持下,同样可以在端侧高效部署。
在MiniCPM-V 2.0基础上,LLM替换为Llama3-8B-Instruct,基于更新的RLAIF-V进一步降低幻觉率。当前,官方支持了llama.cpp和ollama的高效CPU推理、GGUF 16-bit量化、LoRA微调等实用功能。

VILA1.5

24年5月,NVIDIA发布VILA1.5,提供视频理解能力,开源了3B/8B/13B/40B的模型,位于当前开源榜单MMMU和Video-MME前列。VILA详见我的上篇文章,这里简单回顾一下:VILA在大规模交错图文数据上预训练,从而具有多图理解能力,作者通过实验发现:(1) 图文交错排布比较关键;(2) 交错图文预训练过程中微调LLM能赋予其上下文学习的能力;(3) 混合只有文本的指令数据有助于提升性能;(4) 压缩视觉token可以扩展视频帧数。

CogVLM2

24年5月,智谱 @GLM大模型 发布CogVLM2,随后发布了GLM-4V。CogVLM2基于Llama3-8B-Instruct,支持8K上下文、1344×1344分辨率、中英双语对话。GLM-4V-9B替换为GLM-4-9B语言模型,采取同样的数据和训练策略,去除CogVLM原有的视觉专家,将模型大小减为13B。CogVLM和CogAgent详见我的上篇文章。

Cambrian-1

24年6月,LeCun&谢赛宁团队发布Cambrian-1,关注以视觉为中心的多模态LLM,开源了8B/13B/34B的模型。当前多模态LLM仍存在较大的视觉缺陷,需要增强视觉表征以更好地和语言模态交互,赋予模型在真实场景更强的感知定位能力。这项研究的一大意义在于影响多模态LLM的工作开始重视视觉表征质量的提升,而非一直scale up LLM。

[2406.16860] Cambrian-1: A Fully Open, Vision-Centric Exploration of Multimodal LLMs

如上图,该工作围绕多模态LLM的5个核心设计要素展开研究,分别是:视觉表征、连接器设计、指令微调数据、指令微调策略、评估基准。

  1. 视觉表征

作者评估了多种视觉编码器及其组合,下图表明以语言监督的CLIP模型优势较强,但自监督方法在提供充足数据和适当微调的情况下性能也能接近。而且,结合多种类型的视觉编码器有助于提升多模态LLM的性能,尤其是以视觉为中心的任务。注意到,高分辨率的编码器大大增强了图表和以视觉为中心任务的性能,而基于ConvNet的架构适合处理这类任务。

2. 连接器设计

提出Spatial Vision Aggregator (SVA),一个动态的、具备空间感知的连接器,以将 (来自多个视觉编码器的) 视觉特征与LLM深度融合。如下图,该方法设置一些可学习的latent query tokens,通过cross-attention与多个视觉特征交互 (视觉特征作为key/value)。SVA的设计有两点要素:(1) 通过显式定义每个query token对应的视觉特征图子区域,引入空间inductive bias,便于模型在处理视觉信息时保留对空间结构的理解,更准确地定位和整合局部特征;(2) 在LLM的多层聚合视觉特征,让模型在不同层级特征上反复利用视觉信息,增强模型对视觉内容的深入推理能力。该方法可以有效减少需要的视觉token数,例如相比于Mini-Gemini和LLaVA-NeXT,Cambrian-1的视觉token数是其20%。

3. 指令微调数据

作者发布了指令微调数据集Cambrian-10M,综合了OCR、通用VQA、纯语言等指令数据,还筛选了质量更高的7M版本。不同类型的视觉指令数据能赋予模型不同的能力,因此数据配比的平衡性也很关键,实验结果表明,平衡OCR、通用数据和语言数据的比例很重要。此外,在实验中作者发现,训练好的多模态LLM可能在基准测试上指标表现好,但实际对话能力弱,回复简短。因此,作者在训练期间引入了额外的系统提示,鼓励模型输出更长的回答和思维链推理,增强数学推理等任务的表现。

4. 指令微调策略

作者遵循LLaVA的两阶段训练策略,先使用适配数据只微调中间的MLP连接层,再打开LLM和连接器微调。结果表明,第一阶段对连接器的预训练可以提高性能,而使用更多的适配数据可以进一步增强。此外,作者对比了是否微调视觉编码器带来的性能影响,表明微调视觉编码器能增强性能,尤其对自监督预训练的视觉编码器 (如DINO v2、MoCo v3、MAE等),在以视觉为中心的测试上提升明显。

5. 以视觉为中心的基准CV-Bench

现有多数benchmark无法正确评估模型的视觉感知定位能力,而且相应的样本数量有限。CV-Bench重新利用现有视觉benchmark中的样本,包含2638个以视觉为中心的VQA问题,涉及2D的空间位置关系和物体计数、3D的深度次序和相对距离。


最后,让我们共同期待我国的AGI基础模型不断取得新的突破,引领世界潮流!

Sequence Modeling With CTC

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

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

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

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

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

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

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

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

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

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

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

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

算法详解

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

1.1 对齐

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

这个问题有两个缺点:

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

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

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

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

1.2 损失函数

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

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

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

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

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

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

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

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

图7

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

1.3 预测

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

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

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

1.3.1 Greedy Search

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

1.3.2 Beam Search

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

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

CTC的性质:

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

Practitioner’s Guide

到目前为止,我们已经对 CTC 有了概念性的理解。在这里,我们将为从业者提供一些实现技巧。

软件:即使对 CTC 有深入的了解,实施也很困难。该算法有几个边缘情况,应该用较低级别的编程语言编写快速实现。开源软件工具使入门变得更加容易:

  • 百度研究已经开源了warp-ctc。该软件包是用 C++ 和 CUDA 编写的。CTC 损失函数在 CPU 或 GPU 上运行。绑定可用于 Torch、TensorFlow 和 PyTorch。
  • TensorFlow 为 CPU 内置了 CTC loss and CTC beam search 束搜索函数。
  • Nvidia 还在cuDNN 版本 7 及更高版本中提供了 CTC 的 GPU 实现。

Numerical Stability:计算 CTC 损失在数值上是不稳定的。避免这种情况的一种方法是在每个时间步长归一化 α。在实践中,这对于中等长度的序列来说已经足够好了,但对于长序列来说,它仍然会下溢。更好的解决方案是使用 log-sum-exp 技巧计算对数空间中的损失函数。 在对数空间中计算两个概率之和时,使用恒等式.还应使用 log-sum-exp 技巧在 log-space 中进行推理。

Beam Search: 

使用波束搜索解码器时的一个常见问题是要使用的波束的大小。准确性和运行时间之间存在权衡。我们可以检查光束尺寸是否在良好的范围内。为此,首先计算推断输出 ci​. 的 CTC 分数,然后计算真值输出 cg​. 的 CTC 分数 如果两个输出不同,我们应该有cg​<ci​. Ifci​<<cg​ ,那么真值输出在模型下实际上具有更高的概率,并且光束搜索未能找到它。在这种情况下,可能需要大幅增加光束尺寸。