文章作者:李嘉琛、薛潔婷@來也科技 內(nèi)容來源:來也科技 導(dǎo)讀:你是否想過:'美顏相機(jī)如何實(shí)現(xiàn)風(fēng)格轉(zhuǎn)換、大眼、瘦臉的嗎?' GAN可以!自2014年Ian Goodfellow提出生成對(duì)抗網(wǎng)絡(luò) ( Generative Adversarial Networks, GAN ) 以來,GAN的變種層出不窮。研究者們從不同方向?qū)AN進(jìn)行深入研究,其中包括通過數(shù)學(xué)推導(dǎo)對(duì)GAN損失函數(shù)的各種優(yōu)化 ( 例如Wasserstein-loss,LS-loss等 )、對(duì)模型結(jié)構(gòu)的各種嘗試 ( 如DCGAN等 )。經(jīng)過多年的發(fā)展,GAN踏足于多種視覺任務(wù)的子領(lǐng)域,比如風(fēng)格遷移和圖到圖翻譯。本文將詳細(xì)介紹GAN原理、發(fā)展歷程和GAN在來也科技的實(shí)踐。01
最早期的GANGAN的本質(zhì)是希望得到一個(gè)映射關(guān)系G(·),將一個(gè)分布z(例如:均勻分布的隨機(jī)噪聲向量),映射到指定的分布G(z)上。其中映射使用的參數(shù)通過學(xué)習(xí)得到,這樣一來就得到了一個(gè)實(shí)現(xiàn)z → G(z)的模型。通過對(duì)輸入隨機(jī)變量z不斷的采樣、送進(jìn)模型,就能得到許多不一樣,但是符合某種分布的輸出(也就是我們期望生成的數(shù)據(jù),圖像等),即一個(gè)生成器G。問題是:如何訓(xùn)練才能使生成器G足夠逼真?常言道“魔高一尺道高一丈”,Ian等人提出了一種對(duì)抗訓(xùn)練的方法,同時(shí)訓(xùn)練生成器G和一個(gè)鑒別器D,構(gòu)建兩者的競爭關(guān)系,從而完成訓(xùn)練。兩個(gè)子模型的任務(wù)如下:- G:不斷生成自認(rèn)為是“真實(shí)”的假數(shù)據(jù)(fake data)
- D:判斷數(shù)據(jù)為真的可能性,一般是個(gè)二分類器
訓(xùn)練流程一般先使用一些真實(shí)數(shù)據(jù)訓(xùn)練鑒別器D,使其擁有一定的鑒別能力。訓(xùn)練中正樣本使用真實(shí)數(shù)據(jù)本身,負(fù)樣本使用未經(jīng)訓(xùn)練的G生成的數(shù)據(jù)。之后對(duì)抗訓(xùn)練整個(gè)網(wǎng)絡(luò),在每輪迭代中:重復(fù)上述流程,一個(gè)好的GAN訓(xùn)練中,D的分類準(zhǔn)確率不應(yīng)一直太高或太低,動(dòng)態(tài)維持準(zhǔn)確率的波動(dòng)才能說明GAN中的兩個(gè)部分在進(jìn)行對(duì)抗訓(xùn)練。否則,要么D太強(qiáng)導(dǎo)致G參數(shù)更新停滯,無法生成更真實(shí)的fake data;或者D太弱,導(dǎo)致G任意生成的fake data都會(huì)被認(rèn)為是真實(shí)的,同樣導(dǎo)致G偏離真實(shí)的分布學(xué)習(xí)。一個(gè)原始GAN實(shí)現(xiàn)的樣例代碼:https://github.com/RikoLi/Keras-GAN/blob/master/gan/gan.py1. 結(jié)構(gòu)最原始的GAN使用多層感知機(jī)作為模型的主干:2. 損失函數(shù)GAN的優(yōu)化目標(biāo)V(D, G)如下所示:訓(xùn)練目標(biāo)是令D能夠最大化目標(biāo)函數(shù),同時(shí)G能夠最小化目標(biāo)函數(shù),從而構(gòu)建“對(duì)抗”訓(xùn)練。論文中給出了算法的收斂性證明,這里不做展開,有興趣可以看一下原文的證明。我們只需要知道最終收斂的方向是朝著D結(jié)果為0.5前進(jìn)的即可。在這里一定要注意一點(diǎn),V(D, G)并不是GAN的損失函數(shù)!對(duì)于輸出D(x)或者D(G(z))進(jìn)行l(wèi)og變換,我們得到的是對(duì)數(shù)似然(log-likelihood),因此V(D, G)表示的是一個(gè)似然函數(shù)。結(jié)合一點(diǎn)概率論的知識(shí)我們知道,極大似然估計(jì)是對(duì)分布模型參數(shù)估計(jì)的一種方式,此處對(duì)D的訓(xùn)練實(shí)際上就是極大似然估計(jì)的一種體現(xiàn)。只不過似然來自兩部分,用真實(shí)數(shù)據(jù)x計(jì)算的以及用G(z)生成的,這也說明了為何對(duì)于D而言優(yōu)化目標(biāo)是最大化V。在真實(shí)計(jì)算中,損失函數(shù)只是二分類的交叉熵。實(shí)際訓(xùn)練中,每一輪迭代如上文提到的分為兩個(gè)階段:先訓(xùn)練D,再訓(xùn)練整個(gè)GAN。其中訓(xùn)練D時(shí)使用所有與D相關(guān)的損失,因此此時(shí)用于更新D的梯度為:表示mini batch數(shù)量,x表示來自于真實(shí)數(shù)據(jù)的樣本,theta_d表示D中待學(xué)習(xí)的參數(shù)。注意更新D的時(shí)候需要最大化目標(biāo)函數(shù),因此在使用梯度下降法進(jìn)行迭代時(shí)一般將損失函數(shù)設(shè)計(jì)為目標(biāo)函數(shù)V取負(fù)。D訓(xùn)練完成后,開始訓(xùn)練整個(gè)GAN,此時(shí)應(yīng)使用與G和D相關(guān)的損失并凍結(jié)D的權(quán)重,僅更新G的權(quán)重:theta_g是G的參數(shù),此時(shí)直接進(jìn)行梯度下降更新就可以了。因此,在每一輪訓(xùn)練迭代中都保證D和G得到了訓(xùn)練,且訓(xùn)練方向是相互競爭的。02一些GAN的改進(jìn)傳統(tǒng)的GAN提出了一種對(duì)抗式訓(xùn)練的框架,后續(xù)的研究在模型結(jié)構(gòu)和損失函數(shù)上進(jìn)行了大量的創(chuàng)新,這里簡單介紹兩個(gè)模型:DCGAN和WGAN。1. DCGAN最早期的GAN是全部使用MLP進(jìn)行全連接的,自然就會(huì)有MLP存在的問題,例如連接過于稠密,參數(shù)量大的問題,這對(duì)一些圖像生成任務(wù)來說并不是一個(gè)好的選擇。DCGAN是早期對(duì)GAN的一種改進(jìn)。DCGAN全稱Deep Convolutional GAN,發(fā)表于ICLR2016。望文知意,DCGAN將傳統(tǒng)的GAN架構(gòu)改造為CNN架構(gòu),使得模型能更好處理圖像相關(guān)任務(wù)。在結(jié)構(gòu)上,DCGAN的生成器和鑒別器就是常見的CNN架構(gòu),鑒別器就是CNN架構(gòu)的二分類器,生成器如下圖所示:DCGAN將輸入的噪聲向量全連接投影到一個(gè)1024x4x4的更大向量,之后reshape成一組feature map,然后反復(fù)使用反卷積操作進(jìn)行上采樣,直至最后輸出為指定的大小和通道。其中使用BatchNormlization技術(shù),并拋棄池化層,除了輸出層激活使用tanh外,其他均使用ReLU作為激活函數(shù)。其中的反卷積操作又稱為“分?jǐn)?shù)步長卷積”(fractional-strided convolution)或“轉(zhuǎn)置卷積”(transposed convolution),可以視為一種與正常卷積“相反”的操作,這里不是指反卷積是卷積的逆變換,而是使用一種類似卷積的方法實(shí)現(xiàn)了上采樣。具體操作如下所示:反卷積在具體實(shí)現(xiàn)上其實(shí)仍然是一種卷積,但是為了能將輸入轉(zhuǎn)換到輸出的尺寸(一般來說是變得更大),往往需要進(jìn)行填充處理。上圖所示的藍(lán)色部分是2x2的輸入圖像,經(jīng)過padding后進(jìn)行3x3大小卷積核以步長1進(jìn)行卷積操作,輸出得到5x5的綠色圖像。這整個(gè)過程可以看做將2x2圖像反卷積成5x5的輸出。此外也有觀點(diǎn)認(rèn)為“反卷積”一詞使用的不恰當(dāng),真正的“反卷積”應(yīng)該只在圖像邊緣進(jìn)行填充處理,而不是將像素拆開進(jìn)行填充。反卷積對(duì)步長和卷積核大小的設(shè)計(jì)有特別的限制,如果卷積核大小不能整除步長,則很容易出現(xiàn)棋盤格效應(yīng),體現(xiàn)在圖像上就是棋盤狀紋理的交替出現(xiàn),原因是反卷積過程中出現(xiàn)了周期性的像素重疊。在進(jìn)行反卷積操作時(shí)往往選擇偶數(shù)大小的卷積核變長,并且以偶數(shù)作為步長,這能夠減輕棋盤格效應(yīng),但效果有限。在實(shí)際中往往通過使用上采樣+普通卷積的方式實(shí)現(xiàn)反卷積的功能。以下是嘗試DCGAN做過一些圖像生成的demo,例如從噪聲中生成動(dòng)漫風(fēng)格頭像,不過效果有限:DCGAN較大的改進(jìn)了GAN在圖像生成任務(wù)上的性能,替換掉了最早的MLP架構(gòu),后續(xù)基本所有涉及到圖像的基于GAN的模型都采用了卷積結(jié)構(gòu)。2. WGAN文章(3)中提出了一種使用EM距離作為損失函數(shù)的GAN網(wǎng)絡(luò)結(jié)構(gòu):WGAN, 解決了傳統(tǒng)GAN訓(xùn)練中出現(xiàn)的模式崩潰問題,同時(shí)增加了GAN訓(xùn)練的穩(wěn)定性。EM距離是作者使用的測度,就像其他測度如:TV距離、KL散度、JS散度等,EM距離也能用來描述兩個(gè)概率分布之間的“距離”。EM距離的原始數(shù)學(xué)定義為:讓我們不那么“數(shù)學(xué)”地去理解它。x和y表示兩個(gè)分布下的隨機(jī)變量,||x-y||描述了分布變換的距離。實(shí)際中,從x所在的分布變換到y(tǒng)所在的分布可能有多種變換方式。這些變換方式中,每一種變換方式出現(xiàn)的概率可以用聯(lián)合分布gamma(x, y)表示,所有變換方式的組成了集合Pi(Pr, Pg)。在每種變換方式下,求每種聯(lián)合分布gamma中變換距離的期望,我們就能得到當(dāng)前變換方式下的平均變換距離。然后,針對(duì)集合Pi中所有變換方式的平均變換距離求下界,我們就能得到所有變換距離中的最近距離,將這個(gè)最近距離稱為:EM距離。作者發(fā)現(xiàn):針對(duì)某些學(xué)習(xí)任務(wù),使用其他距離作為損失函數(shù)無法得到收斂的模型,原因出在因損失函數(shù)不連續(xù)而無法使用梯度下降去優(yōu)化。而EM距離能夠彌補(bǔ)這一缺點(diǎn)。關(guān)于EM距離的連續(xù)性,作者進(jìn)行了大量數(shù)學(xué)推導(dǎo)進(jìn)行證明,可以參看原論文的附錄內(nèi)的推導(dǎo)過程。EM距離雖然很好描述了兩個(gè)分布之間的差異,但根據(jù)定義式我可以看出:無法用數(shù)值梯度優(yōu)化模型??梢越?jīng)過數(shù)學(xué)推導(dǎo)可以用一個(gè)等價(jià)的式子描述EM距離!對(duì)上式的最大化等價(jià)于對(duì)EM距離的最小化。其中:函數(shù)fw描述一組由w作為參數(shù)的擁有Lipschitz性質(zhì)的函數(shù),實(shí)際上是鑒別器,而g_theta自然就是生成器了。如此一來,上式可以通過反向傳播進(jìn)行梯度更新了。如果將EM距離的損失函數(shù)和傳統(tǒng)GAN的損失函數(shù)進(jìn)行對(duì)比,可以看出:在WGAN中不進(jìn)行對(duì)數(shù)映射的對(duì)抗損失反而性能更好。至此,WGAN的損失設(shè)計(jì)基本已經(jīng)完成了。此外作者在優(yōu)化器上進(jìn)行了一些分析,認(rèn)為使用基于動(dòng)量的優(yōu)化器會(huì)導(dǎo)致WGAN訓(xùn)練變得不穩(wěn)定,推薦使用RMSprop進(jìn)行更新。作者還發(fā)現(xiàn)WGAN解決了梯度消失和模式崩潰的問題,具體推導(dǎo)可以看原論文。WGAN最主要的貢獻(xiàn)是從原理上解決了模式崩潰問題,使GAN的訓(xùn)練更加穩(wěn)定,隨之而來的問題就是訓(xùn)練耗時(shí)會(huì)變長(需要在一輪迭代中訓(xùn)練多次鑒別器)。后續(xù)有人提出LSGAN進(jìn)一步修改了損失函數(shù)使得收斂更快。3. 關(guān)于模式崩潰與梯度消失模式崩潰是指:對(duì)于不同的輸入,比如傳統(tǒng)GAN中的噪聲輸入z,生成器只能生成相似的G(z)。即:生成器生成樣本多樣性不足,且經(jīng)過長時(shí)間訓(xùn)練也難以改善。下圖的幾個(gè)生成結(jié)果就出現(xiàn)了模式崩潰:模式崩潰的原因是:傳統(tǒng)GAN訓(xùn)練的會(huì)面臨一個(gè)嚴(yán)重問題--梯度消失。傳統(tǒng)神經(jīng)網(wǎng)絡(luò)提到的梯度消失往往是由sigmoid激活函數(shù)在遠(yuǎn)離原點(diǎn)的區(qū)域梯度過小導(dǎo)致,或是網(wǎng)絡(luò)太深導(dǎo)致回傳梯度累計(jì)值過小。在GAN中的梯度消失問題源于其損失函數(shù)。WGAN論文中給出了分析,傳統(tǒng)GAN的損失實(shí)際上是JS散度(對(duì)KL散度的改進(jìn))下界經(jīng)伸縮和平移變換而來,JS散度對(duì)于沒有重疊的兩個(gè)分布給出的損失是一個(gè)常數(shù),這就意味著沒有梯度來更新模型,從而造成了梯度消失。因?yàn)樘荻认?,模型參?shù)更新基本停滯,也就導(dǎo)致了模型學(xué)習(xí)的映射不再向一個(gè)方向進(jìn)行改變,間接導(dǎo)致了模式崩潰。針對(duì)梯度消失和模式崩潰,WGAN給出的EM距離是一個(gè)很好的解決方案,它的設(shè)計(jì)使得梯度不會(huì)消失,也就解決了模式崩潰問題。03GAN的應(yīng)用:圖到圖翻譯、風(fēng)格遷移圖到圖翻譯可以看做風(fēng)格遷移的一種實(shí)現(xiàn)方式。針對(duì)圖像而言,給定圖A和圖B,其中將A作為風(fēng)格遷移的對(duì)象,通過特定算法將B擁有的風(fēng)格賦予A,如下圖:關(guān)于風(fēng)格遷移的發(fā)展,綜述文章Neural Style Transfer: A Review描述的十分具體。如果我們端到端的去看這個(gè)系統(tǒng),實(shí)際上我們可以將這個(gè)過程視為一個(gè)翻譯的過程。和語言翻譯類似,圖到圖翻譯也是將一個(gè)域的圖像通過模型轉(zhuǎn)換為另一個(gè)域內(nèi)的圖像,本質(zhì)上是一個(gè)分布向目標(biāo)分布的映射。既然GAN能夠完成分布之間的映射學(xué)習(xí),那么使用GAN進(jìn)行圖像到圖像的翻譯就是值得一試的了。目前關(guān)于使用GAN進(jìn)行圖到圖翻譯已存在大量的模型,下面介紹幾個(gè)經(jīng)典模型。它們可以分為兩類:1. cGANcGAN全稱Conditional GAN,是緊接著GAN提出的模型改進(jìn)。這種改進(jìn)是自然的,在GAN一文中作者就將其視為有價(jià)值的future works之一。傳統(tǒng)的GAN學(xué)習(xí)噪聲到某個(gè)分布的映射z → G(z),噪聲可以進(jìn)一步拓展到任意一個(gè)分布,因此GAN學(xué)習(xí)分布到分布的映射,這種映射可以看成先驗(yàn)概率分布Ps(x_s) → Pt(x_t)的映射。cGAN指出,如果我們在分布中加入一個(gè)條件變量,例如一個(gè)one-hot向量,使映射改為條件概率分布的映射Ps(x_s | c) → Pt(x_t | c),那么就等價(jià)于加入了一個(gè)作為引導(dǎo)的條件信息,從而可以控制生成器生成的方向。舉個(gè)例子,通過改變條件變量,我們可以讓一個(gè)人臉圖像生成器生成帶有不同屬性的人臉圖像,例如特定顏色的眼睛、特定發(fā)型的頭發(fā)等。在模型架構(gòu)上,cGAN僅加入了一個(gè)控制條件的向量y作為輸入:可以認(rèn)為條件向量編碼了特定的條件,此時(shí)cGAN的優(yōu)化目標(biāo)各項(xiàng)也需要加上引入的條件:2. pix2pixpix2pix是Berkeley AI Research Lab于2018年提出的一個(gè)基于cGAN思想的圖到圖翻譯模型。在pix2pix中,作者使用成對(duì)的圖片進(jìn)行訓(xùn)練,例如我們有一個(gè)圖片配對(duì){x, y},其中x∈X,y∈Y,X和Y分別表示翻譯前后的源圖像域和目標(biāo)圖像域。此時(shí)x不僅擔(dān)任了作為輸入數(shù)據(jù)的角色,還擔(dān)任了類似于cGAN中的條件信息的角色。這里不再需要隨機(jī)向量z作為輸入,仍然能訓(xùn)練生成器G: x → y。同GAN的訓(xùn)練流程一樣,我們讓x通過生成器生成G(x)。但是之后送入鑒別器的不再是G(x)自己了,還要包括x本身,因此pix2pix中的鑒別器接受兩個(gè)輸入。這是希望鑒別器利用條件信息x進(jìn)行學(xué)習(xí)。此時(shí),鑒別器判斷的是存在x的條件下,G(x)為真實(shí)圖像的概率。在真實(shí)訓(xùn)練中,通過向鑒別器輸入{x, G(x)}的負(fù)樣本和{x, x_real}的正樣本來更新權(quán)重。換句話說,這是通過告知鑒別器什么是正確的翻譯(x → x_real)、什么是錯(cuò)誤的翻譯(x → G(x)),庫完成鑒別器的訓(xùn)練。此外,作者在鑒別器的設(shè)計(jì)上采用了PatchGAN的想法,大致思路是:不使用整張圖來訓(xùn)練鑒別器,而是選取許多來自于整張圖的小patch進(jìn)行鑒別器訓(xùn)練,判斷每個(gè)patch是否為真實(shí)數(shù)據(jù),最終取平均結(jié)果作為整張圖是否為真實(shí)數(shù)據(jù)的判據(jù)。這樣做能夠在模型性能基本不變的情況下使鑒別器參數(shù)量減少、運(yùn)行更快。在生成器設(shè)計(jì)方面,pix2pix采用了U-Net架構(gòu)的網(wǎng)絡(luò)。U-Net類似encoder-decoder,先進(jìn)行下采樣,再進(jìn)行上采樣,不同的是U-Net增加了跨層連接以彌補(bǔ)下采樣導(dǎo)致的信息丟失。pix2pix的損失函數(shù)設(shè)計(jì),采用了多種損失組合的形式。論文指出,除了對(duì)抗損失外,引入其他的經(jīng)典損失有助于模型性能改善。對(duì)抗損失和cGAN基本一致:實(shí)際訓(xùn)練中沒有隨機(jī)噪聲向量z。此外,還有專門用于優(yōu)化生成器性能的L1損失,作者使用L1損失而非L2損失的理由是:L1損失能更好地減少生成圖像的模糊程度:最后,通過一個(gè)參數(shù)lambda調(diào)整兩個(gè)損失函數(shù)的比重,得到總體損失函數(shù):pix2pix的提出,使得圖到圖翻譯、風(fēng)格化的工作可以端到端的實(shí)現(xiàn)。不過,要求數(shù)據(jù)一定是成對(duì)出現(xiàn)的,對(duì)訓(xùn)練數(shù)據(jù)要求有不少難度。下面的CycleGAN通過引入循環(huán)一致?lián)p失(cycle-consistency loss)提供了一種非監(jiān)督的訓(xùn)練方法。3. CycleGAN基于pix2pix的研究,BAIR的研究人員將目光投向非監(jiān)督式的圖到圖翻譯算法,提出了CycleGAN模型,其架構(gòu)如下:CycleGAN基于這樣一個(gè)思想:如果將一句英語翻譯成法語,然后再將其翻譯回英語,我們應(yīng)該得到完全一樣的一句英語。同樣的事情也要發(fā)生在圖到圖翻譯中,圖像x經(jīng)過兩次翻譯,回到源圖像域后應(yīng)該盡可能一致,即:x → G(x) → F(G(x)) ≈ x,對(duì)于目標(biāo)域圖像y同理。于是CycleGAN設(shè)計(jì)了循環(huán)一致?lián)p失:這樣一來就涉及到兩組生成器和鑒別器,每一組生成器和鑒別器都需要考慮對(duì)抗損失,此外再加上循環(huán)一致?lián)p失,我們得到總損失函數(shù):CycleGAN的好處在于:我們不再需要特意準(zhǔn)備配好對(duì)的圖像進(jìn)行訓(xùn)練了。原本pix2pix要求圖像配對(duì)是為了顯式增加翻譯方向的監(jiān)督信息,從而讓網(wǎng)絡(luò)學(xué)習(xí)定向的映射關(guān)系。因?yàn)槿绻苯尤∠鋵?duì),從原圖像域和目標(biāo)圖像域內(nèi)隨機(jī)挑選樣本進(jìn)行學(xué)習(xí),網(wǎng)絡(luò)學(xué)習(xí)到的映射有太強(qiáng)的隨機(jī)性,可以將源圖像域的圖像翻譯成目標(biāo)圖像域中的任意一種甚至是幾種組合,而這種映射關(guān)系可能不是我們想要的。換句話說,網(wǎng)絡(luò)沒有學(xué)到我們希望它學(xué)到的映射。舉個(gè)例子:假設(shè)我們訓(xùn)練一個(gè)網(wǎng)絡(luò),學(xué)習(xí)將黑白線稿上色。源圖像域內(nèi)的訓(xùn)練樣本全是線稿,目標(biāo)圖像域內(nèi)的樣本全是彩色圖。如果我們使用有監(jiān)督的成對(duì)圖像進(jìn)行訓(xùn)練,比如如下的三個(gè)樣本:- {handbag_sketch, handbag_color}
- {lemon_sketch, lemon_color}
那么很好,網(wǎng)絡(luò)學(xué)到了將貓的線稿映射到彩色貓、將手提包線稿映射到彩色手提包、將檸檬線稿映射到彩色檸檬;如果取消配對(duì),設(shè)置兩個(gè)圖像域:- X = {cat_sketch, handbag_sketch, lemon_sketch}
- Y = {cat_color, handbag_color, lemon_color}
訓(xùn)練的時(shí)候讓網(wǎng)絡(luò)隨機(jī)從兩個(gè)集合中選取樣本來學(xué)習(xí)映射,那么很有可能你將得到一個(gè)有著貓咪毛色和紋理的詭異檸檬,又或是一只長滿棕色人造革“皮膚”的可憐貓咪......這個(gè)例子可能比較驚悚,這是用一種極端的方式去說明去掉圖像配對(duì)進(jìn)行非監(jiān)督式訓(xùn)練,網(wǎng)絡(luò)學(xué)到的映射有多么不可控。CycleGAN考慮到了這一點(diǎn),因此提出了之前說到的循環(huán)一致?lián)p失,循環(huán)一致?lián)p失使得生成器不僅僅學(xué)習(xí)到從域X向域Y的映射就萬事大吉了,更要求它學(xué)到能夠使得讓Y向X的重建同樣成功的參數(shù)??梢哉f,循環(huán)一致?lián)p失的加入減小了生成器學(xué)習(xí)的映射空間,避免了很多過于隨機(jī)化的映射被學(xué)習(xí)。04來也科技基于GAN的手寫字體風(fēng)格遷移實(shí)踐手寫體在我們的日常生活中有著非常廣泛的應(yīng)用:某些重要文檔的簽署、電子閱卷、票據(jù)等都依賴人工書寫。然而,目前對(duì)于手寫體的檢測和識(shí)別仍比較困難。最大的困難是文字上比較成功的深度模型屬于數(shù)據(jù)驅(qū)動(dòng),而僅靠公開的手寫數(shù)據(jù)集根本無法覆蓋實(shí)際需求。因此,如果能開發(fā)一種印刷體到任意手寫體風(fēng)格的遷移網(wǎng)絡(luò)就可以大大增加數(shù)據(jù)的多樣性,本質(zhì)上解決了訓(xùn)練樣本缺乏的問題。手寫字體風(fēng)格遷移一般可以從兩個(gè)思路進(jìn)行解決:一種是將手寫字體視為圖像通過計(jì)算機(jī)視覺領(lǐng)域內(nèi)的生成模型進(jìn)行處理,常見的生成算法如GAN、VAE等;另一種是將手寫字體視為關(guān)鍵點(diǎn)集序列,通過序列生成算法如RNN、LSTM等進(jìn)行處理。下文分享了來也科技采用了GAN對(duì)手寫字體風(fēng)格遷移進(jìn)行實(shí)踐研究:1. 基于BicycleGAN的手寫風(fēng)格遷移實(shí)踐BicycleGAN是2017年發(fā)表于NIPS的基于cGAN的多域圖像翻譯模型,其提出:在輸入和隱空間內(nèi)使用雙射變換以保證網(wǎng)絡(luò)輸出的多樣性。即:在訓(xùn)練階段,模型不僅需要學(xué)習(xí)從輸入、隱向量到輸出的映射任務(wù),同時(shí)還需要學(xué)習(xí)從輸出到隱空間的映射關(guān)系,這將會(huì)避免模型忽略隱向量信息,從而保證輸出的多樣性。① 模型簡介整個(gè)模型由兩個(gè)GAN網(wǎng)絡(luò)以及一個(gè)編碼器組成,其中兩個(gè)GAN網(wǎng)絡(luò)共用一個(gè)生成器G。針對(duì)第一個(gè)模塊cVAE-GAN來說,其先將目標(biāo)風(fēng)格圖像B通過編碼器處理為隱向量,這里的編碼器通常是由四層下采樣層以及一層全連接組成,目的是為了提取目標(biāo)風(fēng)格圖像的風(fēng)格信息。之后原始風(fēng)格圖像A與隱向量通過通道級(jí)連后作為生成器G的輸入,這里的生成器是基于U-Net架構(gòu)設(shè)計(jì)的編碼-解碼型網(wǎng)絡(luò),輸出為目標(biāo)風(fēng)格圖B。與上文描述的pix2pix一樣,這里的鑒別器類似于一個(gè)二分類網(wǎng)絡(luò),主要用于判斷輸入圖像的真實(shí)性。為了提升鑒別準(zhǔn)確性,這里依舊使用了Patch Discriminator,不僅對(duì)輸入圖像整體進(jìn)行判別打分,而且對(duì)輸入圖像的每一個(gè)細(xì)分Patch塊進(jìn)行判別打分。通過約束生成目標(biāo)風(fēng)格圖像B與真實(shí)目標(biāo)風(fēng)格圖像B之間的L1損失與對(duì)抗損失以及隱向量與高斯分布之間的KL損失優(yōu)化模型參數(shù)。cVAE-GAN的目的是希望隱向量不僅要蘊(yùn)含目標(biāo)風(fēng)格信息,還要盡可能的與標(biāo)準(zhǔn)正態(tài)分布保持一致。這樣,在理想情況下,訓(xùn)練完成后我們直接從標(biāo)準(zhǔn)正態(tài)分布中隨機(jī)采樣,即可生成無限多樣風(fēng)格的結(jié)果,當(dāng)然也可以通過編碼器輸出指定的風(fēng)格遷移結(jié)果。但在實(shí)際中,這部分模型可能受限于KL損失難優(yōu)化以及隱向量容易被模型忽略等問題。因此這里還使用了cLR-GAN用于防止隱向量信息丟失問題。針對(duì)cLR-GAN來說,其彌補(bǔ)了cVAE-GAN容易忽略隱向量信息的問題。首先從高斯分布中隨機(jī)采樣隱向量N(z)與原始風(fēng)格圖像A通過通道級(jí)連后再次輸入生成器G中,生成器輸出目標(biāo)風(fēng)格圖像B。B再次通過cLR-GAN中的編碼器提取隱向量z,通過約束z與N(z)之間的L1距離來促使中保留隱向量信息。由于此時(shí)B攜帶了隨機(jī)隱向量N(z)信息,因此不能再與B進(jìn)行像素約束,即:與B僅通過鑒別器計(jì)算對(duì)抗損失。注意:這里最好不復(fù)用cVAE-GAN中的鑒別器。綜上所述,通過這兩部分的聯(lián)合訓(xùn)練,BicycleGAN能夠建立生成結(jié)果與隱向量之間的雙射一致性,從而促使模型生成更多樣的結(jié)果。整個(gè)模型使用L1、KL以及對(duì)抗損失約束。② 具體實(shí)踐我們基于該思路在手寫英文及數(shù)字上進(jìn)行了風(fēng)格遷移實(shí)踐。我們從Google Font中選擇了27種字體作為基礎(chǔ)數(shù)據(jù),并將Caveat-Regular作為原始風(fēng)格,其余字體作為目標(biāo)風(fēng)格,以1:9的方式劃分測試集與訓(xùn)練集。最終獲得了1451張訓(xùn)練集,161張測試集。通過多次調(diào)整損失權(quán)重我們發(fā)現(xiàn):一般將λL1=50,λKL=0.01,λz_L1=0.1會(huì)有較為穩(wěn)定的結(jié)果。但是我們在原始論文的架構(gòu)上(附錄8)上實(shí)驗(yàn)發(fā)現(xiàn):模型有較嚴(yán)重的筆畫丟失問題,因此嘗試引入Feature-Loss和AC-Loss,并設(shè)計(jì)了LSTM鑒別器來緩解這一問題,但實(shí)驗(yàn)效果不及預(yù)期。其中,加入Feature-Loss后生成結(jié)果有細(xì)微增強(qiáng),下面是實(shí)驗(yàn)結(jié)果展示,可以看出有些風(fēng)格上較細(xì)的筆畫容易在遷移過程中丟失:2. 基于Zi2Zi的手寫漢字風(fēng)格遷移實(shí)踐① 模型簡介Zi2Zi是在條件GAN網(wǎng)絡(luò) ( cGAN ) 的基礎(chǔ)上,用于解決One-to-Many漢字風(fēng)格轉(zhuǎn)換問題的模型。One-to-Many是指從某一種固定風(fēng)格字體生成任意多種風(fēng)格字體的任務(wù)。如上文所述,模型以生成器和鑒別器作為基礎(chǔ)架構(gòu)。生成器以某種固定風(fēng)格的字體及風(fēng)格類別標(biāo)簽作為輸入,輸出具有指定風(fēng)格的漢字圖像。鑒別器以固定風(fēng)格與目標(biāo)風(fēng)格的漢字圖像對(duì)作為輸入,輸出圖像真實(shí)性分類結(jié)果以及風(fēng)格類別分類結(jié)果。首先需要先對(duì)數(shù)據(jù)進(jìn)行預(yù)處理操作,整個(gè)過程如下圖所示:模型將輸入數(shù)據(jù)進(jìn)行拆分處理,整體拆分為固定風(fēng)格字體、目標(biāo)風(fēng)格字體以及目標(biāo)風(fēng)格標(biāo)簽三個(gè)部分。其中固定風(fēng)格字體是指基于的原始字體,目標(biāo)風(fēng)格字體是指我們希望生成的風(fēng)格字體,即Zi2Zi可以僅通過修改目標(biāo)風(fēng)格標(biāo)簽就能將固定風(fēng)格字體轉(zhuǎn)化為任意目標(biāo)風(fēng)格的字體。生成器基于比較經(jīng)典的編碼-解碼架構(gòu)。首先,原始字符圖像經(jīng)過編碼器對(duì)字符內(nèi)容進(jìn)行編碼。該編碼器由8層下采樣層組成,每個(gè)下采樣層內(nèi)包括了卷積、歸一化、激活三層網(wǎng)絡(luò),注意這里沒有使用池化去降采樣圖像,而是選擇調(diào)整卷積步長來降采樣圖像。之后,風(fēng)格標(biāo)簽和編碼器的輸出通過通道級(jí)連。這里風(fēng)格標(biāo)簽其實(shí)是以一個(gè)預(yù)定義的高斯分布矩陣中的第label維作為當(dāng)前目標(biāo)風(fēng)格字體的風(fēng)格標(biāo)簽。最后,解碼器從風(fēng)格嵌入后的特征向量中恢復(fù)出目標(biāo)風(fēng)格字體。該解碼器是由8層上采樣層組成,每個(gè)上采樣層內(nèi)包括了分步卷積層、歸一化層以及激活層。鑒別器以原始字體圖像與目標(biāo)風(fēng)格字體圖像對(duì)作為輸入,通過4層下采樣層提取圖像的深層特征,之后通過兩個(gè)全連接層分別輸出圖像真/假分類結(jié)果以及風(fēng)格分類結(jié)果。如上文所述,傳統(tǒng)的鑒別器其實(shí)可以被視為是二分類網(wǎng)絡(luò)。為了使目標(biāo)風(fēng)格保留的更加清晰,這里的鑒別器還承擔(dān)著多風(fēng)格分類任務(wù)。整個(gè)模型使用了對(duì)抗損失、分類損失、像素?fù)p失(L1)、編碼一致?lián)p失進(jìn)行約束。另外在實(shí)驗(yàn)中發(fā)現(xiàn)部分生成結(jié)果會(huì)有噪點(diǎn)以及模糊問題,因此這里還使用了TV-loss用于平滑生成結(jié)果。② 具體實(shí)踐我們基于Zi2Zi對(duì)手寫漢字風(fēng)格遷移進(jìn)行了實(shí)驗(yàn):以黑體作為原始風(fēng)格字體,選擇了15種風(fēng)格迥異的字體作為目標(biāo)風(fēng)格字體。除對(duì)風(fēng)格差異較大的手寫體隨機(jī)采樣4000張圖像外,其余字體均采樣2000張圖像作為訓(xùn)練集,最終我們獲得了45,000張訓(xùn)練集, 4000張測試集。多次調(diào)整損失權(quán)重后發(fā)現(xiàn):將λL1=100,λTV=0.001,λconst=10,其他權(quán)重均設(shè)為1,會(huì)有較穩(wěn)定良好的訓(xùn)練結(jié)果。另外,我們參考作者(附錄12)建議的兩階段訓(xùn)練方案,即:先用全部字體訓(xùn)練整個(gè)模型,之后固定編碼器對(duì)某幾種字體進(jìn)行微調(diào)訓(xùn)練。可以發(fā)現(xiàn):前期生成結(jié)果可能會(huì)有明顯的噪點(diǎn),并且在細(xì)節(jié)區(qū)域會(huì)有明顯的模糊。加入TV-Loss后,噪點(diǎn)問題有所緩解;參考FontRNN引入Binary-Loss后,希望生成結(jié)果更清晰,但發(fā)現(xiàn)該損失會(huì)加重生成筆畫丟失的問題,而這也是基于CNN處理漢字圖像風(fēng)格遷移難以避免的問題之一。以下是我們的部分實(shí)驗(yàn)結(jié)果:3. 小結(jié)將字符視為圖像的風(fēng)格遷移模型在多樣性上具有卓越的表現(xiàn),并且滿足One-to-Many的工業(yè)需求。但是,由于CNN的網(wǎng)絡(luò)特性,會(huì)不可避免地發(fā)生筆畫連接錯(cuò)誤或筆畫丟失等問題,而這些問題對(duì)于漢字來說是非常關(guān)鍵的(如:銀和鋃)。在未來我們期望通過引入筆畫序列監(jiān)督以及注意力機(jī)制等算法改善這一問題。05GAN的優(yōu)缺點(diǎn)分析- 僅用到BP進(jìn)行訓(xùn)練,在實(shí)現(xiàn)上有成熟框架支持
- 相比其他生成模型(如VAE等),GAN生成樣本的質(zhì)量更高
- 經(jīng)過改進(jìn)的GAN應(yīng)用場景豐富,尤其是在圖像領(lǐng)域,包括風(fēng)格遷移、超分辨率、去噪,損失函數(shù)設(shè)計(jì)較為統(tǒng)一(以對(duì)抗損失為核心,無需設(shè)計(jì)針對(duì)任務(wù)特定的損失)
- 對(duì)于圖像任務(wù),可以進(jìn)行端到端訓(xùn)練,比較方便
06訓(xùn)練GAN的技巧大部分的技巧只針對(duì)從噪聲z → G(z)的傳統(tǒng)意義的GAN而提出。關(guān)于訓(xùn)練技巧的研究很少,大部分還是16-17年提出來的一些經(jīng)驗(yàn)性的方法。https://cloud.tencent.com/developer/article/133565207其他應(yīng)用場景除了上文描述的字體圖像風(fēng)格遷移外GAN在其他場景下也有卓越的表現(xiàn),比如:Generate Examples for Image Datasets、Generate Photographs of Human Faces、Generate Realistic Photographs、Generate Cartoon Characters、Image-to-Image Translation、Text-to-Image Translation、Semantic-Image-to-Photo Translation、Face Frontal View Generation、Generate New Human Poses、Photos to Emojis、Photograph Editing、Face Aging、Photo Blending、Super Resolution、Photo Inpainting、Clothing Translation、Video Prediction、3D Object Generation.傳統(tǒng)GAN作為框架指導(dǎo),基本已經(jīng)不投入直接使用。目前的模型往往結(jié)合較新的架構(gòu)(如殘差網(wǎng)絡(luò))和改進(jìn)過的損失函數(shù)(從原理上改進(jìn),如WGAN;根據(jù)任務(wù)改進(jìn),如pix2pix和CycleGAN的損失),用于特定工作。GAN典型應(yīng)用介紹: https:///@jonathan_hui/gan-some-cool-applications-of-gans-4c9ecca35900 https:///impressive-applications-of-generative-adversarial-networks/ 08參考資料1. Generative Adversarial Networks
http:///abs/1406.2661 2. Deep Convolutional GAN https:///abs/1511.06434 3. Wasserstein GAN https:///abs/1701.07875 4. Neural Style Transfer: A Review https:///abs/1705.04058 5. Conditional GAN https:///abs/1411.1784 6. Image-to-Image Translation with Conditional Adversarial Networks https:///abs/1611.07004 7. Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks https:///abs/1703.10593 8. https://cloud.tencent.com/developer/article/1335705 9. 比較詳細(xì)的GAN綜述: http://www./note-gans.html 10. BicycleGAN https:///abs/1711.11586 11. FontRNN https://onlinelibrary./doi/full/10.1111/cgf.13861 12. ZI2ZI https://github.com/kaonashi-tyc/zi2zi 今天的分享就到這里,謝謝大家。
|