PM、GAN、InfoGAN、對抗自編碼模型對比

本文源自知乎,僅做爲我的學習使用。

做者:鄭華濱
連接:https://zhuanlan.zhihu.com/p/27159510
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

前段時間我受極視角邀請,在鬥魚上直播分享有關GAN的話題。考慮到如今網上關於GAN的文章、視頻都已經很是多了,因此我就故意選擇了一個以前沒有什麼人講過的主題:LSTM之父Schmidhuber與GAN之間的恩怨糾葛。其實這件事在英文網上傳播得還挺廣,並且除了八卦以外也有一些嚴肅的學術討論,惋惜相關的中文信息寥寥,不過這樣倒正好給我一個機會來給你們介紹一些新內容。html

其實相比視頻直播我仍是更喜歡寫成文章的形式,由於後者更適合深刻理解和收藏回顧。因此爲了方便錯過直播或者不習慣看視頻的朋友,我對當晚直播內容進行了文字整理,全文分爲如下四個部分:面試

  • 八卦Schmidhuber與GAN之間的恩怨
  • 講解Schmidhuber在92年提出的PM模型
  • 簡單介紹GAN、InfoGAN、對抗自編碼器三個模型
  • 對比以上四個模型之間的異同

若是選擇看直播回放,能夠到百度雲下載。
連接:
密碼:200j網絡

1、雙雄捉對

2016年12月,NIPS大會,Ian Goodfellow的GAN Tutorial上,發生了尷尬的一幕。架構


