disentangling-vae
disentangling-vae 是一个基于 PyTorch 的开源研究工具,旨在深入探索变分自编码器(VAE)中潜在表示的“解耦”特性。在深度学习中,模型往往难以将数据的独立特征(如形状、颜色、姿态)分离开来,而该工具通过对比五种主流损失函数(包括标准 VAE、β-VAE、FactorVAE 及β-TCVAE 等),帮助研究者理解不同算法如何提升特征分离的效果。
它主要解决了学术界在评估和比较不同解耦方法时缺乏统一基准的问题。disentangling-vae 不仅提供了完整的训练代码,还集成了互信息差距(MIG)等专业评估指标与可视化功能,能够自动生成潜在维度遍历的动态图,直观展示模型学习到的特征结构。
这款工具特别适合人工智能研究人员、算法工程师及相关领域的学生使用。无论是想要复现经典论文实验,还是希望在同一架构下公平对比不同损失函数的性能,都能从中获得高效支持。其核心亮点在于“单一架构对比”设计,确保了实验变量的严格控制,同时支持 CPU 与 GPU 运行,并预置了 MNIST、CelebA 等多种数据集的实验配置,大大降低了复现前沿研究的门槛。
使用场景
某计算机视觉团队正在开发一个基于生成式 AI 的虚拟时尚试衣系统,需要模型能够独立控制人物图像中的姿态、发型和服饰等特征,以生成高质量的个性化穿搭预览。
没有 disentangling-vae 时
- 特征耦合严重:使用标准 VAE 训练时,潜变量相互纠缠,试图改变模特的“发型”往往会意外扭曲其“面部表情”或“身体姿态”。
- 调试成本高昂:团队难以判断是模型架构问题还是损失函数选择不当,缺乏统一框架来对比 $\beta$-VAE、FactorVAE 等不同解耦策略的效果。
- 缺乏量化评估:仅靠肉眼观察生成结果,无法通过互信息间隙(MIG)等指标客观衡量特征分离程度,导致优化方向模糊。
- 可视化困难:缺少自动化的潜空间遍历工具,难以直观向非技术背景的产品经理展示模型是否真正学会了独立特征控制。
使用 disentangling-vae 后
- 实现精准控制:通过集成 $\beta$-TCVAE 或 FactorVAE 等损失函数,成功将姿态、纹理和形状分离到独立的潜变量维度,实现了“只换衣服不改脸”的精准编辑。
- 高效策略对比:利用工具内置的单架构对比功能,快速在同一数据集上测试了 5 种不同损失函数,迅速锁定了最适合时尚数据的 $\beta$-VAE$_B$ 配置。
- 科学量化迭代:直接输出 MIG 和对齐度量指标,团队得以用数据驱动的方式监控训练进度,将特征解耦度提升了 40%。
- 直观成果展示:自动生成的潜变量遍历 GIF 清晰展示了每个维度控制的单一语义特征,极大降低了内部沟通成本并加速了产品演示准备。
disentangling-vae 通过提供标准化的解耦实验框架与量化指标,将原本依赖直觉的黑盒调优转化为可度量、可复现的科学工程流程。
运行环境要求
- 未说明
非必需(支持 CPU 和 GPU 运行),具体型号、显存大小及 CUDA 版本未说明
未说明

快速开始
解耦VAE

