CosyVoice

创新点:

  • 将监督语音token集成到TTS 模型,增强了零样本语音克隆中的内容一致性和说话者相似性。
  • 一种可扩展的零样本 TTS 合成系统,它将用于文本到token生成的 LLM 与用于token到语音合成的条件流匹配模型(conditional flow matching model(CFM))相结合,不依赖于音素持续时间预测(Duration predictor),不需要使用补充音素器(phonemizers)和强制对齐器aligners (比如:Glow-TTS中 Monotonic Alignment Search(MAS))。
  • 为了进一步细化生成语音的质量,将 x-vector 合并到 LLM 中,将语音建模分为语义、说话者和韵律(semantic, speaker, and prosody)组件。 LLM 对语义(semantic)内容和韵律(prosody)进行建模,而条件流匹配模型(CFM)则捕获音色(timbre)和环境信息。我们使用Classifier-Free Guidance(2022. Classifier-free diffusion guidance)、余弦调度器(cosine scheduler)和屏蔽条件(masked conditions)等技术来优化流匹配过程。

CosyVoice由四个组件组成,即文本编码器(text encoder)、语音分词器(speech tokenizer)、大语言模型(large language model)和条件流匹配模型(conditional flow matching model)

  • 文本编码器(text encoder)用于对齐文本和语音token的语义空间;
  • 语音标记器(speech tokenizer)用于提取语义token;
  • LLM(GLM)学习文本编码和语音标记的整个序列,将 TTS 重新表述为以文本作为提示的自回归序列生成问题;
  • 利用条件流匹配模型(conditional flow matching model), 通过最优路径上的去噪处理,将语音标记转换为梅尔谱图(Mel spectrogram); 通过Classifier-Free Guidance(Classifier-free diffusion guidance CFG)提高扩散概率模型的生成质量, 将CFG适应到条件流匹配模型中;
  • 获得人类耳朵可感知的声音信号,声码器(vocoder)使用 Hifi-GAN Generator 用于将生成的梅尔频谱图作为输入来合成波形(waveform)。

其中:

附:

Supervised Semantic Tokens for Speech 语音的监督语义tokens

Supervised speech tokenizer: 使用一个监督自动语音识别(ASR)模型来派生监督语义语音tokenizer(Supervised speech tokenizer)。该模型是我们专有的SenseVoice ASR模型的一个微调版本。它在多语言音频数据上进行训练,具有丰富的音频内容理解能力。与原始ASR模型不同,我们将编码器分为两部分,并在它们之间插入一个向量量化层。给定一个梅尔频谱图 X 作为输入,它首先经过位置编码和 $Encoder_1$以获得上下文感知表示 H : $$ H = \text{Encoder}_1(\text{PosEnc}(X)) $$

然后,向量量化器(VQ)被用来获得离散标记。对于第 l 帧的隐藏表示 $h_l$ ,码本 C 中最近邻嵌入的索引被视为该时间步的语音token $\mu_l$ : $$ \mu_l = \text{VQ}(h_l, C) = \arg \min_{c_n \in C} | h_l - c_n |_2 $$

其中 $|\cdot |_2$ 表示L2范数(L2 norm,也称为欧几里得范数或欧几里得距离)。

在训练阶段,码本嵌入通过指数移动平均(EMA)进行更新: $$ c_{\mu_l} := \alpha c_{\mu_l} + (1 - \alpha) h_l $$

其中 $\alpha$ 是一个预定义的衰减系数。相应的语音token的码本嵌入被用作量化后的隐藏表示 $ \bar{H} = { c_{\mu_1}, c_{\mu_2}, \ldots, c_{\mu_L} }$ ,并传递给剩余的编码器层$Encoder_2$: $$ \tilde{H} = \text{Encoder}_2(\text{PosEnc}(\bar{H})) $$

