---
# System prepended metadata

title: gan

---


GAN 是將 network 當作 generator，也就是輸入來做使用，特別處在輸入會加上一 random variable，z，是從某個 simple distribution 來產生出來(每次都不同)。

![image](https://hackmd.io/_uploads/S1o_u47GA.png)
![image](https://hackmd.io/_uploads/rkPyYVQzA.png)

###### why distribution?
1.兩個答案同時是對的，但同一時間只有一個會出現。例如在小精靈遊戲上，預測結果向左. 向右同時是對的，但小精靈不可能同時向左或向右，這樣就變成是錯的，需要靠 distribution 來解決，有時小精靈向左，有時小精靈向右。
2.需要更有創造力的結果時。
###### all kinds of gan:
由於GAN的熱門，一位叫Avinash Hindupur的工程師在GitHub建立了一份清單叫GAN動物園（the GAN zoo）


###### GAN 的基本概念

![image](https://hackmd.io/_uploads/BkwMcyabR.jpg)
例如第一代的 generator 隨機產生圖片，第一代 discriminator 利用真實圖片去分辨出那些 generator 產生出來的圖片是假的。

假設第一代 discriminator 是一句有沒有眼睛來分辨，為了要騙過第一代 discriminator，第一代 generator 為了要對抗它，調整參數、劃出眼睛，進化為第二代 generator，而第一代 discriminator 也會進會為第二代 discriminator，試圖來分辨第二代 generator 產生出來的圖片和真實圖片的差異!

然後第二代 generator 為了要去對抗它，產生出第三代 generator，為了要騙過第二代 discriminator，例如第二代 generator 產生出來的圖片，二代 discriminator是依據有沒有嘴巴和頭髮來判斷，所以第三代 generator 產生出來的圖片就有嘴巴和頭髮，而 discriminator 判斷也會依據真實二次元圖片，越來越嚴苛，產生出第三代的 discriminator。

###### GAN 的步驟
step1:
固定 generator G，然後更新discriminator D，discriminator 會給real object高分，會給生成器生成出的低分
step2:
固定 discriminator D, 然後更新generator G，generator 會嘗試fool discriminator

![image](https://hackmd.io/_uploads/H1r9jJpZ0.png)

如果將輸入的圖片做內插

##### theory of Gan
![image](https://hackmd.io/_uploads/SyV6oJaW0.png)

![image](https://hackmd.io/_uploads/HkhLhka-0.jpg)


把 discriminator 寫成數學式子，看作是 optimization 的問題，要訓練一個 discriminator(D)，最大化這個 objective function(由binary classifier 而來，推導後發現和 JS function 有關
此 objective function = cross entropy 乘以負號取最大 = 訓練classifier = minimize cross entropy。所以如果 discrimination function 所做的事情是 maximize objective function，也就等同於 classifier
![image](https://hackmd.io/_uploads/Hy_A94XzR.png)
為什麼這和 diversion 有關呢?
最後整個流程就會如下，
![image](https://hackmd.io/_uploads/ByiQsN7fA.png)

然而JS function 是有缺陷的
在𝑃𝐺 and 𝑃𝑑𝑎𝑡a沒有重疊時 ，JS divergence計算出來的答案都是 log2，正常情況下 𝑃𝐺 and 𝑃𝑑𝑎𝑡重疊很少或沒有重疊，因此很難看出訓練有沒有變好
![image](https://hackmd.io/_uploads/HJsujVXMA.png)
因此有新的方法：Wasserstein distance，把 P 和 Q 看成土堆，將 P 和 Q 的土堆堆再一起，目的是窮舉所有方法，看哪一個 moving 計畫，最小值即為 Wasserstein distance。
![image](https://hackmd.io/_uploads/r1pcsNmf0.png)
利用 Wasserstein distance 可以看出，模型的訓練(generator)有沒有越來越好。
![image](https://hackmd.io/_uploads/BkeiooVmG0.png)
計算期望值若從 Pdata 來的，丟進 D of y function，希望越大越好，計算期望值從 PG 來的，丟進 D of y function，希望越小越好，而這個 D of y function 必須是 1-Lipschitz function(也就是 D 必須是一個足夠平滑的 function)。
以下是WGAN的object function
![image](https://hackmd.io/_uploads/HyTAs4QfR.png)
為什麼要足夠平滑呢?不夠平滑就會發生diverge的問題
![image](https://hackmd.io/_uploads/B1YMnV7zA.png)
如何確保 D of function 屬於1-Lipschitz function 呢?

方法1:限制 weight 在某個數值範圍內

方法2:在 real 和 fake 各 sampling 出一個點，中間再取一個點，gradient 要接近 1。

方法3:Spectral Normalization，讓 gradient 標準化之後，皆小於 1。
大部分採用方法三
![image](https://hackmd.io/_uploads/B13wn47GA.png)


gan常見的問題：若 generator 或 discriminator 其中一者，training 無法再提升，另一方就會停下來。

#### 如何評估一個 generator 的好壞


將產生的圖片丟入 classifier 輸出是一個機率分布，若越集中，則表示越好
![image](https://hackmd.io/_uploads/S17634QzA.png)
但可能會發生一個問題， generator 發現 discriminator 的一個盲點，某張圖片出現越來越多，最後全部都是那張圖片，此問題現今無最佳解法，這個情況稱為mode collapse

現在有一種評估影像多樣性足不足夠的方法，例如將 1000 張圖片丟進去，若 classifier 過於集中，則表示可能多樣性不足，看起來好像和 quality 是互斥的，但 quality 是只看一張圖片，丟進去時，分布集不集中
![image](https://hackmd.io/_uploads/HknV6VXMC.png)

![image](https://hackmd.io/_uploads/BknD6NmGC.png)


而GAN透過自己相互對抗的生成與鑑別網路，大幅減少資料量的需求，也為非監督式學習提供了更為進步的方法。

GAN的應用與展望

目前GAN較多被應用在生成資料方面，如圖像與影音的生成、合成、辨識、修復等等，進階一點的則是輸入文本描述便能生成與形容相符的圖像，或者透過語言模型實現機器翻譯等。

GAN被譽為是21世紀最難被訓練的類神經網路之一

我們可以用GAN的方式生成資料，做到資料擴增，並能做到資料集增加


圖片就是高維的向量
什麼是unconditional generator(把x拔掉)
什麼是normal distribution
圖片是高維空間裡面的manifold
reinforce learning 是什麼
因為max而不能做gradient但為甚麼cnn的max pooling 可以
![image](https://hackmd.io/_uploads/HyPkhT3-C.png)