<commit_before>---
layout: post
title: VAE模型
date: 2018-04-04
categories: blog
tags: [DeepLearning, 生成模型]
description: 描述生成模型VAE
---

# VAE模型

## 什么是VAE

当我们谈论GAN的时候，往往会把VAE也一并拿出来说。在生成模型方面，这两个算是目前的大热门（尤其是GAN）。那么VAE究竟是什么呢？作为一个生成模型，它需要具备生成样本的能力（从$P(X)$分布中采样得到）。  
Variational Autoencoder（VAE）从名字上看，是由变分+自动编码器组成，不过它与我们所熟悉的Autoencoder还不一样，只是在模型结构上借鉴了encoder和decoder的思路。并且，这两部分的作用也不同，在autoencoder中，encoder用来对输入数据压缩编码，decoder则还原为原来的数据；而在VAE中，encoder将输入数据$x$“压缩”为隐变量$z$，decoder将隐变量“重构”为**新的样本**。  
经过了以上的介绍，相信大家对VAE有一个初步的认识。那么，接下来就是如何去构建这个网络（哪里用模型、哪里假设分布、损失函数用什么）。  
VAE与AE不同，AE虽然也是无监督学习，但它并不是一个生成模型，不具备泛化能力。当VAE中的$\sigma^2$为0时，表明随机变量$z$是一个确定性变量($z=\mu$)，那么，此时VAE就变成了AE。

现在，我们根据VAE的模型图，尝试从“常识”与“假设”上直接得到VAE的目标函数。

$$
L(\theta, \phi;x^{(i)})=KL(q_{\phi}(z \mid x^{(i)}) \ parallel p_{\theta}(z))-{\mathbb{E}}_{z \sim q_{\phi}(z \mid x^{(i)})}(logp_{\theta}(x^{(i)} \mid z))
$$

上面的loss function是针对一个样本而言的。其中，$\theta$与$\phi$就是我们需要学习的分布的参数。从公式可以看到，损失函数分为两部分：前面的部分为KL散度，它表示隐变量分布与我们想要的真实分布之间的差异；后面的部分表示decoder层通过隐变量得到样本的对数概率关于$q_{\phi}(z \mid x^{(i)})$均值。

### 左侧公式

假设$q_{\phi}(z \mid x^{(i)}) \sim {\Nu}(\mu, {\theta^2})$，$p_{\theta}(z) \ sim {\Nu}(0, 1)$，则左侧的KL散度可以写成：
<commit_msg>refresh<commit_after>---
layout: post
title: VAE模型
date: 2018-04-04
categories: blog
tags: [DeepLearning, 生成模型]
description: 描述生成模型VAE
---

# VAE模型

## 什么是VAE

当我们谈论GAN的时候，往往会把VAE也一并拿出来说。在生成模型方面，这两个算是目前的大热门（尤其是GAN）。那么VAE究竟是什么呢？作为一个生成模型，它需要具备生成样本的能力（从$P(X)$分布中采样得到）。  
Variational Autoencoder（VAE）从名字上看，是由变分+自动编码器组成，不过它与我们所熟悉的Autoencoder还不一样，只是在模型结构上借鉴了encoder和decoder的思路。并且，这两部分的作用也不同，在autoencoder中，encoder用来对输入数据压缩编码，decoder则还原为原来的数据；而在VAE中，encoder将输入数据$x$“压缩”为隐变量$z$，decoder将隐变量“重构”为**新的样本**。  
经过了以上的介绍，相信大家对VAE有一个初步的认识。那么，接下来就是如何去构建这个网络（哪里用模型、哪里假设分布、损失函数用什么）。  
VAE与AE不同，AE虽然也是无监督学习，但它并不是一个生成模型，不具备泛化能力。当VAE中的$\sigma^2$为0时，表明随机变量$z$是一个确定性变量($z=\mu$)，那么，此时VAE就变成了AE。

现在，我们根据VAE的模型图，尝试从“常识”与“假设”上直接得到VAE的目标函数。

$$
L(\theta, \phi;x^{(i)})=KL(q_{\phi}(z \mid x^{(i)}) \ parallel p_{\theta}(z))-{\mathbb{E}}_{z \sim q_{\phi}(z \mid x^{(i)})}(logp_{\theta}(x^{(i)} \mid z))
$$

上面的loss function是针对一个样本而言的。其中，$\theta$与$\phi$就是我们需要学习的分布的参数。从公式可以看到，损失函数分为两部分：前面的部分为KL散度，它表示隐变量分布与我们想要的真实分布之间的差异；后面的部分表示decoder层通过隐变量得到样本的对数概率关于$q_{\phi}(z \mid x^{(i)})$均值。

### 左侧公式

假设$q_{\phi}(z \mid x^{(i)}) \sim \mathcal{N}(\mu, {\sigma^2})$，$p_{\theta}(z) \ sim \mathcal{N}(0, 1)$，则左侧的KL散度可以写成：

{'fraction_non_alphanumeric': 0.20408163265306123, 'fraction_numerical': 0.011054421768707483, 'mean_word_length': 10.046948356807512, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5796932', 'n_tokens_mistral': 1671, 'n_tokens_neox': 1792, 'n_words': 96}