0
本文作者: 亞萌 | 2016-12-14 21:45 |
編者按:深度學(xué)習(xí)頂級盛會NIPS于今年12月初在巴塞羅那舉行,相信有很多人都無法參加。不過,有另一個AI盛會卻是全世界所有人都能參加的,叫做“AI WITH THE BEST”,已于今年9月在網(wǎng)絡(luò)世界里召開。演講嘉賓有100多人,其中就有“GANs之父”Ian Goodfellow。這個會議由于是網(wǎng)絡(luò)播出,所以有完整錄像,雷鋒網(wǎng)對比Ian Goodfellow在NIPS的演講內(nèi)容,二者十分相仿,故在此將此次會議的視頻搬運給大家,并附上中文圖文詳解(PS:本文由亞萌和三川共同編輯完成)。
大家好,先自我介紹一下,我叫Ian Goodfellow,我是OpenAI的一名研究員。OpenAI是一個非盈利性組織,致力于把通用性的人工智能變成一種安全的方法,并且造福于全人類。
我今天將給大家講一下生成對抗網(wǎng)絡(luò)(Generative Adversarial Networks),簡稱“GANs”。
生成對抗網(wǎng)絡(luò)是一種生成模型(Generative Model),其背后最基本的思想就是從訓(xùn)練庫里獲取很多的訓(xùn)練樣本(Training Examples),從而學(xué)習(xí)這些訓(xùn)練案例生成的概率分布。
一些生成模型可以給出概率分布函數(shù)定義的估測,而另一些生成模型可以給你全新的樣本,這些新樣本來自于原有生成訓(xùn)練庫的概率分布。
PPT最底下一排圖片來自于ImageNet的數(shù)據(jù)庫,左邊是訓(xùn)練圖片,右邊我們可以看作是一個理想的生成模型所產(chǎn)生的照片(實際上右邊的照片依然是從ImageNet庫里選取的,我們的系統(tǒng)目前還沒有成熟到可以生成這種真實感)。
GANs的方法,就是讓兩個網(wǎng)絡(luò)相互競爭“玩一個游戲”。
其中一個叫做生成器網(wǎng)絡(luò)( Generator Network),它不斷捕捉訓(xùn)練庫里真實圖片的概率分布,將輸入的隨機噪聲(Random Noise)轉(zhuǎn)變成新的樣本(也就是假數(shù)據(jù))。
另一個叫做判別器網(wǎng)絡(luò)(Discriminator Network),它可以同時觀察真實和假造的數(shù)據(jù),判斷這個數(shù)據(jù)到底是不是真的。
所以整個訓(xùn)練過程包含兩步,(在下圖里,判別器用 D 表示,生成器用 G 表示,真實數(shù)據(jù)庫樣本用 X 表示,噪聲用 Z 表示)。
第一步,只有判別器D參與。
我們把X樣本輸入可微函數(shù)D里運行,D輸出0-1之間的某個值,數(shù)值越大意味著X樣本是真實的可能性越大。在這個過程中,判別器D盡可能使輸出的值靠近1,因為這一階段的X樣本就是真實的圖片。
第二步,判別器D和生成器G都參與。
我們首先將噪聲數(shù)據(jù)Z喂給生成器G,G從原有真實圖像庫里學(xué)習(xí)概率分布,從而產(chǎn)生假的圖像樣本。然后,我們把假的數(shù)據(jù)交給判別器D。這一次,D將盡可能輸入數(shù)值0,這代表著輸入數(shù)據(jù)Z是假的。
所以這個過程中,判別器D相當于一個監(jiān)督情況下的二分類器,數(shù)據(jù)要么歸為1,要么歸為0。
與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)訓(xùn)練不一樣的且有趣的地方,就是我們訓(xùn)練生成器的方法不同。生成器一心想要“騙過”判別器。使用博弈理論分析技術(shù),我們可以證明這里面存在一種均衡。
現(xiàn)代GANs架構(gòu)基于一篇名為“ Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks ”(簡稱DCGANs)的論文,作者是 Alec Radford、Luke Metz和Soumith Chintala。(鏈接:https://arxiv.org/pdf/1511.06434.pdf)
DCGANs的基本架構(gòu)就是使用幾層“反卷積”(Deconvolution)網(wǎng)絡(luò)?!胺淳矸e”類似于一種反向卷積,這跟用反向傳播算法訓(xùn)練監(jiān)督的卷積神經(jīng)網(wǎng)絡(luò)(CNN)是類似的操作。
CNN是將圖像的尺寸壓縮,變得越來越小,而反卷積是將初始輸入的小數(shù)據(jù)(噪聲)變得越來越大(但反卷積并不是CNN的逆向操作,這個下面會有詳解)。
如果你要把卷積核移動不止一個位置, 使用的卷積滑動步長更大,那么在反卷積的每一層,你所得到的圖像尺寸就會越大。
這個論文里另一個重要思想,就是在大部分網(wǎng)絡(luò)層中使用了“批量規(guī)范化”(batch normalization),這讓學(xué)習(xí)過程的速度更快且更穩(wěn)定。另一個有趣的思想就是,如何處理生成器里的“池化層”(Pooling Layers),傳統(tǒng)CNN使用的池化層,往往取區(qū)域平均或最大來壓縮表征數(shù)據(jù)的尺寸。
在反卷積過程中,從代碼到最終生成圖片,表征數(shù)據(jù)變得越來越大,我們需要某個東西來逐漸擴大表征的尺寸。但最大值池化(max-pooling)過程并不可逆,所以DCGANs那篇論文里,并沒有采用池化的逆向操作,而只是讓“反卷積”的滑動步長設(shè)定為2或更大值,這一方法確實會讓表征尺寸按我們的需求增大。
這其中有些想法來自于早期的一篇論文“全卷積網(wǎng)絡(luò)”(Striving for Simplicity: The All Convolutional Net,鏈接 https://arxiv.org/abs/1412.6806),大家可以看一看。
DCGANs非常擅長生成特定Domain里的小圖片,這里是一些生成的“臥室"圖片樣本。這些圖片分辨率不是很高,但是你可以看到里面包含了門、窗戶、棉被、枕頭、床頭板、燈具等臥室常見物品。
我們在生成網(wǎng)絡(luò)里隨意輸入一些噪聲值,這些值解碼成一些“戴眼鏡的男人”的圖片。我們將這些代碼取平均值,便得到如下圖最左一的“戴眼鏡的男人”的圖片,這是一個“平均圖片”(Average Image)。
我們使用同樣的過程,產(chǎn)生圖中的“男人”(左二)和“女人”(左三)的圖片。
而你可以在這些圖片(向量空間)之間做運算。
“戴眼鏡的男人”-“男人”+“女人”=“戴眼鏡的女人”
這則加減運算里,輔以解碼一些變量,最終得出了最右邊一系列“戴眼鏡的女人”圖片。
這十分類似語言模型,單詞向量(Word Embedding)之間也具有有趣的代數(shù)關(guān)系。例如,
“王后”-“女性”+“男性”=“國王”
向量運算是可行的,這一點令人印象深刻,因為我們確實需要解碼經(jīng)過運算生成的向量,然后得到每個像素都是有意義的圖片。
在單詞向量里,我們從運算中得到的新向量,只需要與之前的某個向量靠近就行。這個過程,并不需要解碼成一種“真實世界體驗”。而在我們圖片的向量運算里,可以將運算結(jié)果映射到真實世界當中。
訓(xùn)練GANs的一個難點,就在于會出現(xiàn)“模型崩潰”(Mode Collapse):生成的所有樣本都在一個點上(樣本相同),這是訓(xùn)練GANs經(jīng)常遇到的失敗現(xiàn)象。
我們訓(xùn)練GANs,起初讓判別器的輸出值最大化(盡量接近1),然后讓生成器輸出值最小化(盡量接近0),那么一切都沒問題。但是,如果我們把順序調(diào)一下,先最小化生成器輸出值,然后再最大化判別器輸出值,那么一切都會崩掉(這在循環(huán)訓(xùn)練的時候會發(fā)生)。
針對這個,我們可以采用的解決方法是minibatch GAN,給生成器增加一些額外的“特征”(Feature),讓原始數(shù)據(jù)分成一波波的小批量樣本,從而保證每一批數(shù)據(jù)的多樣性。我們將里面用到的特征稱為“小批量特征”(Minibatch Feature)。
如果這些“特征”測量的是樣本之間的間距,那么通過這一點,判別器就能檢測到生成器是否將要崩潰。小批量樣本更加接近真實,且每個樣本的間距是正確的,就不會讓生成器產(chǎn)生只映射到一個點的圖像?!靶∨俊钡睦砟顏碜杂贠penAI研究員Tim Salimans在2016年提交給NIPS的一篇論文。
使用“小批量特征”會大大提升GANs訓(xùn)練效果。我們用很多數(shù)據(jù)庫來檢驗這一方法,其中的一個數(shù)據(jù)庫就是CIFAR 10,這里面包括10中不同類別的物體,有鳥、飛機、汽車、貨車、馬等等,圖片像素為32x32。
如上圖所示,左邊是訓(xùn)練數(shù)據(jù),這些圖片都很小,而且質(zhì)量不高;右邊是生成器產(chǎn)生的樣本,其中有些樣本展示的物體辨識度還可以,比如馬、汽車、船等等。生成樣本里大約40%只是一些由顏色和紋理構(gòu)成的難以名狀的一團,但是剩下的確實包含了一些有意義的物體圖像。
我們也把 minipatch GANs放到更大的ImageNet數(shù)據(jù)庫里,里面圖像的分辨率是128x128,且包含數(shù)千種物體,難度大得多。尤其是發(fā)生我們前面提到的“模型崩潰”問題時,訓(xùn)練過程更難。
上面左邊的圖,來自于ImageNet,你或許會發(fā)現(xiàn)這些圖比之前CIFAR 10的圖片質(zhì)量高很多,這是因為空間幅度(Spatial Extent)大約在每個方向上都擴展了4倍。這里面的物體類別繁多,甚至有一些連人類都無法準確歸類,比如這當中有一格小圖里包含了一個“瓦屋頂”,我就不太能確定這要歸為“瓦”、“屋頂”還是“房子”?
所以,需要意識到的一點就是,這里要捕捉的多樣性太多了。
右邊的組圖里,是我們訓(xùn)練minipatch GAN生成的樣本圖,其中真的有一些圖片包含了可識別的物體。比如左上角的圖,看起來像是一只胖狗,你也可以看到狗的臉、貓臉、眼睛等圖形散布在各個樣本里。但是,大部分圖展示的內(nèi)容并不協(xié)調(diào),它們看起來像是畢加索或達利風(fēng)格的畫,只是一些紋理和圖形的堆砌,并不是有機的構(gòu)成。
我們從中精挑細選了一些比較好的樣本圖(Cherry-Picked Results),從中我們看到GAN做的事情是比較有用的,但是仍然有很多不足。
下面左上角的一張圖的構(gòu)成不錯,這像是一個狗媽媽,旁邊依偎著一只狗寶寶,兩只狗望向同一個方向。但是你可以發(fā)現(xiàn),這張圖里的場景并不是3D的,而且跟前面的狗相比,后邊的背景圖并沒有展現(xiàn)出什么意義。
最上面一排的中間圖,看起來就像是一只巨型蜘蛛,而我認為之前的訓(xùn)練庫里沒有什么與此類似的東西。
很多次,我們常常發(fā)現(xiàn),系統(tǒng)無法將紋理與形狀合理地整合起來,這是一種模型過分概括(overgeneralization)的案例。
我們經(jīng)常遇到的問題就是,這里面完全沒有3D的立體構(gòu)成,比如底部一排左三圖片,狗的面部不錯,狗的毛發(fā)展現(xiàn)的很好,但是總體上,這像是一塊平鋪在地上的狗皮(而不是立體的狗),就像是從正上方垂直看下來,我們稱之為“正交投影”。在這個案例里,模型根本不知道如何做透視。
我們知道卷積網(wǎng)絡(luò)可以計數(shù)的,在一些應(yīng)用里,我們需要將圖片里的地址數(shù)字進行轉(zhuǎn)錄,這就要求我們知道數(shù)字里包含了多少數(shù)位(Digits)。但看起來,如果你不明確訓(xùn)練神經(jīng)網(wǎng)絡(luò)如何計數(shù),那么它自己是不會自動學(xué)習(xí)計數(shù)方法的。
最右下角的圖,看起來像是一只美洲豹或黑貓的臉,但是這張圖里包含的“臉”太多了。似乎神經(jīng)網(wǎng)絡(luò)知道需要有眼睛、嘴和鼻子來構(gòu)成臉,但是它并不清楚到底一張臉要包含幾個眼睛、嘴和鼻子,也不知道這些器官要正確放在什么位置。
我們可以用GANs做很多應(yīng)用,其中一種就是“文本轉(zhuǎn)圖像”(Text to Image)。在Scott Reed等人的一篇論文里(Generative Adversarial Text to Image Synthesis,鏈接 https://arxiv.org/abs/1605.05396)。GANs根據(jù)輸入的信息產(chǎn)生了相關(guān)圖像,我到目前為止談到的GANs還只是從學(xué)習(xí)訓(xùn)練庫里的概率分布,隨機產(chǎn)生圖像,而不是像Scott Reed這樣根據(jù)特定輸入語句來產(chǎn)生特定圖像。
在這篇新論文里,GANs增強了,輸入了額外的描述信息,告訴它們應(yīng)該要產(chǎn)生什么樣的圖像。
也就是說,生成器里輸入的不僅是隨機噪聲,還有一些特定的語句信息。所以判別器不僅要區(qū)分樣本是否是真實的,還要判定其是否與輸入的語句信息相符。
這里是他們的實驗結(jié)果,左上角的圖里有一些鳥,鳥的胸脯和鳥冠是是粉色,主羽和次羽是黑色,與所給語句描述的信息相符。
但是我們也看到,仍然存在“模型崩潰”問題,在右下角的黃白花里,確實產(chǎn)生了白色花瓣和黃色花蕊的花朵,但它們多少看起來是在同一個方向上映射出來的同一朵花,它們的花瓣數(shù)和尺寸幾乎相同。
所以,模型在輸出的多樣性方面還有些問題,這需要解決。但可喜的地方在于,輸入的語句信息都比較好的映射到產(chǎn)生的圖像樣本中。
在Indico和Facebook發(fā)布了他們自己的DCGAN代碼之后,很多人開發(fā)出他們自己的、有趣的GANs應(yīng)用。有的生成新的花朵圖像,還有新動漫角色。我個人最喜歡的,是一個能生成新品種精靈寶可夢的應(yīng)用。
在一個 Youtube 視頻,你會看到學(xué)習(xí)過程:生成器被迫去學(xué)習(xí)怎么騙過判別器,圖像逐漸變得更真實。有些生成的寶可夢,雖然它們是全新的品種,看上去就像真的一樣。這些圖像的真實感并沒有一些專業(yè)學(xué)術(shù)論文里面的那么強,但對于現(xiàn)在的生成模型來說,不經(jīng)過任何額外處理就能得到這樣的結(jié)果,已經(jīng)非常不錯了。
一篇最近發(fā)表的論文,描述怎么利用GANs進行超分辨率重建(Super-Resolution)。我不確定這能否在本視頻中體現(xiàn)出來,因為視頻清晰度的限制。基本思想是,你可以在有條件的GANs里,輸入低分辨率圖像,然后輸出高分版本。使用生成模型的原因在于,這是一個約束不足(underconstrained)的問題:對于任何一個低分辨率圖像,有無數(shù)種可能的高分辨率版本。相比其他生成模型,GANs特別適用超分辨率應(yīng)用。因為GANs的專長就是創(chuàng)建極有真實感的樣本。它們并不特別擅長做概率函數(shù)密度的估測,但在超分辨率應(yīng)用中,我們最終關(guān)心的是輸出高分圖像,而不是概率分布。
(從左到右分別為:圖1、2、3、4)
上面展示的四幅圖像中,最左邊的是原始高分圖像(圖1),剩下的其余三張圖片都是通過對圖片的降采樣(Down Sample)生成的。我們把降采樣得到的圖片用不同的方法進行放大,以期得到跟原始圖像同樣的品質(zhì)。
這些方法有很多種,比如我們用雙三次插值(Bicubic Interpolation)方式,生成的圖像(圖2)看起來很模糊,且對比度很低。另一個深度學(xué)習(xí)方法SRResNet(圖3)的效果更好,圖片已經(jīng)干凈了很多。但若采用GANs重建的圖片(圖4),有著比其它兩種方式更低的信噪比。雖然我們直觀上覺得圖3看起來更清晰,事實上它的信噪比更高一些。GANs在量化矩陣(Quantitative Matrix)和人眼清晰度感知兩方面,都有很好的表現(xiàn)。
(PS:在視頻的后半段,主要是Ian Goodfellow回答網(wǎng)友的提問,雷鋒網(wǎng)將據(jù)此編輯成第2篇文章,后續(xù)將發(fā)布。)
相關(guān)文章:
“不要過于關(guān)心AI本身”,資深創(chuàng)業(yè)者談人工智能創(chuàng)業(yè)心得
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。