在剩余的编码器层之前,我们添加了一个额外的位置编码,以增强时间信息。经过$Encoder_2$后,跟随一个基于Transformer的ASR解码器,预测文本标签(labels)的后验概率: $$ P(Y | X) = \text{ASRDecoder}(\tilde{H}, Y^{Z-1}) $$ 其中 $Y^{Z-1}$ 表示在教师强制训练方案中左移的文本标签。

Large Language Model for TTS 用于TTS的大型语言模型

将文本到语音(TTS)任务重新定义为一个自回归语音token生成问题,并使用大型语言模型(LLM)来解决。对于LLM,序列的构建至关重要,具体构建方式如下:

$$ S, v, {\bar{y}_u}|{u\in[1:U]}, T, {\mu_l}|{l\in[1:L]}, E $$

其中:

$$ \bar{Y} = \text{TextEncoder}(\text{BPE}(Y)) $$

由于文本和语音token位于不同的语义层次,文本编码器用于对齐它们的语义空间,从而有利于LLM的建模。在文本编码和语音token ${\mu_l}_{l \in [1:L]}$ 之间插入一个起始标识符 T ,语音token是使用语音的监督语义标记器(Supervised Semantic Speech Tokenizer)提取的。在训练阶段,采用教师强制方案,其中左移序列作为模型输入,原始序列作为期望输出。注意,在训练过程中,只有语音token和 E 的交叉熵损失被考虑:

$$ \text{LLM} = - \frac{1}{L + 1} \sum_{l=1}^{L+1} \log q(\mu_l) $$

其中 $\mu_{L+1}$ 是“序列结束”token E 。 $q(\mu_l)$ 表示由LLM的softmax层预测的 $\mu_l$ 的后验概率。

Optimal-transport Conditional Flow Matching 最优传输条件流匹配

使用最优传输条件流匹配模型(OT-CFM)来学习梅尔频谱图的分布,并以生成的语音标记为条件生成样本。与扩散概率模型(DPMs)相比,OT-CFM具有更简单的梯度、更容易的训练和更快的生成速度。 这在论文:2022.10 Flow matching for generative modeling | 2023.2 Improving and generalizing flow-based generative models with minibatch optimal transport | 2023.9 Matcha-TTS: A fast TTS architecture with conditional flow matching 中已经研究过。

在连续时间正规化流(CNFs)中,从先验分布 $p_0(X)$ 到梅尔频谱图数据分布 $q(X)$ 构建一个概率密度路径。这个概率密度路径由一个时间依赖的向量场 $\nu_t(X)$ 定义,通过以下常微分方程(ODE)生成流 $\phi_t$ :

$$ \frac{d}{dt} \phi_t(X) = \nu_t(\phi_t(X), t) \phi_0(X) \sim p_0(X) = N(X; 0, I) \phi_1(X) \sim p_1(X) $$

通过求解初值问题,可以用 $p_1(X)$ 近似语音分布 $q(X)$ 并从中采样。为了学习向量场 $\nu_t(X)$ ,我们定义最优传输(OT)流,并通过最小化以下损失函数使神经网络匹配它:

$$ L_{OT-CFM}\ = \mathbb{E}_{t, p_0(X_0),\ q(X_1)} \left[ \left| \omega_t(\phi_{OT}^t(X_0, X_1) | X_1) - \nu_t(\phi_{OT}^t(X_0, X_1) | \theta) \right| \right] $$

其中: $$ \phi_{OT}^t(X_0, X_1) = (1 - (1 - \sigma)t)X_0 + tX_1 \omega_t(\phi_{OT}^t(X_0, X_1) | X_1) = X_1 - (1 - \sigma)X_0 $$

说话人嵌入 v 、语音标记 ${\mu_l}_{1:L}$ 和掩码梅尔频谱图 $\tilde{X}_1$ 也被输入到神经网络中,以匹配带有可学习参数 $\theta$ 的向量场:

$$ \nu_t(\phi_{OT}^t(X_0, X_1) | \theta) = \text{NN}_\theta \left( \phi_{OT}^t(X_0, X_1), t; v, {\mu_l}_{1:L}, \tilde{X}_1 \right) $$

