和题主一样,碰到了VQ loss不稳定的情况。检查了一下codebook的使用率,只有30%,应该是codebook训崩了...
在VQVAE(Vector Quantization Variational AutoEncoder)的训练过程中,vq_loss的不稳定性是一个常见的问题。这主要源于码本坍缩现象,即某些码本向量被频繁更新,而其他向量则几乎未被使用。为了解决这个问题,我们可以探索不同的训练策略和优化方法。 码本坍缩的成因 🏠 VQVAE模型采用了向量量化技术,利用一个离散的码本...
因此重建loss的梯度是无法传递到encoder网络的。 因此,作者采用了straight through estimator(直通估计)来解决这个问题。直通估计,主要用于处理一些不可导函数梯度: 对不可导的部分,在反向传播计算梯度时,直接忽略,就采用上游的梯度,即认为不可导部分是恒等操作(Identify function)。 上图zq就是ze通过与codebook中的e计算...
commitment loss也比较简单,直接计算encoder的输出和对应的量化得到的embedding向量的L2误差: 注意这里的sg是作用在embedding向量上,这意味着这个约束只会影响encoder。 综上,VQ-VAE共包含三个部分的训练loss:reconstruction loss,VQ loss,commitment loss。 其中reconstruction loss作用在encoder和decoder上,VQ loss用来...
loss = q_latent_loss + self._commitment_cost * e_latent_loss 1. 2. 3. 最后确保梯度可以直接从解码器流向编码器。 quantized = inputs + (quantized - inputs).detach() 1. 从数学上讲,左右两边是相等的(+输入和-输入将相互抵消)。在反向传播过程中,.detach部分将被忽略 ...
也就是说,前向传播时,sg里的值不变;反向传播时,sg按值为0求导,即此次计算无梯度。(反向传播其实不会用到式子的值,只会用到式子的梯度。反向传播用到的loss值是在前向传播中算的) 基于这种运算,我们可以设计一个把梯度从$z_e(x)$复制到$z_q(x)$的误差: ...
第一项相等于固定z,让zq靠近z,第二项则反过来固定zq,让z靠近zq。注意这个“等价”是对于反向传播(求梯度)来说的,对于前向传播(求loss)它是原来的两倍。根据我们刚才的讨论,我们希望“让zq去靠近z”多于“让z去靠近zq”,所以可以调一下最终的loss比例: ...
在训练过程中,编码器将图像转化为特征图,然后通过与codebook的向量比较找到最接近的index。这个index被用于生成重构图,同时,Encoder的梯度通过 Straight-Through 方法巧妙地传递,解决不可导问题。codebook loss则通过VQ算法,不断调整codebook以逼近Encoder的输出,保持编码的稳定性。4. 实验与应用 VQ-VAE...
self._decoder = Decoder(embedding_dim, num_hiddens, num_residual_layers, num_residual_hiddens) def forward(self, x): z = self._encoder(x) z = self._pre_vq_conv(z) loss, quantized, perplexity, _ = self._vq_vae(z) x_recon = self._decoder(quantized) return loss, x_recon, perplex...
loss.backward() 损失函数设计细节 重构损失函数设计 Straight-Through Estimator操作(前向传播的时候可以用想要的变量(哪怕不可导),而反向传播的时候,用自己针对一些操作设计的梯度) 该操作的目的: 一般的VAE:输入图像 Encoder Decoder 输出图像 VQ-VAE:输入图像 ...