深入理解vqvae

深入理解vqvae

TL; DR:通过 vector quantize 技术,训练一个离散的 codebook,实现了图片的离散表征。vqvae 可以实现图片的离散压缩和还原,在图片自回归生成、Stable Diffusion 中,有重要的应用。

从 AE 和 VAE 说起

AE(AutoEncoder,自编码器)是非常经典的一种自监督表征学习方法,它由编码器 encoder 和解码器 decoder 构成,编码器提取输入图像的低维特征,解码器根据该特征重构出输入图像,损失函数一般就是原始图像和重构图像间的 L1 / L2 损失。由于解码器需要根据特征重构出输入图像,因此需要编码器提取的特征尽可能包含完整的图像信息,因此训练出的编码器是一个不错的图像特征提取器。在训练完成后,编码器就是一个图像表征模型,而解码器就没有用处了,丢掉即可。

AE 的解码器真的没有任何用处了吗?它能够根据一个任意的特征向量,生成出一张真实图片,明明看起来本身就是一个图像生成模型了呀。但实际上,AE 的解码器只能认识训练时 AE 的编码器提取出的特征,而对于任意采样的特征向量,他是无法生成出图像的。换句话说,AE 训练时,编码器产生的隐层特征的分布我们是不知道的,在采样时,自然无法采样出这种解码器认识的分布的特征,给解码器去生成图片。

其实这也好办,我们约束一下 AE 训练时隐层特征的分布就好了嘛,训练结束后从这个规定的分布中采样出的特征向量,解码器肯定就认得了。VAE(Variational AutoEncoder,VAE)其实就是这么做的,它将隐变量的分布约束为高斯分布。VAE 中,编码器的输出直接就被认为是高斯分布的均值和方差,然后,根据该均值和方差(结合重参数化技巧),从高斯分布中采样一个隐变量,输入到解码器中生成。VAE 训练结束后,解码器就是一个生成模型,我们可以从高斯分布中采样,输入给解码器生成新的图片,反而编码器就没有用处了,丢掉即可。

在这里插入图片描述

vqvae:从连续表征到离散表征

我们生活的世界实际上是离散的,而非连续的,量化的思想能上溯到量子力学。

在 NLP 中,通常是先有一个 tokenizer,将自然语言转换成一个个的 token,实际就是一个个的离散的整数索引,接下来有一个 embedding 层,查索引获取对应的词嵌入 embedding,然后再送入到模型中处理。因此对于自然语言来说,数据是由一个个 token 组成,是一种离散的数据模态。

在 CV 中,计算机中的图片硬要说也是离散的数据,因为所有可能得图像像素数量也是有限的,一般对彩色图像最多 256 × 256 × 3 256\times 256\times 3 256×256×3 种。但由于这个数太大,因此一般认为图像是一种连续的数据模态,一般读图进来,再像素归一化之后直接就输入模型中处理。

vqvae 的作者认为离散的数据形式其实是更自然的,由此提出了 vqvae,使用 vector quantize 的方法,将图像编码为离散的表征。

首先,构建一个图像特征的 codebook(码本,原文中称为 Embedding Space),它的作用就类似于 NLP 中的词嵌入 embedding 层。codebook 是一个可学习的 K × D K\times D K×D 的张量,其中 K K K 是表征向量 embedding 的个数, D D D 是 embedding 的维度。对于一张输入图像,CNN 编码器会提取其特征图 z e z_e ze,特征图尺寸为 h × w × D h\times w\times D h×w×D,也就是 h × w h\times w h×w D D D 维的向量。每个向量在 codebook 中找到与其最接近向量的索引,按索引取得最接近向量,得到量化后特征图 z q z_q zq z q z_q zq 送入解码器中,输出重构图像。

在这里插入图片描述

这里有一个问题,就是取码本里取最接近的向量,是一个 argmin 操作,是没法传导梯度的。这里作者使用了一种类似 straight-through estimator 的方法来处理,在反向传播时跳过这一步,直接将 z q z_q zq 的梯度复制给 z e z_e ze 。如上图所示,前向传播时,正常计算 codebook 中与 z e z_e ze 最近邻的的向量,得到 z q z_q zq 送到解码器,而在反向传播时,直接将 z q z_q zq 的梯度 ∇ z L \nabla_zL zL 复制给 z e z_e ze 。由于 z q z_q zq z e z_e ze 的维度是一样的,都是 D D D,因此这样复制过来的梯度可以指导 encoder 的参数更新。

