关于VQ-VAE

work in process

概述

VQ-VAE (Vector Quantized Variational AutoEncoder):VQ-VAE 是 VAE 的一种变体,它结合了 VQ 和 VAE 的思想。在 VQ-VAE 中,编码器的输出不再是连续的潜在表示,而是离散的符号,这些符号是通过 VQ 过程从代码本中选出的。这样做的好处是,VQ-VAE 可以更好地处理离散数据(如文本和音频),并且生成的数据通常更加清晰和连贯。

VQ-VAE 结合了 VQ 和 VAE 的优点,它使用 VAE 来学习潜在空间,并使用 VQ 来对潜在空间进行离散化。具体来说,VQ-VAE 使用一个编码器将输入数据映射到潜在空间中,然后将每个潜在向量映射到代码本中最近的向量,从而实现离散化。在训练过程中,VQ-VAE 旨在最小化重构误差和 VQ 误差。其中,重构误差度量了观测数据与生成数据之间的差异,而 VQ 误差则度量了潜在向量与其对应的代码本向量之间的距离。训练过程中,我们通过反向传播更新编码器和解码器的参数,并通过直接移动代码本向量来最小化 VQ 误差。

VQ-VAE 算法流程如下:

  1. 定义编码器和解码器网络。
  2. 初始化代码本。
  3. 对于每个训练批次,执行以下操作:
  • 将输入数据通过编码器得到潜在表示。
  • 将潜在表示与代码本中的向量进行比较,找到最接近的向量(即量化潜在表示)。
  • 使用解码器将量化潜在表示解码为重构数据。
  • 计算重构误差(如均方误差或交叉熵损失)。
  • 计算 VQ 误差(即潜在表示与量化潜在表示之间的欧氏距离)。
  • 将两个误差相加,使用梯度下降法更新编码器和解码器的参数。
  • 使用直接移动代码本向量的方法更新代码本。

VQ

VQ (Vector Quantization):向量量化是一种在信号处理和数据压缩中常见的技术,它将连续的向量空间离散化。具体来说,它首先定义一个“代码本”(codebook),这是一个固定的向量集。然后,对于输入的每个向量,VQ 将其映射到代码本中最接近的向量。这样,原始的连续向量就被转换为离散的符号,从而实现了数据的压缩。
VQ将矢量空间中的 k 维矢量映射到矢量的有限集合。 每个向量称为code vector(代码向量)或codeword(码字)。所有码字的集合称为codebook(码本)。

大神的python实现(可直接pip安装):lucidrains/vector-quantize-pytorch

VAE

VAE (Variational AutoEncoder):变分自编码器是一种生成模型,它使用神经网络学习数据的潜在表示,并能从这些表示中生成新的数据。VAE 由两部分组成:编码器和解码器。编码器将输入数据编码为潜在空间中的点,而解码器则将这些点解码回原始数据空间。VAE 的关键在于其损失函数,它包括重构损失(鼓励解码的数据接近原始输入)和正则化项(鼓励潜在表示符合某种预定义的分布,通常是标准正态分布)。

  • 在 VAE 中,编码器将输入数据映射到一个参数化的概率分布,通常选择的是多元高斯分布。对于每个输入数据点,编码器输出均值(μ)和对数方差(log σ^2)或标准差(σ)两个向量,共同定义了一个高斯分布。接着,我们利用这个分布进行随机采样,获取一个潜在变量 z。这里需要注意的是,采样过程并不是确定性的,而是从分布中随机抽取样本。
  • 之后,解码器接收这个潜在变量z,并将其映射回原始数据空间,生成重构的数据点。

VAE的训练目标有两个部分:1)最大化观测数据(输入数据)与生成数据(重构数据)之间的似然函数,这通常通过对损失函数(如均方误差或交叉熵损失)的最小化来实现;2)使潜在空间的分布接近预定义的先验分布,通常是标准正态分布。这个目标通过引入额外的KL散度项到损失函数中来实现,KL散度衡量了两个分布之间的差异。

参考

posted @ 2024-02-23 21:26  Skye_Zhao  阅读(358)  评论(0编辑  收藏  举报