# 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)))$。

屬於$p_{data}$的點的$\log{D(x)}$期望值 + 屬於$p_z(z)$的點的$\log{1-D(x)}$期望值
這個式子其實就是去掉負號的cross entropy function(true data的cross entropy + generative data的 cross entropy)

所以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的量級,顯然下面的比較好去調校參數(在梯度下降中)
---

黑點是$p_{data}$,藍線是D的accuracy,綠線是$p_G$,z是noise的空間,用來讓G(z)產生到x(箭頭),再給D(x)辨識。
線的密度對應到了波的高度,當映射越多線到同個地方,該處就越高。
圖為訓練過程,可以看到綠線分布逐漸往黑點靠近,藍線也慢慢準確,最後收斂在綠黑完全重疊,藍線機率0.5的地方
:::danger
我其實沒有很懂,為什麼藍線會在後半部下降
:::
## 4 Theoretical Results
Algorithm 1

使用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

把V(D,G)的積分合併,讓x的範圍包括了原本的x跟z,再用機率去作為是否屬於該分布,最終得出的一樣是期望值相加
然後這個算式的最佳解(最大值)會是$D(x) = p_{data} / p_g + p_{data}$
證明如下:

#### Theorem 1

$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


經過這個運算後(論文直接跳過詳細運算==,只好手寫了):

變成:

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的形式

:::spoiler JS-Divergence補充

:::
---
### 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

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

## 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 抽樣分佈,可以大大加快訓練速度。