# GAN

<https://www.bilibili.com/video/av24011528?from=search&seid=11650623199975498039>

![](/files/-LqGmjagZaSYw73Znf4_)

## 基本思想

由一个生成模型和一个判别模型组成

> 生成模型用于学习真实样本数据的概率分布，并直接生成符合这种分布的数据，输入为随机分布的数据
>
> 判别模型的任务是指导生成模型的训练，判断一个输入样本数据是真实样本还是由生成模型生成的
>
> 在训练时，两个模型不断竞争，从而分别提高它们的生成能力和判别能力

例子

> 比如我们希望最终能生成卡通头像图片
>
> 输入是一个100维的向量，每个维度代表图像的某种特征，如1维表示人物头发长短（这些特征是生成器学到的）
>
> 经过生成器映射后变成新的向量，用于判别器的输入，同时也有可能输入真的卡通图像
>
> 判别器二分类判断这个输入是生成的还是真实的，不断博弈
>
> 最后如果效果好，准确率、错误率接近0.5；停止训练，撤销判别器
>
> 此时生成器就能生成接近真实的、以假乱真的图像
>
> 而输入还是随机向量，此时学到的真实映射，随机向量的某个维度很可能对应的就是图像的某个特征、不懂改变输入的向量，就能生成不同图像，如果某个维度决定了头发颜色，那么固定其它的，不断改变这个维度的值，就能生成只有头发颜色不一样，其它一样的图像

## 生成随机样本

比如生成服从高斯分布、均匀随机分布的一个向量，这个向量就是我们要放到GAN的生成器里面的初始输入数据

假设随机样本服从分布：$$p\_z(z)$$

## 生成器

生成模型将上面的随机样本映射到样本数据空间：$$G(z,\theta\_g)$$

> 这个映射根据随机噪声变量构造出服从某种概率（比如能生成手写数字的分布、卡通头像的分布，无法描述）分布的随机数

对于生成模型，要**最小化目标函数**：$$log(1-D(G(z)))$$

> 也就是希望D(G(z))尽可能接近1，也就是希望判别器把自己生成的数据尽可能判为1（真实数据标签），既尽可能欺骗判别器

## 判别模型

$$D(x,\theta\_d)$$

> 是一个二分类器，判定一个样本是真实的还是生成的，一般也用神经网络实现
>
> 训练目标是最大化判别准确率，即区分样本是真实数据还是由生成模型生成的
>
> 当这个样本被判定为真实数据时标记为1，判定为来自生成模型时标记为0

判别模型，要让真实样本尽量被判定为真实的，即**最大化**：$$logD(x)$$

> 也就是希望判别的真实样本x，D(x)接近1

## 目标函数

因为：

* 生成模型，**最小化目标函数**：$$log(1-D(G(z)))$$
* 判别模型，**最大化**：$$logD(x)$$

因此，目标函数为：

$$
min\_{G}max\_{D}=E\_{x \sim P\_{data}(x)}\[logD(x)]+E\_{z \sim P\_z(z)}\[log(1-D(G(z)))]
$$

解释：

* x为真实数据、z为生成器生成的数据
* 希望左边E最大化得到D、右边E最小化得到G
* 实际编程训练时，两个阶段是轮流训练的：
* > G生成样本->D判别类型，根据判别结果计算损失
  >
  > D要最大化$$logD(x)$$去更新参数（梯度上升法）
  >
  > G要最小化$$log(1-D(G(z)))$$去更新参数（梯度下降法）

## 训练

训练时采用分阶段优化策略进行优化，交替的优化生成模型和判别模型

随着训练的进行，最终达到平衡的状态、生成模型产生的样本与真实样本几乎没有差别，判别模型也无法准确的判断出一个样本是真实的还是生成模型生成的，此时的分类错误率为0.5，系统达到平衡，训练结束

step：

> 循环，对t = 1, ..., max\_iter
>
> 第一阶段：训练判别模型（生成模型此时不更新，只正向生成）
>
> > 循环，对i = 1, ..., k
> >
> > > 根据噪声服从的概率分布产生m个噪声数据z1,...,zm
> > >
> > > 根据样本数据服从的概率分布采样出m个样本x1,..., xm
> > >
> > > 用随机**梯度上升法**（求极大化）更新判别模型，判别模型参数梯度的计算公式为
> > >
> > > $$\nabla\_{\theta\_d}\frac{1}{m}\sum\_{i=1}^m\[log(D(x\_i))+log(1-D(G(z\_i)))]$$
> >
> > 结束循环
>
> 第二阶段：训练生成模型（判别模型此时不更新，只正向判断）
>
> > 根据噪声分布产生m个噪声数据z1,...,zm
> >
> > 用随机梯度下降法（极小化）更新生成模型，生成模型参数的梯度计算公式为：
> >
> > $$\nabla\_{\theta\_g}\frac{1}{m}\sum\_{i=1}^m\[log(1-D(G(z\_i)))]$$
>
> 结束循环


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://im-qianuxn.gitbook.io/pytorch/ji-suan-ji/shen-du-xue-xi-li-lun/gan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
