comfUI背后的技术——VAE

第一次知道VAE可能还是许嵩。当然,这里的VAE指的是变分自编码器(Variational Autoencoder, VAE)

Seq2Seq

在 Seq2Seq 框架提出之前,深度神经网络在图像分类等问题上取得了非常好的效果。在其擅长解决的问题中,==输入和输出通常都可以表示为固定长度的向量==,如果长度稍有变化,会使用填充Padding)等操作,其目的是将序列数据转换成固定长度的格式,以便于输入到需要固定长度输入的神经网络中。

但是,Padding可能引入的问题:例如在计算损失时可能需要特殊的处理来忽略这些补零的元素,以免它们影响模型的训练效果。这通常通过使用掩码(Mask)来实现,掩码可以指示哪些位置是补零的,以便在计算过程中忽略这些位置。然而许多重要的问题,例如机器翻译、语音识别、对话系统等,表示成序列后,其长度事先并不知道。

结构最重要的地方在于输入序列和输出序列的长度是可变的

Encoder-Decoder

Transformer的设计为Encoder-Decoder结构。其实和seq2seq是差不多的,只不过从名字上看,seq2seq关注的是输入输出的形式,Encoder-Decoder关注的是结构。

这里简单再回顾一下Transformer。对于ByteNet and ConvS2S,计算长距离的操作次数分别是指数和线性的,而Transformer把次数降低到了常数次。虽然位置注意力加权造成了有效分辨率的降低,但是可以通过多头注意力机制来弥补。

使用循环自注意力机制而非序列对齐的循环网络,已经被证明是有效的,Transformer则完全只使用self-attention计算输入输出的representations,而没有使用sequence aligned RNNs or convolution

encoder是把input sequence 的symbol representations转换为representations z,decoder是把symbols的一个个element转换为output sequence。网络是自回归的,这意味着之前产生的symbols可以作为下一个的额外输入。

下面这幅图的左右两边就是encoder and decoder:

encoder由6层layer堆叠得到,即上图中的N=6。每个layer又有两个sub-layers,分别是multi-head self-attention, 和position-wise fully connected feed- forward network,两个部分由又都有残差的连接:

class EncoderLayer(nn.Module):"Encoder is made up of self-attn and feed forward (defined below)"def __init__(self, size, self_attn, feed_forward, dropout):super(EncoderLayer, self).__init__()self.self_attn = self_attnself.feed_forward = feed_forwardself.sublayer = clones(SublayerConnection(size, dropout), 2)self.size = sizedef forward(self, x, mask):"Follow Figure 1 (left) for connections."x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask))。# 注意力部分的残差return self.sublayer[1](x, self.feed_forward)  # ffn的残差# SublayerConnection 不光包含了残差,还有layerNorm,Dropout

decoder也是6层堆叠,不过sublayer是3层,多出来的multi-head attention负责处理encoder的输z出。

class DecoderLayer(nn.Module):"Decoder is made of self-attn, src-attn, and feed forward (defined below)"def __init__(self, size, self_attn, src_attn, feed_forward, dropout):super(DecoderLayer, self).__init__()self.size = sizeself.self_attn = self_attnself.src_attn = src_attnself.feed_forward = feed_forwardself.sublayer = clones(SublayerConnection(size, dropout), 3)def forward(self, x, memory, src_mask, tgt_mask):"Follow Figure 1 (right) for connections."m = memoryx = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask))。# 关注selfx = self.sublayer[1](x, lambda x: self.src_attn(x, m, m, src_mask)) # 关注encoder的输出return self.sublayer[2](x, self.feed_forward) # forward之后加残差

注意,在self attention的部分是带masked的,这样是为了避免当前位置关注到后续位置:

prevent positions from attending to subsequent positions subsequent positions。

使用mask二维的行和列分别表示当前位置和对应能注意到的最远的位置,所以画出来就是一个上三角矩阵:

def subsequent_mask(size):"Mask out subsequent positions."attn_shape = (1, size, size)subsequent_mask = np.triu(np.ones(attn_shape), k=1).astype('uint8')return torch.from_numpy(subsequent_mask) == 0plt.figure(figsize=(5,5))
plt.imshow(subsequent_mask(20)[0])