掩码梅尔频谱图 $\tilde{X}_1$ 是通过从随机起点到结束连续帧设为零得到的。考虑到生成过程在开始时比后续更难,我们引入了一个余弦调度器来调整时间步 t :

$$ t := 1 - \cos \left(\frac{t\pi}{2}\right) $$

在调度的流下,开始时有更多的生成步骤。

Classifier-Free Guidance(Classifier-free diffusion guidance CFG)已被证明可以提高扩散概率模型的生成质量。 在论文:2021. Improved denoising diffusion probabilistic models | 2022. Classifier-free diffusion guidance | 2023. Voicebox: Text-guided multilingual universal speech generation at scale 中已经研究过。 因此,提出将CFG适应到条件流匹配模型中。在训练阶段,以固定概率0.2随机丢弃条件 $\Psi = {v, {\mu_l}_{1:L}, \tilde{X}_1}$ 。以这种方式,可以学习条件和无条件流。在生成期间,向量场被修改如下:

$$ \tilde{\nu}_t(\phi_{OT}^t(X_0, X_1)|\theta; \Psi)=(1+\beta)\cdot \nu_t(\phi_{OT}^t(X_0, X_1)|\theta;\Psi) -\beta \cdot \nu_t(\phi_{OT}^t(X_0, X_1) | \theta) $$

其中 $\beta$ 是指导强度,取值为0.7。

Zero-shot In-context Learning 零样本上下文学习

这种零样本上下文学习能力使得CosyVoice能够在没有目标说话人的大量样本的情况下,生成高质量的语音,这对于个性化语音合成和多语言应用具有重要意义。通过这种方式,模型能够快速适应新的说话人和语言,提供更加自然和一致的语音输出。

CosyVoice模型展示了零样本上下文学习的能力,允许仅使用简短的参考语音样本复制任意声音。这一过程涉及精心构建输入序列以供token 语言模型(LM)使用。

构建输入序列如图所示:

  • 对于提示语音(prompt speech)和输入文本(input text)使用相同语言的情况,将它们合并为一个统一的输入,将提示语音token视为预先生成的。通过这种输入序列,自回归LM迭代预测后续token,直到遇到“序列结束”标记 E。
  • 当提示语音(prompt speech)和输入文本(input text)在语言上不同时,省略与提示相关的文本(prompt text)和tokens (prompt speech token),以防止原始语言的韵律特征(prosodic characteristics)影响目标语言。需要注意的是,提示文本(对应于提示语音的内容)可以通过人工标注或ASR模型(如SenseVoice)进行转录。与提示文本类似,prompt speech token是使用 supervised semantic speech ($S^3$) tokenizer 从提示语音中提取的。

生成speech token后,将它们附加到prompt tokens之后,形成流匹配模型的复合条件。此外,还纳入了prompt speech的说话人嵌入(speaker embedding)和梅尔频谱图(Mel spectrogram),以进一步增强音色(timbre)和环境的一致性。

PS: 引入提示语音和文本,进行零样本上下文学习,也为后续speech to speech学习提供参考方法

Rich Generation with Instruction 带指令的丰富生成

为了进一步增强CosyVoice的可控性,我们尝试整合额外的指令微调。CosyVoice-instruct在CosyVoice-base的基础上进行了扩展,增强了对指令的遵循能力。具体来说,它支持对多个方面的控制,包括说话人身份(即说话人的特征)、说话风格(包括情感、性别、语速和音高)以及细粒度的副语言特征。这些特征包括插入笑声、呼吸声、边笑边说以及强调某些词汇的能力。

使用不包含说话人嵌入的自回归语言模型的训练数据对CosyVoice-base进行了微调。

