---
# System prepended metadata

title: GAN Note
tags: [Paper Note]

---

# GAN Note

:::info
非文本內容的補充格式:
寫在文本翻譯之前
- 專有名詞、概念 1 [link](#) (此link for 大概念)
    - 敘述 1 [link](#)(此link for 單一概念)
    - 敘述 2
- 專有名詞、概念 2 [link](#)
    - 敘述 1
    - ...
:::

:::danger
有看不懂、有疑義的地方，請用 
"::: danger"
":::"
包住，如此段
:::

## 1 introduction

:::spoiler 補充

- dropout algorithms
    - 隨機丟掉某些資料(神經元output為0)，以增加model魯棒性(穩健性)
- piecewise linear units
    - 某種activation function，擁有某些區段線性某些區段非線性的特質
- multilayer perceptron (MLP) 多層感知器
    - perceptron -> 只有輸入輸出層
    - multilayer perceptron -> 有隱藏層
- random noise [link](https://stackoverflow.com/questions/60553795/random-noise-for-gan)
    - 一個依據某種distribution的random vector，包含了各種feature
    - 用來當作生成的材料

:::

----

當前的discriminative model(辨識模型)，透過把資料映射到高維度、後向傳播、dropout algorithms、piecewise linear units

因為很多機率估算上的問題難解，導致generative model中的很多要最大化的可能性難解。

對抗網路核心在於，讓辨識模型辨識出資料來自data distribution(正常的)或是model distribution(生成的)

在對抗過程中，model distribution會逐漸接近data distribution

GAN的框架可以用在很多不同的模型上，這裡用簡單的模型，Generative model用MLP來把random noise計算成要生成的東西。Discriminative model也是用MLP。論文稱這種case為Adversial Nets(對抗網路)。

在訓練Generative model和Discriminative model時，只需要用反向傳播和dropout algorithm就好。而在訓練Generative model產出的sample時，只需要用正向傳播。不需要馬可夫鏈。


## 2 Related work

::: spoiler 補充

- Directed graphical model(有向圖模型)
    - 有向圖的網路，用節點表示變數，邊表示變數關係，節點具有因果關係(A導致B的權重，不代表B導致A的權重)
- Undirected graphical model(有向圖模型)
    - 無向圖的網路，節點間的權重不代表因果，更像是兩個節點之間的關係
- latent variable(潛在變數)
    - 在feature中觀察不到的變數，隱藏層的節點就算是一種潛在變數
- Restricted Boltzmann Machines(RBMs)受限玻爾茲曼機 [link](https://zhuanlan.zhihu.com/p/22794772)
    - 一個只有兩層: 隱藏層、可見層的網路
    - 從可見層往隱藏層前向傳播，再從隱藏層往可見層後向傳播
    - energy function(類似loss function)可以由可見層輸出或是隱藏層的輸出決定
- potiential function
    - 描述模型中變數相互關係的function，基本上當成是邊上的權重就好
- partition function
    - 在計算output的屬於某個的機率時(可能是屬於某個class的機率)，因為機率必須相加為1，所以要用partition function來讓他相加為1，這也導致了結果很難做梯度下降。
- score matching [link](https://bobondemon.github.io/2022/01/08/Estimation-of-Non-Normalized-Statistical-Models-by-Score-Matching/)
    - 透過對模型預測的機率取對數作為分數，然後跟現實的機率所得的分數去比較，想辦法讓差異最小
- noise-contrastive estimation (噪音對比模型,NCE) [link](https://bobondemon.github.io/2021/06/05/Noise-Contrastive-Estimation-NCE-%E7%AD%86%E8%A8%98/)
    - 很複雜，建議不要看這段，知道他是用來測東西是不是從生成模型生出來的就好
    - 也是用來比對一個東西是否來自生成模型的model，一般適用優化MLE去做，但是這個model引入了一個noise distirbution作為生成模型output的分布，然後經過一連串證明，可以發現求出來的結果跟很難優化的MLE求出來的相同

:::

簡寫對照
* (RBMs)Restricted Boltzmann Machines 受限玻爾茲曼機
* (DBMs)Deep Boltzmann Machines 深度玻爾茲曼機
* (DBNs)Deep Belief Networks 深度信念網路
* (NCE)noise-contrastive estimation 噪音對比模型



----

有潛在變數的Directed graphical model(有向圖模型)的類似模型是有潛在變數的Undirected graphical models（無向圖模型）。
Undirected graphical model 例子：
* Restricted Boltzmann Machines(RBMs)受限玻爾茲曼機
* Deep Boltzmann Machines(DBMs)深度玻爾茲曼機


對於複雜的網路，他的partition function是難以計算梯度的

Deep Belief Networks(DBNs) 深度信念網路是一種混合模型，具有一層無向layer和數層有向layer，其實就是由很多RBMs組成，基本上就是現在的神經網路，是深度學習的經典模型之一。儘管存在著快速近似的逐層訓練criterion(對於每個RBMs分別訓練)，所以深度信念網路仍然有關於有向和無向模型的計算困難。

為了避免這些困難，很多跟近似計算partition function或是算式中log的出現形式有被限制住的算法被提出，像是score matching, noise-contrastive estimation (噪音對比模型,NCE)

但這些方法都需要知道pdf(機率密度函數)，但對於多層的網路，要找到pdf是幾乎不可能的

本文的GAN作法類似NCE，但是NCE是讓生成模型自己來偵測，但GAN分成了兩個模型

然後，有一些技術提出了不用遵循數學定義完整的機率分布的模型，而是只要抽一些數據出來，然後他就會去找到這些數據的分布，並嘗試去生成符合這些分布的資料，像是generative stochastic network (GSN)(用了馬可夫鍊的模型)

這種方式就比較好進行後向傳播

而adversarial nets可以在不使用馬可夫鍊的情況下訓練，並且能使用piecewise linear units，讓後向傳播的效能更好

## 3 Adversarial nets

若model都是MLP，adversial modeling 框架是最直觀的。

為了要學習generator在 data $x$ 的分佈 $pg$，需要定義
- $p_z(z)$ ：input noise variables 
    - 這裡paper講的不是很清楚，我認為$p_z(z)$是noise z在他的z-distribution(機率密度分布)的機率，後面也是用來算期望值，這樣比較合理
- $G(z; \theta_g)$ : mapping 到 資料空間。 $G$是一個有$\theta_g$參數的MLP，代表一個可微分的function
- $D(x;\theta_d)$ : 第二個MLP。會輸出一個scalar。$D(x)是$x$是從data而不是從$p_g$得來的機率

訓練$D$來最大化將正確標籤分配給訓練樣本和來自$G$的樣本的機率。同時間，訓練$G$ 來最小化 $log(1 − D(G(z)))$。

![Screenshot 2024-04-22 at 12.21.04 PM](https://hackmd.io/_uploads/HJ-aBP7ZC.png)
屬於$p_{data}$的點的$\log{D(x)}$期望值 + 屬於$p_z(z)$的點的$\log{1-D(x)}$期望值

這個式子其實就是去掉負號的cross entropy function(true data的cross entropy + generative data的 cross entropy)

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

所以D-model嘗試maxmium V(D,G), G-model則嘗試去minmum D-model得到的最大V(D,G)

:::danger
這裡寫得挺模糊的，建議去看李弘毅的[影片](https://www.youtube.com/watch?v=jNY1WBb8l4U&ab_channel=Hung-yiLee)
:::

---

在訓練過程中，完全優化D是禁止的，因為dataset是有限的，所以會導致overfitting

因此採用訓練D跟G交錯的方法，練k step的D，再練1次G，讓D可以逐漸靠近最佳解，G也不會練太快。

類似...什麼燃燒馬可夫鍊的? 先跳，應該不重要

---

實務上，上面提到的第一個V(D,G)可能不能很好的訓練，因為:

在一開始，因為G生的很爛，所以D可以很好的做分類，導致$\log{1-D(G(z))}$接近最大值(飽和)，因此他會很難做優化，因為對他來說，比較好的distribution跟比較差的distribution得到的值基本上都是最大值

所以比起訓練G去最小化$\log{1-D(G(z))}$，不如訓練G去最大化$\log{D(G(z))}$，兩種函數都會讓G,D到達同個平衡點，但是第二個函數早期訓練時，會更有效率

舉個例子: D(G(z)) = 0.00001 -> 0.0001
在$\log{1-D(G(z))}$時，$log{0.99999} - log{0.9999} = 4e-5$
但在$\log{D(G(z))}$時，$log{0.0001} - log{0.00001} = 1$
差了10^5的量級，顯然下面的比較好去調校參數(在梯度下降中)

---

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

黑點是$p_{data}$，藍線是D的accuracy，綠線是$p_G$，z是noise的空間，用來讓G(z)產生到x(箭頭)，再給D(x)辨識。

線的密度對應到了波的高度，當映射越多線到同個地方，該處就越高。

圖為訓練過程，可以看到綠線分布逐漸往黑點靠近，藍線也慢慢準確，最後收斂在綠黑完全重疊，藍線機率0.5的地方

:::danger
我其實沒有很懂，為什麼藍線會在後半部下降
:::

## 4 Theoretical Results

Algorithm 1
![image](https://hackmd.io/_uploads/H17WUILb0.png)
使用mini-batch stochastic gradient decent
k設1
第一個for練D-model，使用原來的V(D,G)
第二個for練G-model，使用的V(D,G)只包含後半部，也就是有G的部分，因為前面只跟D有關，G不需要用到

### 4.1 Global Optimality of $p_g = p_{data}$

#### proposition 1

![image](https://hackmd.io/_uploads/BJlb5IUW0.png)
把V(D,G)的積分合併，讓x的範圍包括了原本的x跟z，再用機率去作為是否屬於該分布，最終得出的一樣是期望值相加

然後這個算式的最佳解(最大值)會是$D(x) = p_{data} / p_g + p_{data}$

證明如下:
![image](https://hackmd.io/_uploads/SyiRFILW0.png =50%x)

#### Theorem 1

![image](https://hackmd.io/_uploads/Hy-ZrjI-C.png)

$D^*(G)$是固定G-model，D優化到最好的情況，也就是$p_{data} / p_g + p_{data}$

---

接下來講G-model的優化

在訓練G-model到最佳時，$p_{data}=p_g$，$D^*(G) = 1/2$
因此min(max(V(G,D)))的值(最小)是-log4

至於怎麼證明最佳時，會是$p_g=p_{data}$由以下證明給出

把前面推出來的最佳項，換成KL-Divergence
![image](https://hackmd.io/_uploads/rkQzwj8bA.png)
![image](https://hackmd.io/_uploads/BkUbwsI-0.png)

經過這個運算後(論文直接跳過詳細運算==，只好手寫了):
![image](https://hackmd.io/_uploads/Sy6SnjIWA.jpg)

變成:
![image](https://hackmd.io/_uploads/rJsF_oUbA.png)
C(G)是V(G,D在固定max時的最大解公式

這正好符合上面提到的最佳值是-log4，因為KL散度>=0，只要在散度比較的兩個分布一樣時，才等於0，所以最小值發生在$p_{data}=p_g$

所以G-model要做的就是想辦法讓$p_{data}=p_g$，以達到loss function的最小

另外，上面KL-Divergence的式子，也可以換成JS-Divergence的形式
![image](https://hackmd.io/_uploads/SyKCknU-C.png)

:::spoiler JS-Divergence補充
![image](https://hackmd.io/_uploads/Hk18jamZC.png)
:::

---



### 4.2 Convergence of Algorithm 1

這裡我完全沒看懂，總之他在證明用V(G,D)當loss function是個合理的選擇，之後再詳細研究

## 5 Experiments

資料集:
MNIST(手寫數字)
CIFAR-10: 有10個種類的照片(飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車)
Toronto Face Database(TFD) (人臉) 

activation function:
ReLU + sigmoid混合

測試的方法是，找test data在$p_g$分布的機率是多少，然後取log，機率越高分數越高
(用了 Gaussian Parzen window 不知道是啥，之後查)

得到數據如下，正負的值是mean的standard error
![image](https://hackmd.io/_uploads/Hyb7f6U-R.png)
然後在低維度的MINST表現不錯，但在高維度的TFD就沒這麼好


## 6 Advantages and disadvantages

### 缺點
- 沒有對 pg(x) 進行明確的表示
- 在訓練期間 D 必須與 G 很好地同步（特別是 G 不能太多地訓練而不更新 D，以避免“Helvetica情景”，即 G 將太多的 z 值折疊到同一個 x 值上，以便具有足夠的多樣性來模擬 pdata），就像Boltzmann機器的負鏈在學習步驟之間需要保持更新一樣。

Helvetica scenario: D還不夠好，導致G有一個生成可以完全騙過D，就導致G不斷生成這個東西，不論輸入的z是什麼

### 優點
- 優點主要是計算方面的。對抗模型可以從生成器網絡不直接根據數據示例更新，而僅根據通過鑑別器流動的梯度獲得一些統計優勢。這意味著輸入的組件不會直接複製到生成器的參數中
- 不需要馬爾可夫鏈，只需使用反向傳播來獲取梯度
- 在學習期間不需要推斷，並且可以將各種函數合併到模型中
- 對抗網絡可以表示非常尖銳，甚至退化的分佈，而基於馬爾可夫鏈的方法要求分佈在模式之間能夠模糊一些，以便鏈能夠混合

![Screenshot 2024-04-22 at 1.48.03 PM](https://hackmd.io/_uploads/HJXmcdQZC.png)

## 7 Conclusions and future work

未來研究方向：
1. 通過將 $c$ 添加為 $G$ 和 $D$ 的輸入，以獲得條件式生成模型 $p(x | c)$。
2. 通過訓練一個輔助網絡來預測給定 $x$ 的 $z$，可以執行學習的近似推斷(Learned approximate inference)。這類似於通過 wake-sleep 演算法訓練的inference net，但優勢在於inference net 可以在生成器網絡訓練完成後固定訓練。
3. 通過訓練一系列共享參數的條件式模型來近似模擬所有條件機率 $p(x_S | x_\cancel{S})$，其中 $S$ 是 $x$ 索引的子集。基本上，可以使用對抗網絡實現 MP-DBM 的隨機擴展(stochastic extension)。
4. 半監督學習：當僅有有限標記數據可用時，從鑑別器或推斷網絡獲取的特徵可以提高分類器的性能。
5. 效率改進：通過制定更好的方法來協調 G 和 D，或在訓練期間確定更好的 z 抽樣分佈，可以大大加快訓練速度。





