GAN解決Structured Learning問題的理解

來自專欄小石頭的碼瘋窩29 人贊了文章

Basic of GAN

Goodfellow微醉時與同學進行一次爭論,Goodfellow在酒吧相處了GAN的技術:用一個模型對現實世界進行創造,再用另一個模型去分析結果並對圖像的真偽進行識別。

300+ 相關GAN模型Facebook的AI研究負責人楊立昆(Yann LeCun)將GAN稱作「過去20年內在深度學習上最酷的想法」

Generator

Discriminator

?

The Relation between Generator And Discriminator

將Generator比喻成蝴蝶,Discriminator比喻成捕食者,蝴蝶為了不被捕食者捕殺而一步步進化成枯葉蝶,而捕食者由於食物減少也隨之會學會更能判別枯葉蝶的能力:

步驟1: 使生成器G不更新,更新判別器D:

步驟2: 使判別器D不更新,更新生成器G:

?

偽代碼:

In each train iteration: - Sample m examples {x1, x2, ..., xm} from database - Sample m noise samples {z1, z2, ..., zm} from a distribution - Obtaining generated data {G(z1), G(z2), ..., G(zm)} - Update discriminator parameter to maximize - Loss_{ heta_{d}} = 1/m * (sum_{1}^{m} log(D(xi)) + sum_{1}^{m} log(1-D(G(zi)))) - heta_d = heta_d + learning_rate * Delta(Loss_{ heta_{d}}) - Sample m noise samples {z1, z2, ..., zm} from a distribution - Update generator parameter to maximize - Loss_{ heta_{g}} = 1/m * sum_{1}^{m} log(D(G(zi))) - heta_g = heta_g - learning_rate * Delta(Loss_{ heta_{g}})

GAN And Structured Learning

首先我們瞭解下什麼叫做stuctured learning, 機器學習本質上是學習數據集到目標的映射函數 F:X->Y, 對比下機器學習下其他的場景,如回歸、分類:

Regression: 輸出為連續變數

Classification: 輸出為類別(one-hot vector)Structured Learning: 輸出為序列、矩陣(圖像)、樹等等

Structured Learning的輸出是彼此有前後依賴關係的, 比如一個好的系統輸出一張生成的圖像,圖像有藍天,天空中通常有鳥,但是不會有人(除非是超人),當我們把圖像中每一個像素點看做一個components,我們知道這些components之間會有若干聯繫。

Structured Learning在實際的場景中很有用,比如Machine Translation、Speech Recognition、Chat-bot、Image Transform、Image to Text

Why Structured Learning Challenging

Structured Learning 主要有這幾個方面的挑戰:

  • One-shot/Zero-shot Learning: 在分類任務中,每一個類別有若干個examples,而在Structured Learning,假如我們把components的某一種組合即生成的結果看做一個類別,你會發現類別特別大,不可能有如此多的數據來覆蓋,Structured Learning,生成的圖像可能在訓練數據集中完全沒有出現。因此,Structured Learning需要機器更加"智能",需要學會創造,才能完成相應場景的任務;
  • Machine has to learn to do planning: 前面有提到生成圖像有藍天、天空中有鳥,這些components之間有依賴關係,所有的components才能合成一張有意義的圖像,Structured Learning必須要有這樣的能力,才能完成相應場景的任務;

GAN: A Solution from Structured Learning

傳統的在Structure Learning上相關的工作,主要集中在兩部分:

  • Bottom Up: 要產生一個完整的對象,如圖像,需要從component一個一個分別產生,這種方法會失去大局觀;
  • Top Down: 從整體考慮,生成多個對象,然後找到最好的對象;

而GAN中,Generator就屬於Bottom Up的方法,Discriminator屬於Top Down的方法,接下來兩節,我會詳細解釋如何理解Generator為Bottom Up,Discriminator為Top Down的方法;

Generator As Bottom Up

假設我們想通過一個向量來生成一張圖片,我們一般會如何做呢 ?

很容易,我們一般第一印象會想到Auto-encoder的技術

?

拿到圖片,我們通過一個nn來encoding為一段vector, 然後過NN來decode這段vector,設置loss函數保證decode出來的圖像與原始圖像儘可能類似,這樣我們把decode的部分拿出來,不就是一個Generator了嗎 ?

那麼Auto-encoder會有什麼樣的問題呢?

?

比如code a能生成1的圖像,code b也能生成1的圖像,比較右向,那麼0.5a+0.5b呢 我們可能希望它也有相應的方向變化,但是Auto-encoder可能連1這張圖像也無法生成;

如何解決?VAE也是我們在學習GAN經常會拿來對比的

NN Encoder在生成時,會生成對應維度下的方差然後經過如圖的組合得到c1,c2,c3去decode相應的輸出,這樣即使encoder的code約束性更少的情況下也可以得到相應的圖像。說道這樣,看起來Generator就可以做到很好的Structure Learning的問題,看到這裡,可能會問,前面不是說Bottom Up的方法有缺失大局觀的問題嗎?如何理解呢?是的,這裡我們來聊下缺失大局觀的問題(莫名想到酒神)。

?

在Auto-encoder中,我們來衡量G的準確性時,我們是拿原始圖片和生成的圖片,彼此像素值的差異,那麼就會存在一個問題:圖像對像素值差異越小,越能說明是某一類嗎?

?

第一行中,像素差異的部分只有1個pixel,第二行差異部分有6個pixel,但是我們認為第二行的數據更像屬於數字2,這裡就是大局觀的問題,Generator的方法,在衡量生成結果的時候會有很難設定考慮到大局的相似性函數。當然,如果在無窮數據、無窮的計算資源下下,這類問題不存在,但是實際當中無法規避,通常的經驗是使用Generator生成多個components組成的對象,例如圖像時,需要更複雜的網路結構。

Can Discriminator generate

那我們能用Discriminator解決Structured Learning的問題嗎?前面有提到Discriminator可以被視為Top Down的一種解決方法。

Discriminator相對Generator很容易去建模components之間的關係,比如

?

這兩個數字,用卷積核,處理components之間的依賴關係,那麼Discriminator如何來做呢?

?

原理很簡單,我們只需要遍歷所有的數據然後找到生成得分值最好的(實際當中怎麼解呢?),即可解決Structured Learning的問題,這裡先假設我們能夠收集"所有數據"這部分不是問題,那麼要想得到一個這樣的工具,如何去訓練呢?

我們需要得到好和不好的圖像,比如在繪畫場景下,我們需要得到畫的好與畫的不好的情況,這個其實就存在一個悖論了,如果我們能得到不好的圖像,那麼得到好的圖像是不是也沒有問題呢?怎麼得到真實的不好的圖像呢?這個是很有意思的

?

各種不同程度negative會直接影響Discriminator的評分,你很難去得到negative的樣本。

而GAN為什麼能說是一種比較好解決,同樣我們從G和D兩個方便來說

針對Discriminator,我們能夠利用G很好地解決負樣本的問題,這個是Discriminator缺乏的能力,G可以進化地去產生更好的負樣本,去保證Discriminator更精準;

  • 針對Generator,儘管還是每一個component每一個component地去生成對象,但是他會學到Discriminator的大局觀。

以上文章,學習李宏毅老師的GAN教程整理所得,希望大家在沉醉於GAN的時候,去了解下為什麼如此有效

推薦閱讀:

相關文章