2014 年 6 月,Ian Goodfellow 等學者發表了論文《Generative Adversarial Nets》,題目即「生成對抗網絡」,標誌着 GAN 的誕生。算法
2015 年還名不見經傳的 GAN ,在 2016 年開掛般地掀起了一波深度學習的高潮,除了 OpenAI 火力全開以外,Facebook 的人工智能實驗室也在這一領域快馬加鞭地深耕,而蘋果不久前的首篇AI論文,就是基於 GAN 的變種「SimGAN」。編程
2016年,GAN 熱潮席捲 AI 領域各大頂級會議,從 ICLR 到 NIPS,大量高質量論文被髮表和探討。Yann LeCun 曾評價 GAN 是「 20年來機器學習領域最酷的想法」,並在 2016 巴塞羅那的 NIPS 上提到將「預測學習(Predictive Learning)"落腳到 GAN 。網絡
在大數據的圈子,一般有人說「誰掌握了數據,誰就佔據了將來高地」。因而,基於數據而習得「特徵」的深度學習技術受到熱捧,而 GAN 的訓練方法更加激進:它生成數據自己。框架
從學術界到工業界,GAN 熱潮席捲整個 AI 領域,成爲深度學習領域一顆冉冉升起的新星,將來的發展潛力更是被無數人看好。dom
GAN :基於機率的生成模型機器學習
什麼是 GAN?用 Ian Goodfellow 本身的話來講:「生成對抗網絡是一種生成模型(Generative Model),其背後基本思想是從訓練庫裏獲取不少訓練樣本,從而學習這些訓練案例生成的機率分佈。」svn
而實現的方法,是讓兩個網絡相互競爭,‘玩一個遊戲’。其中一個叫作生成器網絡( Generator Network),它不斷捕捉訓練庫裏真實圖片的機率分佈,將輸入的隨機噪聲(Random Noise)轉變成新的樣本(也就是假數據)。另外一個叫作判別器網絡(Discriminator Network),它能夠同時觀察真實和假造的數據,判斷這個數據究竟是不是真的。函數
用 Adit Deshpande 的話解釋更加清晰:post
「GAN 的基本原理是它有兩個模型:一個生成器,一個判別器。判別器的任務是判斷給定圖像是否看起來‘天然’,換句話說,是否像是人爲(機器)生成的。而生成器的任務是,顧名思義,生成看起來‘天然’的圖像,要求與原始數據分佈儘量一致。學習
GAN 的運做方式可被看做是兩名玩家之間的零和遊戲。原論文的類比是,生成器就像一支造假幣的團伙,試圖用假幣矇混過關。而判別器就像是警察,目標是檢查出假幣。生成器想要騙過判別器,判別器想要不上當。當兩組模型不斷訓練,生成器不斷生成新的結果進行嘗試,它們的能力互相提升,直到生成器生成的人造樣本看起來與原始樣本沒有區別。」
GAN 首先是一種機率生成模型,機率生成模型能夠用於天然圖像的生成。假設給定1000萬張圖片以後,生成模型能夠自動學習到其內部分佈,可以解釋給定的訓練圖片,並同時生成新的圖片。
與龐大的真實數據相比,機率生成模型的參數個數要遠遠小於數據的數量。所以,在訓練過程當中,生成模型會被強迫去發現數據背後更爲簡單的統計規律,從而可以生成這些數據。
除了 GAN ,如今比較經常使用的變分自動編碼模型(VAE)、自迴歸模型(Auto-regressive)也屬於機率生成模型。
GAN 是更好的生成模型,在某種意義上避免了馬爾科夫鏈式的學習機制,這使得它可以區別於傳統的機率生成模型。傳統機率生成模型通常都須要進行馬可夫鏈式的採樣和推斷,而 GAN 避免了這個計算複雜度特別高的過程,直接進行採樣和推斷,從而提升了 GAN 的應用效率,因此其實際應用場景也就更爲普遍。
GAN 的基本原理
GAN 模型包括了一個生成模型 G 和一個判別模型 D,GAN 的目標函數是關於 D 與 G 的一個零和遊戲。也是一個最小-最大化問題。
這裏判別模型 D 其實是對數據的來源進行一個判別:究竟這個數據是來自真實的數據分佈 Pdata,仍是來自於一個生成模型 G 所產生的一個數據分佈 Pg。
判別模型 D 的訓練目的就是要儘可能最大化本身的判別準確率。當這個數據被判別爲來自於真實數據時,標註 1,自於生成數據時,標註 0。
而與這個目的相反的是, 生成模型 G 的訓練目標,就是要最小化判別模型D的判別準確率。在訓練過程當中,GAN 採用了一種很是直接的交替優化方式,它能夠分爲兩個階段。第一個階段是固定判別模型 D,而後優化生成模型 G,使得判別模型的準確率儘可能下降。而另外一個階段是固定生成模型 G,來提升判別模型的準確率。
下面這張圖,可視化了 GAN 學習的過程,從左到右是隨着訓練過程的進展,依次獲得的訓練結果。
圖(a)中黑色大點虛線P(x)是真實的數據分佈,綠線 G(z) 是經過生成模型產生的數據分佈(輸入是均勻分佈變量z,輸出是綠色的曲線)。藍色的小點虛線 D(x) 表明判別函數。
在圖(a)中,咱們能夠看到,綠線 G(z) 分佈和黑色 P(x) 真實分佈,還有比較大的差別。這點也反映在藍色的判別函數上,判別函數可以準確的對左面的真實數據輸入,輸出比較大的值。對右面虛假數據,產生比較小的值。可是隨着訓練次數的增長,圖(b)和圖(c)反映出,綠色的分佈在逐漸靠近黑色的分佈。到圖(d),產生的綠色分佈和真實數據分佈已經徹底重合。這時, 判別函數對全部的數據(不管真實的仍是生成的數據),輸出都是同樣的值,已經不能正確進行分類。G 成功學習到了數據分佈,這樣就達到了GAN的訓練和學習目的。
GAN 經過對抗式訓練生成圖片
準確來說,對抗式訓練爲指導人工智能完成複雜任務提供了一個全新的思路,某種意義上他們(人工智能)將學習如何成爲一個專家。
舉個對抗式訓練的例子,當你試圖經過模仿別人完成某項工做時,若是專家都沒法分辨這項工做是你完成的仍是你的模仿對象完成的,說明你已經徹底掌握了該工做的所需的技巧。對於像寫論文這樣複雜的工做,這個例子可能不適用,畢竟每一個人的最終成果多少有些不一樣,但對於中等難度的任務,好比造句或寫一段話,對抗式訓練大有用武之地,事實上它如今已是計算機生成真實圖像的關鍵所在了。
咱們知道,OpenAI 對生成模型格外偏心,他們的動力可總結爲理查德·費曼的一句名言:「不是我創造的,我就不能理解。」,費曼這裏實際上是指「首要原則」的思考方法:經過構建驗證過的概念來理解事物。
在 AI 領域,或許就是指:若是一個機器可以生成具備高度真實感的模型,那麼它就發展出了對預測模型的理解。而這剛好是 GAN 所採起的方法。
GAN 解決問題的方式是用不一樣的目標分別訓練兩種不一樣的網絡。
• 一種網絡創造答案(生成方)
• 另外一種網絡分辨前者創造的答案與真實答案的區別(對抗方)
GAN 的訣竅是這樣的:訓練兩種網絡進行競爭,一段時間後,兩種網絡都沒法在對抗中取得進步,或者生成方變得很是厲害以致於即便給定足夠的線索和時間,其對抗網絡也沒法分辨它給的答案是真實的仍是合成的。
這其中有不少有趣的細節,但咱們暫時先忽略這些細節。GANs 能夠在給定繪製圖像類別和隨機種子(random seed)的條件下,自主完成圖像的繪製。
論文《Generative Adversarial Text to Image Synthesis》介紹瞭如何經過 GAN 進行從文字到圖像的轉化。比方說,若神經網絡的輸入是「粉色花瓣的花」,輸出就會是一個包含了這些要素的圖像。該任務包含兩個部分:1. 利用天然語言處理來理解輸入中的描述。2. 生成網絡輸出一個準確、天然的圖像,對文字進行表達。
爲實現這些目標,生成器和判別器都使用了文字編碼技術:經過循環文字編碼器(recurrent text encoder)生成的文字屬性,來做爲條件對 GAN 進行訓練。這使得 GAN 可以在輸入的文字描述和輸出圖像之間創建相關性聯繫。
好比咱們給定「紅腳鷸」、「螞蟻」、「修道院」和「火山」,利用 GAN 就能夠生成如下的圖片。
是否是讓人有眼前一亮的感受呢?不少人都畫不出這麼好的圖吧,固然,這是比較理想的狀況,還有一些常常被搞砸的狀況(以下圖),不過這已經讓研究者們很是欣喜了。
目前的共識是,這些生成模型並不能準確捕捉到給定任務的「語義」:也就是說它們其實並不能很好地理解「螞蟻」、「紅腳鷸」、「火山」等詞的意義,但卻可以很好地模仿和預測。這些圖片並非機器基於原有訓練圖片庫的再創造,而是根據通用模型所推斷出的很是接近現實的結果。
這種使用對抗性網絡的方法,異於經典的機器學習方法。咱們有兩個相互競爭的神經網絡,但又好像在共同協做達成一種「泛化能力」。在經典機器學習領域,研究人員先定義一個目標函數,而後使用他最喜歡的優化算法。但這其中有一個問題,那就是咱們沒法準確得知所定的目標函數是不是正確的。而 GAN 使人驚喜的地方在於,它甚至可以習得本身的目標函數。
GAN 的超分辨率應用
這是推特 Cortex 研究團隊進行的一項研究,在 2016 年 9 月發表。它的主要貢獻是開發出全新的損失函數(loss function),使得 GANs 能對大幅降採樣後的圖像,恢復它的生動紋理和小顆粒細節。
在機器學習中,實現超分辨率須要用成對樣本對系統進行訓練:一個是原始高清圖像,一個是降採樣後的低分辨率圖像。本研究中,低分圖像被做爲輸入餵給生成器,它重建出高分辨率圖像。而後,重建圖片和原始圖片被一塊兒交給判別器,來判斷哪一幅是原始圖像。
生成模型要將模糊的低分辨率圖像做爲輸入,並輸出一個高分辨率的清晰圖像。而判別模型,就要判斷所輸入的圖像到底是「真實高分辨率圖像」仍是由低分辨率圖像「轉化來的高分辨率圖像」。而這就 大大簡化了圖像超分辨率模型的學習過程。由於傳統上作一個圖像超分辨率,都要去對一些高頻細節進行建模,而這裏生成模型訓練目的就簡化爲迷惑判別模型。
在 Twitter 的論文中,他們用一個16個殘差塊的網絡來參數化生成模型。而判別模型使用的是一個VGG網絡。這個實驗結果也說明了使用GAN模型可以獲得更好的結果。與以往基於深度學習模型作圖像超分辨率的結果相比的話(好比SRResNet等),咱們能夠看到 GAN 的結果圖可以提供更豐富的細節。 這也就是GAN作圖像生成時的一個顯著優勢,即可以提供更銳利的數據細節。
對抗式學習和人類的反饋式學習
那麼咱們是如何學習寫字的?除非你念的是要求很嚴格的小學,不然學習寫字的過程很難說是最大化某個與書寫字母有關的函數。最可能的狀況是你模仿老師在黑板上的書寫筆順,而後內化這一過程 。
你的生成網絡書寫字母,而你的識別網絡(對抗方)觀察你的字體和教科書中理想字體的區別。
針對三年級學生的對抗式訓練
咱們並不知道咱們的大腦是如何使用「行爲人-批評家」的模式來學習的,可是能夠肯定的是在有一個專家即時反饋的條件下,咱們能夠更有效率地學習新東西。
當學習編程或攀巖時,若是你一直接收某個專家的「beta(反饋建議)」,則能夠進步得更快。在你得到足夠的經驗可以自我反饋批評以前,有一個外部的批評家來糾正你每一小步的錯誤能夠更容易訓練你大腦的生成網絡。即便有一個內部批評家在監督你,學習一個有效的生成網絡仍然須要認真的練習。
一個問題天然而然地出現了——到底哪一種網絡可以真正理解所面臨問題,是生成器仍是識別器?或者說究竟誰更會寫字,是寫字的學生,仍是教寫字的老師?
現實世界一般是老師更會寫字,但在以前的例子中,應該是學生更會寫字。由於一個用於識別產品評論的識別器只需知道一些常見的語法錯誤,就能投入使用。正如一我的像米開朗基羅同樣畫畫,一我的僅僅是擡頭看看西斯廷大教堂的天花板(上面有米開朗基羅的畫),誰須要更多的技巧呢?
好比,手機圖像軟件 Prisma 在有對抗方的框架下,訓練生成網絡,進行不一樣風格的創做。大多數風格正是經過這種方式生成了那些曲折的線條。我但願他們能增長訓練 GAN 的時間,這樣 GAN 不只能認出照片中的陰影,並給其塗上不一樣的顏色,還可能以一個印象派藝術家的風格完成這些任務。當它偶爾能夠正確地區分光線和陰影的時候,那麼它就是使人驚歎的。
順着這條思路想下去能夠得出一個很天然的結論,生成式對抗方法,可讓人工智能有能力作實驗和A/B測試。一我的工智能模型給出了一個很好的解決方案,而後它蒐集反饋來了解這個生成方案和標準答案是否相符,或與其餘它正在學習或已經內化的人工智能模型比較,觀察得出的結果是否相符。在這一過程當中,你不必去設計一個損失函數,由於雖然可能會花上一點時間,但這我的工智能模型終將找到本身的評判標準。
在不完美中繼續前行
做爲一個生成模型,GAN模型避免了一些傳統生成模型在實際應用中的一些困難,巧妙地經過對抗學習來近似一些不可解的損失函數。
天然 GAN 也並不完美。一個是優化過程當中存在不穩定性,很容易坍縮到一個鞍點上;其次是 GAN 的可解釋性比較差;再次,須要提升訓練過程當中的穩定性和GAN 模型的延展性,尤爲在處理大規模數據的時候。
固然也有不少人對 GAN 的收斂性和可推廣性持悲觀態度,他們認爲,因爲這種蹺蹺板式的訓練方法——一下子訓練生成方,一下子訓練識別方,如此反覆——並不能保證收斂於一個穩定解,更別提一個最優解了。
天然目前還有不少不盡如人意的地方,但咱們看到 GAN 應用在無監督學習或自監督學習上並提供有效的解決方案的可能性。同時 GAN 還能夠創建與強化學習之間的聯繫,應用在強化學習上。
GAN 的誕生給咱們帶來的一個迷人的發現是,深度學習系統的可塑性極強。經典的機器學習認爲目標函數和約束條件都是固定的觀念,或者認爲最優算法是固定的觀念,此時並不適用於機器學習領域了。
正如 Yan Lecun 所說:「 GAN 爲建立無監督學習模型提供了強有力的算法框架,有望幫助咱們爲 AI 加入常識。咱們認爲,沿着這條路走下去,有不小的成功機會能開發出更智慧的 AI 。」
深度學習新星:GAN
- DataCastle -