編譯 | 王念
編輯 | 叢末
生成式對抗網絡(Generative Adversarial Networks, GAN)誕生於2014年,它的作者Ian Goodfellow 因它而聲名大噪,被譽為「GAN 之父」。
據說GAN是Goodfellow手握扎啤在酒吧靈機一動所得(咦?這篇文章突然散發出麥芽的香氣)。GAN的誕生是AI界的裡程碑,為這個本已生機勃勃的領域打開了一扇全新的大門。
近些年,針對GAN的研究層出不窮。科學家們紛紛為自己的工作冠以各種高大上的名字,以此烘託出自己的與眾不同和十足的神秘感。
然而所謂科研的實質就是「填坑」,當一個大牛提出了創新技術,它的衍生品自然會層出不窮。
比如在初代GAN誕生後,便有人提出為其「加裝輪子」,成為CycleGAN(獨輪GAN);但是一個輪子走不穩,於是經過改造就有人忽悠出一輛BiCycleGAN(自行車GAN);自行車忽悠過了,就有人提出ReCycleGAN(輪椅GAN)。照這個架勢,相信在不久的將來,我們還會迎來三蹦子GAN、越野車GAN、SUV GAN和SpaceX GAN(狗頭保命)。
GAN的成功要歸功於其在計算機視覺上的驚人效果。相對於VAE等傳統技術,GAN能合成更加逼真的圖片,這些圖片真的能到以假亂真的地步。GAN在計算機視覺方向的成就斐然,實用性有口皆碑。然而人們不甘止步於此,所以在近些年,大家又在關注如何將其利用到聲音、文字等其他數據場景。比如說:
CycleGAN模型能夠將圖片從一個場景(domain)變到另一個場景。例如將男人的圖片過渡稱為女性、將年輕的照片變成衰老的樣子;Text-to-image模型能夠根據文字生成對應的圖片,不折不扣的腦補神器;ProgressiveGAN能夠用於生成超高解析度的圖片。在這篇文章中,讓我們共同領略GAN的魅力,一口氣看盡GAN領域當下最流行的「弄潮兒」,尤其是這六位:CycleGAN, StyleGAN, DiscoGAN, pixelRNN, text-2-image 和 lsGAN。
在此之前,我們不妨先看下初代 GAN 的相關原理和核心思想:
1
GAN 101 和 初代 GAN
我們知道監督學習包括生成式模型和判別式模型兩大類。其中判別式模型可以進行分類任務,比如根據輸入的圖片判斷圖中物體的種類。而生成式模型主要用於合成跟訓練樣本具有類似特徵的數據,可以理解成合成「假數據」。
我們可以把生成式模型看作一個數據生成器,它能根據學習到的模式源源不斷地產生「看起來類似但不完全相同」的數據樣本。今天我們的主角GAN就屬於生成式模型。
從數學的角度來看,任何數據都有自己的概率分布特點。生成式模型的任務是從有限的訓練數據中總結出這個概率,將這個概率學習成一個「公式」、一個「模型」或者一種「模式」。當它學習到這個樣本的分布特點後,模型就能夠據此源源不斷地生成新的偽數據了。
有些童鞋可能會問這些偽數據有什麼用呢?例如在影視作品中,每個群眾演員都是很貴的,只要露臉了他的薪酬可能就需要翻番。但在有了GAN之後,導演就能像種樹一樣合成虛擬的群演——「種人」,從而節省很多人力成本。另外在醫療場景下,患者樣本可能特別稀缺,那為了平衡數據集,一生就可以利用GAN產生部分患者數據,避免模型過擬合的問題。
那麼下面,我們首先來聊聊GAN的核心思想。
GAN由兩個部分組成:生成器和判別器。
生成器就像是製造偽鈔的印刷機,它負責根據隨機噪聲產生合成樣本(偽鈔);而判別器就像是驗鈔機,它負責識別這個輸入樣本是否為假數據(偽鈔)。生成器的輸出都是假數據(Fake Sample),而訓練集中的樣本就是真樣本(Real Sample)。
當我們訓練判別器時,如果模型的輸入是生成器的偽數據,那這個樣本對應的標籤就是Fake;如果輸入的是數據集中的真實樣本時,它對應的標籤就是Real。這樣能形成一個良好的負反饋,在訓練判別器「鑑偽」的同時,也逼著生成器增強自己「造假」的能力。
圖1:GAN中包括生成器和判別器兩個部分
GAN成功之處在於生成器和判別器的「左右互搏之術」。
生成器會竭盡全力生產「假鈔」,試圖讓所生成的假數據通過判別器的嚴格審查。而判別器也會盡一切努力嚴格執法,揪出每一個合成數據,讓「假鈔」們無所遁形。
圖2:GAN中包括生成器和判別器兩個部分
下面我們簡單的看一下GAN的目標函數以及優化方法。本質上來說,GAN需要解決和優化的是一個最小-最大優化問題(min-max optimization)。生成器的任務是最小化目標函數,而判別器的任務是最大化這個目標函數。
待優化的目標函數如圖3所示。在公式中,D是判別器,G是生成器。Pz是潛在空間的一個概率分布,其實就是一個隨機的高斯噪聲,它是生成假數據的源頭。Pdata是訓練數據集的概率分布。當x是從Pdata中真實採樣的,我們便希望分辨器將其判別為真樣本。G(z)是生成器合成的假數據,當我們將其輸入判別器的時候,我們希望判別器能夠將其判別為假樣本。
圖3:GAN的目標函數
判別器的目標是最小化D(G(z)),也就是最大化(1-D(G(z)))。而生成器的目標是最大化D(G(z)),也就是想讓判別器犯錯,看不出這是個假數據,從而達到以假亂真的效果。所以生成器的目標是最小化(1-D(G(z)))。判別器和生成器的目標相反,所以這是一個典型的最小-最大優化問題(min-max optimization)。
圖4 :GAN中的目標函數
2
CycleGAN
不知道大家有沒有玩過一款叫做FaceApp的軟體,它能讓我們「穿越」時光,看看中年、老年時候的我們。譯者親測,效果十分震撼和可怕。譯者在第一次使用的時候愣了足足十餘分鐘,仿佛真的見到了50年後的自己,甚至有種窺透天機的恐懼感。FaceApp中就使用了CycleGAN技術來實現這種「穿越」,或者專業點,叫領域轉換(Domain Transformation)。
言歸正傳,CycleGAN在近些年大火,它是一種廣泛應用於風格轉換的GAN模型。舉例來說,它能學習到藝術作品和真實照片之間的映射關係和變換方法。當我們用手機拍一張照片,CycleGAN就能將它自動變成油畫;反之,CycleGAN也能還原藝術畫作創作時的真實照片,讓畫面更加真實、讓我們身臨其境。此外,CycleGAN還能學習到例如馬匹和斑馬之間的變換,也能讓照片裡的季節背景自由切換。
為了方便介紹和陳述,我們用馬匹和斑馬的變換作為案例。這裡設X數據集中都是馬匹的圖片,而Y數據集中都是斑馬的圖片。
CycleGAN的目標是學習一個映射函數G,實現馬匹到斑馬圖片的變換。用公式表達起來就是G:X->Y。和普通GAN一樣,CycleGAN中也有自己的生成器和判別器。其中生成器的功能是根據輸入的馬匹圖片,輸出一張讓判別器以為是真實斑馬的圖片。這個目的能夠通過最優化對抗損失(Adversarial loss)來實現。需要注意的是,CycleGAN不光能學到馬匹到斑馬的映射函數G,也能通過使用循環一致性損失(Cycle-Consistency Loss)學到逆向的、斑馬到馬匹的映射函數F:Y->X。
在訓練的過程中,模型有兩組輸入。第一組輸入樣本{X1, Y1}中的每個Xi(馬匹)均有其所對應的斑馬圖片(Yi)。而第二組數據{X2, Y2}中,每個馬匹樣本Xi和斑馬圖片(Yi)都是不匹配的。
圖5. CycleGAN的訓練過程
我們前邊提到,CycleGAN能夠學習到G和F這兩個映射函數。第一個是G,它能將馬匹圖片X轉換成斑馬圖片Y。第二個是F,它負責將斑馬圖片Y轉換成馬匹圖片X。所以CycleGAN其實是由兩個獨立的GAN組成的,也就包括了2個生成器Gx, Gy,以及2個判別器Dx和Dy。
其中Dx的任務是檢查輸入的Y和真實的斑馬Y之間有沒有差異。同樣的,Dy的任務是檢查輸入的X和真實的馬匹圖片集X間有沒有差異。這是通過對抗損失的最小化實現的。
此外,CycleGAN中還有另一個損失,就是循環一致性損失(Cycle-Consistency Loss)。它是用來在訓練中使用{X2, Y2}這組無匹配樣本的數據集。循環一致性損失能夠幫助模型最小化重構損失,也就同時實現F(G(x)) ≈ X ,以及G(F(Y)) ≈ Y。
所以總結起來,CycleGAN的損失函數由三個獨立的部分組成:
在損失的優化過程中,目標函數可以表達為:
以上就是CycleGAN的技術部分。CycleGAN的實際應用效果十分逼真,比如下面這張圖片就使用CycleGAN實現了油畫與照片的轉換、馬匹和斑馬的轉換,以及季節切換的效果。從結果中我們可以看到,模型學習到了斑馬和馬匹切換的訣竅,也領悟到了季節變換的精髓。
Linu Torvalds曾經說過:「Talk is cheap. Show me the code(能侃沒啥用,有本事貼代碼)」。CycleGAN的技術主要體現在損失函數上,所以在這裡我們貼上一段損失函數的代碼片段。感興趣的同學可以自行查看論文原文。
效果沒看夠?我們再貼一張大圖,來看看馬匹和斑馬之間的變換效果。
論文:https://arxiv.org/abs/1703.10593
CycleGAN的詳細教程:https://www.tensorflow.org/tutorials/generative/cyclegan
3
StyleGAN
GAN生成圖片不是什麼難事,但是真的很逼真嗎~哼哼,小編覺得它估計還不行,輕易就能被人眼看穿!那童鞋你猜猜這兩張照片哪個是真的哪個是GAN生成的假照片~
「emm…右邊這張還有背景,它估計是真貨!左邊這個背景太單調了,估計是假的!」
哈哈,圖樣圖森破!真相是,它倆都是GAN生成的假貨!驚不驚喜、意不意外~(我倒是有點莫名害怕)
StyleGAN是近些年新出現的一種十分流行的網絡模型。它能夠生成解析度為1024*1024的高清圖片。它的主體思想是堆疊很層的GAN,其中第一層用來生成低解析度的圖像,而後的每層都逐漸增加圖片的解析度。
在StyleGAN之前,也有一些人嘗試提高圖片的解析度,它們大多是通過在圖片中添加隨機噪聲或者插值的方式實現的。但是這樣做的效果通常不好。StyleGAN發現了這個問題,它並沒有通過添加無意義的噪聲來「自欺欺人」。StyleGAN的做法是學習人臉的特徵,並基於這個比較泛在的特點生成一個並不存在的人臉圖像。如果你質疑StyleGAN的性能的話, 請戳這裡,這個連結在每次打開的時候都會生成一張假的人臉圖,這個人臉圖是GAN隨機產生的,而不是從訓練集中粘貼出來的。
典型的StyleGAN的結構如上圖所示。網絡的輸入在經過8層全連接網絡的處理後被映射成一個潛在向量z,z中就包括了人臉的各種特徵。而生成器的合成器由18層網絡組成,它們將向量z從4*4的解析度一直擴大到1024*1024,實現了解析度的升高。但此時生成的圖像還是黑白的,缺少RGB三個顏色通道。因此,StyleGAN在輸出層上使用了獨立的卷積結構來添加顏色通道。看到這麼深的全連接的時候我們就能猜到,這個網絡的參數量極大。事實上,它擁有2620萬個參數需要訓練,因此StyleGAn需要十分龐大的訓練數據集,也需要十分昂貴的計算資源。
在StyleGAN中,每層網絡都需要經過AdaIN歸一化:
其中每個特徵圖都會首先進行獨立的歸一化操作,而後使用目標風格Y對應的屬性進行縮放和偏置轉換。因此Y的維數應為該層網絡特徵圖數量的兩倍。
論文:https://arxiv.org/pdf/1812.04948.pdf
Github代碼:https://github.com/NVlabs/stylegan
4
PixelRNN
PixelRNN是一種自回歸生成模型。
在這個人人曬圖的時代,我們隨便上網就能爬到數不勝數的圖像數據。但是這些「野生圖片」都是沒有標籤的,而基於無標籤數據的無監督學習方法很難學習到數據的分布特點。這個問題一致困擾著我們,直到PixelRNN的出現。
PixelRNN的強大之處在於它能學習到圖像的離散概率分布,並預測或生成二維圖像中的像素。
我們知道循環神經網絡(RNNs)擅長學習數據的條件分布,比如LSTM能夠學習到序列數據和序列像素點之間的長時依賴特點。在PixelRNN中,它採取了漸進式的生成方法,當我們給出了X0~Xi的數據後,它預測下一步Xi+1的結果,而基於X0~Xi+1的結果,模型又能輸出Xi+2的值……以此類推,模型就能產生無窮無盡的數據了。
理論上來說,GAN網絡學習的是數據集隱式的概率分布,而PixelRNN這樣的自回歸模型學習的是數據集顯式的概率分布。這是因為GAN沒有明確地在函數中引入概率分布項,它是通過讓我們查看觀察模型所學到的概率分布來實現相同的目的。
上圖中是一個獨立的PixelRNN殘差塊,模型會疊加、串聯並訓練若干層的殘差塊。一個典型的PixelRNN LSTM層的輸入特徵的高度是特徵圖高度的兩倍,即2h。為了減少特徵維度,LSTM將狀態輸入門的尺寸設為h。在遞歸層之後,PixelRNN使用1*1的卷積來將每個特徵的尺寸擴大2倍,並將輸入分量加入輸出結果之中。
論文:https://arxiv.org/pdf/1812.04948.pdf
Github代碼:https://github.com/NVlabs/stylegan
5
Text-2-image
每當我們提起GAN,它給人的印象大概就是「不羈放縱愛自由」,沒有太多的約束。它所生成圖像的風格和樣式都比較隨意。
比如說,一個從小貓數據集上訓練的GAN網絡能夠生成很多假的貓圖~這些貓在毛色、運動狀態、表情等等方面都很隨機。比如可能生成一張黑貓在吃飯的圖片,或是一張白貓在抓老鼠的圖片,也有可能是一張橘貓盯著自己的贅肉惆悵的圖片(狗頭保命),具有不可控的隨機性。當然了,它們都是一個鼻子兩個耳朵的正常貓,符合貓的特徵。
但是在商業領域中,人們往往需要精準掌控所生成的內容,嚴格按照人類控制生成一些樣本,否則要是出現一些違法或者引起公憤的內容就得不償失了。因此GAN很少應用在商業場景中。為了減少GAN生成圖像的隨機性,儘量控制其中的不可控因素,人們就想設計一種模型讓GAN能夠根據我們的預期和控制生成特定圖像。
在這裡,我們隆重介紹Text-2-Image模型,它能根據輸入的文字描述,有針對性地生成特定的圖像。這對於GAN的研究來說是一項意義重大的進步。Text-2-Image的輸入是文字描述,輸出的是該描述所描繪的圖片。
舉例來說,當我們輸入「一個有許多粉色的小圓花瓣的花花」的句子時,模型就能夠產生一張真的有好多粉色花瓣的花朵圖片,甚至還能把背後的綠葉背景也加上去:
在Text-2-Image模型中,生成器的輸入不再是隨機的噪聲向量了,而是一段有明確意義和確定描述的文字。這段文字會首先經過嵌入(Embedding)層的處理進行編碼,然後在編碼的結果後摻入噪聲向量並輸入生成器模型中。
比如在下面的這個例子中,文字會首先被轉換成256維的特徵,然後和100維的噪聲拼接,形成356維的超級向量。其中的噪聲向量通常是從正態分布中隨機採樣的。
這種方法能夠給生成器一個生成規則(就是明確的文字描述),使生成結果符合該規則,從而降低生成結果在該方面的隨機性。
這樣的設計思想會給判別器帶來額外的壓力和任務。它既需要判斷輸入樣本是否為假數據,又需要判斷輸入樣本是否符合了文字描述的要求。因此在訓練的過程中,我們的輸入數據格式就要進行調整,變成(圖像, 文字)的數據對。具體來說,一共有三種情況:
(正確圖片,正確描述)樣式的數據,它的標籤為1(錯誤圖片,正確描述)樣式的數據,它的標籤為0(假圖片,正確描述)樣式的數據,它的標籤為0其中第一類樣本是指我們為真實圖片提供了正確的文字描述,模型通過它們能學習出圖像的模式和文字描述之間的對應關係。第二類樣本是指數據集中的描述和圖片不相符的情況,模型能夠通過它們了解不匹配是怎樣一個現象。最後一類樣本就是普通GAN中的假數據的判別,生成器通過學習它們來讓生成器儘量生成看起來不那麼「假」的圖像。
具體到我們的花朵生成的例子中,訓練數據集共有10種不同的組合:
下面我們來看一下Text-2-Image模型的生成結果,領略一下這臺聽話的偽鈔機的風採~
論文:https://arxiv.org/pdf/1605.05396.pdf
Github代碼:https://github.com/paarthneekhara/text-to-image
6
DiscoGAN
最近一段時間,DiscoGAN備受學術和工業界的關注。這主要是由於DiscoGAN能夠學習跨領域非監督數據間的關聯性。
對於人類來說,不同領域之間的關聯信息通常是很容易總結和學習的。比如在下圖中,我們一眼就能看出第一行的圖片都是書包,第二行的圖片都是鞋子,第一行和第二行對應圖片在顏色特徵上是一樣的。
然而在人工智慧領域,模型很難挖掘出這種不匹配圖像之間的關聯和共性信息。所以為了解決這個實際存在的問題,研究人員發明了DiscoGAN,希望它能夠學習到不同領域數據間的關聯信息。
DiscoGAN和CycleGAN的核心思想十分類似。DiscoGAN也需要學習兩個映射函數,一個用來學習領域X到領域Y的正向變換方法,另一個用來學習Y到X的反向的變換函數。而原始圖像和經過兩次變換後的重建圖像間的不匹配程度使用了重構損失來進行計算。
此外,DiscoGAN的設計規則和CycleGAN也很類似,即希望將領域A的圖像先轉換到領域B,再將其從領域B轉換回領域A,然後想讓這個二手的切換回來的結果能夠和原始圖像儘量匹配,有種「出淤泥而不染」的感覺。
DiscoGAN和CycleGAN的不同之處在於,DiscoGAN為兩個領域都單獨使用了一個重構損失函數,而CycleGAN只使用一個統一的損失對其進行表示。
(a)Vanilla GAN (b) 使用了重構損失的GAN (c) DiscoGAN
DiscoGAN中的重要思想是利用重構損失函數表示原始圖像和重構圖像之間的差異。換個角度來看,它的變換就是從一個領域轉換到另一個領域,再從那個領域變換回來。兩個領域間來回切換轉換的過程是不是像極了夜店蹦迪的大燈球來回照射,難道人們因此才將其稱為迪斯科GAN(DiscoGAN)?哈哈。在領域A的數據變換到領域B後,數據被變換到另一個領域中進行編碼表達,而在將領域B的數據轉換回來的時候,DiscoGAN希望轉換回來的二手結果能夠跟原始數據盡力那個匹配。所以從數學的角度來說,DiscoGAN就是希望最小化重構損失值。
總結來說,DiscoGAN包括兩個獨立的GAN網絡,一個是GAB,一個叫GBA。在上圖中,模型正在嘗試學習汽車和人臉這兩個不同領域的數據圖像中物體的「方向」信息。在模型重建數據之後,圖像中的物體方向應儘量和原始方向一致。
論文:https://arxiv.org/pdf/1703.05192.pdf
Github代碼:https://github.com/SKTBrain/DiscoGAN
7
LsGAN
無監督的數據通常是很便宜的,因為不用人類對其進行昂貴的標記。因此很多研究都在探索將GAN應用在無監督學習的應用上。
在常規的GAN模型中,有一個讓人撓頭的問題就是梯度消失。梯度消失的原因有很多,其中一個就是判別器中使用的交叉熵損失函數。為了解決這個問題,LsGAN提出使用最小二乘損失函數替代交叉熵。實驗證明,在這樣操作之後LsGAN能夠生成更高質量的圖像結果。
我們首先回顧一下,在Vanilla GAN中,模型使用最小最大化優化方法訓練模型。模型中的判別器是二分類的,輸出的結果非真即假。因此Vanilla GAN的判別器中使用了sigmoid對結果進行激活,並且使用交叉熵作為損失。
這樣的設計會加劇模型訓練中梯度消失的問題,因為對於那些位於決策超平面正確一邊的樣本來說,它們會遠離特徵空間中樣本分布密集的區域,從而產生極大的梯度(誤差值提高了嘛)。而當我們使用最小二乘損失函數的時候就沒有這個問題了,它能夠讓學習的過程更加穩定,從而產生質量更高的圖像結果。
下圖是LsGAN需要優化的目標函數,其中a是假數據樣本的標籤,b是真實樣本的標記,c是生成器希望判別器器對假樣本判別所輸出的值。
因此,在這種場景中就有兩個獨立的待優化損失函數。一個是訓練判別器用的,一個是訓練生成器用的。
相比於Vanilla GAN來說,LsGAN具有很多優點。在Vanilla GAN中,因為判別器使用二分類交叉熵損失函數,所以如果一個樣本的分類結果正確,那它的損失值就=0。
但是在LsGAN中,決策結果並不是損失值的唯一判定標準。在lsGAN中,就算一個數據處於分類超平面中正確的一邊,但一旦它距離決策邊界很遠的話,模型也會給予它很高的損失。
這種懲罰的方式迫使生成器朝向決策邊界產生數據。因此這也能在一定程度上解決梯度消失的問題,因為那些遠離分類邊界的樣本就不會產生巨大的梯度了。
論文地址:https://arxiv.org/pdf/1611.04076.pdf
Github 開源地址:https://github.com/xudonmao/LSGAN
文末閒侃
所有GAN網絡結構都有一個共性,它們都是基於對抗損失進行構建和訓練的。每個網絡都有一個生成器,也有一個判別器。它們的任務是互相欺騙,在左右互搏的過程中提升彼此。
GAN在近些年大放異彩,已經成為機器學習領域中最熱門的研究方向之一。相信在不久的未來,我們會看到更多更有意思的GAN!
這個Github庫系統地整理了GAN相關的研究論文,感興趣的小夥伴不妨一讀哦:
https://github.com/hindupuravinash/the-gan-zoo
參考文獻見原文:https://towardsdatascience.com/6-gan-architectures-you-really-should-know-d0b7373a2585
招 聘
AI 科技評論希望能夠招聘 科技編輯/記者 一名
辦公地點:北京
職務:以跟蹤學術熱點、人物專訪為主
工作內容:
1、關注學術領域熱點事件,並及時跟蹤報導;
2、採訪人工智慧領域學者或研發人員;
3、參加各種人工智慧學術會議,並做會議內容報導。
要求:
1、熱愛人工智慧學術研究內容,擅長與學者或企業工程人員打交道;
2、有一定的理工科背景,對人工智慧技術有所了解者更佳;
3、英語能力強(工作內容涉及大量英文資料);
4、學習能力強,對人工智慧前沿技術有一定的了解,並能夠逐漸形成自己的觀點。
感興趣者,可將簡歷發送到郵箱:jiangbaoshang@yanxishe.com