正當Goodfellow講到GAN與其餘模型的比較時,臺下一位神祕人物站起來打斷了演講,自顧自地說了一大通話(視頻片斷在此機器學習

 
這個觀衆不是別人,倒是大名鼎鼎的Jürgen Schmidhuber,一位來自德國的AI科學家。雖然名聲不如三巨頭響亮,但Schmidhuber其實也是深度學習的先驅人物,
 
在上個世紀就作出了許多重要貢獻,其中最有名的就是他在1997年提出的LSTM,而他本人也被尊稱爲」LSTM之父」。

本文八卦的正是這位大佬跟Goodfellow在GAN上的爭論,但其實這早就不是Schmidhuber第一次開炮懟人了。再往前2015年的時候,咱們熟知的三巨頭Hinton、Lecun、Bengio在Nature上發表了一篇《Deep Learning》綜述以後,Schmidhuber就站出來指責他們行文偏頗,認爲他們沒有重視本身作出的不少貢獻,以爲本身沒有獲得應有的榮譽,而Lecun以後也發文霸氣反駁,場面十分激烈。固然這不是本文的重點,感興趣的朋友能夠進一步挖掘,下面仍是繼續回到NIPS演講現場,看看Schmidhuber這回究竟又是爲什麼開炮。ide

 

只見他站起來以後,先講本身在1992年提出了一個叫作Predictability Minimization的模型,它如何如何,一個網絡幹嗎另外一個網絡幹嗎,花了好幾分鐘,接着話鋒一轉,直問臺上的Goodfellow:「你以爲我這個PM模型跟你的GAN有沒有什麼類似之處啊?」函數

彷佛只是一個很正常的問題,但是Goodfellow聽完後反應卻很激烈。Goodfellow表示,Schmidhuber已經不是第一次問我這個問題了,以前呢我和他就已經經過郵件私下交鋒了幾次,因此如今的狀況純粹就是要來跟我公開當面對質,順便浪費現場幾百號人聽tutorial的時間。而後你問我PM模型和GAN模型有什麼類似之處,我早就公開回應過你了,不在別的地方,就在我當年的論文中,並且後來的郵件也已經把個人意思說得很清楚了,還有什麼可問的呢?post

確實正如Goodfellow所言,早在2014年的第一篇GAN論文中,PM已經被拿出來跟GAN進行了比較,舉了三點不一樣之處。不過那只是論文的最終版本,而在一開始投遞NIPS的初稿中並無下面這段文字,也就是說極可能Goodfellow一開始是不知道有PM這麼一個東西的。學習

那爲何在最終版本里又出現了PM的內容呢?原來,當年Schmidhuber就是NIPS的審稿人,並且恰好就審到了Goodfellow的論文。咱們如今知道這篇論文挖了一個巨大無比的坑,引得大批人馬前仆後繼都來作GAN的研究,之後也應該是能寫進教科書的經典工做。但就是這樣牛逼的一篇論文,當年Schmidhuber竟然給出了拒稿意見!固然另外兩位審稿人識貨,因此論文最後仍是被收了。優化

回到正題,當時Schmidhuber在評審意見中認爲,他92年提出的PM模型纔是「第一個對抗網絡」,而GAN跟PM的主要差異僅僅在於方向反過來了,能夠把GAN名字改爲「inverse PM」,即反過來的PM。按他的意思,GAN簡直就是個PM的變種模型罷了。

Goodfellow固然不一樣意,因此就有了14年最終版本里的三點不一樣之處,具體細節放在最後模型比較的部分再講。然而Schmidhuber並不接受這些說法,私下裏又經過郵件跟Goodfellow進行了一番爭論,還到16年的NIPS大會上打斷演講,公開較勁,就是想讓對方認可PM模型的地位和貢獻,可謂不依不饒。

 

Goodfellow也不客氣,乾脆在2016年的GAN Tutorial中徹底移除了對PM的比較和引用。他在Quora上公開表示,「我從沒有否定GAN跟另一些模型有聯繫,好比NCE,可是GAN跟PM之間我真的認爲沒太大聯繫。」更有意思的是,Goodfellow還透露說,「Jürgen和我準備合寫一篇paper來比較PM和GAN——若是咱們可以取得一致意見的話。」想必真要寫出來,背後又要通過一番激烈的爭論了。

說了這麼多,所謂的PM模型到底是什麼?它跟GAN究竟有多少相同多少不一樣?還有,這個「古老」的模型能給今天的GAN研究帶來什麼啓發嗎?你們內心確定充滿了疑問。那麼八卦結束,咱們如今就來走近科學,走近塵封多年的PM模型。

2、古老智慧

Predictability Minimization(可預測性最小化)模型,簡稱PM模型,出自1992年的論文《Learning Factorial Codes by Predictability Minimization》,Jürgen Schmidhuber是惟一的做者。對於相似我這樣二零一幾年才接觸深度學習的人來講,它幾乎就是「中古時期」的文獻了。

理解PM模型,首先得從自編碼器提及。你們知道機器學習分爲有監督學習、無監督學習和強化學習,無監督學習中一個很重要的領域是表徵學習,旨在從原始數據中學習到一個良好的表徵,而自編碼器就是用於表徵學習的表明模型。

自編碼器由兩個模塊——編碼器(encoder)和解碼器(decoder)組成。編碼器負責輸入原始樣本,輸出壓縮編碼(code);解碼器負責輸入編碼,還原出原始樣本。解碼還原出來的樣本跟真正的原始樣本進行比較,能夠計算重構偏差,自編碼器的訓練目標就是儘量地減小這個重構偏差。

若是自編碼器通過訓練可以很好地重構樣本,那意味着編碼器和解碼器中間的隱藏層節點保留了原始樣本的重要信息,咱們把中間這層節點構成的向量稱爲表徵(representation)、特徵(feature)或編碼(code),這三個詞其實能夠當成同義詞。

可是僅僅保留樣本信息、僅僅學到一個表徵,是不夠的,由於表徵學習的一大難點就是想要學到一個「好」的表徵。但什麼是「好」呢?有不少人提出了不一樣的標準。

 

 

好比有人認爲編碼向量的各個維度表明了樣本所具備的屬性,而單獨一個樣本不該該同時具有那麼多種屬性,因此合理的狀況是編碼向量中大多數維度都是0(不激活),只有少數維度不爲0(激活),此爲「稀

 

疏」,附帶稀疏要求的編碼器就叫稀疏自編碼器。

再好比有人認爲自編碼器不能死記硬背,須要在「理解」樣本的基礎上對樣本進行編碼,即使輸入的時候存在一些噪聲損壞了樣本,自編碼器也要可以還原出無缺的原始樣本,在此條件下編碼出來的向量可能會更具語義信息,此爲「降噪」,附帶降噪要求的編碼器就叫降噪自編碼器。

除了稀疏、降噪,還有人認爲編碼向量的各個維度之間應該相互獨立,此爲「解耦」(factorial / disentangled),也是下文的重點。爲了方便起見,咱們考慮編碼只有3個維度的狀況,此時解耦在數學形式上表現

爲:

P(c_1, c_2, c_3 | X) = P(c_1 | X) P (c_2 | X) P(c_3 | X) (1)

其中X是所有訓練樣本而非單個樣本,c_i對應編碼的第i個維度。爲方便起見,下文省略X

直觀上說,一個解耦的編碼(factorial code)把本來混雜在樣本中的各個獨立要素拆解開來,用一個個維度分別表示,就像人類經過拆解獨立要素來認知復瑣事物同樣,因此能夠認爲它是一個「好」的表徵。

如今問題來了,咱們能夠經過L1正則化給來自編碼器提出稀疏的要求,能夠經過輸入加噪來給自編碼器提出降噪的要求,那要怎麼給自編碼器提出解耦的要求呢?當年Schmidhuber就想到了很是聰明的方法。

首先,上面公式(1)能夠換一個表述,改寫成三個條件獨立表達式:

P(c_1 | c_2, c_3) = P(c_1) (2a)

P(c_2 | c_1, c_3) = P(c_2) (2b)

P(c_3 | c_1, c_2) = P(c_3) (2c)

直觀上能夠把這組式子解釋爲,一個編碼維度旁邊的「兄弟維度」對於預測該維度沒有額外幫助,好比說知道了c_1c_2並不能幫助咱們將c_3猜得更準。

接着,使用三個預測器網絡f_1, f_2, f_3把上述邏輯具體化,其中預測器1負責預測維度1,輸入維度2和3,以此類推,數學形式以下:

\hat c_1 = f_1(c_2, c_3) (3a)

\hat c_2 = f_2(c_1, c_3) (3b)

\hat c_3 = f_3(c_1, c_2) (3c)

網絡形式以下:
爲了讓預測器猜準它所負責的編碼維度,能夠把它的loss函數定爲L2 loss(或者其餘預測偏差loss):

L(f_1) = \mathbb{E} [c_1 - \hat c_1]^2 = \mathbb{E}[c_1 - f_1(c_2, c_3)]^2 (4a)

L(f_2) = \mathbb{E} [c_2 - \hat c_2]^2 = \mathbb{E}[c_2 - f_2(c_1, c_3)]^2 (4b)

L(f_3) = \mathbb{E} [c_3 - \hat c_3]^2 = \mathbb{E}[c_3 - f_3(c_1, c_2)]^2 (4c)

按Schmidhuber的思想,上述loss體現了各個編碼維度的解耦程度。怎麼說呢?以預測器1爲例,若是c_1c_2, c_3頗有關係,甚至極端狀況下c_1恆等於c_2,那麼f_1就可以猜得很準。此時c_1關於c_2, c_3條件不獨立,頗有可預測性(predictability),咱們就認爲c_1沒能從c_2, c_3中解耦。

這顯然不是想要的局面。爲了將c_1c_2, c_3解耦,編碼器就得儘量讓預測器猜不中,loss上體現爲:

L(Enc) = - \mathbb{E} [c_1 - f_1(c_2, c_3)]^2 = - L(f_1) (5)

預測器1想要猜中維度1,而編碼器想要讓它猜不中,loss函數恰好相反,,二者之間存在對抗。若是編碼器贏了,就表明c_1c_2, c_3關係不大,成功解耦。

接下來考慮上全部維度,再把公式寫得通用一點。每一個預測器試圖猜中它所負責的編碼維度,體現了編碼的可預測性,其loss爲:

L(Pred) = \sum_i \mathbb{E} [c_i - f_i (c_1, \dots, c_{i-1}, c_{i+1}, \dots, c_N)]^2 (6)

編碼器試圖讓全部預測器都猜不中,試圖最小化可預測性,其loss與預測器相反:

L(Enc) = - \sum_i \mathbb{E} [c_i - f_i (c_1, \dots, c_{i-1}, c_{i+1}, \dots, c_N)]^2 (7)

若是編碼器贏了,就解耦了編碼向量的各個維度。至此,讀者就能夠理解Schmidhuber論文標題的含義了:Learning Factorial Codes by Predictability Minimization,經過最小化可預測性,來學習一個解耦的編碼表示。

固然,除了上述兩個相互對抗可預測性loss,別忘了還有個自編碼器自己的重構偏差loss,它可以保證編碼中儘量保留了原始輸入樣本的重要信息。論文中其實還有其餘loss,但不是重點,感興趣的人能夠去讀原論文。將上述網絡模塊與loss函數所有集中在一塊兒,就造成了PM模型的整體架構圖,咱們用這張圖做爲第二部分的總結:

3、三個後輩

知道了PM是啥,接下來的問題就是它跟GAN究竟有多類似,但實際上GAN的兩個後續變種——InfoGAN、對抗自編碼器反而跟PM更像,因此第三部分先簡單介紹這三個模型,再在第四部分跟PM進行綜合比較。相關論文以下:

Generative Adversarial Nets
InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets
Adversarial Autoencoders

第一個模型是你們已經很熟悉的GAN,分爲生成器(generator)和判別器(discriminator)兩個模塊。生成器輸入一個隨機編碼向量,輸出一個複雜樣本(如圖片);判別器輸入一個複雜樣本,輸出一個機率表示該樣本是真實樣本仍是生成器產生的假樣本。判別器的目標是區分真假樣本,生成器的目標是讓判別器區分不出真假樣本,二者目標相反,存在對抗。

GAN的生成器輸入一個100維的編碼向量,但在生成樣本的過程當中未必會用上所有維度,可能有些維度提供了絕大部分重要信息,另一些維度只是襯托,提供一些無關痛癢的隨機擾動。然而究竟哪些維度編碼了重要信息,哪些維度僅僅提供隨機擾動?在GAN的架構下咱們既無法知道,也無法控制。

 

第二個模型InfoGAN卻能夠作到。先來看它的結構,相比GAN多了個重構器模塊,用於重構生成器輸入的隨機編碼向量,可是隻重構由咱們指定的一部分維度。

加上重構器模塊以後,若是生成器拿這一部分維度當成無關痛癢的隨機擾動來用,那重構器的任務就會比較艱難;但若是生成器拿這一部分維度當成樣本的重要信息(或者套用PCA的術語,主成分)來用,那麼輸出樣本就會和這部分編碼維度高度相關,此時重構器可以比較輕鬆地從樣本重構出原來的這部分編碼。兩相對比,生成器就會傾向於使用咱們指定的這一部分維度來做爲樣本的重要信息(主成分)。訓練結束後,甚至有機會觀察到有些維度具備很是顯著的語義信息,好比InfoGAN論文在MNIST手寫數字上訓練以後,能夠觀察到某個維度徹底控制着0-9的數字類別,某個維度徹底控制着數字圖像從左到右的傾斜程度,這些顯然就是MNIST數據集的重要信息(主成分):

對於已經讀過InfoGAN論文的人,我須要補充解釋一下,上述講法跟論文的講法不太同樣。論文是從互信息的角度開始推導,通過一些變分推斷的技巧最終獲得模型的loss,但其實最終獲得的loss基本上就是普通的重構偏差。對於離散維度,論文最終推出的loss是log likelihood,通常對離散維度設置的重構偏差也是如此;對於連續維度,論文最終推出的loss是對多維高斯分佈取log,若是簡化高斯分佈中的協方差矩陣是單位矩陣,該loss就等價於普通的L2 loss,也是通常對連續維度設置的重構偏差形式。

 

不管是GAN、InfoGAN仍是其餘GAN變種,基本上都想學習從零均值、一方差的標準高斯分佈到複雜樣本分佈的映射,而GAN的思路是先固定前者(標準高斯分佈)做爲網絡輸入,再慢慢調整網絡輸出去匹配後者(複雜樣本分佈)。

 

第三個模型Adversarial Autoencoder(對抗自編碼器)卻採起了相反的思路!它是先固定後者(複雜樣本分佈)做爲網絡輸入,再慢慢調整網絡輸出去匹配前者(標準高斯分佈)。具體來講,對抗自編碼器包含三個模塊——編碼器、解碼器、判別器,前二者構成一個普通的自編碼器,輸入的複雜樣本,仍是要求在解碼器的輸出端重構;判別器輸入編碼向量,斷定它是來自一個真實的標準高斯分佈,仍是來自編碼器的輸出。判別器試圖區分編碼向量的真假,編碼器就試圖讓判別器區分不出真假,若是最終編碼器贏了,就意味着它輸出的編碼很接近標準高斯分佈,致使判別器混淆不清,咱們的目的也就達到了。對抗自編碼器嚴格來講應該不算GAN的變種,由於它的思路方向與GAN相反。

說到跟GAN方向相反,讀者可能會記起上文提到Schmidhuber把GAN叫作「inverse PM」。PM跟GAN相反,對抗自編碼器也和GAN相反,那它們兩個會不會很像呢?答案是確實很像,若是把PM的架構圖參照上面三個模型從新畫一遍,就能夠很清晰地看到PM跟對抗自編碼器的主體架構徹底對的上。

 

須要注意的是,上圖其實把N個預測器合併畫成了一個。

最後,一圖總結第三部分:

4、縱橫融匯

最後是對上述四個模型作綜合比較。首先對比PM和GAN:

1.映射方向相反

  • PM的編碼器把複雜分佈映射爲解耦分佈
  • PM的解碼器把解耦分佈映射爲複雜分佈
  • GAN的生成器把一個解耦的高斯分佈映射爲複雜分佈

其中PM的編碼器和GAN的生成器方向相反,因此Schmidhuber把GAN稱爲「inverse PM」。

2.都是對抗優化相反的目標

  • PM的預測器要猜準某一維編碼,編碼器要讓它猜不許
  • GAN的判別器要區分真假樣本,生成器要讓它區分不許

3.預測/判別結構類似

若是把真假標籤的節點跟圖片樣本節點拼接到一塊兒,視爲一個超長向量的話,GAN的判別器就能夠強行視爲PM預測器的特例:PM對每個維度都要預測,可是GAN只預測真假標籤這一特殊維度。

4.模型主體不一樣(Goodfellow在GAN論文中提出)
  • PM的主體是自編碼重構,對抗訓練僅僅做爲一個正則,起到輔助做用
  • GAN的主體就是對抗訓練,沒有其餘目標

5.可拓展性不一樣

  • PM的思想最多隻能作到把編碼建模爲解耦分佈,沒辦法施加其餘要求,施加其餘要求那就不是PM的功勞了
  • GAN雖然具體把編碼建模爲解耦高斯分佈,但其實對編碼的分佈並無任何限制,徹底能夠直接換成其餘分佈來建模,不管是均勻分佈仍是別的什麼分佈都沒問題,甚至能夠用另外一個複雜分佈好比圖片來做爲編碼,讓生成器輸入一張圖片輸出另外一張圖片,可拓展性很是強大。

Goodfellow在GAN論文中還提了其餘不一樣點,可是我我的以爲不合理,就忽略不講了。通過上述比較,咱們能夠看到PM和GAN確實有很是多的類似之處,可是差別也很大,我我的以爲並不能把GAN簡單看做PM的變種。

相比之下,PM和InfoGAN、對抗自編碼器反倒更像:

1.模型主體

  • PM主體是自編碼器,要求重構複雜分佈的樣本
  • 對抗自編碼器主體是自編碼器,要求重構複雜分佈的樣本
  • InfoGAN主體能夠視爲自編碼器,要求重構(部分)編碼向量

2.對網絡中間層的要求

  • PM要求編碼器和解碼器中間的隱藏層解耦,它是經過可預測性最小化的思想來作到的
  • 對抗自編碼器要求編碼器和解碼器中間的隱藏層解耦,且知足高斯分佈,它是經過對抗訓練,拉近隱藏層編碼分佈與一個真正的解耦高斯分佈來作到的
  • InfoGAN要求生成器和重構器中間的隱藏層知足複雜樣本分佈,它是經過對抗訓練,拉近生成分佈與真實複雜分佈來作到的

3.預測/判別結構類似

PM輸入編碼其餘維度,預測某一維度;對抗自編碼器,輸入編碼所有維度,預測真假標籤;InfoGAN和前面GAN的狀況相同,輸入圖片,預測真假標籤。在這個角度上對抗自編碼器與PM更類似。

四個模型對比完畢,咱們可以得到什麼啓發嗎?下面試舉一例,來結束第四部分。

 

inference.vc是一個關於生成模型的著名博客,其中有篇文章認爲對抗自編碼器中用GAN來拉近編碼分佈和高斯分佈,是殺雞用牛刀的作法。

文章認爲,GAN模型強大的分佈拉近能力適用於圖片這樣的複雜分佈,可是對於像解耦高斯分佈如此簡單的狀況,並不須要動用到GAN這種大殺器,其實徹底能夠利用解耦高斯分佈的特殊形式,採起更加高效的方式(好比文章中提了一個叫作MMD的方法,此處略過不講)。

看了PM以後就能夠想到另外一個思路——分別要求解耦和高斯。先把對抗自編碼器的判別器換成PM模型的N組預測器,用可預測性最小化的思想,實現編碼向量各個維度之間的解耦;接着對每一個單獨的編碼維度,經過GAN使其知足高斯分佈。雖然仍是用GAN,可是咱們把向量上的對抗訓練轉化爲標量上的對抗訓練,然後者可能比前者要容易和穩定得多。

5、總結

Schmidhuber在92年提出的PM模型經過可預測性最小化來學習一個解耦的編碼表示,編碼器和預測器優化相反的目標,確實是比GAN更早地使用了對抗訓練的思想。

PM不只跟GAN,還跟InfoGAN、對抗自編碼器存在不少類似之處,但仍是有很明顯的差別。其中PM和對抗自編碼器最像,主體都是自編碼器,但它們並不能簡單地視爲GAN的變種。

咱們如今都是盯着最新最前沿的研究工做,其實也許有不少像PM這樣「古老」但有趣的想法被咱們忽視了,有的是由於當年提出的時候思想太過超前,或者硬件計算能力撐不起來,致使無人問津,最典型的例子就是LSTM。這些工做不該該被埋沒,若是可以從新挖掘出來的話,就可能給今天的研究帶來不少新的啓發。

相關文章
相關標籤/搜索