Skip to content

Commit

Permalink
Update 2024-07-04-GAMES001-NOTES-14.md
Browse files Browse the repository at this point in the history
  • Loading branch information
peng00bo00 committed Jul 4, 2024
1 parent ea647cb commit 75b0362
Showing 1 changed file with 84 additions and 2 deletions.
86 changes: 84 additions & 2 deletions _posts/2024-07-04-GAMES001-NOTES-14.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,98 @@ KL散度可以用来解决度量概率分布之间相似度的问题。在此基

在VAE模型中,数据分布$$p(x)$$和隐变量分布$$p(z)$$通过**编码器(encoder)****解码器(decoder)**关联在一起:

- 编码器将数据$$x$$映射为隐变量$$z$$,相当于计算条件概率$$p(z | x)$$
- 解码器将隐变量$$z$$重建为数据$$x$$,相当于计算条件概率$$p(x | z)$$
- 编码器将数据$$x$$映射为隐变量$$z$$,相当于计算条件概率$$p(z \vert x)$$
- 解码器将隐变量$$z$$重建为数据$$x$$,相当于计算条件概率$$p(x \vert z)$$

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/os5LrLe.png" width="100%">
</div>

有了条件概率后就可以计算样本数据$$x$$在VAE网络中的概率

$$
\pi_\theta (x) = \int p_\theta (x \vert z) p (z) \ \mathrm{d} z = \mathbb{E}_{z \sim p(z)} [p_\theta (x \vert z)]
$$

进而通过最小化KL散度来进行训练。然而,需要注意的是,在计算期望$$\mathbb{E}_{z \sim p(z)} [p_\theta (x \vert z)]$$时需要对$$z$$进行采样,通常需要非常多的样本才能保证计算结果的准确性。除此之外,我们还希望数据$$x$$和隐变量$$z$$之间保持有相对有序的对应关系。因此,需要借助编码器来规范$$z$$的行为。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/09wvIqE.png" width="100%">
</div>

具体来说,在VAE中使用两个神经网络来表示条件概率:

- 解码器$$D_\theta (z)$$输出$$p_\theta (x \vert z)$$的均值,而$$p_\theta (x \vert z)$$的方差一般规定为1。
- 编码器输出$$q_\phi (z \vert x)$$的均值和方差,这里假定了$$q_\phi (z \vert x)$$服从正太分布

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/ZBtODYG.png" width="100%">
</div>

这样,联合概率分布$$p(x, z)$$就有两种表达方式:

- 对隐变量$$z$$进行采样并利用解码器有$$p(x, z) = p_\theta (x \vert z) p(z)$$
- 对数据$$x$$进行采样并利用编码器有$$q(x, z) = q_\phi (z \vert x) p (x)$$

两种表示方法对应着同一个分布,因此可以使用KL散度$$D_{KL} (q(x, z) \Vert p(x, z))$$作为损失函数进行训练。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/FBYt3pv.png" width="100%">
</div>

### 损失函数

把KL散度进行展开并略去只关于样本分布$$p(x)$$的部分可以得到最终的损失函数为

$$
L = \mathbb{E}_{z \sim q_\phi (z \vert x_i)} \bigg[ \log{\frac{q_\phi (z \vert x_i)}{p(x_i, z)}} \bigg]
$$

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/jq25Sqd.png" width="100%">
</div>

实际上,上面定义的损失函数还对应着$$\log p(x)$$的下界,也即最大似然估计。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/Z1Sx5vG.png" width="100%">
</div>

继续对损失函数进行展开,可以将损失函数拆分为两部分:

$$
L = \mathbb{E}_{z \sim q_\phi (z \vert x_i)} [-\log{p_\theta (x_i \vert z)}] + D_{KL} (q_\phi (z \vert x_i) \Vert p(z))
$$

其中第一项对应着生成结果与原始数据之间的误差(重建误差),而第二项对应着两个正态分布之间的KL散度。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/lhspieW.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/3rfe61k.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/hmlNpWm.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/cLJ6Put.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/VRwYr0M.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/I2m6Grt.png" width="100%">
</div>

### 训练与生成

推导完VAE损失函数后就可以按照通常的神经网络来进行训练。而需要进行生成时只需要从标准正态分布进行采样,并送入解码器来得到新样本。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/lU1FNvf.png" width="100%">
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/B3ObRkt.jpg" width="100%">
</div>

VAE模型的一个缺陷在于它很难生成高质量的数据。对于图像生成任务,这表现为生成的图片大多比较"糊"。

<div align=center>
<img src="https://search.pstatic.net/common?src=https://i.imgur.com/ptH05lR.jpg" width="100%">
</div>

## Diffusion Model


## Reference

- [Lecture 15: 生成模型](https://www.bilibili.com/video/BV1MF4m1V7e3?p=14&vd_source=7a2542c6c909b3ee1fab551277360826)

0 comments on commit 75b0362

Please sign in to comment.