类别 示例
Speaker Identity 1. Selene ’Moonshade’, is a mysterious, elegant dancer with a connection to the night. Her movements are both mesmerizing and deadly.Hope is a good thing. 2. Theo ’Crimson’, is a fiery, passionate rebel leader. Fights with fervor for justice, but struggles with impulsiveness.You don’t know about real loss
类别示例说话人身份 1. Selene ‘Moonshade’,是一位神秘、优雅的舞者,与夜晚有着神秘的联系。她的动作既迷人又致命。希望是美好的东西。2. Theo ‘Crimson’,是一位热情、激进的叛军领袖。他为正义而战,充满热情,但有时会冲动。你不知道真正的失落是什么。
Speaking Style 1. A happy girl with high tone and quick speech.The sun is shining brightly today.2. A sad woman with normal tone and slow speaking speed.I failed my important exam.
说话风格 1. 一个快乐的女孩,语调高,语速快。今天阳光明媚。2. 一个悲伤的女性,语调正常,语速慢。我重要的考试没通过。
Fine-grained Paralinguistics 1. Well that’s kind of scary [laughter].2. I don’t think I over eat yeah [breath] and um I do exercise regularly.3. Well that pretty much covers the subject well thanks for calling me. 4. The team’s unity and resilience helped them win the championship
细粒度副语言 1. 好吧,这有点吓人[笑声]。2. 我不认为我吃得过多,是的[呼吸],而且我确实定期锻炼。3. 好吧,这基本上涵盖了<笑声>这个话题,好吧,谢谢你打电话给我。4. 团队的团结韧性帮助他们赢得了冠军。

通过这种指令微调,CosyVoice能够根据给定的指令生成更加丰富和多样化的语音,满足不同场景下的需求。例如,用户可以指定生成一个快乐的女孩的声音,或者在语音中插入笑声,使生成的语音更加自然和生动。这种可控性不仅提高了语音合成的灵活性,还为个性化语音合成和多语言应用提供了更广泛的可能性。

Datasets 数据集

  • Libritts: A corpus derived from librispeech for text-to-speech (小规模单语言数据集, 应该是用来快速验证的) | https://www.openslr.org/60/ : 该语料库包含 2,456 名英语使用者的 585 小时; 其中“train-clean-100”、“train-clean-360”和“train-other-500”合并进行训练(train),“dev-clean”用于模型选择。 “test-clean”用于构建评估集(val)。
  • 非公开数据,内部采集,利用专门的内部工具进行语音检测、信噪比 (SNR) 估计、说话人二值化和分离。随后,使用 SenseVoice-Large 和 Paraformer 生成伪文本标签。这些标签在强制对齐 (force-alignment FA) 模型的帮助下经历了细化过程,这有助于消除低质量数据并提高标点符号的准确性。(大规模多语言数据集,进行scaling,毕竟结合LLM模型参数变大了)。

PS: 这里还是用了AISHELL-3: A Multi-speaker Mandarin TTS Corpus and the Baselines 作为评估数据集来评估模型的生成质量。

大规模多语言数据集时长和对应指令类型时长统计:

image

实验设置

Supervised Semantic Speech Tokenizer

  • 对于小规模单语言数据集(Librispeech数据集);采用 ESPNet Conformer ASR 模型作为主干;Speech Tokenizer 由前六个编码器层和VQ组成;

    • VQ单个码本包含 4,096 个code。在Librispeech数据集上从头开始 50 个 epoch 训练量化器增强的 ASR 模型。
    • Text Tokenizer: 在训练文本上训练单词句子模型,其词汇量为 4,000。
  • 对于大规模多语言数据集(内部采集处理的数据集);采用SenseVoice-Large丰富的识别模型作为骨干;Speech Tokenizer 也由前六个编码器层和VQ组成;

    • VQ包含 4,096 个code的单个码本。与单语言实验不同,使用预训练的检查点来初始化SenseVoice-Large模型,而不是从头开始训练。加入VQ后,进一步微调了 8 个 A800 GPU 上 210,000 个训练步骤(steps)的整体参数。
    • Text Tokenizer 使用原有模型中自带的。

SenseVoice 模型结构(small Transformer Encoder, large Transformer Encoder-Decoder):

image

CosyVoice 模型设置

