淘新聞

“GANs之父”Goodfellow 38分鐘視頻親授:如何完善生成對抗網路?(上)

編者按:深度學習頂級盛會NIPS於今年12月初在巴賽隆納舉行,相信有很多人都無法參加。不過,有另一個AI盛會卻是全世界所有人都能參加的,叫做“AI WITH THE BEST”,已於今年9月在網路世界裡召開。演講嘉賓有100多人,其中就有“GANs之父”Ian Goodfellow。這個會議由於是網路播出,所以有完整錄影,雷鋒網對比Ian Goodfellow在NIPS的演講內容,二者十分相仿,故在此將此次會議的視頻搬運給大家,並附上中文圖文詳解(PS:本文由亞萌和三川共同編輯完成)。

大家好,先自我介紹一下,我叫Ian Goodfellow,我是OpenAI的一名研究員。OpenAI是一個非盈利性組織,致力於把通用性的人工智慧變成一種安全的方法,並且造福於全人類。

我今天將給大家講一下生成對抗網路(Generative Adversarial Networks),簡稱“GANs”。

什麼是對抗生成網路(GANs)?

生成對抗網路是一種生成模型(Generative Model),其背後最基本的思想就是從訓練庫裡獲取很多的訓練樣本(Training Examples),從而學習這些訓練案例生成的概率分佈。

一些生成模型可以給出概率分佈函式定義的估測,而另一些生成模型可以給你全新的樣本,這些新樣本來自于原有生成訓練庫的概率分佈。

PPT最底下一排圖片來自於ImageNet的資料庫,左邊是訓練圖片,右邊我們可以看作是一個理想的生成模型所產生的照片(實際上右邊的照片依然是從ImageNet庫裡選取的,我們的系統目前還沒有成熟到可以生成這種真實感)。

GANs的方法,就是讓兩個網路相互競爭“玩一個遊戲”。

其中一個叫做生成器網路( Generator Network),它不斷捕捉訓練庫裡真實圖片的概率分佈,將輸入的隨機雜訊(Random Noise)轉變成新的樣本(也就是假資料)。

另一個叫做判別器網路(Discriminator Network),它可以同時觀察真實和假造的資料,判斷這個資料到底是不是真的。

所以整個訓練過程包含兩步,(在下圖裡,判別器用 D 表示,生成器用 G 表示,真實資料庫樣本用 X 表示,雜訊用 Z 表示)。

第一步,只有判別器D參與。

我們把X樣本輸入可微函數D裡運行,D輸出0-1之間的某個值,數值越大意味著X樣本是真實的可能性越大。在這個過程中,判別器D盡可能使輸出的值靠近1,因為這一階段的X樣本就是真實的圖片。

第二步,判別器D和生成器G都參與。

我們首先將雜訊資料Z喂給生成器G,G從原有真實圖像庫裡學習概率分佈,從而產生假的圖像樣本。然後,我們把假的資料交給判別器D。這一次,D將盡可能輸入數值0,這代表著輸入資料Z是假的。

所以這個過程中,判別器D相當於一個監督情況下的二分類器,資料要麼歸為1,要麼歸為0。

與傳統神經網路訓練不一樣的且有趣的地方,就是我們訓練生成器的方法不同。生成器一心想要“騙過”判別器。使用博弈理論分析技術,我們可以證明這裡面存在一種均衡。

DCGANs:深度卷積生成對抗網路