这个mask机制,还有输出embding偏移一个位置的机制一起作用,保证了输出只受前面的输出的影响。

AE(自动编码器Auto-Encoder)

Encoder-Decoder是把输入和输出做映射,所以适用于自监督学习也可以监督学习。自编码器就是针对自监督或者无监督学习的,所以它关注是自我的重构,所以通常是一个对称的网络结构,即编码器和解码器具有相似的结构,甚至是对称的。

理想的AE的输入和输出是完全一样的,那么好好的图像我处理半天还是原来的图像,意义何在呢?其实在Encoder和Decoder之间还有一个Bottleneck,它存在是为了限制从编码器到解码器的信息流,因此只允许最重要的信息通过。

由于瓶颈的设计方式是将图像所拥有的最大信息捕获在其中,所以AE的作用之一就是来降维,或者说压缩图像。这种AE其实就是不完整的自动编码器 Undercomplete autoencoders。

此外,还有去噪自动编码器 Denoising autoencoders:

在对自动编码器进行去噪处理时,我们输入图像的嘈杂版本,其中噪声是通过数字更改添加的。噪声图像被馈送到编码器-解码器架构,并将输出与真值图像进行比较。

你会发现,这其实就是图像去噪领域中最常用的结构。背后的原理是自动编码器通过将输入数据映射到低维流形(如在不完整的自动编码器中)来执行此操作,其中噪声滤波变得更加容易。

VAE( 变分自编码器Variational Auto-Encoder)

终于到了VAE。VAE最开始由Kingma and Welling在2014年提出,论文是Auto-Encoding Variational Bayes。在Tutorial on Diffusion Models for Imaging and Vision中,第一节讲的就是VAE,甚至在DDPM之前。

既然是AE的一种,那在结构上仍然有encoder和decoder,目的和作用仍然是通过重建自身学习图像的特征表示。VAE的核心特点在于,它不是将输入直接映射到一个固定的向量,而是将输入映射到一个概率分布上。这种方法使得VAE不仅能够进行数据重构,还能生成新的、与输入数据相似的数据。

由encoder编码的 z称为隐式变量latent variable,z充当了encoder和decoder之间承上启下的工作,一方面从x中压缩信息,虽然是有损的lossy,但是却封装了x的重要的高级语义信息;另一方面z又是decoder的seed,决定了生成的结果。我们熟知的JPEG压缩中的DCT变换其实就是得到z的过程,余弦的系数就是z,而DCT和逆DCT就是encoder和decoder;

x,z都可以分别使用概率分布来表示,并且通过条件转移概率来表示。所以VAE其实是一个贝叶斯网络。在VAE的假设之中,我们常常直接将分布p(z)假设为一个零均值、单位方差的高斯分布  ,真实的分布可能与这个假设相差甚远,但是做这样一个假设有着多个优点:1.高斯分布的线性变换依旧为一个高斯分布,数据处理简单;2.只要将高斯分布通过足够复杂的映射函数,就能得到任何一种分布.

一个例子就是高斯混合模型,GMM,Gaussian Mixture Module,它是多个高斯模型的加权:

可以得到x的概率分布,这是一个total probability全概率的形式:

k表示第k个cluster,p_Z(k)表示第k类的权重。

那么encoder做的就是从x提取z,就是在判断x属于哪个类,把样本映射到了一个分布上。decoder就会在那一类z中做一个采样。恢复的过程仍然是贝叶斯全概率的形式:

theta是z的分布相关参数。但是上面的公式需要找到所有z的可能取值,这是不可能的,所以VAE引入贝叶斯变分中近似表示的方法,使用NN来表示encoder和decoder,相关参数分别使用\phi\theta来表示:

Variational Autoencoder中的贝叶斯网络模型,实线是生成过程,虚线是难处理的后验p(z|x)的近似估计q(z|x)

为了得到这两个参数,就需要设立一个目标函数或者说loss函数。我们在这使用的损失函数被称为“证据下界”(Evidence Lower Bound, ELBO)

除了基于KL散度的ELBO,VAE还使用了重参数化,模拟采样,使得网络可以反向传播。从而可以训练:

EncoderNetworkϕ的作用就是估计z的均值和方差:

和使用自编码用于图像压缩不同,VAE在训练完成后只使用decoder的部分,这样只要给了隐变量z,就可以生成图像:

GAN生成的质量好,但是和数据的关联度不大,VAE正好相反,可以和GAN可以互补。在stable diffusion中,VAE 可以使生成的图像颜色更鲜艳、细节更清晰,改善面部和手部的表现。

VAE也有很多扩展,可以参考https://zhuanlan.zhihu.com/p/682709613

贝叶斯变分(变分贝叶斯,Variational Bayes,VB)是一类用于贝叶斯估计和机器学习领域的近似计算技术,其核心思想是通过引入一个易于处理的近似分布来逼近复杂的后验分布,从而简化计算过程并实现对数据潜在分布的推断。

reference:

1.变分自编码器(VAE)在AIGC中的应用及其技术解析-腾讯云开发者社区-腾讯云

2.https://zhuanlan.zhihu.com/p/26819995884

3.https://www.zhihu.com/question/1891410702348027478/answer/1893822993005802489

4.【教程】深度学习中的自动编码器Autoencoder是什么?-腾讯云开发者社区-腾讯云

5.https://arxiv.org/pdf/2403.18103

6.变分自编码器VAE - 小舟渡河 - 博客园Transformer 学习笔记 | Seq2Seq,Encoder-Decoder,分词器tokenizer,attention,词嵌入-阿里云开发者社区

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【序列晋升】21 Spring Cloud Gateway 云原生网关演进之路

Spring Cloud Gateway作为Spring生态系统中的核心组件,已成为微服务架构中的首选API网关解决方案。它基于响应式编程模型,提供高性能、可扩展的路由管理和跨领域功能,解决了传统微服务架构中的接口聚合、安全管控和流量控制等核心问题。与此同…

“HEU-AUTO”无线上网使用指南

本文针对笔记本电脑 笔者电脑型号为:2025联想拯救者Y9000p 5060步骤1:点击开始菜单,点击设置,如图步骤2:在Windows设置菜单中,点击“网络和Internet”选项,如下图:步骤3:…

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

在微信小程序开发中,集成蓝牙打印机实现中文打印是常见需求,但中文文本常因编码不匹配(如UTF-8与GBK冲突)导致乱码问题。本文详细解释如何利用iconv-lite库高效处理中文编码转换,确保打印内容正确显示。文章结构清晰,逐步引导您解决问题,代码示例基于实际项目验证。 1. …

GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成

GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成理论部分安装知识图谱生成测试将数据导入到Neo4j图数据库可视化将GraphRAG与Dify集成理论部分 https://guoqingru.blog.csdn.net/article/details/150771388?spm1011.2415.3001.5331安…

MongoDB 聚合管道(Aggregation)高级用法:数据统计与分析

MongoDB 聚合管道(Aggregation)高级用法:数据统计与分析第一章:聚合管道核心概念与架构设计1.1 聚合管道的本质与价值1.2 管道阶段深度解析1.3 执行引擎与优化机制第二章:高级分组与多维统计分析2.1 复合分组与层次化分…

Twitter舆情裂变链:指纹云手机跨账号协同机制提升互动率200%

——基于动态设备指纹与智能行为仿真的裂变增长体系​​一、Twitter舆情运营的三大核心挑战​账号关联风险​同一设备/IP操作多账号触发平台风控,封号率高达65%,舆情响应链路断裂固定设备参数(如GPU型号/屏幕分辨率)导致账号权重暴…

【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注

停车场车辆(车位)识别数据集概述 数据集包含12415张从监控摄像头画面中截取的停车场图像,涵盖晴天、阴天和雨天场景,标注类别包含车位占用、空车位2类。 标注格式:yolo txt 标注工具:labelme/labelimg 分辨率:416*416 一、学术研究的奠基与迭代 停车场车辆(车位)…

苍穹外卖项目笔记day02

接下来的笔记都会以难点与一些不常见的方法为主,一些重复的crud并不会出现哦 ThreadLocal类 ThreadLocal 并不是一个Thread,而是Thread的局部变量,它用于创建线程局部变量。 核心思想:每个线程都有自己独立的变量副本。这意味着,即…