在单语言和多语言实验中训练微小和正常大小的模型。模型架构设置的详细信息如表所示:

image

  • 微型模型在 LibriTTS 训练集上使用 4 个 V100-32M GPU 进行了 50 个周期的训练.
  • 多语言模型则在我们的内部数据集上使用 64 个 V100-32M GPU 进行了 800,000 个步骤的训练。
  • 微小模型和普通模型的学习率分别为 1e−3 和 1e−4。预热步骤设置为 10,000。

实验结果

Supervised Semantic Speech Tokenizer 的评估

  • 引入VQ后是否WER很高,结果表明和不量化时,差距不大

  • 使用不同的 Tokenizer (text Tokenizer 和 speech Tokenizer) 对模型的影响评估,在 LibriTTS 单一说话人英文测试集上与其他 TTS 模型在内容一致性和说话人相似度 (SS) 方面的比较。使用 非自回归 ASR 模型 Paraformer-en 来识别生成的话语(utterances), 用于快速评估 WER.

    • 与其他 TTS 模型相比,即使使用相同的文本和语音标记器,所提出的 CosyVoice 框架也能实现可比的内容一致性和更高的说话者相似度。
    • 多语言text和speech tokenizer替换了单语言text和speech tokenizer。仅使用 LibriTTS 语料库来训练模型会降低内容一致性和说话人相似度。通过涉及内部大规模数据集,性能得到显着提升,达到了人类同等的质量。 image

CosyVoice生成质量评估

评估方法:

  • 从LibriTTS测试子集构建英文评估集,从AISHELL-3 测试集构建中文评估集; 对于这些集中的每个文本,随机选择一个提示语音。使用 Whisper-Large V3 进行英语识别,使用 Paraformer-zh 进行中文识别来评估内容一致性。通过计算使用 ERes2Net 提取的生成语音和提示语音的说话人嵌入之间的余弦相似度来量化说话人相似度 。

  • token LM 采用随机采样解码策略,使用五个不同的随机种子值:0、7、42、123 和 1,337 来评估合成过程。对所得评估指标进行平均以确定平均值和标准差。

  • ASR re-ranking 以展示离线模式下潜在的性能改进。 ASR re-ranking(自动语音识别重排序)是一种技术,用于改进自动语音识别(ASR)系统的输出质量。其核心思想是通过重新评估和排序ASR系统生成的候选转录结果,选择最有可能正确的转录。这种方法可以显著提高ASR系统的准确性和鲁棒性,特别是在处理复杂或噪声环境下的语音数据时。

结果:

  • 在英语数据集上,CosyVoice 达到了人类水平的性能,具有相似的内容识别和更高的说话人相似度。
  • ASR 重新排名显着增强了内容一致性,将字错误率 (WER) 降低了 1.51%。
  • CosyVoice 在 WER 以及插入和删除错误数量方面优于 ChatTTS,这表明其具有出色的内容一致性。
  • 没有评估 ChatTTS 的说话者相似度,因为它没有发布语音克隆功能。 image

CosyVoice的情绪可控性 Emotion Controllability

评估方法:

结果:

  • 对于 CosyVoice-instruct,输入由内容文本和语音风格指令组成(e.g., “Happy. Content Text”)。相反,CosyVoice-base 仅接收内容文本作为输入。
  • 结果表明,带有情感指令的 CosyVoice-instruct 比没有情感指令的 CosyVoice-base 和 CosyVoice-instruct 都有显着的改进。

image

CosyVoice 作为数据生成器 Data Generator

评估方法:

  • 通过CosyVoice生成语音数据,用于 ASR 模型训练;
  • 使用原始Librispeech 训练集进行ASR模型训练;
  • 使用原始Librispeech+合成数据,用于 ASR训练;
  • 使用原始Librispeech+MLS+合成数据,用于 ASR训练;

单词错误率作为评估标准。

