---
# System prepended metadata

title: ML(Hung-yi Lee)_Lecture05. Generative Adversarial Network(GAN)
tags: [Machine Learning]

---

# ML(Hung-yi Lee)_Lecture05. Generative Adversarial Network(GAN)
###### tags: `Machine Learning`

## Network as Generator 
* 不只看x當作輸出，還看z(從distribution simple出來的，不固定)
![](https://i.imgur.com/bEGDtPJ.png)
* why distribution?
	* video prediction
		* 世界有很多不可預測的東西
	* when the tasks need **creativity** ： 有多種可能輸出並且都是正確的

## Generative Adversarial Network(GAN)

### Unconditional generation
#### Generator
產生一個非常高維的向量
![](https://i.imgur.com/ZpHSHq4.png)
#### Discriminator
輸入：image  輸出：scalar

#### Algorithm
step1. fix generator **G**, update discriminator **D**
* **D**訓練目標：分辨出真正的二次元人物和**G**產生出來的差別

step2. fix discriminator **D**, update generator **G**
* **G** learn how to fool **D**
* **G**產生二次元照片由**D**評分來做training
![](https://i.imgur.com/aklgblM.png)


#### progressive GAN
產生真實人臉
![](https://i.imgur.com/MT5a3jQ.png)
目標：
* $P_G、P_{data}$愈相近愈好
* 找一個generator $G^*=argminDiv(P_G,P_{data})$
	* 計算divergence：**D**看到real data就給高分（分辨真圖和生成圖）
		* $V(G,D)=E_{y~P_{data}}[logD(y)]+E_{y~P_G}[log(1-D(y))]$ 
($P_{data}$是真正的images,$P_G$是從**G**產生的images)
			* $E_{y~P_{data}}[logD(y)]$：越大越好
			* $E_{y~P_G}[log(1-D(y))]$ ：越小越好
		* 等同於minimize cross entropy=訓練一個classifier
		
### Tips for GAN

#### Js divergence 
* $P_G,P_{data}$原始資料重疊部份少
* if smapling的點不夠多還是沒有很多交集
* 怎麼train結果都很好

#### Wasserstein distance
窮舉所有把P變成Q的方法看看哪一個平均距離最短，計算distance的計算量很大
![](https://i.imgur.com/kwtAWaD.png)
從左到右 **G**越來越強，但是觀察**D**會看不出東西從左到右的divergance都相同，但是wasserstein distance愈來愈好
![](https://i.imgur.com/PzQtZYO.png)

#### WGAN
* 計算wasserstein distance between $P_{data},P_G$
![](https://i.imgur.com/TeOPi1H.png)
* 加上$D\in1-Lipschitz$的限制避免generated往無窮負、real的往無窮正，要求**D**夠平滑不能變化劇烈
* improved WGAN $\rightarrow$ Gradient Penalty
	* keep the gradient close to 1 
* Spectral Normalization
* **G**和**D**只要有其中一者不再進步另一個也會跟著停擺

#### Evaluation of Generation
* **mode collapse**問題
![](https://i.imgur.com/J1vmiUY.png)
* **mode dropping**
	產生出來的資料只有真實資料的一部份
![](https://i.imgur.com/4kDiyn2.png)
* 確認**diversity**：做分類，產生的圖片分佈不同 （image classifier）
	* Inception Score(IS) : good quality, large diversity$\rightarrow$large **IS** (但如果是產生人臉，diversity本來就會很小IS不適用)
	* Ferchet Inception Distance(FID)：拿進入softmax之前的hidden layer的輸出
![](https://i.imgur.com/EmXoh0Q.png)
真實data和generator產生的image distance愈小愈好

### Conditional Generation
可操控輸出
![](https://i.imgur.com/H7hycCt.png)
![](https://i.imgur.com/qoQDX02.png)
if這樣訓練會產生清晰的圖片但和輸入完全無關
在Conditional GAN裡**D**的input不只要吃image y同樣要把x(敘述)一起讀進去判斷$\rightarrow$**需要label成對資料**
![](https://i.imgur.com/dGtXOUZ.png)

### learning from unpaired data
x和y不是成對的 ex.影像風格轉換（真人轉換成動慢）
![](https://i.imgur.com/BkJS7jf.png)
* 怎麼強化輸入&輸出的關係 
	**cycle GAN**
![](https://i.imgur.com/6YM5IEy.png)
輸入的圖片和輸出無關
solution_3個Generator:
1. 把x轉成y
2. 把y還原成x
3. 看**D**的輸出像不像y domain的圖
![](https://i.imgur.com/fNLIVT1.png)



