生成模型

给定数据集,希望生成模型产生与训练集同分布的新样本。对于训练数据服从\(p_{data}(x)\);对于产生样本服从\(p_{model}(x)\)。希望学到一个模型\(p_{model}(x)\)与\(p_{data}(x)\)尽可能接近。

这也是无监督学习中的一个核心问题——密度估计问题。有两种典型的思路:

  1. 显式的密度估计:显式得定义并求解分布\(p_{model}(x)\),如VAE。
  2. 隐式的密度估计:学习一个模型\(p_{model}(x)\),而无需显式定义它,如GAN。

VAE

AE

首先介绍下自编码器(Auto Encoder, AE),它将输入的图像X通过编码器encoder编码为一个隐向量(bottleneck)Z,然后再通过解码器decoder解码为重构图像X',它将自己编码压缩再还原故称自编码。结构如下图所示:

以手写数字数据集MNIST为例,输入图像大小为28x28,通道数为1,定义隐向量的维度(latent_dim)为1 x N,N=20。经过编码器编码为一个长度为20的向量,再通过解码器解码为28x28大小的图像。将生成图像X'与原始图像X进行对比,计算重构误差,通过最小化误差优化模型参数:

\[Loss = distance(X, X')
\]

一般distance距离函数选择均方误差(Mean Square Error, MSE)。AE与PCA作用相同,通过压缩数据实现降维,还能把降维后的数据进行重构生成图像,但PCA的通过计算特征值实现线性变换,而AE则是非线性。

VAE

如果中间的隐向量的每一分量取值不是直接来自Encoder,还是在一个分布上进行采样,那么就是VAE(Variational Auto Encoder),结构如下图所示:

还是上面的例子,这里的Z维度还是1 x 20,但是每一分量不是直接来自Encoder,而是在一个分布上进行采样计算,一般来说分布选择正态分布(当然也可以是其他分布)。每个正态分布的\(\mu\)与\(\sigma\)由Encoder的神经网络计算而来。关于Z上每一分量的计算,这里,\(\epsilon\)从噪声分布中随机采样得到。

\[z^{(i,l)}=\mu^{(i)}+\sigma^{(i)}\cdot\epsilon^{(l)}\space\mathrm{and}\space\epsilon^{(l)}\sim N(0,I)
\]

在Encoder的过程中给定x得到z就是计算后验概率\(q_\phi(z|x)\),学习得到的z为先验分布\(p_\theta(z)\),Decoder部分根据z计算x的过程就是似然估计\(p_\theta(x|z)\),训练的目的也是最大化似然估计(给出了z尽可能得还原为x)。

边缘似然度\(p_\theta(x)=\int p_\theta(z)p_\theta(x|z)\,{\rm d}z\),边缘似然度又是每个数据点的边缘似然之和组成:\(\log p_\theta(x^{(1)},\cdots,x^{(N)})=\sum_{i=1}^N\log p_\theta(x^{(i)})\),可以被重写为:

\[\log p_\theta(x^{(i)})={\rm D_{KL}}(q_\phi(z|x^{(i)})||p_\theta(z|x^{(i)}))+{\cal L}(\theta,\phi;x^{(i)})
\]

等式右边第二项称为边缘似然估计的下界,可以写为:

\[\log p_\theta(x^{(i)})\ge{\cal L}(\theta,\phi;x^{(i)})=\mathbb{E}_{z\sim q_\phi(z|x)}[-\log q_\phi(z|x)+\log p_\theta(x|z)]
\]

得到损失函数:

\[{\cal L}(\theta,\phi;x^{(i)})=-{\rm D_{KL}}(q_\phi(z|x^{(i)})||p_\theta(z))+\mathbb{E}_{z\sim q_\phi(z|x^{(i)})}[\log p_\theta(x^{(i)}|z)]
\]

GAN

生成对抗网络(Generative Adversarial Nets, GAN)需要同时训练两个模型:生成器(Generator, G)和判别器(Discriminator, D)。生成器的目标是生成与训练集同分布的样本,而判别器的目标是区分生成器生成的样本和训练集中的样本,两者相互博弈最后达到平衡(纳什均衡),生成器能够以假乱真,判别器无法区分真假。

生成器和判别器最简单的应用就是分别设置为两个MLP。为了让生成器在数据x学习分布\(p_g\),定义一个噪声分布\(p_z(z)\),然后使用生成器\(G(z;\theta_g)\)将噪声映射为生成数据x'(\(\theta_g\)是生成器模型参数)。同样定义判别器\(D(x;\theta_d)\),输出为标量表示概率,代表输入的x来自数据还是\(p_g\)。训练D时,以最大化分类训练样例还是G生成样本的概率准确性为目的;同时训练G以最小化\(\log(1-D(G(z)))\)为目的,两者互为博弈的双方,定义它们的最大最小博弈的价值函数\(V(G,D)\):

\[\min_G\max_DV(D,G)=\mathbb{E}_{x\sim p_{data}}[\log D(x)]+\mathbb{E}_{z\sim p_{z}}[\log(1-D(G(z)))]
\]

可以得到生成器与判别器的损失函数:

\[ \mathcal{L}_G = -\log(D(G(z))) \\
\mathcal{L}_D = -\log(D(x)) - \log(1 - D(G(z)))
\]

极端情况下如果D很完美,\(D(x)=1,D(G(z))=0\),最后两项结果都为0,但如果存在误分类,由于log两项结果会变为负数。随着G的输出越来越像x导致D误判,价值函数V也会随之变小。

计算它们的期望(\(\mathbb{E}_{x\sim p}f(x)=\int_xp(x)f(x){\rm d}x\)):

\[V(G,D)=\int_xp_{data}(x)\log D(x)\,{\rm d}x+\int_zp_z(z)\log(1-D(G(z)))\,{\rm d}z \\
=\int_xp_{data}(x)\log D(x)+p_g(x)\log(1-D(x))\,{\rm d}x
\]

当D取到最优解时,上面的最大最小博弈价值函数\(V(G,D)\)可以写为:

\[C(G)=\max_DV(G,D)= \\
\mathbb{E}_{x\sim p_{data}}[\log\frac{p_{data}(x)}{p_{data}(x)+p_g(x)}]+\mathbb{E}_{x\sim p_g}[\log\frac{p_g(x)}{p_{data}(x)+p_g(x)}]
\]

当\(p_g=p_{data}\),取到\(-\log4\),上式可以写成KL散度的形式:

\[C(G)=-\log4+{\rm KL}(p_{data}||\frac{p_{data}+p_g}{2})+{\rm KL}(p_g||\frac{p_{data}+p_g}{2})
\]

当\(p_g=p_{data}\)时,D取最小值也就是最优解。对于对称的KL散度,可以写成JS散度的形式:

\[C(G)=2\cdot{\rm JS}(p_{data}||p_g)-\log4
\]

参考文献

  1. PyTorch-VAE-vanilla_vae.py
  2. Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes." arXiv preprint arXiv:1312.6114 (2013).
  3. DALL·E 2(内含扩散模型介绍)【论文精读】
  4. Goodfellow, Ian, et al. "Generative adversarial nets." Advances in neural information processing systems 27 (2014).
  5. 【概率论】先验概率、联合概率、条件概率、后验概率、全概率、贝叶斯公式
  6. 机器学习方法—优雅的模型(一):变分自编码器(VAE)
  7. GAN论文逐段精读【论文精读】

生成模型的两大代表:VAE和GAN的更多相关文章

  1. GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)

    我对GAN"生成对抗网络"(Generative Adversarial Networks)的看法: 前几天在公开课听了新加坡国立大学[机器学习与视觉实验室]负责人冯佳时博士在[硬 ...

  2. tflearn kears GAN官方demo代码——本质上GAN是先训练判别模型让你能够识别噪声,然后生成模型基于噪声生成数据,目标是让判别模型出错。GAN的过程就是训练这个生成模型参数!!!

    GAN:通过 将 样本 特征 化 以后, 告诉 模型 哪些 样本 是 黑 哪些 是 白, 模型 通过 训练 后, 理解 了 黑白 样本 的 区别, 再输入 测试 样本 时, 模型 就可以 根据 以往 ...

  3. GAN实战笔记——第二章自编码器生成模型入门

    自编码器生成模型入门 之所以讲解本章内容,原因有三. 生成模型对大多数人来说是一个全新的领域.大多数人一开始接触到的往往都是机器学习中的分类任务--也许因为它们更为直观:而生成模型试图生成看起来很逼真 ...

  4. 深度|OpenAI 首批研究成果聚焦无监督学习,生成模型如何高效的理解世界(附论文)

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载,原文. 选自 Open AI 作者:ANDREJ KARPATHY, PIETER ABBEEL, GREG BRO ...

  5. ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文

    https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...

  6. 【图机器学习】cs224w Lecture 8 & 9 - 图神经网络 及 深度生成模型

    目录 Graph Neural Network Graph Convolutional Network GraphSAGE Graph Attention Network Tips Deep Gene ...

  7. Java轻量级业务层框架Spring两大核心IOC和AOP原理

    IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...

  8. 生成模型(Generative)和判别模型(Discriminative)

    生成模型(Generative)和判别模型(Discriminative) 引言    最近看文章<A survey of appearance models in visual object ...

  9. 生成模型(Generative Model)和 判别模型(Discriminative Model)

    引入 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出.这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X). 监督学习方法又可以 ...

  10. 文档主题生成模型(LDA)

    一.问题描述 1.1文本建模相关 统计文本建模的目的其实很简单:就是估算一组参数,这组参数使得整个语料库出现的概率最大.这是很简单的极大似然的思想了,就是认为观测到的样本的概率是最大的.建模的目标也是 ...