CosyVoice 的一个简单应用是作为数据生成器来增强其他任务的训练数据,例如 ASR、语音到语音翻译 (S2ST)。以ASR任务为例,我们在Librispeech语料库上进行了实验,以评估CosyVoice生成高质量数据的能力。实验结果如表所示,其中“Librispeech”表示原始的960小时数据。 “Syn on LS text”和“Syn on LS, MLS text”分别表示使用 Librispeech 和 Multilingual LibriSpeech (MLS) 训练集的文本生成的数据。

image

结果:

  • 从表中可以看到,仅对合成数据进行训练,ASR 模型就可以达到与原始 Librispeech 训练集相当的结果。将它们集成后,可以观察到识别精度显着提高。
  • 一个有趣的发现是,将合成数据纳入 MLS 文本可以显着提高识别性能。这可能表明文本多样性对于 ASR 任务比语音本身的持续时间更重要。
  • 这一改进可归因于 CosyVoice 合成样本引入的不同语言内容。
  • 评估结果强调了 CosyVoice 生成的样本的高质量。

理想化:既然合成的语音数据能提高ASR模型识别任务精度提高,模型质量提高,进而可以提升Supervised Semantic Speech Tokenizer来提高 TTS模型的质量性能。 形成闭环,拟定评估标准,自适应学习提高?

总结

CosyVoice作为一种自回归,可扩展的多语言语音生成模型,它支持零样本上下文学习、跨语言语音克隆、指令生成以及情感、副语言特征的细粒度控制。实验结果表明,CosyVoice的系统架构对于说话者相似度很重要,而文本和语音标记器对内容一致性影响很大。此外,扩大模型大小和数据量可以显着提高性能。因此,CosyVoice 实现了人类同等的生成质量。

但是扩大模型大小,实际生产环境中推理部署的成本会增加,而且论文中没有对推理生成实时因子RTF进行评估;在同一硬件平台,推理速度相对NAR模型来说要慢些;尽管可以结合LLM中的推理优化方案。


附录:

Vector Quantizer(向量量化器)

https://github.com/lucidrains/vector-quantize-pytorch

https://github.com/ai-bot-pro/baby-llm/pull/1

https://github.com/ai-bot-pro/baby-llm/pull/13

向量量化器(Vector Quantizer)是一种将连续或离散向量序列映射为适合在数字信道上通信或存储的数字序列的系统。其主要目标是数据压缩:在保持数据必要保真度的同时,通过减少比特数来表示数据。

应用场景:

  • 向量量化器在多个领域有广泛应用,包括:
  • 图像压缩:通过将图像块映射到码本中的码字,减少存储和传输所需的比特数。
  • 声音压缩:将音频信号的特征向量量化,实现高效的音频编码。
  • 语音识别:将语音特征向量量化,提高识别效率和准确性。
  • 表示学习:通过向量量化学习更具解释性和泛化能力的特征表示。

优势:

  • 提高计算效率:向量化技术通过将数据转化为向量形式,可以利用现代计算架构(如GPU)进行高效的并行计算,显著提高处理速度。
  • 促进数据交互:通过将不同类型的数据转化为向量形式,可以更容易地在不同的模型和任务之间共享和迁移知识。
  • 改善搜索和推荐系统:向量化的数据可以用于快速检索相似内容,如相似图片、文档或商品推荐等。

向量量化器对计算效率的提升主要体现在以下几个方面:

  • 减少数据存储需求:向量量化通过将高维向量映射到有限的码本中,显著减少了数据的存储需求。例如,乘积量化(PQ)可以将高维向量压缩高达97%,从而节省大量内存。
  • 加速相似性搜索:在进行最近邻搜索时,向量量化可以显著加快查询速度。例如,使用乘积量化可以在实际测试中将最近邻搜索的速度提高5.5倍。此外,通过预先计算和存储码本中每个码字与查询向量的距离,可以进一步减少计算时间,提高检索速度。
  • 提高并行计算能力:向量化操作可以利用现代处理器的并行计算能力,显著加速计算过程。例如,使用NEON Intrinsic函数进行向量化优化,可以将效率提升54%。在深度学习中,向量化操作可以加速矩阵运算、卷积操作、激活函数计算和损失函数计算等,从而缩短训练时间。
  • 简化计算过程:向量化技术可以将复杂的标量运算转换为更简单的向量运算,减少代码复杂度,提高程序的可读性和可维护性。例如,使用NumPy库进行向量化数组运算,可以显著减少计算时间。
  • 减少循环次数:通过将for循环转换为向量或矩阵运算,向量化可以减少循环次数,从而提高计算效率。例如,使用向量化卷积操作可以显著加快卷积神经网络(CNN)中的卷积计算。
  • 优化硬件利用:现代处理器和GPU都支持向量化操作,通过优化代码以适应硬件的架构,可以进一步提升性能。例如,使用SIMD指令集可以加速向量计算。

