# [GAN] GAN&CGAN 理念與架構
###### tags: `GAN`
## GAN
偽造者(counterfeiter)就稱為『生成模型』(generative model),
警察稱為『鑑別模型』(discriminative model),簡單架構如下圖:

:::info
Generator跟Discriminator都是NN架構
* 產生**圖**的NN架構:通常是CNN
* 產生**文字、句子**的NN架構:通常是RNN、LSTM等
:::
Generator
* 輸入:z(隨機向量 or 動畫人物的頭像轉成的低維向量)
* 輸出:圖片(高維向量)
> 
> 輸入向量中的每一個 dimension ,對應到影像中某些特徵(例如某pixel 的顏色)。如果改變了其中一個dimension的數值,輸出的圖片某種特徵會改變。
>
Discriminator
* 輸入:圖片(高維向量)
* 輸出:分數
## Basic Idea of GAN

GAN的基本想法是
* $Pdata(x)$:我們已有一個目標資料集
* $x$:可以是任何目標,這裡$x$指照片
這也是我們希望機器可以生成的資料分佈(distribution)。
圖上藍色區域是**高機率**的部份,其它部份是低的部份,只要從藍色區域中生成的圖像都可以是**完美的**,而從藍色外區域生成的圖像就會是模糊的。
## Structure Learning
:::info
* Regreassion:輸出數值
* Classification:輸出class
* Structure Learning:輸出sequence,matrix, graph, tree…
GAN 是一種類似 Structure Learning 的學習過程,藉由 D 的對抗,讓 G 生成一個足具結構性的結果 ( 可以是一張圖片、一段摘要、… )

:::
* 傳統Structure learning有兩種方法:Bottom up, Top down
* Bottom up:一個個component 分開產生物件,容易失去大局觀,可視為 G 的方法
* Top down:產生一個完整的物件後,再從整體去看這個物件好不好,可視為 D 的方法
| | Generator | Discriminator |
| -------- | -------- | -------- |
| Pros | 便於產生圖片 | 可以考量到全局 |
| Cons | 僅學習到整個結構的表象,並沒有學習到其內涵,因此每個 pixel 間都是個別獨立的。 | argmax 問題通常不易解,而且反例圖片不容易取得 |
* Generator + Discriminator
GAN 就是結合上述的優點所形成的方法,利用 Generator 來克服 Discriminator 不易產生圖片的難處,也利用 Discriminator 來幫 Generator 做到全局的掌控。
## 訓練
1. 固G,訓D

2. 固D,訓G

3. D和G交替訓練

4. 更新參數


1. G:生成G1
2. D:由G1產生的照片經過D1輸出之後,D1知道它是假照片,輸出score非常小。
3. G1更新參數,升級為G2,也就是G2的輸出照片經過D1的輸出應該是1.0
:::info
1. 固定住G,只訓練D:==真圖給高score,假圖給低score==
* 只訓練D:鑑別能力提升
* 偏假圖:第一次G產生的圖片很大機率是不好的,因為參數隨機初始化,還沒訓練過,這些圖片對D來說就是不好的圖片
2. 固定住D,只訓練G:
* 固定住D:無法鑑別G生成的假圖(==D給假圖的score變高==)
* 只訓練G:G學習騙過D
* 過程:
* 讓G產生的圖片丟進D中,讓固定住的D打分數,然後把G和D串在一起,視為兩個NN組成的巨大NN
* 巨大NN的目標:
最終輸出的score越高越好:用Backpropagation去找,只是會固定住D中對應的幾個維度,只調整G中對應的幾個維度
所以Generator-V1會更新參數,升級為Generator-V2,讓它的輸出照片可以更Realistic,最基本就是要可以騙過Discriminator-V1,也就是Generator-V2的輸出照片經過Discriminator-V1的輸出應該是1.0
3. 總結:實際在訓練的時候,是D和G交替訓練
4. 新的GAN方法:WGAN、improved WGAN、WGAN-GP
:::
## 演算法
ref: https://medium.com/hoskiss-stand/gan-note-791358c3b10b
### **訓練D**:
最大化 
* 前面項:表示要判斷真實 data 越接近 1 越好,後面項:fake 越接近 0 越好
* 理論上 discriminator 參數最好要多 update 幾次

### **訓練G**:
這時候我們的 discriminator 已經(接近)讓上面的式子最大化了,G 要開始試圖讓後面項最小化
最大化, or
最小化  = 