現代GANs架構基於一篇名為“ Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks ”(簡稱DCGANs)的論文,作者是 Alec Radford、Luke Metz和Soumith Chintala。(連結:

https://arxiv.org/pdf/1511.06434.pdf)

DCGANs的基本架構就是

使用幾層“反卷積”(Deconvolution)網路

。“反卷積”類似於一種反向卷積,這跟用反向傳播演算法訓練監督的卷積神經網路(CNN)是類似的操作。

CNN是將圖像的尺寸壓縮,變得越來越小,而反卷積是將初始輸入的小資料(雜訊)變得越來越大(但反卷積並不是CNN的逆向操作,這個下面會有詳解)。

如果你要把卷積核移動不止一個位置, 使用的卷積滑動步長更大,那麼在反卷積的每一層,你所得到的圖像尺寸就會越大。

這個論文裡另一個重要思想,

就是在大部分網路層中使用了“批量規範化”

(batch normalization),這讓學習過程的速度更快且更穩定。另一個有趣的思想就是,如何處理生成器裡的“池化層”(Pooling Layers),傳統CNN使用的池化層,往往取區域平均或最大來壓縮表徵資料的尺寸。

在反卷積過程中,從代碼到最終生成圖片,表徵資料變得越來越大,我們需要某個東西來逐漸擴大表徵的尺寸。但最大值池化(max-pooling)過程並不可逆,所以DCGANs那篇論文裡,並沒有採用池化的逆向操作,而

只是讓“反卷積”的滑動步長設定為2或更大值,這一方法確實會讓表徵尺寸按我們的需求增大

這其中有些想法來自於早期的一篇論文“全卷積網路”(Striving for Simplicity: The All Convolutional Net,連結 https://arxiv.org/abs/1412.6806),大家可以看一看。

DCGANs非常擅長生成特定Domain裡的小圖片,這裡是一些生成的“臥室"圖片樣本。這些圖片解析度不是很高,但是你可以看到裡面包含了門、窗戶、棉被、枕頭、床頭板、燈具等臥室常見物品。

向量空間運算

我們在生成網路裡隨意輸入一些雜訊值,這些值解碼成一些“戴眼鏡的男人”的圖片。我們將這些代碼取平均值,便得到如下圖最左一的“戴眼鏡的男人”的圖片,這是一個“平均圖片”(Average Image)。

我們使用同樣的過程,產生圖中的“男人”(左二)和“女人”(左三)的圖片。

而你可以在這些圖片(向量空間)之間做運算。

“戴眼鏡的男人”-“男人”+“女人”=“戴眼鏡的女人”

這則加減運算裡,輔以解碼一些變數,最終得出了最右邊一系列“戴眼鏡的女人”圖片。

這十分類似語言模型,單詞向量(Word Embedding)之間也具有有趣的代數關係。例如,

“王后”-“女性”+“男性”=“國王”

向量運算是可行的,這一點令人印象深刻,因為我們確實需要解碼經過運算生成的向量,然後得到每個圖元都是有意義的圖片。

在單詞向量裡,我們從運算中得到的新向量,只需要與之前的某個向量靠近就行。這個過程,並不需要解碼成一種“真實世界體驗”。而在我們

圖片的向量運算裡,可以將運算結果映射到真實世界當中

訓練GANs難點:“模型崩潰”及其解決方法

訓練GANs的一個難點,就在於會出現“模型崩潰”(Mode Collapse):生成的所有樣本都在一個點上(樣本相同),這是訓練GANs經常遇到的失敗現象。

我們訓練GANs,起初讓判別器的輸出值最大化(儘量接近1),然後讓生成器輸出值最小化(儘量接近0),那麼一切都沒問題。但是,

如果我們把順序調一下,先最小化生成器輸出值,然後再最大化判別器輸出值,那麼一切都會崩掉

(這在迴圈訓練的時候會發生)。

針對這個,我們可以採用的

解決方法是minibatch GAN

,給生成器增加一些額外的“特徵”(Feature),讓原始資料分成一波波的小批量樣本,從而保證每一批資料的多樣性。我們將裡面用到的特徵稱為“小批量特徵”(Minibatch Feature)。

如果這些“特徵”測量的是樣本之間的間距,那麼通過這一點,判別器就能檢測到生成器是否將要崩潰。小批量樣本更加接近真實,且每個樣本的間距是正確的,就不會讓生成器產生只映射到一個點的圖像。“小批量”的理念來自于OpenAI研究員Tim Salimans在2016年提交給NIPS的一篇論文。

使用“小批量特徵”會大大提升GANs訓練效果。我們用很多資料庫來檢驗這一方法,其中的一個資料庫就是CIFAR 10,這裡面包括10中不同類別的物體,有鳥、飛機、汽車、貨車、馬等等,圖片圖元為32x32。

如上圖所示,左邊是訓練資料,這些圖片都很小,而且品質不高;右邊是生成器產生的樣本,其中有些樣本展示的物體辨識度還可以,比如馬、汽車、船等等。生成樣本裡大約40%只是一些由顏色和紋理構成的難以名狀的一團,但是剩下的確實包含了一些有意義的物體圖像。

我們也把 minipatch GANs放到更大的ImageNet資料庫裡,裡面圖像的解析度是128x128,且包含數千種物體,難度大得多。尤其是發生我們前面提到的“模型崩潰”問題時,訓練過程更難。

上面左邊的圖,來自於ImageNet,你或許會發現這些圖比之前CIFAR 10的圖片品質高很多,這是因為空間幅度(Spatial Extent)大約在每個方向上都擴展了4倍。這裡面的物體類別繁多,甚至有一些連人類都無法準確歸類,比如這當中有一格小圖裡包含了一個“瓦屋頂”,我就不太能確定這要歸為“瓦”、“屋頂”還是“房子”?

所以,需要意識到的一點就是,這裡要捕捉的多樣性太多了。

右邊的組圖裡,是我們訓練minipatch GAN生成的樣本圖,其中真的有一些圖片包含了可識別的物體。比如左上角的圖,看起來像是一隻胖狗,你也可以看到狗的臉、貓臉、眼睛等圖形散佈在各個樣本裡。

但是,大部分圖展示的內容並不協調,它們看起來像是畢卡索或達利風格的畫,只是一些紋理和圖形的堆砌,並不是有機的構成

我們從中精挑細選了一些比較好的樣本圖(Cherry-Picked Results),從中我們看到GAN做的事情是比較有用的,但是仍然有很多不足。

下面左上角的一張圖的構成不錯,這像是一個狗媽媽,旁邊依偎著一隻狗寶寶,兩隻狗望向同一個方向。但是你可以發現,這張圖裡的場景並不是3D的,而且跟前面的狗相比,後邊的背景圖並沒有展現出什麼意義。

最上面一排的中間圖,看起來就像是一隻巨型蜘蛛,而我認為之前的訓練庫裡沒有什麼與此類似的東西。

很多次,我們常常發現,系統無法將紋理與形狀合理地整合起來,這是一種模型過分概括(overgeneralization)的案例。

我們經常遇到的問題就是,這裡面完全沒有3D的立體構成,比如底部一排左三圖片,狗的面部不錯,狗的毛髮展現的很好,但是總體上,這像是一塊平鋪在地上的狗皮(而不是立體的狗),就像是從正上方垂直看下來,我們稱之為“正交投影”。在這個案例裡,模型根本不知道如何做透視。

我們知道卷積網路可以計數的,在一些應用裡,我們需要將圖片裡的位址數位進行轉錄,這就要求我們知道數字裡包含了多少數位(Digits)。但看起來,如果你不明確訓練神經網路如何計數,那麼它自己是不會自動學習計數方法的。

最右下角的圖,看起來像是一隻美洲豹或黑貓的臉,但是這張圖裡包含的“臉”太多了。似乎神經網路知道需要有眼睛、嘴和鼻子來構成臉,但是它並不清楚到底一張臉要包含幾個眼睛、嘴和鼻子,也不知道這些器官要正確放在什麼位置。

GANs的應用:“文本轉圖像”(Text to Image)

我們可以用GANs做很多應用,其中一種就是“文本轉圖像”(Text to Image)。在Scott Reed等人的一篇論文裡(Generative Adversarial Text to Image Synthesis,連結 https://arxiv.org/abs/1605.05396)。GANs根據輸入的資訊產生了相關圖像,我到目前為止談到的GANs還只是從學習訓練庫裡的概率分佈,隨機產生圖像,而不是像Scott Reed這樣根據特定輸入語句來產生特定圖像。

在這篇新論文裡,GANs增強了,輸入了額外的描述資訊,告訴它們應該要產生什麼樣的圖像。

也就是說,

生成器裡輸入的不僅是隨機雜訊,還有一些特定的語句資訊

。所以判別器不僅要區分樣本是否是真實的,還要判定其是否與輸入的語句資訊相符。

這裡是他們的實驗結果,左上角的圖裡有一些鳥,鳥的胸脯和鳥冠是是粉色,主羽和次羽是黑色,與所給語句描述的資訊相符。

但是我們也看到,仍然存在“模型崩潰”問題,在右下角的黃白花裡,確實產生了白色花瓣和黃色花蕊的花朵,但它們多少看起來是在同一個方向上映射出來的同一朵花,它們的花瓣數和尺寸幾乎相同。

所以,模型在輸出的多樣性方面還有些問題,這需要解決。但可喜的地方在於,輸入的語句資訊都比較好的映射到產生的圖像樣本中。

有趣的GANs 圖像生成應用

在Indico和Facebook發佈了他們自己的DCGAN代碼之後,很多人開發出他們自己的、有趣的GANs應用。有的生成新的花朵圖像,還有新動漫角色。我個人最喜歡的,是一個能生成新品種精靈寶可夢的應用。

在一個 Youtube 視頻,你會看到學習過程:生成器被迫去學習怎麼騙過判別器,圖像逐漸變得更真實。有些生成的寶可夢,雖然它們是全新的品種,看上去就像真的一樣。這些圖像的真實感並沒有一些專業學術論文裡面的那麼強,但對於現在的生成模型來說,不經過任何額外處理就能得到這樣的結果,已經非常不錯了。

超解析度

一篇最近發表的論文,描述怎麼利用GANs進行超解析度重建(Super-Resolution)。我不確定這能否在本視頻中體現出來,因為視頻清晰度的限制。基本思想是,你可以在有條件的GANs裡,輸入低解析度圖像,然後輸出高分版本。使用生成模型的原因在於,這是一個約束不足(underconstrained)的問題:

對於任何一個低解析度圖像,有無數種可能的高解析度版本

。相比其他生成模型,GANs特別適用超解析度應用。因為GANs的專長就是創建極有真實感的樣本。它們並不特別擅長做概率函數密度的估測,但在超解析度應用中,我們最終關心的是輸出高分圖像,而不是概率分佈。

(從左到右分別為:圖1、2、3、4)

上面展示的四幅圖像中,最左邊的是原始高分圖像(圖1),剩下的其餘三張圖片都是通過對圖片的降採樣(Down Sample)生成的。我們把降採樣得到的圖片用不同的方法進行放大,以期得到跟原始圖像同樣的品質。

這些方法有很多種,比如我們用雙三次插值(Bicubic Interpolation)方式,生成的圖像(圖2)看起來很模糊,且對比度很低。另一個深度學習方法SRResNet(圖3)的效果更好,圖片已經乾淨了很多。但若採用GANs重建的圖片(圖4),有著比其它兩種方式更低的信噪比。雖然我們直觀上覺得圖3看起來更清晰,事實上它的信噪比更高一些。GANs在量化矩陣(Quantitative Matrix)和人眼清晰度感知兩方面,都有很好的表現。

(PS:在視頻的後半段,主要是Ian Goodfellow回答網友的提問,雷鋒網將據此編輯成第2篇文章,後續將發佈。)