GAN介紹(李宏毅GAN課程學(xué)習(xí)筆記)
Generative Adversarial Network
GAN由Ian Goodfellow于2014年提出欣鳖,并迅速成為了非承劬恚火熱的研究話題外厂,GAN的變種更是有上千種泥畅,深度學(xué)習(xí)先驅(qū)之一的Yann LeCun就曾說, "GAN及其變種是數(shù)十年來機(jī)器學(xué)習(xí)領(lǐng)域最有趣的 idea"。
聽起來很厲害的樣子凭豪,那么什么是GAN呢焙蹭?
生成式對(duì)抗網(wǎng)絡(luò)(GAN, Generative Adversarial Networks )是一種深度學(xué)習(xí)模型,是近年來復(fù)雜分布上無監(jiān)督學(xué)習(xí)最具前景的方法之一嫂伞。模型通過(至少)兩個(gè)模塊:生成模型(Generative Model)和判別模型(Discriminative Model)的零和博弈進(jìn)行學(xué)習(xí)孔厉,即通過兩個(gè)網(wǎng)絡(luò)的互相對(duì)抗來達(dá)到最好的生成效果。
這一段看完了末早,所以烟馅,什么是GAN说庭?看懂了嗎然磷?感覺充滿了問號(hào)。刊驴。姿搜。接下來跟著李宏毅老師的節(jié)奏好好梳理一下寡润。
1、生成模型舅柜、判別模型
概念里說梭纹,模型通過框架中(至少)兩個(gè)模塊:生成模型G(Generative Model)和判別模型D(Discriminative Model),那么什么是生成模型致份?什么是判別模型变抽?
生成模型G是指能夠隨機(jī)生成觀測(cè)數(shù)據(jù)的模型,尤其是在給定某些隱含參數(shù)的條件下氮块。在GAN中绍载,可以理解為輸入一個(gè)vector,生成一個(gè)圖片滔蝉、語音击儡、文本等有結(jié)構(gòu)的輸出。
判別模型D是一種對(duì)未知數(shù)據(jù)與已知數(shù)據(jù)之間關(guān)系進(jìn)行建模的方法蝠引,在GAN中阳谍,可以理解為判別器建立了訓(xùn)練數(shù)據(jù)與生成器輸出的數(shù)據(jù)的關(guān)系,按訓(xùn)練數(shù)據(jù)的標(biāo)準(zhǔn)為生成的數(shù)據(jù)打分螃概。
以圖像的生成為例:
- G負(fù)責(zé)生成圖片矫夯。接收一個(gè)隨機(jī)的噪聲z,通過z生成圖片G(z)谅年;
- D負(fù)責(zé)判別一張圖片是不是“真實(shí)的”茧痒。輸入是一張圖片x,輸出D(x)表示x為真實(shí)圖片的概率融蹂,如果為1旺订,代表是真實(shí)圖片的概率為100%,而輸出為0超燃,代表不可能是真實(shí)的圖片区拳。
知道了生成器和判別器是什么,那么他們是怎么配合工作來推動(dòng)GAN的學(xué)習(xí)的呢意乓?
以學(xué)習(xí)畫二次元人物頭像為例:
- 第一步:我們最開始畫人物頭像只知道有一個(gè)頭的大致形狀樱调,用筆也不行,畫出來的一片糊届良,老師搭眼一看笆凌,垃圾!噼里啪啦給我們10個(gè)大嘴巴子士葫,老師的快樂+10乞而,我們的快樂-10;
- 第二步:我們痛定思痛慢显,努力學(xué)習(xí)爪模,畫出的頭像好多了欠啤,甚至還能看到水靈靈的大眼睛,老師參考一下二次元美圖:鼻子呢屋灌!噼里啪啦給我們9個(gè)大嘴巴子洁段,老師的快樂+9,我們的快樂-9共郭;
- 第三步:我們進(jìn)步了祠丝!老師又學(xué)習(xí)了一會(huì)二次元美圖說:“我覺得不行”,噼里啪啦給我們8個(gè)大嘴巴子除嘹,老師的快樂+8纽疟,我們的快樂-8;
就這樣一步一步憾赁,老師覺得我們畫的頭像和真正的二次元美圖一樣美的時(shí)候污朽,就不再抽我們大嘴巴子,我們終于出師了,是一個(gè)合格的生成器了!(這里的老師就是判別器唐础,判別器也是需要學(xué)習(xí)的,雖然老師水平高炎功,但他不學(xué)習(xí)也不一定知道什么是美麗的二次元頭像)
2、零和博弈
生成器和判別器通過零和博弈來學(xué)習(xí)缓溅,什么是零和博弈呢蛇损?
零和博弈(zero-sum game),又稱零和游戲坛怪,是博弈論的一個(gè)概念淤齐,屬非合作博弈。
它是指參與博弈的各方袜匿,在嚴(yán)格競爭下更啄,一方的收益必然意味著另一方的損失,博弈各方的收益和損失相加總和永遠(yuǎn)為“零”居灯,可以說自己的幸福是建立在他人的痛苦之上的祭务,二者的大小完全相等,因而雙方都想盡一切辦法以實(shí)現(xiàn)“損人利己”怪嫌。
在上面的例子中义锥,老師(判別器)抽我們(生成器)大嘴巴子,抽的越多他的快樂越多岩灭,我們的快樂越少拌倍,我們通過和老師博弈改變雙方的快樂,但快樂數(shù)值的總和一直都是零川背,這就是判別器和生成器的零和博弈贰拿,這種博弈的關(guān)系也是GAN中“Adversarial”的由來。
3熄云、GAN算法流程
了解了GAN中的幾個(gè)關(guān)鍵詞的含義后膨更,我們來看看GAN是怎樣運(yùn)行的:
- 初始化generator G 和discriminator D;
- 每一次迭代過程中:
- 固定 G缴允, 只更新 D 的參數(shù)荚守。從你準(zhǔn)備的數(shù)據(jù)集中隨機(jī)選擇一些,再從 G 的output中選擇一些练般,現(xiàn)在等于 D 有兩種input矗漾。接下來,D 的學(xué)習(xí)目標(biāo)是, 如果輸入是來自于真實(shí)數(shù)據(jù)集薄料,則給高分敞贡;如果是 G 產(chǎn)生的數(shù)據(jù),則給低分摄职,可以把它當(dāng)做一個(gè)回歸問題或分類問題誊役。
- 接下來,固定住 D 的參數(shù), 更新 G 谷市。將一個(gè)向量輸入 G蛔垢, 得到一個(gè)output, 將output扔進(jìn) D , 然后會(huì)得到一個(gè)分?jǐn)?shù)迫悠,這一階段 D 的參數(shù)已經(jīng)固定住了鹏漆,G 需要調(diào)整自己的參數(shù)使得這個(gè)output的分?jǐn)?shù)越大越好,希望能騙過判別器创泄。
過程聽起來不是很復(fù)雜艺玲,不過問題是生成器和判別器兩個(gè)NN網(wǎng)絡(luò)是用什么結(jié)構(gòu)組合在一起的呢?
其實(shí)鞠抑,generator和discriminator是同一個(gè)大的網(wǎng)絡(luò)板驳,像上圖,整個(gè)大的網(wǎng)絡(luò)的前半部分是generator碍拆,后半部分是discriminator若治,所以其輸入是vector,輸出就是得分感混,而圖片就在中間hidden層端幼,即兩個(gè)網(wǎng)絡(luò)的銜接處。所謂的生成是指:網(wǎng)絡(luò)中間的一層hidden-layer的輸出是一個(gè)圖片弧满,判別是指:對(duì)這個(gè)生成的圖片婆跑,網(wǎng)絡(luò)的后半部分會(huì)訓(xùn)練出一個(gè)得分(或者說概率)。
用稍微數(shù)學(xué)化一些的語言來表示上述過程:
1庭呜、結(jié)構(gòu)化學(xué)習(xí)(Structured Learning)
什么是結(jié)構(gòu)化學(xué)習(xí)滑进?
在機(jī)器學(xué)習(xí)過程中犀忱,對(duì)數(shù)據(jù)的擬合其實(shí)就是在找一個(gè)擬合函數(shù):
對(duì)于回歸問題(Regression)來說,這個(gè)函數(shù)輸出一個(gè)標(biāo)量(scalar)
對(duì)于分類問題(Classification)來說扶关,這個(gè)函數(shù)輸出一個(gè)類別(one-hot 向量)
如果輸出的是一個(gè)序列阴汇,一個(gè)矩陣,一個(gè)圖节槐,一顆樹...
其輸出由具有依賴關(guān)系的組件組成的搀庶,這就叫做結(jié)構(gòu)化學(xué)習(xí)。
2铜异、結(jié)構(gòu)化學(xué)習(xí)的難點(diǎn)
首先哥倔,對(duì)于一般的分類問題,每個(gè)類別會(huì)對(duì)應(yīng)多個(gè)樣本揍庄,而結(jié)構(gòu)化學(xué)習(xí)如果把每一個(gè)output當(dāng)做一個(gè)類別來看的話咆蒿,輸出空間就非常大,因?yàn)槠漭敵鍪嵌喾N多樣的蚂子,很可能是One-shot learning甚至Zero-shot learning蜡秽。
One-shot learning:對(duì)某一/某些類別只提供一個(gè)或者少量的訓(xùn)練樣本;
Zero-shot learning:對(duì)某一/某些類別完全不提供訓(xùn)練樣本缆镣。
以文本為例芽突,輸入“吃了嗎?”董瞻,輸出“吃過了”寞蚌、“吃了”、“吃啦”等等都可以看做不同的類钠糊,所以用普通的分類是難以解決的挟秤。
再者,結(jié)構(gòu)化學(xué)習(xí)的輸出是由具有依賴關(guān)系的組件組成的抄伍,需要考慮整體艘刚。
GAN的生成器可以生成各種輸出,判別器可以判斷輸出的好壞截珍,似乎這兩個(gè)模塊都有很強(qiáng)的學(xué)習(xí)能力攀甚,那么他們能獨(dú)立工作嗎?為什么一定要進(jìn)行博弈呢岗喉?
首先來看看生成器能不能自己學(xué)習(xí)秋度。
生成器當(dāng)然可以自己學(xué)習(xí),在GAN之前就有自編碼器AE钱床、變分自編碼器VAE荚斯。
1、自編碼器AE
自編碼器是一個(gè)如下圖所示結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),其輸入和輸出的維度相同事期,中間的隱含層維度最小滥壕,作為編碼的結(jié)果,其前半部分encoder會(huì)盡可能的保留原始輸入的信息兽泣,以便在后半部分decoder還原輸入绎橘。
其實(shí)自編碼器AE得到的decoder就是一個(gè)生成器,不過AE的缺點(diǎn)是無法處理沒有訓(xùn)練過的數(shù)據(jù)撞叨,當(dāng)給code加上噪聲后,就不知道會(huì)輸出什么了浊洞,可能是一個(gè)完全的亂碼或者是噪聲牵敷,我們希望的是“生成模型”能夠?qū)θ我獾妮斎刖幋a產(chǎn)生有相關(guān)意義的數(shù)據(jù),這就是我們后面的“變分自編碼器VAE”所要做的事情法希。
2枷餐、變分自編碼器VAE
變分自編碼器直接編碼成高斯分布,可以對(duì)各種隨機(jī)輸入產(chǎn)生有意義的輸出苫亦。
3毛肋、這一類生成器到底存在什么缺點(diǎn)
編碼器的目標(biāo)是讓輸出與輸入盡可能的相似,怎么評(píng)價(jià)相似呢屋剑?實(shí)際上是計(jì)算輸入向量與輸出向量的距離润匙,拿圖片來說,向量距離表示兩個(gè)圖片有多少像素不同唉匾,但沒法表達(dá)更多的東西孕讳,比如位置等。
如下圖所示巍膘,編碼器會(huì)認(rèn)為上面只差1個(gè)像素的圖更好厂财,但實(shí)際上上面兩個(gè)在奇怪的地方多/少一個(gè)像素點(diǎn),更容易看出不是人的手寫數(shù)字峡懈,而下面兩個(gè)雖然像素差的多璃饱,但其實(shí)只是筆畫長一點(diǎn)而已,更像是手寫的數(shù)字肪康。
組間之間的關(guān)系非常重要荚恶,在編碼器中,盡管兩個(gè)組間高度相關(guān)磷支,但卻無法相互影響裆甩,我們需要structure 來約束這個(gè)事情。就是在后面在加幾個(gè)隱藏層齐唆,就可以調(diào)整第L層的神經(jīng)元輸出嗤栓。也就是說理論上,VAE要想獲得GAN的效果,它的網(wǎng)絡(luò)要比GAN要深才行茉帅。
而且由于VAE算法采用的分布采樣叨叙,因此做一些離得比較散的目標(biāo)效果不好:
下圖中綠色是目標(biāo),藍(lán)色是VAE學(xué)習(xí)的結(jié)果
總結(jié)一下堪澎,不依靠判別器擂错,生成器獨(dú)立去學(xué)習(xí)是可以的,不過生成器是一個(gè)一個(gè)component來生成樱蛤,每個(gè)component之間的關(guān)系不好控制钮呀,存在一定的缺點(diǎn),不能從全局把握結(jié)果的好壞昨凡。
那么爽醋,判別器能不能獨(dú)立學(xué)習(xí)來生成好的結(jié)果呢?
判別器也是可以獨(dú)立學(xué)習(xí)的便脊。
判別器也就是Evaluation function, Potential Function, Energy Function …其特點(diǎn)是top-down evaluation蚂四,所以很容易控制component之間的關(guān)系,能更好的判斷一個(gè)結(jié)果的好壞哪痰,以手寫數(shù)字為例遂赠,判別器能輕松的捕捉到元素之間的相關(guān)性,這可是生成器很難解決的問題啊晌杰。
例如上面提到的問題跷睦,圖中所示的CNN Filter就可以輕松識(shí)別是不是有孤立的的像素點(diǎn)。
那么應(yīng)該怎么做才能讓判別器得到好的輸出呢肋演?
只需要窮舉所有可能的x送讲,再挑一個(gè)使得判別器得分最好的那個(gè)即可:
1、判別器獨(dú)立訓(xùn)練
判別器訓(xùn)練的一個(gè)難點(diǎn)是缺失負(fù)向樣本惋啃,比如我們想要生成手寫字體或者二次元頭像哼鬓,那么我們的訓(xùn)練數(shù)據(jù)其實(shí)只有正向樣本,或許我們可以通過給正向樣本增加噪聲來得到負(fù)向樣本边灭,但我們制作的負(fù)向樣本的質(zhì)量及分布是很難把握的异希,怎么解決這個(gè)問題呢?
可以采用讓判別器自己來生成負(fù)向樣本的方法绒瘦,算法流程如下:
- 首先拿出正樣本称簿,并根據(jù)正樣本隨機(jī)生成負(fù)樣本,正負(fù)樣本一起送入判別器進(jìn)行訓(xùn)練惰帽;
- 在每次迭代中憨降,訓(xùn)練出一個(gè)能區(qū)分正負(fù)樣本的判別器;使用此判別器通過 argmax 生成最好的負(fù)樣本(假設(shè)我們能做到)该酗;
- 再與真樣本一起送入鑒別器進(jìn)行訓(xùn)練授药,如此循環(huán)士嚎。
看起來似乎和GAN訓(xùn)練差不多,但其實(shí)還存在著問題悔叽。如下圖可以幫助我們理解判別器訓(xùn)練的過程莱衩,可以理解為判別器在為真實(shí)樣本打高分,同時(shí)壓制其他樣本的得分娇澎,并在每次迭代中修復(fù)自己的漏洞笨蚁,最終希望訓(xùn)練到除了真實(shí)樣本其他全是低分:
其缺點(diǎn)是什么呢?
在高維空間中趟庄,負(fù)樣本采樣過程其實(shí)是很難進(jìn)行的括细,再者判別器生成樣本的過程,即argmax過程戚啥,要枚舉大量樣本奋单,效率很低。
判別器的生成既然這么麻煩的話虑鼎,真的有用判別器來做生成任務(wù)的嗎辱匿?實(shí)際上键痛,概率圖模型就是一類典型的判別器做生成的例子炫彩。
思考一下,概率圖模型我們會(huì)有一個(gè)圖絮短,根據(jù)圖還會(huì)有一個(gè)Potential Function(勢(shì)函數(shù)江兢,詳細(xì)馬爾科夫隨機(jī)場、CRF)丁频,這不就形成了一個(gè)可以打分的判別器嗎杉允!計(jì)算出來的概率不就是打的分嗎?想一下CRF的訓(xùn)練席里,就是通過給正向樣本和負(fù)樣本打分叔磷,不過迭代過程是不是有我不確定,HMM應(yīng)該就沒有吧奖磁?總之這個(gè)角度的思路是非常棒的改基!
2、判別器 VS 生成器
總結(jié)一下咖为,判別器和生成器的區(qū)別:生成器 VS 判別器
3秕狰、生成器 + 判別器
綜合以上所述的生成器和判別器的優(yōu)缺點(diǎn),我們發(fā)現(xiàn)兩者是互補(bǔ)的躁染,因此將其組合起來使用鸣哀,充分利用兩者的優(yōu)勢(shì):
Benefit of GAN
(1) From Discriminator’s point of view
? Using generator to generate negative samples
(2)From Generator’s point of view
? Still generate the object component-bycomponent
? But it is learned from the discriminator with global view. (跟discriminator 學(xué)習(xí)大局觀)
GAN 的數(shù)學(xué)理論及推導(dǎo)在下一篇詳述,李宏毅老師在第一節(jié)介紹課程中也沒有講這部分吞彤。
主要參考
對(duì)抗生成網(wǎng)絡(luò)(GAN)教程(2018) 李宏毅