随机推荐

  1. ETL之apache hop系列3-hop Server环境部署与客户端发布管道工作流

    前言 该文档主要是apache hop 2.5的 Windows 10和Linux docker环境部署和客户端发布工作流和管道的相关内容 不使用Docker直接使用应用程序包,下载压缩包文件后,需要 ...

  2. 商品详情接口设计:使用API调用获取淘宝商品数据的完整方案

    ​ 在如今的电商时代,获取商品的详细信息是实现商业化应用的基础.本文将详细介绍如何通过API调用来获取淘宝商品数据,并提供一个完整的商品详情接口设计方案,包括代码示例.开发人员可以根据此方案快速实现商 ...

  3. Blazor前后端框架Known-V1.2.14

    V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...

  4. 完全可复制、经过验证的 Go 工具链

    原文在这里. 由 Russ Cox 发布于 2023年8月28日 开源软件的一个关键优势是任何人都可以阅读源代码并检查其功能.然而,大多数软件,甚至是开源软件,都以编译后的二进制形式下载,这种形式更难 ...

  5. SQL取上一条, 下一条记录方法

    如果我们需要取id为3的前后的1条记录.  就可以用以下方法 取上一条记录: select  *  from `表名` where `id`<3 order by `id` desc limit ...

  6. LeetCode155:最小栈,最简单的中等难度题,时间击败100%,内存也低于官方

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 最近运气不错,在LeetCode上白捡一道送 ...

  7. Hugging News #0912: Hugging Face 2 人入选时代周刊全球百大 AI 人物

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  8. SQL Server更改表字段顺序和表结构

    1.首先打开SqlServer,SSMS可视化工具.点击工具,再点选项. 2.在弹出的选项窗口中,点击Desinners,点击表设计和数据库设计器,将阻止保护勾去掉.点"确定" 3 ...

  9. Dockcer上传hub和配置国内镜像源

    Dockcer上传hub和配置国内镜像源 1.Dockcer上传hub 要将本地的Docker镜像上传到Docker镜像仓库,可以按照以下步骤操作: linux环境 1.创建用户 首先,确保你已经在D ...

  10. Forest轻量级框架的声明式使用

    1.Forest框架声明式接口的基础使用 1.1构建接口 ​ 在 Forest 中,所有的 HTTP 请求信息都要绑定到某一个接口的方法上,不需要编写具体的代码去发送请求.请求发送方通过调用事先定义好 ...