編者按:深度學習頂級盛會nips于今年12月初在巴塞羅那舉行,相信有很多人都無法參加。不過,有另一個ai盛會卻是全世界所有人都能參加的,叫做“ai with the best”,已于今年9月在網絡世界裡召開。演講嘉賓有100多人,其中就有“gans之父”ian goodfellow。這個會議由于是網絡播出,是以有完整錄像,雷鋒網對比ian goodfellow在nips的演講内容,二者十分相仿,故在此将此次會議的視訊搬運給大家,并附上中文圖文詳解(ps:本文由亞萌和三川共同編輯完成)。
大家好,先自我介紹一下,我叫ian goodfellow,我是openai的一名研究員。openai是一個非盈利性組織,緻力于把通用性的人工智能變成一種安全的方法,并且造福于全人類。
我今天将給大家講一下生成對抗網絡(generative adversarial networks),簡稱“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的基本架構就是使用幾層“反卷積”(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的一個難點,就在于會出現“模型崩潰”(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)。在scott reed等人的一篇論文裡(generative adversarial text to image synthesis,連結 https://arxiv.org/abs/1605.05396)。gans根據輸入的資訊産生了相關圖像,我到目前為止談到的gans還隻是從學習訓練庫裡的機率分布,随機産生圖像,而不是像scott reed這樣根據特定輸入語句來産生特定圖像。
在這篇新論文裡,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篇文章,後續将釋出。)