Generative Adversarial Nets - GAN
介紹
Goodfellow 的這篇paper發佈於2014年,提出了一種新的模型——生成對抗模型。這個模型其實就是訓練兩個相互對抗的網絡,一個是訓練一個生成器(Generator),另一個是訓練一個判別(Discriminator)。
- 生成器G(Generator):通過給生成器網絡輸入一個噪聲向量來生成一個對象(要學習生成的那個對象)。
- 判別器D(Discriminator):通過給判別器網絡輸入一個對象,輸出有個 scalar(標量)來衡量輸入的這個對象是真實的對象,還是由生成器生成的對象。
這兩個網絡是相互對抗相互博弈的。生成器的目的是儘量生成接近真實的對象,把這個生成的對象輸入到判別器網絡D中,用判別器的輸出(0到1之間的一個實數)來衡量生成器生成的對象接近真實對象的程度。生成器會朝着使判別器輸出比較大的數的方向上調節生成器的網絡參數,此時判別器網絡參數固定不便。生成器的目的是儘量分辨出輸入的對象是不是真實的對象,其輸出越大表示這個輸出的對象越可能是真實的。判別器對真實的對象來說會朝着輸出較大的方向上去調節判別器的網絡參數,此時生成器網絡參數固定,對於輸入假的對象(生成器生成的對象),判別器會朝着輸出較小的方向上去調節判別器的網絡參數。
描述
整個過程我們可以理解成老師教學生畫一隻貓的過程。老師也不是一開始就知道什麼樣的圖片是貓,所以老師也要學習(判別器),第第一次去訓練判別器的過程就相當於是老師學習認識貓的過程,但是老師只是看了一個batch的真實的貓的照片,所以他只記住了貓是有耳朵的。此時生成器根據初始化的參數生成了一張圖片,把這個圖片輸入到判別器中得到一個結果,這個過程相當於學生隨便畫了一幅圖,然後去問老師這個圖片是不是貓,老師說貓是有耳朵的,然後學生畫的下一個圖片就是有耳朵的(這就是訓練生成器G的過程),然後老師又去看真實貓的圖片又從中學習到貓是有尾巴的(第二次訓練判別器)。然後學生畫了一張有耳朵的貓給老師看(生成器生成了一張比上一次要接近貓的圖片輸入判別器),老師告訴學生“你已經畫對了一部分,但是貓是有尾巴”。…就這樣循環往復,直到最後學生就能畫出一張很接近貓的圖片。
數學表示
用數學語言描述整個博弈過程
- 生成模型用數學符合表示爲 ,其中 是一個隨機噪聲表示模型的輸入,表示生成模型中參數(生成器網絡裏的參數),模型的輸出用來表示,這裏的是一個假的對象是生成器生成的。
- 判別模型用數學符號表示爲,其中爲模型的輸入,表示生成模型中參數(判別器網絡裏的參數),模型的輸出是0-1範圍內的一個實數用來判斷這個圖片是一個真實圖片的概率是多大。
訓練過程
優化判別器
- 當把一個真實的對象輸入判別器時,我們希望判別器輸出的數接近於1的,也就是最大化判別器。
- 當把一個由生成器生成的對象輸入到判別器時,我們希望判別器輸出的數接近於0的,也就是最小化。
把上面的兩個步驟合併在一起公式如下
正向傳播
結合上面指出的兩點,把這兩項整合成數學公式如下,爲此時相對於判別器的損失函數
反向優化 注意此時只優化判別器的參數
朝着使損失函數最大化的方向優化
優化生成器
當把一個由生成器生成的對象輸入到判別器時,我們希望判別器輸出的數接近於1的,也就是最大化或者是最小化。
正向傳播
爲此時相對於生成器的損失函數
或者是
反向優化 注意此時只優化生成器的參數
對於正向傳播的第一個函數來說朝着使損失函數最大化的方向優化。對於正向傳播的第二個函數來說朝着使損失函數最小化的方向優化。
算法的訓練過程如下圖(圖中給出的是,優化生成器時正向傳播使用的第一個公式)
參考文檔
Generative Adversarial Nets 論文
論文閱讀——《Generative Adversarial Nets》