设计模式12-适配器模式

定义 Adapter Partern: 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 场景 系统需要使用现有的类,而这些类的接口不符合系统的需要。 典型场景:集成第三方库、遗留系统代…

VGG改进(6):基于PyTorch的VGG16-SE网络实战

1. 引言:注意力机制在计算机视觉中的重要性近年来,深度学习在计算机视觉领域取得了巨大成功,从图像分类到目标检测,各种复杂任务都获得了前所未有的性能提升。然而,传统的卷积神经网络(CNN)在处…

[电商网站-动态渲染商品-尺寸、尺码、颜色图片等];库存缺货状态动态对应。

目录 描述: 数据结构 组件代码文件 描述: 自动处理SKU数据生成规格属性列表 支持用户选择不同规格组合 智能禁用无库存选项 自动匹配当前选择对应的SKU信息 通过视觉样式区分可选/不可选状态 该组件采用Vue实现,通过计算属性和响应式数据…

论《运动战》

运动战的本质是以机动换主动,以时间换空间,通过高度的流动性、主动的位移和灵活的战术选择,在动态中创造并捕捉战机,最终以较小的代价换取最大的胜利。它是一种非对称的、主动的作战哲学,其核心不在于一城一地的得失&a…

DVWA靶场通关笔记-CSRF(Impossible级别)

目录 一、查看源码 二、功能分析 三、CSRF防范分析 1、CSRF令牌验证机制 (1)核心原理 (2)防范机制 2、旧密码确认防御实现 (1)核心原理 (2)为什么旧密码确认能有效防范CSRF…

深层语义在自然语言处理中的理论框架与技术融合研究

摘要本文章系统阐述了深层语义在自然语言处理(NLP)领域的定义、特征及其与知识图谱和大型预训练语言模型的融合方法。基于截至2025年8月的最新研究成果,报告深入分析了深层语义的多维度特性、技术实现路径以及面临的挑战,为研究人…

深入解析HarmonyOS:UIAbility与Page的生命周期协同

深入解析HarmonyOS:UIAbility与Page的生命周期协同 在HarmonyOS应用开发中,理解UIAbility和Page的生命周期是构建高质量应用的关键。本文将深入探讨这两大核心概念的生命周期及其协同工作机制,帮助开发者更好地管理应用资源、优化用户体验。…

规律作息 + 养成好的习惯 + 考研倒计时 111 天 + 线面积分入门 1 下半部分

文章目录前言杂进度10.4空间直线一般式方程对称式方程 点向式方程参数式方程转换位置关系10.510.610.7平面束方程10.810.9总结前言 规律作息! 杂 欲买桂花同载酒,终不似,少年游。 进度 向量代数和空间解析几何。 10.4 这题就是算一个…

序列容器(vector,deque,list)

STL 序列式容器(vector、deque、list、array、forward_list)的核心特征是按插入顺序存储元素(元素的逻辑顺序与物理存储顺序一致) vector 下图是底层原理 具体点击链接vector介绍 deque(双端队列) 在 C STL 中,deque…

Time-MOE添加MLP分类头进行分类任务

文章目录一、背景:Time-MoE 的 4096 长度限制二、数据准备(以帕金森二分类为例)三、标签对齐(弱监督)四、类别不平衡 & 数据划分五、模型微调(冻结 backbone,只训 MLP 头)六、评…

朴素贝叶斯:用 “概率思维” 解决分类问题的经典算法

一、贝叶斯:从 “逆概” 问题走来的数学家要理解朴素贝叶斯,得先回到它的 “源头”—— 贝叶斯公式,以及它要解决的核心问题:逆概问题。1. 贝叶斯的 “生不逢时”托马斯・贝叶斯(Thomas Bayes,约 1701-1761…

Qt/C++开发监控GB28181系统/视频点播主码流子码流/动态切换码流/支持海康大华/全网唯一

一、前言说明 目前市面上的国标监控系统,没有看到可以切换码流的,都是默认主码流,包括easynvr、livegbs、wvp等,很是奇怪为什么他们不做呢?难道没有用户反馈需要这个?我这就遇到过一些用户需要能够切换主码…