此仓库包含用于研究VAE中解耦现象的代码(训练、指标计算、绘图),并使用单一架构比较5种不同的损失函数(差异总结):
- 来自《变分贝叶斯自动编码》的标准VAE损失
- 来自《β-VAE:利用约束变分框架学习基本视觉概念》的β-VAEH
- 来自《理解β-VAE中的解耦》的β-VAEB
- 来自《通过因子分解实现解耦》的FactorVAE
- 来自《在变分自编码器中分离解耦源》的β-TCVAE
注意事项:
- 已测试兼容Python 3.6及以上版本
- 已测试支持CPU和GPU
目录:
安装
# 克隆仓库
pip install -r requirements.txt
运行
使用python main.py <模型名称> <参数>来训练和/或评估模型。例如:
python main.py btcvae_celeba_mini -d celeba -l btcvae --lr 0.001 -b 256 -e 5
您也可以使用-x <实验>来运行预定义的实验及超参数,这些超参数可在hyperparam.ini中找到。每个实验的预训练模型可从results/<实验>目录中获取(通过./bin/train_all.sh脚本生成)。
输出
这将创建一个名为results/<保存名称>/的目录,其中包含:
- model.pt:训练结束时的模型。
- model-
i.pt:每经过i次迭代后保存的模型检查点,默认每10次保存一次。 - specs.json:运行程序时使用的参数(默认参数及通过命令行修改后的参数)。
- training.gif:训练过程中每一epoch的潜在空间维度Z的遍历动画GIF。
- train_losses.log:训练期间计算的所有(子)损失。
- test_losses.log:训练结束后以评估模式运行时计算的所有(子)损失(不进行采样)。
- metrics.log:互信息差距指标和轴对齐指标。仅当指定
--is-metric时才会计算(较慢)。
帮助
用法:main.py ...
PyTorch实现与评估解耦变分自编码器及其指标。
可选参数:
-h, --help 显示此帮助信息并退出
通用选项:
name 模型名称,用于存储或加载。
-L, --log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}
日志级别。(默认:info)
--no-progress-bar 禁用进度条。(默认:False)
--no-cuda 即使有CUDA设备也禁用CUDA训练。(默认:False)
-s, --seed SEED 随机种子。可以设置为`None`以获得随机行为。(默认:1234)
训练特定选项:
--checkpoint-every CHECKPOINT_EVERY
每隔n个epoch保存一次训练好的模型检查点。(默认:30)
-d, --dataset {mnist,fashion,dsprites,celeba,chairs}
训练数据路径。(默认:mnist)
-x, --experiment {custom,debug,best_celeba,VAE_mnist,VAE_fashion,VAE_dsprites,VAE_celeba,VAE_chairs,betaH_mnist,betaH_fashion,betaH_dsprites,betaH_celeba,betaH_chairs,betaB_mnist,betaB_fashion,betaB_dsprites,betaB_celeba,betaB_chairs,factor_mnist,factor_fashion,factor_dsprites,factor_celeba,factor_chairs,btcvae_mnist,btcvae_fashion,btcvae_dsprites,btcvae_celeba,btcvae_chairs}
预定义的实验任务。若非`custom`,则会覆盖其他部分参数。(默认:custom)
-e, --epochs EPOCHS 最大训练轮数。(默认:100)
-b, --batch-size BATCH_SIZE
训练批次大小。(默认:64)
--lr LR 学习率。(默认:0.0005)
模型特定选项:
-m, --model-type {Burgess}
使用的编码器和解码器类型。(默认:Burgess)
-z, --latent-dim LATENT_DIM
潜在变量的维度。(默认:10)
-l, --loss {VAE,betaH,betaB,factor,btcvae}
使用的VAE损失函数类型。(默认:betaB)
-r, --rec-dist {bernoulli,laplace,gaussian}
每个像素所使用的似然分布形式。(默认:伯努利)
-a, --reg-anneal REG_ANNEAL
渐进式添加正则化项的退火步数。具体退火内容因损失而异。(默认:0)
BetaH特有参数:
--betaH-B BETAH_B KL散度项的权重(论文中的beta)。(默认:4)
BetaB特有参数:
--betaB-initC BETAB_INITC
初始退火容量。(默认:0)
--betaB-finC BETAB_FINC
最终退火容量。(默认:25)
--betaB-G BETAB_G KL散度项的权重(论文中的gamma)。(默认:1000)
factor VAE特有参数:
--factor-G FACTOR_G TC项的权重(论文中的gamma)。(默认:6)
--lr-disc LR_DISC 判别器的学习率。(默认:5e-05)
beta-tcvae特有参数:
--btcvae-A BTCVAE_A MI项的权重(论文中的alpha)。(默认:1)
--btcvae-G BTCVAE_G 维度级KL项的权重(论文中的gamma)。(默认:1)
--btcvae-B BTCVAE_B TC项的权重(论文中的beta)。(默认:6)
评估特定选项:
--is-eval-only 是否仅使用预先计算好的模型`name`进行评估。(默认:False)
--is-metrics 是否计算解耦指标。目前仅适用于`dsprites`数据集,因为它是唯一已知真实变化因素的数据集。(默认:False)
--no-test 是否不计算测试损失。(默认:False)
--eval-batchsize EVAL_BATCHSIZE
评估时的批次大小。(默认:1000)
绘图
使用 python main_viz.py <model-name> <plot_types> <param> 可以利用预训练模型进行绘图。例如:
python main_viz.py btcvae_celeba_mini gif-traversals reconstruct-
traverse -c 7 -r 6 -t 2 --is-posterior
这会将图表保存在模型目录 results/<model-name>/ 中。所有实验生成的图表都位于各自的目录中(通过 ./bin/plot_all.sh 脚本创建)。
帮助信息
用法: main_viz.py ...
用于使用 `disvae` 的预训练模型进行绘图的命令行界面
位置参数:
name 模型名称,用于存储和加载。
{generate-samples,data-samples,reconstruct,traversals,reconstruct-traverse,gif-traversals,all}
需要生成的所有图表类型。`generate-samples`: 随机解码样本。`data-samples`: 数据集中的样本。`reconstruct`: 前半部分为原始样本,后半部分为对应的重建样本。`traversals`: 沿着最重要的几个潜在维度进行遍历,每列展示来自先验或后验分布的不同样本。`reconstruct-traverse`: 第一行是原始样本,第二行是重建样本,其余行是遍历结果。`gif-traversals`: 由多张动图组成的网格,行代表潜在维度,列代表示例,每张动图展示后验分布的遍历过程。`all`: 运行所有类型的图表。
可选参数:
-h, --help 显示帮助信息并退出
-s, --seed SEED 随机种子。可以设置为 `None` 以获得随机行为。(默认值:None)
-r, --n-rows N_ROWS 可视化时使用的行数(如果适用)。(默认值:6)
-c, --n-cols N_COLS 可视化时使用的列数(如果适用)。(默认值:7)
-t, --max-traversal MAX_TRAVERSAL
潜在变量遍历时的最大位移量。假设遍历是对称的。若 `m>=0.5`,则采用绝对值遍历;若 `m<0.5`,则基于分布的百分比(分位数)进行遍历。例如,在先验分布中,分布为标准正态分布,因此 `m=0.45` 对应于绝对值 `1.645`,因为 `2m=90%` 的标准正态分布在 `-1.645` 到 `1.645` 之间。需要注意的是,在后验分布中,分布不再是标准正态分布。(默认值:2)
-i, --idcs IDCS [IDCS ...]
放置在样本开头的图像索引列表。(默认值:空列表)
-u, --upsample-factor UPSAMPLE_FACTOR
图像上采样的缩放因子(如果适用)。(默认值:1)
--is-show-loss 在图表中显示损失值(如果适用)。(默认值:False)
--is-posterior 使用后验分布而非先验分布进行遍历。(默认值:False)
示例
以下是一些你可以生成的图表示例:
python main_viz.py <model> reconstruct-traverse --is-show-loss --is-posterior第一行是原始样本,第二行是重建样本,其余行是潜在变量遍历结果。以btcvae_dsprites为例:
python main_viz.py <model> gif-traversals由多张动图组成的网格,行代表潜在维度,列代表示例,每张动图展示后验分布的遍历过程。以btcvae_celeba为例:
使用
bin/plot_all.sh脚本生成的动图网格。网格的列对应不同的数据集(除 FashionMNIST 外),行对应不同的模型(顺序为:标准 VAE、β-VAEH、β-VAEB、FactorVAE、β-TCVAE):
更多示例,请参阅预先定义的实验所生成的所有图表,它们都存放在各自的目录中(通过 ./bin/plot_all.sh 脚本创建)。
数据
当前可用的数据集包括:
首次运行时,数据集将会被下载并存储在 data 目录下,供后续使用。下载可能需要一些时间,且如果下载链接发生变化,可能会导致无法继续下载。在这种情况下,您可以:
- 提交一个问题报告。
- 在
utils/datasets.py文件中修改您所需数据集的 URL(请记得提交一个 Pull Request :) )。 - 手动下载数据并以相同文件名保存(不推荐)。
我们的贡献
除了复现上述论文之外,我们还提出并研究了以下内容:
轴对齐度量指标
由于定性评估具有主观性和耗时性,因此不适合用来可靠地比较不同模型。近期的一些论文采用了基于真实变化因素 v 和潜在维度 z 的定量解耦度量方法。其中,互信息差距 (MIG) 是一种颇具吸引力的信息论度量指标,因为它无需使用任何分类器。在 dSprites 数据集中,我们有 10 个潜在维度和 5 个生成因素,若要使 MIG 达到 1,就需要让其中 5 个潜在维度精确地编码这些真实的变化因素,而其余 5 个则与前 5 个无关。
尽管长期来看我们希望使用类似 MIG 的指标,但目前大多数模型的得分并不理想,且难以明确其改进方向。因此,我们提出了轴对齐度量指标 AAM,该指标并不关注 z 编码了多少 v 的信息,而是关注每个 vk 是否仅由单个 zj 编码。例如,在 dSprites 数据集中,即使 z 只编码了形状 x 位置方差的 90%,只要这 90% 完全由单一潜在维度 zj 编码,就可以达到 AAM = 1。这一指标有助于更好地理解各个模型的优势和不足。形式化定义如下:

其中下标 (d) 表示第 d 个次序统计量,而 Ix 则通过经验分布和分层抽样来估计(类似于 MIG):

单一模型对比
该模型与所有损失函数解耦,因此在不修改损失函数的情况下,很容易对编码器/解码器进行修改。我们仅使用单一模型,以便更客观地比较不同的损失函数。所使用的模型来自论文《理解 β-VAE 中的解耦》,其架构如下所示:

损失函数说明
所有先前的损失函数都是以下损失函数的特例:

索引-代码互信息:潜在变量 z 与数据变量 x 之间的互信息。关于如何正确处理该项,学术界存在争议。从信息瓶颈的角度来看,这一项应当受到惩罚。而 InfoGAN 则通过增加互信息(负 α)取得了良好效果。最后,Wasserstein 自编码器 直接舍弃了该项。
总相关性(TC):潜在变量的联合分布与其边缘分布乘积之间的 KL 散度。即潜在空间各维度之间依赖性的度量。增大 β 值会迫使模型在数据分布中寻找统计独立的变化因子。
逐维 KL 散度:后验分布的每个维度与先验分布之间的 KL 散度。该项确保学习到一个接近先验分布的紧凑空间,从而能够采样生成新的样本。
不同损失函数在估算上述各项以及所使用的超参数方面存在差异:
- 标准 VAE 损失:α=β=ɣ=1。各项均通过闭式解精确计算(先验与后验之间的 KL 散度)。为最紧的下界。
- β-VAEH:α=β=ɣ>1。各项同样通过闭式解精确计算。只是在 KL 散度前增加了一个超参数(文中为 β)。
- β-VAEB:α=β=ɣ>1。与 β-VAEH 类似,但仅当三项偏离随训练过程逐渐增大的容量 C 时才予以惩罚。
- FactorVAE:α=ɣ=1,β>1。各项均通过闭式解精确计算。同样在 KL 散度前增加了一个超参数(文中为 β),并在标准 VAE 损失基础上添加了一个加权的总相关性项。总相关性采用分类器和密度比技巧进行估计。需要注意的是,他们论文中的 ɣ 在我们的框架中对应于 β+1。
- β-TCVAE:α=ɣ=1(尽管可以调整),β>1。概念上等同于 FactorVAE,但各项分别使用小批量分层采样进行估计。
引用
在学术研究中使用本仓库实现的任一模型时,请引用相应的论文(链接位于 README 的顶部)。若需引用此特定实现,可使用以下格式:
@misc{dubois2019dvae,
title = {Disentangling VAE},
author = {Dubois, Yann and Kastanos, Alexandros and Lines, Dave and Melman, Bart},
month = {march},
year = {2019},
howpublished = {\url{http://github.com/YannDubs/disentangling-vae/}}
}
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器