综上所述,向量量化器通过减少数据存储需求、加速相似性搜索、提高并行计算能力、简化计算过程、减少循环次数和优化硬件利用,显著提升了计算效率。这些优势在处理大规模数据和进行复杂运算时尤为明显。

(PS:以上文字来自KIMI,引用互联网内容进行的总结归纳)

以下是一个简单的Python代码示例,(这里简化了码本,随机生成,一般是训练而来);这里展示通过训练好的码本,如何实现将原始特征向量x通过码本进行量化(从原来的12维变成了4维),然后通过码本进行尽可能近似还原其特征(本质没变就行):

import numpy as np
from random import randint

# 原始向量
x = [1, 8, 3, 9, 1, 2, 9, 4, 5, 4, 6, 2]
m = 4  # 子向量的个数
D = len(x)  # 原始向量的维度
D_ = int(D / m)  # 子向量的维度
u = [x[row:row+D_] for row in range(0, D, D_)]  # 划分子向量

k = 256  # 总簇心个数
k_ = int(k ** (1 / m))  # 子向量的簇心个数
print("子向量的簇心个数:",k_)
# 生成码本
codebook = []
for i in range(m):
    c_j = []
    for j in range(k_):
        c_ji = [randint(0, 9) for _ in range(D_)]
        c_j.append(c_ji)
    codebook.append(c_j)

# 计算欧几里德距离
def euclidean_distance(v, u):
    distance = sum((x - y) ** 2 for x, y in zip(v, u)) ** 0.5
    return distance

# 找到最近的簇心
def nearest_cluster_center(v, codebook):
    ans = []
    for i in range(m):
        distance = 9e9
        for j in range(k_):
            d = euclidean_distance(v[i], codebook[i][j])
            if d < distance:
                distance = d
                nearest_cluster_center = j
        ans.append(nearest_cluster_center)
    return ans

# 量化编码
quantization_code = nearest_cluster_center(u, codebook)

# 恢复向量
restore_u = []
for i, code in enumerate(quantization_code):
    restore_u.extend(codebook[i][code])

print("原始向量:", x)
print("划分子向量:",u)
print("codebook:",codebook)
print("量化编码:", quantization_code)
print("恢复向量:", restore_u)

"""
子向量的簇心个数: 4
原始向量: [1, 8, 3, 9, 1, 2, 9, 4, 5, 4, 6, 2]
划分子向量: [[1, 8, 3], [9, 1, 2], [9, 4, 5], [4, 6, 2]]
codebook: [[[8, 1, 6], [8, 7, 0], [7, 2, 5], [1, 0, 5]], [[1, 5, 0], [3, 1, 1], [5, 2, 2], [7, 3, 4]], [[8, 4, 5], [0, 7, 9], [8, 1, 1], [3, 3, 0]], [[9, 3, 3], [5, 9, 1], [8, 6, 8], [7, 9, 1]]]
量化编码: [1, 3, 0, 1]
恢复向量: [8, 7, 0, 7, 3, 4, 8, 4, 5, 5, 9, 1]
"""

CFG (Classifier-free diffusion guidance)

2022. Classifier-free diffusion guidance | Unofficial Implementation pytorch

  1. 背景和动机

