当前位置: 首页 > article >正文

【深度学习】走向VQ-VAE模型

有监督任务和无监督任务

有监督任务(Supervised Tasks)的数据包含输入特征和对应的标签(目标值),模型学习从输入到输出的映射关系,典型任务有分类、回归、序列标注等。无监督任务(Unsupervised Tasks) 的数据仅包含输入特征,无标签,模型从数据中发现隐藏结构或模式, 典型任务有聚类、降维、特征学习、密度估计等。

聚类(Clustering) 将数据分组为相似的子集(簇),比如客户分群,输入为用户行为数据,输出为高价值用户、普通用户等群组。具体算法有K-means、层次聚类、DBSCAN。

降维(Dimensionality Reduction) 减少数据维度,保留重要信息。 比如可视化高维数据,将3维数据降至2维。 图像压缩(如PCA用于人脸识别)。 具体算法有主成分分析(PCA)、t-SNE、UMAP。(线性降维)

特征学习(Feature Learning) 自动发现数据的有效表示(如抽象特征),是一种非线性的降维方式。 比如,词嵌入(Word2Vec将词语映射为稠密向量),自编码器(Autoencoder)用于图像特征提取。具体算法有自编码器、生成对抗网络(GAN)、Word2Vec。

密度估计(Density Estimation) 估计数据的概率分布。 比如异常检测(低概率区域的数据视为异常),生成合成数据(如模拟用户行为)。 具体算法有高斯混合模型(GMM)、核密度估计(KDE)、变分自编码器(VAE)。

无监督学习相对于有监督学习的最有利的一件事情就是,数据获取成本低。

生成模型

生成模型关注的是给定数据,生成与训练集同分布的新样本。如果给10000张图片,能够找到一个模型生成与10000张图片一样的概率密度。训练数据的真实分布我们永远无法知道,因为太过高维,我们只能找到一个模型的分布尽可能接近训练数据的分布。如果有了模型之后,我们就可以对模型进行采样,去生成跟真实样本接近的数据,但是肯定与真实样本里的内容不同。

我们这节课关注的生成模型涉及无监督学习中的一个核心问题——密度估计问题。将已知类别点的概率密度,通过密度估计进行估计。然后已知类别点的概率密度之后,进行采样,将采样后的点用来进行生成新的数据样本。密度估计有两种思路——显式密度估计隐式密度估计显式密度估计就是能够定义分布的方程形式,能够知道模型产生的概率,隐式密度估计就是只能生成内容,不能进行显式定义模型。

那为什么要研究生成模型呢?生成模型(Generative Models)是机器学习的核心方向之一,其目标是通过学习数据分布,生成与真实数据相似的新样本。研究生成模型的意义包括,数据增强,生成稀缺或敏感领域的数据(如医学图像);内容创作,自动化生成图像、文本、音乐等;跨模态转换,实现不同形式数据之间的转换(如文字生成图像);领域适应,解决不同数据分布(domain)之间的差异问题。

  • 图像合成(Image Synthesis):根据输入信息(如文本、草图等)生成新图像。  输入文本描述(如“一只红色的鸟站在树枝上”)生成对应的图像。  
  • 图像属性编辑(Image Attribute Editing):通过修改图像的隐藏属性(如表情、年龄、颜色)来调整输出。  将人物表情从“中性”改为“微笑”。  
  • 图片风格转移(Image Translation):将图像的风格或内容转换为另一种形式,同时保留核心信息。  黑白照片上色、白天场景转夜晚场景、卫星图像转地图。  
  • 域适应(Domain Adaptation):解决源域(source domain)和目标域(target domain)数据分布差异的问题。  将合成数据(如虚拟场景)的特征适配到真实场景数据。  

PixelRNN与PixelCNN

PixelRNN与PixelCNN 将图像生成看作序列过程,先生成的一个值,再在第一个值的基础上生成第二个值。利用链式法则,将生成图像x转换为每个像素生成概率的乘积。学习的过程就是最大化数据的似然,也就是在这个模型下,产生这些数据的概率是最大的。假设这个模型符合正态分布,需要找到合适的均值和方差让这些数据产生的概率最大。至于这个模型符不符合正态分布,这是一个很麻烦的事情,需要用神经网络进行学习。

确保当前像素的生成仅依赖于其左上方的已知像素(即保持自回归性质)

将PixelRNN进行改进,得到PixelCNN。确保当前像素的生成仅依赖于其左上方的已知像素(即保持自回归性质),基于已经生成的像素,利用CNN生成新的像素。 通过掩码(Mask)对标准卷积核进行修改。 对于输入通道和输出通道均为 C 的卷积核,掩码矩阵 M 的设计如下:

