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