在整个过程中,可训练的参数共包括三部分:编码器、码本、解码器,驱动这三部分训练的损失函数是怎么设计的呢?首先,与 ae、vae 一样,vqvae 有一项重构损失 log ⁡ p ( x ∣ z q ( x ) ) \log p(x|z_q(x)) logp(xzq(x)) 来优化编码器和解码器。但是由于使用了梯度停止技术,这一项重构损失是无法优化 codebook 的。作者这里使用了 vector quantization 技术来优化 codebook,具体来说,就是最小化码本向量与解码器输出向量的 L2 距离 ∣ ∣ sg [ z e ( x ) ] − e ∣ ∣ 2 2 ||\text{sg}[z_e(x)]-e||_2^2 ∣∣sg[ze(x)]e22 。另外,由于这里相当于只是在更新 codebook 里的向量,因此也可以试着使用 EMA 技术来动量更新。最后为了保证 encoder 提取出的隐变量与 codebook 中的向量尽可能接近,需要使得 codebook 与编码器的训练速度尽量一致,因此这里还加了一个正则项来约束编码器的参数更新 ∣ ∣ z e ( x ) − sg [ e ] ∣ ∣ 2 2 ||z_e(x)-\text{sg}[e]||_2^2 ∣∣ze(x)sg[e]22,称为 commitment loss。