PixelRNN和PixelCNN的似然函数可以进行精确计算,并且利用似然函数的值可以有效地评估模型性能, 但是序列产生很慢。

VAE (Variational Autoencoders) 

 首先VAE是一种自编码器,目标是利用一个无标签数据找到一个有效的低维的特征提取器。卷积神经网络流行之前,使用全连接网络,把图片拉成长向量;卷积神经网络流行之后,直接利用CNN进行降维。

特征降维后的特征仅仅保留数据中有意义的信息,那么如何进行学习呢?加入一个解码器,利用重构损失来训练低维的特征表示,不需要标签,所以是一种无监督的学习方式。学习好了之后,就可以将解码器移除,已经训练好的编码器可以用来作为有监督学习的初始特征提取模型。而解码器就可以用来将低维特征变成高维特征,用作生成模型。

 在变分自编码器(VAE)的模型架构中,编码器和解码器的设计与传统自编码器有所不同,VAE 通过引入潜在空间的概率分布来增强生成能力和灵活性。在传统的自编码器(Auto-Encoder)中,编码器的任务是将输入数据映射为一个固定的潜在向量。而在 VAE 中,编码器的任务是将输入数据映射到潜在空间中的一个概率分布,通常假设该分布是高斯分布。为此,编码器输出两个值:

  • 均值(Mean)\mu = (\mu_1, \mu_2, \mu_3)
  • 标准差(Standard Deviation) \sigma = (\sigma_1, \sigma_2, \sigma_3)

这两个值定义了潜在空间中潜在变量的分布(均值和方差)。标准差 \sigma_i 的作用是控制噪声的大小,为了确保标准差为正,通常会将输出的\sigma_i 转化为 \exp(\sigma_i),这样可以确保标准差为正值。接着,随机噪声(如 \epsilon = (\epsilon_1, \epsilon_2, \epsilon_3))会根据这个标准差进行加权,最终得到潜在变量的编码 c = (\mu_1 + \epsilon_1 \cdot \exp(\sigma_1), \mu_2 + \epsilon_2 \cdot \exp(\sigma_2), \mu_3 + \epsilon_3 \cdot \exp(\sigma_3)),即编码器的输出就是一个概率分布。这种设计使得编码器的输出不仅仅是一个固定的潜在表示,而是一个关于潜在变量的分布,通过采样潜在空间中的点(即潜在变量),解码器将其映射回数据空间

VAE的解码器(Decoder)的任务是将潜在空间中的点映射回数据空间,生成与原始输入数据相似的样本。解码器接收来自潜在空间的采样点 z(即由编码器输出的均值和标准差生成的潜在变量),然后尝试重构输入数据 x,使其尽可能与原始输入数据相似。

VAE本质上就是一个高斯混合模型,即任何一个数据的分布,都可以看作是若干高斯分布的叠加。如果P(X)代表一种分布的话,存在一种拆分方法能让它表示成图中若干浅蓝色曲线对应的高斯分布的叠加。当拆分的数量达到512时,其叠加的分布相对于原始分布而言,误差是非常非常小的了。

于是我们可以利用这一理论模型去考虑如何给数据进行编码。一种最直接的思路是,直接用每一组高斯分布的参数作为一个编码值实现编码。m代表着编码维度上的编号,譬如实现一个512维的编码,m的取值范围就是1,2,3……512。m会服从于一个概率分布P(m),多项式分布。现在编码的对应关系是,每采样一个m,其对应到一个小的高斯分布N(μm ,Σm),P(X)就可以等价为所有的这些高斯分布的叠加,即:其中,m~P(m),x|m ~ N(μm ,Σm)。上述的这种编码方式是非常简单粗暴的,它对应的是我们之前提到的离散的、有大量失真区域的编码方式

