:::

線上閱讀

:::
通識在線第 75 期(2018年03月)

GAN:永恆輪迴的模仿遊戲


文/魏澤人 東華大學應用數學系副教授
 「生成對抗網路」是2017年深度學習的爆紅主題,簡稱為GAN,為Generative Adversarial Network的縮寫。GAN的主要功能是模仿,讓電腦生出以假亂真的圖片。讓神經網路看過一些圖片的範例樣本,訓練之後,希望它能生出類似的圖片出來。比方像是圖一,電腦看過鞋子的範例後,生出鞋子的圖片。看過建築物的圖片後,生出建築物的圖片(圖二)。看過某種字體的寫法後,其他字也照樣用同樣的風格寫出(圖三)。

1601_60ac37ce.png

(圖一/GAN生出的鞋子圖片)

1602_0f5bf8bb.png

(圖二/GAN生出的建築物圖片)

1603_c922b97d.png

(圖三/用GAN把字變成不同的字體)

 為了讓電腦擁有模仿的能力,很多人做過各式各樣的嘗試,GAN是目前熱門的方法。講到模仿和人工智慧,就不能不提「圖靈測試」。

模仿遊戲
 2014年的電影【模仿遊戲】,讓更多人認識了英國數學家、電腦科學家艾倫圖靈。在電影中,圖靈主要工作是破解密碼。但片名【模仿遊戲】出自於他在1950年發表的論文〈計算機器與智能〉。為了探討機器是否能思考,他提出「模仿遊戲」的概念,也就是一般所稱的「圖靈測試」。遊戲進行的方式是這樣:A是電腦,B和C是人類。C無法看到A或B,只能藉由文字溝通。C的任務是藉由文字交談,來判斷誰是人類誰是電腦。

 早在1960年,MIT人工智慧實驗室發展的ELIZA程式,就能用模式匹配、和一些規則來模仿心理治療師和患者對談(原為英文):
 
 女子:男人都一樣。

 eliza:怎麼說?

 女子:他們總是為了某些特定或者其他事情來煩我們。

 eliza:你能想一個具體的例子嗎?

 女子:我的男朋友要我來這裡。

 eliza:你的男朋友要你來到這裡?

 女子:他說我常常很憂鬱。

 eliza:我很抱歉聽到你很憂鬱。

 女子:真的,我不開心。

 eliza:你認為來這裡能幫你擺脫不開心嗎?

 女子:我需要一些幫助,我想是這樣的。

 eliza:得到幫助對你來說意味著什麼?

 女子:也許我可以學會如何和媽媽相處。

 eliza:告訴我更多關於你的家人。

 女子:我母親照顧我。

 eliza:還有那些家人也照顧你?

 女子:我父親。


眼尖的讀者應該能發現許多不自然之處。現代的對話機器人像是Siri、Google助理當然要先進得多,但仍與真人有所區分。

 在通俗媒體中,常會有把「通過圖靈測試」當成「電腦有智慧」的一個標準。但稍加思考,就會發現模仿人類行為,未必能和有智慧、能思考劃上等號。不過,光是製作出能模仿人類的機械,本身就是很有意思的事情。

我不是機器人
 不曉得大家是否注意到,在使用網路時,我們其實都玩過一種「圖靈測試」的變體。沒有錯,就是現在網站上常見CAPTCHA的驗證機制。最常見的形式是放上一些有點扭曲混淆的圖片,讓使用者閱讀並且輸入圖片中文字來驗證,用來阻擋爬蟲機器人自動抓取內容或破解密碼。

 事實上,CAPTCHA就是Completely Automated Public Turing test to tell Computers and Humans Apart(用來區分電腦與人的全自動公開圖靈測試)的縮寫。跟原版一樣是要來分辨人與機器,差別是裁判要自動化,所以得由機器擔任。當然,從開發爬蟲機器人的角度來看,想要破解這種驗證,就是要試著模仿人類行為,來看懂圖片上的字,或者模仿人類移動滑鼠的方式,贏得這場模仿遊戲。但可想而知,這並不是一件簡單的事情。

電腦要如何學會模仿?
 假設我們有了足夠的範例,要如何讓電腦學會這些範例,舉一反三呢?有些情況可以靠人類觀察出規律,然後將規律形式化,寫成程式。比方如果我們希望電腦隨機生出一個質數,那我們寫個程式就行了。但有時我們雖然很容易找到規律,比方當我們看到十幾、二十張貓的照片,我們很容易歸納出哪些是有貓的照片。當我們看到另外一疊狗的照片時,馬上能區別出彼此不同。但即使如此,卻很難寫出程式碼和演算法來讓電腦區別狗與貓的不同。好在現在訓練神經網路的技術相對成熟,只要事先將幾千、幾萬張貓狗的照片分類好。藉由這些資料來訓練神經網路,就能讓電腦分出狗與貓的不同。

 分類是一回事,模仿又是另外一回事。想畫出一隻像樣的貓,顯然比能認出貓難得多。GAN是怎麼辦到的呢?我們用下面的故事來說明。