## Conditional GAN
* 輸入:CGAN 與一般的 Normal GAN 不同的地方在於餵給 Generator 與 Discriminator 的輸入不同
* 輸出:不僅僅是接近真實的圖像(x~=1),同時還要滿足輸入文字的條件(match: c&x)
### Text to Image
輸入條件$c$:**文字**

**G:生成器**
* 輸入:
==文字train-$c$== 與 ==Prior distribution-$z$==,經過Generator之後得到照片$x$
* $c$(條件):==文字train-$c$==
* $z$(Noise 噪聲向量-from常態分佈值): 這些火車的==常態分佈值==給G
* 原因:火車有正面或側面照,若最後機器輸出這些照片的平均,圖片會非常模糊
> 1. 噪聲:從分佈中提取隨機樣本(噪聲)當輸入,通過G來單純生成假圖
> 2. 目的:生成一張符合我們要求的隨機圖片
> 3. 隨機:
> (1) 原因:GAN 就不會每次生成相同的結果
> (2) 問題:若完全隨機,是不負責任的,因結果不可控,你不知道生成的圖像有什麼特徵,只能保證是要訓練出的圖片類型。
> (3) 解法:加入c去控制必須生成的條件=train
```python=1
# 宣告函式:noise_sample,隨機產生噪音樣本,介於[-1,1]之間的常態分佈數值。
np.random.seed(123)
def noise_sample(num_samples):
return np.random.uniform(
low = -1.0,
high = 1.0,
size = [num_samples, g_input_dim]
# 使用訓練完成的模型,輸入隨機噪音,並生成圖像。
noise = noise_sample(36)
images = G_output.eval({G_input: noise})
plot_images(images, subplot_shape =[6, 6])
```
* 輸出:$x=G(c,z)$
* 希望輸出的 ==假圖$x$== 分佈是可以接近實際資料中屬train的分佈

**D:鑑別器**
* 輸入:輸入 **paired data(==文字train-$c$==, ==假圖$x$==)** 的對應關係,所以是supervised
* $c$(條件):文字train:與G輸入同樣的條件
* $x$(G生成的圖片):1:實際~0:虛假
如果只有輸入$x$,G學到只要生成一個品質好的照片即可,不管條件c(與文字無關的照片,此張圖是不是火車)
* 輸出:score
* 架構:
1. 較差:當score低時,機器不知道到是低分原因是以下哪個造成
* $x$ 生成的假圖很模糊 : (train, **模糊train圖**) → 0
* $c$ 條件不符 : (**dog**, 真實train圖) → 0
2. 較優:當score低時,可以知道低分原因是哪個造成
(train, 模糊train圖)→ 0:造成原因為 假圖$x$模糊
* 假圖 $x$ 是否真實:( _, **模糊train圖** ) → no
* $c$ 判斷條件符不符合 : (train,____) → yes

## 演算法
### **訓練D**:
D的分數由3組paired data(==文字train-$c$==, ==圖$x$==)而來
* 3種x
* 事先準備:從database抓出的
* $𝑥$:真圖(且與條件c相關) → $(c^1,𝑥)=1$
* $𝑥 ̂^i$:真圖(與條件c不相關)→ $(c^1,𝑥 ̂^i)=0$
* 過程中生成:
* $𝑥 ̃^𝑖$:G生成的假圖 → $(c^1,𝑥 ̃^𝑖)=0$

### **訓練G**:

## 參考資料
:::success
### GAN
1. 不要慫,就是GAN:什麼是z(隨機噪聲)
https://www.jianshu.com/p/f31d9fc1d677
2. [機器學習] GAN 筆記:演算法
https://medium.com/hoskiss-stand/gan-note-791358c3b10b
### CGAN
1. Generative Adversarial Network (2) --- Conditional GAN:演算法
https://allen108108.github.io/blog/2019/10/29/Generative%20Adversarial%20Network%20(2)%20%E2%80%94%20Conditional%20GAN/
2. Conditional Generation GAN L2:演算法
https://medium.com/@balanced_salmon_turtle_423/conditional-generation-gan-l2-c785efc9dce
3. 李弘毅老師GAN筆記(二),Conditional GAN:原理
https://blog.csdn.net/taoyafan/article/details/81229466?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.channel_param
:::