在条件生成任务中,Classifier Guidance 方法通过引入一个额外的分类器来提升扩散模型生成样本的质量。这种方法虽然有效,但存在一些明显的缺点:

  • 额外的训练成本:需要在噪声数据上重新训练额外的分类器。
  • 对分类器的准确度有要求:分类器不准确会导致 score 估计时得到不准确的梯度,导致无法生成对应类别的结果。
  • 对抗攻击导致生成失败:通过梯度更新图像会导致对抗攻击效应,生成图像可能会欺骗已经训练好的分类器,实际上并没有按条件生成。
  • 为了解决这些问题,谷歌在论文中提出了 Classifier-Free Guidance 方案,该方案无需额外的分类器,通过调节引导的权重来控制生成图像的真实性和多样性的平衡。
  1. 方法原理

Classifier-Free Guidance 的核心思想是引入一个隐式的分类器 $p(c \mid z_\lambda)$ ,用它来模拟 Classifier Guidance 中的显式分类器的作用。具体来说,Classifier-Free Guidance 对原始 diffusion 的 score 函数 $\epsilon_\theta(z_\lambda, c)$ 进行了修改,使其能够被输入的条件引导,但没有使用显式的分类器。 在 Classifier Guidance 中,条件生成时的反向 SDE 为:

$$ dx = \left[ f(x, t) - g(t)^2 \nabla_x \log p_t(x \mid y) \right] dt + g(t) d\bar{w} $$

利用贝叶斯公式,对 $\nabla_x \log p_t(x \mid y)$ 进行处理: $$ \nabla_x \log p_t(x \mid y) = \nabla_x \log p_t(y \mid x) + \nabla_x \log p_t(x) $$ 在 Classifier-Free Guidance 中,我们不希望使用分类器来计算 $\nabla_x \log p_t(y \mid x)$ ,因此需要用另一种方式来表示这一项。具体推导如下: $$ \nabla_{x_t} \log p(y \mid x_t) = \nabla_{x_t} \log p(x_t \mid y) - \nabla_{x_t} \log p(x_t) $$ 代入 Classifier Guidance 中推导得到的分类器引导对应的梯度项中,可以得到:

$$ \bar{\epsilon}_\theta(x_t, t, y) = (w+1) \epsilon_\theta(x_t, t, y) - w \epsilon_\theta(x_t, t) $$

其中, w 是一个控制条件重要性的参数。当 w = 0 时,模型就是原来的无条件生成模型;当 $w \to \infty$ 时,模型完全依赖于条件;当 w > 1 时,模型不仅更加重视条件,而且向远离无条件生成的方向移动。

  1. 实现和应用

Classifier-Free Guidance 的实现相对简单,主要步骤如下:

训练:

  • 从数据集中采样一张图片和对应的分类。
  • 以一定概率 $p_{\text{uncond}}$ 将条件 c 赋值为空(非条件),以 $1 - p_{\text{uncond}}$ 的概率保留 c (条件)。
  • 通过这种方式将条件和非条件放到一起训练。
  • 取一个时间样本 $\lambda$ 。
  • 抽样随机噪音。
  • 通过均值和标准差计算 $z_\lambda$ 。

推理:

  • 在推理时,同时预测条件生成和无条件生成的图像。
  • 通过 guidance scale 控制最终生成结果的方向和强度。
  1. 优势和效果

Classifier-Free Guidance 的主要优势包括:

  • 无需额外分类器:无需训练额外的分类器,减少了训练成本和复杂度。
  • 灵活性:可以生成任意条件下的样本,不受分类器类别的限制。
  • 生成质量:通过调节 guidance scale,可以生成高质量且多样化的样本。
  1. 总结

Classifier-Free Diffusion Guidance 通过引入隐式的分类器和调节引导权重,避免了 Classifier Guidance 的缺点,同时保持了条件生成的高质量和灵活性。这种方法在图像生成、文本到图像翻译等任务中表现出色,适用于需要高质量和多样化生成的应用场景。