综上,vqvae 整体的损失函数为:
L = L reconstruction + L embedding + β L commitment = log ⁡ p ( x ∣ ∣ z q ( x ) ) + ∣ ∣ sg [ z e ( x ) − e ∣ ∣ 2 2 + β ∣ ∣ z e ( x ) − sg [ e ] ∣ ∣ 2 2 \begin{align} L&=L_{\text{reconstruction}}+L_{\text{embedding}}+\beta L_{\text{commitment}} \\ &=\log p(x||z_q(x))+||\text{sg}[z_e(x)-e||_2^2+\beta||z_e(x)-\text{sg}[e]||_2^2 \end{align} L=Lreconstruction+Lembedding+βLcommitment=logp(x∣∣zq(x))+∣∣sg[ze(x)e22+β∣∣ze(x)sg[e]22
其中,第一项 reconstruction loss 用于优化 encoder 和 decoder,第二项 embedding loss 用于优化码本,第三项 commitment loss 相当于是个正则项,约束 encoder 的训练。

上面的 sg \text{sg} sg 是梯度停止(stop gradient),其计算在前向传播时不变,在反向传播时偏导数为 0。这在代码实现时也很好操作,以 pytorch 为例, sg [ x ] \text{sg}[x] sg[x] 操作就是 x.detach()

简单总结一下,vqvae 的 encoder 是一个图像表征模型,不同于一般的图像表征模型对图像提取一个特征向量,vqvae 是提取出一张特征图(多个特征向量的二维排布),相当于是将一张像素空间的大图压缩为了一张隐空间的小图。而 vqvae 的 decoder 则可以将一张隐空间的小图解码为像素空间的大图。也就是说,vqvae 相当于是一个负责图片离散压缩和还原的模型。在扩散模型时代,这是不是听起来有点熟悉?没错,大名鼎鼎的 Stable Diffusion 就是使用一个类似 vqvae 的 encoder 将图像压缩到隐空间,进行扩散生成,再用 decoder 将结果解码为真实图像。

图像生成:auto-regressive + vqvae

上节提到,vqvae 是一个负责图片离散压缩和还原的模型,但还有一个问题,怎么利用它来进行图像生成呢?我们之前介绍 vae 时提到,通过将中间层的隐变量分布约束为高斯分布,训练结束后我们可以自行从高斯分布中采样,输入到 decoder 中,生成新的图像。但 vqvae 实际没约束这件事情,应该从什么分布中进行采样生成呢?

实际上,vqvae 自己确实不能实现图像生成。我们费那么大劲儿把连续表征改为离散表征究竟有什么用呢?还是联系 NLP 中 tokenizer 和词表 vocab 的概念,有了离散的 vqvae 和 codebook 之后,我们就能做自回归式的生成了(类似 GPT 那样)!在图像生成领域,之前也有自回归式生成的方法,比较知名的是PixelCNN,按照从左上到右下的顺序生成图像的像素值。这听起来成本就很高,现在图片怎么也要上百万像素,所有可能的像素数也多达 256 × 256 × 3 256\times 256\times 3 256×256×3 种,一个一个地生成像素效率也太低了。但有了 vqvae,我们就可以在隐空间特征图上进行自回归生成,空间分辨率一般为 64 × 64 64\times 64 64×64 ,码本中可能的向量数也只有几千个。生成隐空间特征图之后,再用 vqvae 的 decoder 将其解码为像素空间的真实图片即可。生成效率和生成结果质量都大幅提升。

一个典型的 auto-regressive + vqvae 的图像生成系统的训练和采样有以下步骤:

  1. 训练 vqvae,包括 encoder、decoder 和 codebook;
  2. 基于固定参数的 vqvae,训练自回归模型(如 PixelCNN)
  3. 在生成时,先自回归采样一个隐空间特征图,再用 vqvae decoder 将其解码为像素空间的真实图片

总结

vqvae 首次在 cv 领域提出使用 vector quantize 来构建一个离散的 codebook,与其后续的 vqgan 等工作,被认为是 ”图片的 tokenizer“。将图片编码为 token,就能与 NLP token 的形式统一起来,一起在多模态 transformer 模型中进行训练。另外,vqvae encoder 将真实图片压缩为低维特征图, decoder 将低维特征图解码为真实图片的能力,在 ldm 中也大有用武之地,可以极大地降低训练/推理成本,提升生成结果的质量。已经成为扩散生成模型的主流。综上所述,在 transformer、diffusion 的时代,vqvae 的影响和意义极其深远。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374050.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在电脑上恢复查看iPhone短信?4个有效方法给你!

在当今科技发达的世界,能够在计算机上查看 iPhone 短信将彻底改变游戏规则。无论是存档珍贵的对话还是管理与工作相关的聊天,这都是一项至关重要的技能。在本指南中,我们将引导您了解如何在计算机上查看 iPhone 短信的四种高效方法。通过执行…

AI专题:AI应用落地的商业模式探索

今天分享的是AI 系列深度研究报告:《AI专题:AI应用落地的商业模式探索》。 (报告出品方:国金证券) 报告共计:27页 AI基座模型提供按量收费服务 以 ChatGPT 为代表的大模型能力涌现,为基座模型厂商带来增…

C++类和对象入门(三)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 在c中,类型分为两类,一类是内置类型,另一类是自定义类型。 1.内置类型&#xf…

作业:单身狗1

思路: 一:题目一开始就规定了这个数组的标准——只有一个数字出现一次,其他数字都是成对出现的,因此,重点就是如何排除成对的数,和保留单独的数 二:^的特点:相同为0,不…

docker自定义镜像并使用

写在前面 本文看下如何自定义镜像。 ik包从这里 下载。 1:自定义带有ik的es镜像 先看下目录结构: /opt/program/mychinese [rootlocalhost mychinese]# ll total 16 -rw-r--r-- 1 root root 1153 Feb 5 04:18 docker-compose.yaml -rw-rw-r-- 1 el…

Web课程学习笔记--CSS选择器的分类

CSS 选择器的分类 基本规则 通过 CSS 可以向文档中的一组元素类型应用某些规则 利用 CSS,可以创建易于修改和编辑的规则,且能很容易地将其应用到定义的所有文本元素 规则结构 每个规则都有两个基本部分:选择器和声明块;声明块由一…

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能 举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内…

2、ChatGPT 在数据科学中的应用

ChatGPT 在数据科学中的应用 ChatGPT 可以成为数据科学家的绝佳工具。以下是我所了解到的关于它擅长的地方和不那么擅长的地方。 我从使用 ChatGPT 中学到了一个教训。它在数据科学中非常有帮助,但你必须仔细检查它输出的所有内容。它非常适合某些任务,并且可以非常快速准确…

Linux Rootkit实验|01 基于修改系统调用表的Hook

Linux Rootkit实验|01 基于修改系统调用表的Hook 文章目录 Linux Rootkit实验|01 基于修改系统调用表的Hook实验说明实验环境实验过程一 基于修改sys_call_table的系统调用挂钩1 寻找sys_call_table内存地址2 关掉写保护3 修改sys_call_table 二 基于系统…

告别mPDF迎来TCPDF和中文打印遇到的问题

mPDF是一个用PHP编写的开源PDF生成库。它最初由Claus Holler创建,于2004年发布。原来用开源软件打印中文没有问题,最近发现新的软件包中mPDF被TCPDF代替了,当然如果只用西文的PDF是没有发现问题,但要打印中文就有点抓瞎了如图1&am…

【python数据分析基础】—dataframe中index的相关操作(添加、修改index的列名、修改index索引值等)

文章目录 前言一、添加、修改index的列名二、修改index索引值 前言 本文主要讲dataframe结构中index的相关操作,index相当于是数据表的行。 一、添加、修改index的列名 新建一个dataframe表,我们可以自定义index的值,如下: imp…

数据结构高级算法

目录 最小生成树 Kruskal(克鲁斯卡尔)(以边为核心) 9) 不相交集合(并查集合) 基础 Union By Size 图-相关题目 4.2 Greedy Algorithm 1) 贪心例子 Dijkstra Prim Kruskal 最优解(零钱兑换)- 穷举法 Leetcode 322 最优解(零钱兑换)- 贪心法 Leetcode 322 3)…

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用: 可用: Google Chrome Close AutoUpdate-CSDN博客

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络(CNN) 4.2 长短时记忆网络(LSTM) 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