偽畫師G與鑑定師D的故事
 最初,G只是一個尋常的偽畫師。就像其他偽畫師一樣,就是想盡辦法畫得跟原作一樣。剛受訓回來的當地鑑定師D,注意到大量出自G的仿冒品。D受過專業訓練,發現了區分G的偽作的訣竅,並傳授給大家。

 G發現生意大受影響。訪查之後,才知道大家已經發現自己仿作的明顯弱點。他將計就計,特別反過來針對D傳出的訣竅,製作符合「真跡」判準的作品。一時之間,大家又被耍得團團轉,讓G賺了一票。但很快的,D又發現另外的判別方式。G又再度受挫,只好針對新的判別方式再次改進。接下來,D也只好在繼續找其他的弱點。

 有一次,D久久無法找出G作品的破綻。由於太過疲憊,想要放棄離去。但在快出門之際,又捨不得的再回頭看了一下。這才發現,G的偽作右半邊會比左半邊要稍亮一點點。但也只有非常微小的一點點,要遠距離特定角度才能發現。後來G才發現,原來作畫的地方,燈光的亮度有些不平均。 如果不是D,可能自己一輩子都不會注意到這個盲點。

 就這樣,經過無數次的鬥法、對決, 沒有誰能永久擊敗對方。但也因此,G的仿作技術和D的鑑定技術都在不知不覺中進步了,實力已遠超過尋常小鎮地方等級。就這樣,G的仿作流傳到整個國家、世界上。當然,為了能鑑別出G的假畫,大家就更需要D的鑑定能力。

 G與D的對決就這樣持續、循環下去。


 G和D的對決,就是一場又一場的模仿遊戲。D擔任的是裁判的角色。而G則要設法騙過D。經歷了無數次的模仿遊戲後,G學會了模仿。

