简单理解VQGAN

2024-02-20 01:44
文章标签 简单 理解 vqgan

本文主要是介绍简单理解VQGAN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单理解VQGAN

TL; DR:与 VQVAE 类似,隐层压缩表征+自回归生成的两阶段图像生成方法。增加感知损失和对抗损失,提高压缩表征模型解码出图片的清晰度。还可以通过编码并预置条件表征,实现条件生成。

隐层压缩表征+自回归生成:如何改进?

我们在之前介绍 vqvae 的文章中提到,vqvae 本身实际是一种图像的压缩表征模型,其编码器可以将真实的像素图片压缩为隐空间的小特征图,而其解码器可以将隐空间的特征小图重构为真实的像素图片。作为一种压缩表征模型,vqvae 本身并不能进行图像生成,需要根据训好的 vqvae 再训练一个自回归模型(如 PixelCNN),来对隐空间特征图进行采样,再用 vqvae 的解码器解码为新的真实图片。

vqvae 这种隐层压缩表征+自回归生成的两阶段图像生成方法是否还存在改进空间呢?答案当然是肯定的。实际上当时压缩表征和自回归生成两个阶段都有可以借鉴的改进思路。

首先,在隐层表征阶段,简单的 L2 重构损失只约束重构结果与原图像素值之间的差异,而无法约束图片感知效果的差异,会导致生成图片非常模糊,要考虑如何改进。比如增加更全面的监督信号的损失函数,如 LPIPS、对抗损失等。

然后,在自回归生成阶段,PixelCNN 还是太过简单了,要考虑是否存在更强力的模型。在当时,LLM 还没有展现出绝对的统治力,但是以 OpenAI 的 GPT 系列为代表的语言模型已经取得很大进展,并且其自回归的形式也十分适合用于隐空间特征图的采样。另外,当时 ViT 等 Transformer 在视觉领域的工作也已经出来了,相较于 CNN,Transformer 不存在局部性的归纳偏置,对图像全局构图的理解能力更好,并且表达能力更强,在大数据量下性能更好。

vqgan 这篇工作,正是基于上述几个点对 vqvae 做出了改进。

隐层感知压缩表征

在隐层压缩表征的训练上,vqvae 使用了 reconstruction loss、embedding loss 和 commitment loss 三部分损失。vqgan 整体上沿用了 vqvae 的思路,但是为了使 codebook 的语义感知更加丰富,同时避免单独的 L2 损失导致的解码图片模糊的问题,vqgan 做出了两个改进。

一是增加了感知损失,即 LPIPS。简单来说就是将重构图片过一个训练好的 VGG 网络,提取其各层特征图,要求其与原图的各层特征也尽可能接近。而不只是像 L2 损失那样,简单地要求生成结果的像素值与原图接近。这样一来,除了纹理特征之外,高层语义特征的一致性也得到了监督。

二是增加了对抗损失,具体来说,是一个 PatchGAN。PatchGAN 不止是要求辨别器分辨出真实图片和生成图片,而是更细粒度地要求分辨出每一个小图像块是真实的还是生成的。

在这里插入图片描述

从下图的对比中可以看到,增加了这两个损失的监督,VQGAN 的解码结果明显比 VQVAE 更加清晰锐利,没有那么模糊。

在这里插入图片描述

基于Transformer的自回归生成

无条件生成

训练好 vqgan 之后,需要训练一个自回归模型来进行采样。这一阶段的训练其实就是常见的自回归语言模型,根据已有的 token,去预测下一个 token,即 p ( s i ∣ s < i ) p(s_i|s_{<i}) p(sis<i) ,去最大化这个 likelihood p ( s ) = ∏ i p ( s i ∣ s < i ) p(s)=\prod_{i}p(s_i|s_{<i}) p(s)=ip(sis<i)

条件生成

对于给定条件 c c c 的条件生成,vqgan 的做法与文本生成领域 decoder-only 模型的 in-context learning 类似,就是将条件放到最前面即可,此时 likelihood 为 p ( s ∣ c ) = ∏ i p ( s i ∣ s < i , c ) p(s|c)=\prod_ip(s_i|s_{<i},c) p(sc)=ip(sis<i,c) 。注意对于条件的编码,需要重新训练一个新的 vqgan。

总结

vqgan 利用 Transformer 和感知损失等技术,从生成质量和可控生成上对 vqvae 进行了很有意义的改进。vqvae、vqgan这一路压缩表征的方法在 LDM、MultiModal Transformer 中都有很多的应用。

这篇关于简单理解VQGAN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726663

相关文章

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka