一、GAN介紹
生成式對抗網絡GAN(Generative Adversarial Networks)是一種深度學習模型,是近年來復雜分布上無監督學習最具前景的方法之一。它源于2014年發表的論文:《Generative Adversarial Nets》,論文地址:https://arxiv.org/pdf/1406.2661.pdf。
模型通過框架中(至少)兩個模塊:生成模型(Generative model)和判別模型(Discriminative model)的相互博弈學習產生相當好的輸出。原始GAN理論中并不要求G和D都是神經網絡,只需要是能夠擬合相應生成和判別的函數即可。但實際應用中一般均使用深度神經網絡DNN/MLP作為G和D。一個優秀的GAN應用需要有良好的的訓練方法,否則可能由于神經網絡模型的自由性而導致輸出不理想。
GAN將機器學習中的兩大模型緊密結合在了一起,在這個框架中將會有兩個模型被同時訓練:G用來捕獲數據分布,D用來估計樣本來自訓練數據而不是G的概率,G的訓練目的是最大化D產生錯誤的概率。這個框架相當于一個極小化極大的雙方博弈。在任意函數G和D的空間中存在唯一解,此時G恢復訓練數據分布,且D處處都等于1/2。在G和D由DNN構成的情況下,可以使用反向傳播進行訓練,在訓練或生成樣本時不需要任何馬爾可夫鏈或展開的近似推理網絡。
以生成圖片為例,G為一個生成圖片的網絡,接收一個隨機的噪聲z生成圖片G(z);D為一個判別網絡,判斷一張圖片x是不是真實的,D(x)表示x是真實圖片的概率,若D(x)等于1表示x是100%真實的圖片、等于0表示x不可能是真實的圖片。訓練過程中G和D構成一個動態博弈過程,博弈的結果就是G可以生成足以“以假亂真”的圖片G(z),而D難以判斷G生成的圖片是不是真實的,即D(G(z))=0.5。這樣就得到了一個生成模型G,可以用來生成圖片。Goodfellow從理論上證明了該算法的收斂性,且在模型收斂時,生成數據和真實數據具有相同的分布。
GAN的應用有:圖像生成(超分辨率),語義分割,文字生成,數據增強,信息檢索/排序,聊天機器人等。
GAN介紹優勢
GAN是更好的生成模型,在某種意義上避免了馬爾科夫鏈式的學習機制,這使得它能夠區別于傳統的概率生成模型。傳統概率生成模型一般都需要進行馬可夫鏈式的采樣和推斷,而GAN避免了這個計算復雜度特別高的過程,直接進行采樣和推斷,從而提高了GAN的應用效率,所以其實際應用場景也就更為廣泛。
其次GAN是一個非常靈活的設計框架,各種類型的損失函數都可以整合到GAN模型當中,這樣使得針對不同的任務,我們可以設計不同類型的損失函數,都會在GAN的框架下進行學習和優化。
再次,最重要的一點是,當概率密度不可計算的時候,傳統依賴于數據自然性解釋的一些生成模型就不可以在上面進行學習和應用。但是GAN在這種情況下依然可以使用,這是因為GAN引入了一個非常聰明的內部對抗的訓練機制,可以逼近一些不是很容易計算的目標函數
怎么去定義一個恰當的優化目標或一個損失?
傳統的生成模型,一般都采用數據的似然性來作為優化的目標,但GAN創新性地使用了另外一種優化目標。
首先,它引入了一個判別模型(常用的有支持向量機和多層神經網絡)。其次,它的優化過程就是在尋找生成模型和判別模型之間的一個納什均衡。
????????GAN所建立的一個學習框架,實際上就是生成模型和判別模型之間的一個模仿游戲。生成模型的目的,就是要盡量去模仿、建模和學習真實數據的分布規律;而判別模型則是要判別自己所得到的一個輸入數據,究竟是來自于真實的數據分布還是來自于一個生成模型。通過這兩個內部模型之間不斷的競爭,從而提高兩個模型的生成能力和判別能力。
詳細實現過程
假設我們現在的數據集是手寫體數字的數據集minst。?
初始化生成模型G、判別模型D(假設生成模型是一個簡單的RBF,判別模型是一個簡單的全連接網絡,后面連接一層softmax)這些都是假設,對抗網絡的生成模型和判別模型沒有任何限制。
例子與訓練1
假設有一種概率分布M,它相對于我們是一個黑盒子。為了了解這個黑盒子中的東西是什么,我們構建了兩個東西G和D,G是另一種我們完全知道的概率分布,D用來區分一個事件是由黑盒子中那個不知道的東西產生的還是由我們自己設的G產生的。
不斷的調整G和D,直到D不能把事件區分出來為止。在調整過程中,需要:
1、優化G,使它盡可能的讓D混淆。
2、優化D,使它盡可能的能區分出假冒的東西。
當D無法區分出事件的來源的時候,可以認為,G和M是一樣的。從而,我們就了解到了黑盒子中的東西。
例子與訓練2
上面四張圖a,b,c,d. 黑色的點狀線代表M所產生的一些數據,綠色的線代表我們自己模擬的分布G,藍色的線代表著分類模型D。
a圖表示初始狀態,b圖表示,保持G不動,優化D,直到分類的準確率最高
c圖表示保持D不動,優化G,直到混淆程度最高。d圖表示,多次迭代后,終于使得G能夠完全你和M產生的數據,從而認為,G就是M。
生成式對抗網絡的優化是一個二元極小極大博弈(minimax two-player game)問題,它的目的是使生成模型的輸出再輸入給判別模型時,判別模型很難判斷是真實數據還是虛假數據。
極大極小值算法
MiniMax算法(極大極小值算法)是一種找出失敗的最大可能性中的最小值的算法(即最小化對手的最大得益),該算法通常是通過遞歸的形式來實現的;MiniMax算法常用于棋類等兩方較量的游戲或者程序中。
該算法是一個零總和算法,即一方要在可選的選項中選擇將其優勢最大化的選擇,另一方則選擇令對手優勢最小化的一個,其輸贏的總和為0(有點像能量守恒,就像本身兩個玩家都有1點,最后輸家要將他的1點給贏家,但整體上還是總共有2點)。
由于是遞歸的操作,所以層次深度會非常深,那么可能使用神經網絡優化
前向傳播階段
一、可以有兩種輸入?
- 我們隨機產生一個隨機向量作為生成模型的數據,然后經過生成模型后產生一個新的向量,作為Fake Image,記作D(z)。?
- 從數據集中隨機選擇一張圖片,將圖片轉化成向量,作為Real Image,記作x。?
二、將由1或者2產生的輸出,作為判別網絡的輸入,經過判別網絡后輸入值為一個0到1之間的數,用于表示輸入圖片為Real Image的概率,real為1,fake為0。?
使用得到的概率值計算損失函數,解釋損失函數之前,我們先解釋下判別模型的輸入。根據輸入的圖片類型是Fake Image或Real Image將判別模型的輸入數據的label標記為0或者1。即判別模型的輸入類型為?或者?。
判別模型的損失函數
?當輸入的是從數據集中取出的real Iamge 數據時,我們只需要考慮第二部分,D(x)為判別模型的輸出,表示輸入x為real 數據的概率,我們的目的是讓判別模型的輸出D(x)的輸出盡量靠近1。?
當輸入的為fake數據時,我們只計算第一部分,G(z)是生成模型的輸出,輸出的是一張Fake Image。我們要做的是讓D(G(z))的輸出盡可能趨向于0。這樣才能表示判別模型是有區分力的。?
相對判別模型來說,這個損失函數其實就是交叉熵損失函數。計算loss,進行梯度反傳。這里的梯度反傳可以使用任何一種梯度修正的方法。?當更新完判別模型的參數后,我們再去更新生成模型的參數。
生成模型的損失函數
對于生成模型來說,我們要做的是讓G(z)產生的數據盡可能的和數據集中的數據一樣。就是所謂的同樣的數據分布。那么我們要做的就是最小化生成模型的誤差,即只將由G(z)產生的誤差傳給生成模型。?
但是針對判別模型的預測結果,要對梯度變化的方向進行改變。當判別模型認為G(z)輸出為真實數據集的時候和認為輸出為噪聲數據的時候,梯度更新方向要進行改變。?即最終的損失函數為:?
其中表示判別模型的預測類別,對預測概率取整,為0或者1.用于更改梯度方向,閾值可以自己設置,或者正常的話就是0.5。
判別模型的目標函數
用數學語言描述整個博弈過程的話,就是:假設我們的生成模型是g(z),其中z是一個隨機噪聲,而g將這個隨機噪聲轉化為數據類型x,仍拿圖片問題舉例,這里g的輸出就是一張圖片。D是一個判別模型,對任何輸入x,D(x)的輸出是0-1范圍內的一個實數,用來判斷這個圖片是一個真實圖片的概率是多大。令Pr和Pg分別代表真實圖像的分布與生成圖像的分布,我們判別模型的目標函數如下:

整體目標函數
類似的生成模型的目標是讓判別模型無法區分真實圖片與生成圖片,那么整個的優化目標函數如下:
?
在我們的函數V(D,G)中,第一項是來自實際分布(pdata(x))的數據通過鑒別器(也稱為最佳情況)的熵(Entropy)。鑒別器試圖將其最大化為1。第二項是來自隨機輸入(p(z))的數據通過發生器的熵。生成器產生一個假樣本, 通過鑒別器識別虛假(也稱為最壞的情況)。在這一項中,鑒別器嘗試將其最大化為0(即生成的數據是偽造的的概率的對數是0)。所以總體而言,鑒別器正在嘗試最大化函數V(D,G)。
另一方面,生成器的任務完全相反,它試圖最小化函數V(D,G),使真實數據和假數據之間的區別最小化。這就是說,生成器和鑒別器像在玩貓和老鼠的游戲。
論文中有推導過程,但有些跳步,從這里可以看到詳細的推導過程:?https://blog.csdn.net/susanzhang1231/article/details/76906340
下圖是論文中的算法流程:
訓練細節
概括來講,包括兩個階段:
第一階段:訓練鑒別器,凍結生成器(凍結意思是不訓練,神經網絡只向前傳播,不進行 Backpropagation 反向傳播)。
第二階段:訓練生成器,凍結鑒別器。
訓練對抗網絡的步驟:
- 定義問題。你想生成假的圖像還是文字?你需要完全定義問題并收集數據。
- 定義 GAN 的架構。GAN 看起來是怎么樣的,生成器和鑒別器應該是多層感知器還是卷積神經網絡?這一步取決于你要解決的問題。
- 用真實數據訓練鑒別器 N 個 epoch。訓練鑒別器正確預測真實數據為真。這里 N 可以設置為 1 到無窮大之間的任意自然數。
- 用生成器產生假的輸入數據,用來訓練鑒別器。訓練鑒別器正確預測假的數據為假。
- 用鑒別器的出入訓練生成器。當鑒別器被訓練后,將其預測值作為標記來訓練生成器。訓練生成器來迷惑鑒別器。
- 重復第 3 到第 5 步多個 epoch。
- 手動檢查假數據是否合理。如果看起來合適就停止訓練,否則回到第 3 步。這是一個手動任務,手動評估數據是檢查其假冒程度的最佳方式。當這個步驟結束時,就可以評估 GAN 是否表現良好。
noise輸入的解釋
假設我們現在的數據集是一個二維的高斯混合模型,那么這么noise就是x軸上我們隨機輸入的點,經過生成模型映射可以將x軸上的點映射到高斯混合模型上的點。當我們的數據集是圖片的時候,那么我們輸入的隨機噪聲其實就是相當于低維的數據,經過生成模型G的映射就變成了一張生成的圖片G(x)。?
最終兩個模型達到穩態的時候判別模型D的輸出接近1/2,也就是說判別器很難判斷出圖片是真是假,這也說明了網絡是會達到收斂的。
優勢和劣勢
優勢:
- Markov鏈不需要了,只需要后向傳播就可以了。
- 生成網絡不需要直接用樣本來更新了,這是一個可能存在的優勢。
- 對抗網絡的表達能力更強勁,而基于Markov鏈的模型需要分布比較模糊才能在不同的模式間混合。
劣勢:
- 對于生成模型,沒有直接的表達,而是由一些參數控制。
- D需要和G同步的很好才可以。
總結
圖中上半部分是GAN模型的基本架構。我們先從一個簡單的分布中采樣一個噪聲信號 z(實際中可以采用[0, 1]的均勻分布或者是標準正態分布),然后經過一個生成函數后映射為我們想要的數據分布 Xg (z 和 X 都是向量)。生成的數據和真實數據都會輸入一個識別網絡 D。識別網絡通過判別,輸出一個標量,表示數據來自真實數據的概率。
在實現上,G 和 D 都是可微分函數,都可以用多層神經網絡實現。因此上面的整個模型的參數就可以利用backpropagation來訓練得到。
圖中的下半部分是模型訓練中的目標函數。仔細看可以發現這個公式很像cross entropy,注意D是 P(Xdata) 的近似。對于 D 而言要盡量使公式最大化(識別能力強),而對于 G 又想使之最小(生成的數據接近實際數據)。
整個訓練是一個迭代過程,但是在迭代中,對 D 的優化又是內循環。所以每次迭代,D 先訓練 k次,G 訓練一次。
拓展延伸
GAN模型最大的優勢就是訓練簡單,但是也有缺點比如訓練的穩定性。有趣的是,在這篇文章future work部分,作者提出了5個可能擴展的方向,而現在回過頭來看,后續的很多工作真的就是在照著這幾個思路填坑。比如第一個conditional generative model就是后面要講的conditional GAN的思路,而最后一個determing better distribution to sample z from during training則是后面InfoGAN的思路。
所以基于這些,先對關于GANs的一些延伸做個總結,方便以后的學習。
衍生模型結構圖:
DCGAN
為了方便大家更好地理解生成式對抗網絡的工作過程,下面介紹一個GAN的使用場景——在圖片中的生成模型DCGAN。
在圖像生成過程中,如何設計生成模型和判別模型呢?深度學習里,對圖像分類建模,刻畫圖像不同層次,抽象信息表達的最有效的模型是:CNN (convolutional neural network,卷積神經網絡)。
CNN是深度神經網絡的一種,可以通過卷積層(convolutional layer)提取不同層級的信息,如上圖所示。CNN模型以圖片作為輸入,以圖片、類別抽象表達作為輸出,如:紋理、形狀等等,其實這與人類對圖像的認知有相似之處,即:我們對一張照片的理解也是多層次逐漸深入的。
那么生成圖像的模型應該是什么樣子的呢?想想小時候上美術課,我們會先考慮構圖,再勾畫輪廓,然后再畫細節,最后填充顏色,這事實上也是一個多層級的過程,就像是把圖像理解的過程反過來,于是,人們為圖像生成設計了一種類似反卷積的結構:Deep convolutional NN for GAN(DCGAN)
“反卷積”—上采樣卷積
反卷積,英文decovolution。根據wiki的定義,其實是對卷積的逆向操作,也就是通過將卷積的輸出信號,經過反卷積可以還原卷積的輸入信號,還原的不僅僅是shape,還有value。
但是深度學習中的所講的反卷積實質是transport convolution。只是從2010年一篇論文將其叫做了deconvolution,然后才有了這個名字。先看下卷積的可視化:
4x4的輸入信號,經過3x3 的filters,產生了2x2的feature map。那什么是transport-convolution?可視化:
2x2的輸入信號,經過3x3 的filters,產生了4x4的feature map。從小的維度產生大的維度,所以transport-convolution又稱為上采樣卷積。
那為什么叫做transport(轉置)?
因為“反卷積”存在于卷積的反向傳播中。其中反向傳播的濾波器矩陣,是前向傳播(卷積)的轉置,所以,這就是它的名字的由來。只不過我們把反向傳播的操作拿到了前向傳播來做,就產生了所謂的反卷積一說。但是transport-convolution只能還原信號的大小,不能還原其value,所以,不能叫做反卷積,不是真正的逆操作。
用到的其他Trick
- 比如D用的是lrelu激活函數,G用的是relu
- 使用batch_normalization.
- 去掉了pooling層,使用stride-convolution(也就是stride=2)
- 學習率必須很小,比如論文中,rate=0.0002
DCGAN采用一個隨機噪聲向量作為輸入,如高斯噪聲。輸入通過與CNN類似但是相反的結構,將輸入放大成二維數據。通過采用這種結構的生成模型和CNN結構的判別模型,DCGAN在圖片生成上可以達到相當可觀的效果。如下是一些生成的案例照片。
DCGAN結果圖-矢量計算:
DCGAN能改進GAN訓練穩定的原因
- 使用步長卷積代替上采樣層,卷積在提取圖像特征上具有很好的作用,并且使用卷積代替全連接層。?
生成器G和判別器D中幾乎每一層都使用batchnorm層
,將特征層的輸出歸一化到一起,加速了訓練,提升了訓練的穩定性。(生成器的最后一層和判別器的第一層不加batchnorm)?- 在判別器中使用leakrelu激活函數,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是輸出層采用tanh。
- 使用adam優化器訓練,并且學習率最好是`0.0002`,(我也試過其他學習率,不得不說0.0002是表現最好的了)
參考資料
- https://arxiv.org/pdf/1406.2661.pdf
- https://arxiv.org/pdf/1511.06434.pdf
- https://arxiv.org/pdf/1701.07875.pdf