GAN生成對抗網路
 回到主題:「生成對抗網路」。我們希望讓機器來模仿,畫出足以亂真的圖片。我們給機器參考一堆圖片,希望機器能模仿畫出類似的圖片。也不一定要是圖片,文字、聲音是一樣的道理。我們可能會希望機器看過「唐詩三百首」後,能夠創造出新的「唐詩」。看過名作家未完成的遺作,能用同樣的筆法,幫他完成結尾。也許看過《論語》後,當我們問它新問題時,它能模仿孔子的方式來回答我們。聽過貝多芬的樂曲後,機器能創造出全新的貝多芬曲子。聽過許多樂器的聲音後,前所未有的樂器聲音,但同時讓人毫不懷疑,這是自然的樂器聲音。能辦到這種事情的機器,我們稱之為Generator,生成器。簡稱為G。

 通常G是電腦上跑的一個數學計算、演算法。以目前流行的深度學習來說,G就是一個神經網路。如果你清楚神經網路是什麼,那當然最好。如果不清楚,也不要緊。想像你手中有一疊牌,上面畫有各式各樣的圖案。你每次洗牌之後,從裡面抽出一張來看。由於你每次都洗亂了,每次都能看到不一樣的圖案。G做的事情也類似。它會隨機的生出一張圖片出來給你看。只不過這副牌並沒有實體,而是存在於抽象的數學空間。當我們需要「抽」一張牌出來看時,只要告訴它說,請給我第37156421號牌。經由一堆數學計算,通常是矩陣、代數運算,我們就把那張牌給算了出來。

 從前面的編號應該也可以看出,這副抽象的牌,裡面有非常多張牌。多到我們不可能實際全部印出來看。還好,一副牌中的牌,通常有些共同的特性。也就是說,有些數學規律。所以才可以用算式把它「放」在抽象的數學空間中。不同的牌組,抽出來的圖片當然也不同。風景照片也好,人臉也好,唐詩也好,貝多芬的曲子也好,都有各自不同的牌組,或者說,數學規律。

 以上面的比方來說,不同牌組對應的就是算式的不同參數。我們其實不確定是不是有副牌能符合我們的期望。但如果有的話,找到適當的參數也是一項困難的工作。還好,在神經網路的情形,因為參數與牌組間有一種連續性,如果能知道我們的目標是什麼,也就是什麼叫做「模仿得像」,藉由數學微積分的方式,可以幫忙找出參數。這就是一般機器學習稱為「訓練」或「學習」的過程。

 這個過程對人類而言並不陌生,我們有非常多的訓練經驗。包含從小學習走路時,腳的哪個肌肉要出多少力氣。騎腳踏車,如果有點向左傾斜了,要花多少力氣來向右平衡。更「外部」一點的,像是炒菜要放多少鹽巴才好吃。畫圖時,要放多少藍色、多少紅色進去,顏色才對。這些所有的「多少」,都可以看成的參數。我們經由經驗調整,最終會掌握適當的力道與份量。對機器學習來說。事前給的範例就相當於「經驗」。只要有足夠的範例,交給數學和演算法,就能找到適當的參數,G就能舉一反三,推廣出類似的案例。

 一切都很美好,但不要忘了還有一個關鍵性的問題。那就是什麼叫做與範例類似?我們很難用數學嚴謹而完整定義出什麼叫做「像貓的圖片」、「像梵谷的畫作」。沒有錯,「當我看到時我就知道」,但使用數學方法時,必須要用數學的方法來定義,什麼叫做「類似的案例」。這是一個非常困難的問題。初步的想法可能會是:先觀察一下範例的統計性質,像是平均、標準差、顏色相關性之類的,然後生成有相同統計性質的圖片。可惜單靠初步的想法無法獲得很好的結果。

 如果,只是如果,有個像是故事中的鑑定家D就好了。如果能有個數學算法,能幫忙判斷圖片是否和範例類似的程度,一切就能解決了。所以,我們要像故事描述的一樣,訓練一個鑑定家出來。

 我們讓另外一個神經網路來當鑑定家D,英文稱之為Discriminator。訓練鑑定家相對容易點,我們給它看一堆假畫和一堆真畫,訓練它分出真假。像前面提到的分出照片中有貓或狗一樣,是個分類問題。而我們有足夠的真畫和假畫能訓練D:真畫就從範例中隨機取出,假畫則是G隨機生成的。訓練的目標明確,有明確的回饋,剩下的就能交給數學和演算法。

 一開始的G根本沒有訓練過,所以生出的「偽畫」非常容易辨認。只要訓練一下,D很快就能分辨真假了。當D有這種非常初步的鑑別能力後。我們再反過來用D來訓練G,設法讓G來騙過D。等到G進步了,再用G來訓練D。如此反覆下去,G跟D都會進步。如果你感覺這個場景有點似曾相似,那一點也沒有錯,因為這跟故事內容一模一樣。只是G跟D換成神經網路,在訓練過程中經歷了人類難以體會的無窮輪迴,往往需要百萬次甚至千萬次的對決。

那些不能殺死我的,使我更強壯
 這樣看起來有點奸詐。我們什麼也不懂,只是讓G跟D互相殺來殺去。但正因為我們不懂才需要這樣曲折地接近目標。相對機器而言,模仿是我們與生俱來的能力。也因為這樣,會忽略掉模仿其實是很強大的能力。只要善加運用,就能無窮的潛力。像是圖四,我們給神經網路兩種不同的遊戲風格當成訓練的範例,就能讓它自動把一種遊戲的畫面,轉成另外一種遊戲的風格。類似的原理也可以將畫風轉換,或者白天轉成晚上,哭臉轉成笑臉。

1604_df95c6a5.png
 
(圖四/GAN將上面風格的遊戲畫面轉成下面的這種)
 
 圖五是一種標準而奸詐的訓練方式。我們希望機器將混合的兩張圖,還原成兩張。我們需要先用一些範本表演給機器看,示範怎麼將混合過的圖形分成兩張。經由訓練之後,機器自然會模仿。但問題是,將混合的圖形分離是非常困難的,甚至數學上不可能。我們實際上也不會。不過沒關係,我們示範的時候其實是倒過來的。我們先拿兩張圖片,然後再混合成一張。也就是說,我們先知道答案,再來出題。

1605_21f34036.png

(圖五/上為輸入,中下為輸出。利用GAN將照片以及動漫圖片分離。)

 類似的技巧還可以用在黑白圖片轉成彩色圖片。將人臉圖片的鼻子部分挖掉,然後讓機器補回去。把低解析度的圖片還原成高解析度的圖片。

 有無窮盡的可能,在不久的將來,會有不少的工具能幫忙處理技術的困難。你只要準備好訓練的樣本,機器就能模仿。有無限的可能,唯一的限制只是你的想像力!
cron web_use_log