对目前的编码方式进行改进之后使得它成为连续有效的编码。现在我们的编码换成一个连续变量z,我们规定z服从正态分布N(0,1),并不一定要选用N(0,1),其他的连续分布都是可行的。每对于一个采样z,会有两个函数μ和σ,分别决定z对应到的高斯分布的均值和方差,然后在积分域上所有的高斯分布的累加就成为了原始分布P(X),即:其中z~N(0,1),x|z ~ N(μ(z),σ(z))。

        接下来就可以求解这个式子。由于P(z)是已知的,P(x|z)未知,而x|z~N(μ(z),σ(z)),于是我们真正需要求解的,是μ和σ两个函数的表达式。又因为P(x)通常非常复杂,导致μ和σ难以计算,我们需要引入两个神经网络来帮助我们求解。
  Decoder求解的是μ和σ两个函数,这等价于求解P(x|z),因为x|z ~ N(μ(z),σ(z))。Encoder求解的结果是q(z|x),q可以代表任何分布,目的是辅助第一个Decoder求解P(x|z)。

        在变分自编码器(VAE)的推导过程中,我们的目标是最大化数据的对数似然 \log P(x)。然而,直接优化 \log P(x) 是困难的,因为计算 P(x) 的值需要对潜在变量 z 进行求和或积分,这个过程非常复杂。为了解决这个问题,VAE 引入了一个变分分布 q(z∣x) ,通过下界的方式近似最大化对数似然。首先,我们希望最大化对数似然 \log P(x),但由于潜在变量 z 的存在,无法直接计算 P(x)。于是,我们通过引入潜在变量 z 来重写目标式:

\log P(x) = \log \int P(x|z) P(z) dz

        然后我们通过引入一个变分分布q(z|x) 来对积分进行近似:

\log P(x) = \log \int q(z|x) \frac{P(x|z) P(z)}{q(z|x)} dz

        接下来,根据 Jensen 不等式,可以得到 \log P(x) 的下界(称为 Evidence Lower Bound, ELBO):

\log P(x) \geq \mathbb{E}_{q(z|x)} \left[ \log \frac{P(x|z) P(z)}{q(z|x)} \right]

        这个下界由两部分组成,分别是:

  • 重构误差项 \mathbb{E}_{q(z|x)} \left[ \log P(x|z) \right]:表示在给定潜在变量 zz 的情况下,重构数据 xx 的可能性,类似于自动编码器的损失函数。
  • KL 散度项 \text{KL}(q(z|x) \| P(z)):表示变分分布 q(z|x) 与先验分布 P(z) 之间的差异。

        因此,我们得到了一个下界 L_b

L_b = \mathbb{E}_{q(z|x)} \left[ \log P(x|z) \right] - \text{KL}(q(z|x) \| P(z))

        在优化 VAE 时,我们实际上是在最大化 L_b,从而间接最大化 \log P(x)。通过对 ELBO 下界的分析,我们得到了 VAE 的损失函数。它由两部分组成:

  • 重构误差项:这个部分是通过解码器 P(x∣z)P(x|z) 来进行数据的重构,其目标是使得给定潜在变量 zz 时,数据 xx 的重构概率尽可能大。这个项类似于传统的自编码器损失。
  • KL 散度项:这个部分度量了变分分布 q(z|x) 与先验P(z) 之间的差异。优化过程通过最小化 KL 散度,确保变分分布 q(z|x) 更接近于先验分布 P(z),即潜在空间的分布趋向于先验分布。

        在 VAE 的训练过程中,解码器 P(x∣z) 和编码器 q(z∣x) 需要协调工作:

  • 解码器 P(x|z):它负责根据潜在变量 z 重构输入数据 x,其目标是最大化重构误差项,即尽量让 P(x∣z)P(x|z) 较大。
  • 编码器 q(z|x):它通过变分推断将输入数据 x 映射到潜在变量 zz 的分布,目的是使得 q(z∣x)与先验 P(z) 相接近,同时最大化 L_b

http://www.kler.cn/a/592599.html

相关文章:

  • 【Python】使用ImageEnhance提升图片画质
  • windows 10 系统配置Node
  • 使用htool工具导出和导入Excel表
  • AI 原生 IDE Trae 深度体验:SSHremote 功能如何重新定义远程开发与云原生部署
  • 基于Python+Django的旅游管理系统
  • 13-动态规划-最长公共子序列
  • CVPR2025 | TAPT:用于视觉语言模型鲁棒推理的测试时对抗提示调整
  • C++学习笔记(二十三)——STL标准库
  • 握手问题 第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
  • 通过C#脚本更改材质球的参数
  • Flutter TextField 从入门到精通:掌握输入框的完整指南
  • 【链表】一文搞定链表算法:从基础到实战
  • 在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问
  • 记:app启动更换系统语言,app会重走生命周期
  • 【vue3+vant】移动端 - 部门树下拉选择组件 DeptTreeSelect 开发
  • rip 协议详细介绍
  • vue 中常用操作数组的方法
  • 【Python 的发展历史】
  • 【2025】基于Springboot + vue实现的毕业设计选题系统
  • 优选算法系列(2.滑动窗口_下)