2020年通信工程师初级 综合能力 真题

文章目录 第1章 通信职业道德,1-4第2章 法律法规,5-16第3章 计算机应用基础,第5章 现代通信网,38英语题,91 第1章 通信职业道德,1-4 1、职业道德在形式上具有()特点。 A.一致性 B.统一性 C.多样性 D.一般性…

PHP实现DESede/ECB/PKCS5Padding加密算法兼容Java SHA1PRNG

这里写自定义目录标题 背景JAVA代码解决思路PHP解密 背景 公司PHP开发对接一个Java项目接口,接口返回数据有用DESede/ECB/PKCS5Padding加密,并且key也使用了SHA1PRNG加密了,网上找了各种办法都不能解密,耗了一两天的时间&#xf…

【UE】游戏运行流程的简单理解

流程图 官方的游戏流程图: 一般顺序为初始化引擎、创建并初始化 GameInstance、加载关卡,最后开始游戏。 总的来说就是: 开始游戏-》游戏实例-》关卡-》游戏模式-》玩家控制器-》Pawn、玩家状态、HUD、UMG(可有可无) …

idea运行程序报错 java 程序包org.junit不存在

在 IntelliJ IDEA 中运行程序时遇到错误提示:“java: 程序包org.junit不存在”,针对这一问题,我们可以考虑以下三步来解决: 第一步:检查JUnit依赖 尽管现代项目创建时通常会默认引入JUnit依赖,但仍需检查…

postman 文档、导出json脚本 导出响应数据 response ,showdoc导入postman json脚本 导出为文档word或markdown

保存、补全尽可能多的数据、描述 保存响应数据 Response:(如果导出接口数据,会同步导出响应数据) 请求接口后,点击下方 Save as Example 可以保存响应数据到本地(会在左侧接口下新增一个e.g. 文件用来保…

仅一个月获推荐170w+,视频号近期爆火的秘诀是什么?

为了保证良好的创作环境,视频号的原创标准在1月做了新调整, 视频时长小于5秒则不能声明为原创 ,纯图片轮播也不能声明为原创,只有持续输出优质内容的账号才能显示原创标识及原创保护功能,这样的改动也给了不少创作者…