深入淺出 GAN·原理篇文字版(完整)
導語
這次的內容主要是想梳理 GAN 從 NIPS 2014 被提出,到 2017年5月,都有哪些重要的從原理和方法上的重要研究。一共覆蓋了25篇重要論文(論文列表見本文最下方)。
引言:GAN的驚豔應用
首先來看看 GAN 現在能做到哪些驚豔的事呢?
GAN 可以被用來學習生成各種各樣的字型——也就是說,以後字跡辨認這種偵查手段很可能就不靠譜啦!這個工作還有很多動圖,在 GitHub 上搜 zi2zi 這個 project 就可以。
有了GAN,以後就不怕靈魂畫手了!左邊這麼簡單的“簡筆畫”,居然也可以直接生成出對應的蘊含豐富含義的完整圖畫呢。這個工作來自[24],同時還可以用來做一些修正,比如可以把春天的山變成被白雪覆蓋尖端的山——而這一切只需要一點點白色的塗抹(可以參考這個工作[24]的官方頁面)。
有了GAN,不僅僅可以在有輔助的情況下作畫,還可以在無輔助的情況下完成很多修飾!比如從分割圖變成真實照片,從黑白圖變成彩色圖,從線條畫變成富含紋理、陰影和光澤的圖……這些都是用 pix2pix[21] 裡的方法生成的。
去年非常火爆的應用,臉萌當然也難不倒 GAN!想擁有自己的專屬Q版定製頭像嗎?快去看看[22] 吧(這篇工作以前也已經寫過哦)
當然還少不了前段時間刷爆社交網路的“莫奈在春天醒來”、“馬變斑馬”、“四季更迭”的工作啦。來自依然也寫過的 CycleGAN[9]。傳送門在下面二維碼中。
背景知識:GAN基礎和優點
這些驚豔的工作基本都是2016年8月甚至10月以後的,也就是 GAN 被提出兩年後。這是因為,雖然 GAN 有非常吸引人的性質,想要訓練好它並不容易。經過兩年的摸索、思考與嘗試,才有瞭如今的積累和突破。
那麼這個非常吸引人的 GAN 是什麼樣呢。其實 GAN 最初讓人“哇”的地方在於,作為一個生成模型,GAN 就像魔術師變魔術一樣,只需要一個噪音(噪音向量),就可以生成一隻兔子!
而想要成為一個成功的欺騙觀眾的魔術師並不容易,GAN 也是在不斷地失敗、穿幫、磨練技藝中成長起來的!要知道,觀眾們見過很多兔子,如果變出來的東西根本不像兔子,或者變不出來,這個魔術就很失敗,觀眾就不會買賬。在這樣反覆的練習中,作為魔術師的 GAN 扮演的是生成模型的角色,目的是要不斷地提高自己的魔術水平,從而變出更活靈活現的兔子;而觀眾扮演的是一種判別模型的角色,目的是考察和激勵魔術師提高自己的水平。但是這種激勵是通過批評或者懲罰的方式完成的。
嚴格來說,一個GAN 框架,最少(但不限於)擁有兩個組成部分,一個是生成模型 G,一個是判別模型 D。在訓練過程中,會把生成模型生成的樣本和真實樣本隨機地傳送一張(或者一個 batch)給判別模型 D。判別模型 D 的目標是儘可能正確地識別出真實樣本(輸出為“真”,或者1),和儘可能正確地揪出生成的樣本,也就是假樣本(輸出為“假”,或者0)。這兩個目標分別對應了下方的目標函式的第一和第二項。而生成模型的目標則和判別模型相反,就是儘可能最小化判別模型揪出它的概率。這樣 G 和 D 就組成了一個 min-max game,在訓練過程中雙方都不斷優化自己,直到達到平衡——雙方都無法變得更好,也就是假樣本與真樣本完全不可區分。
通過這樣的巧妙設計,GAN 就擁有了一個非常吸引人的性質。GAN 中的 G 作為生成模型,不需要像傳統圖模型一樣,需要一個嚴格的生成資料的表示式。這就避免了當資料非常複雜的時候,複雜度過度增長導致的不可計算。同時,它也不需要 inference 模型中的一些龐大計算量的求和計算。它唯一的需要的就是,一個噪音輸入,一堆無標準的真實資料,兩個可以逼近函式的網路。
訓練難點一:過於自由
但是天下沒有免費的午餐,這樣簡單的要求使得 GAN 的自由度非常大。換句話說,GAN 的訓練就會很容易失去方向,變得野蠻生長。於是,早期的 GAN 經常出現如下讓人崩潰的現象:
這些現象其實是 GAN 中存在的三個難點或者說問題交織導致的。個人覺得,首當其中的難點一就是,深度神經網路自身的難訓練和不穩定。雖然原始 GAN 的理論中,並不要求 G 和 D 都是神經網路,只需要是能擬合相應生成和判別的函式就可以。但是這恰好是深度神經網路擅長的事情嘛,所以大家就都用神經網路作為 G 和 D 了。但是神經網路的選擇、設計和訓練還充滿了藝術的驚喜與生活的不確定性,這也直接為 GAN 的訓練帶來了困難。加之本來 GAN 就缺乏指導,所以就有了一系列可以被歸結為解決這一方向問題的工作。我將這類工作概括為 Partial Guidance, Fine-Grained Guidance 和 Special Architecture。
解決方案一:Partial Guidance
先來看,Partial Guidance。Partial Guidance 中我概括的幾個重要工作,都是為原始 GAN 加上一些顯式的外部資訊,比如使用者的額外輸入,比如類別資訊等等。包含的工作有:
Conditional GAN[15],也叫 CGAN,幾乎是原始 GAN[2] 後的第一份工作,想法非常簡單,既然你的資訊不夠,我就把你原始的生成過程變成基於某些額外資訊的生成。這樣就相當於給你提供了一些 hint,所以公式如下:
可以看到,D 和 G 去擬合的分佈都變成了條件概率分佈。在 CGAN 的工作中,這個額外的 y 資訊,是通過在輸入層直接拼接樣本與 y 資訊的向量而實現的。具體使用的 y 資訊有 one-hot vector,也有影象(也就是基於另一個影象去生成)。這個 y 資訊的選擇其實十分靈活,在後期的工作中也依然很常見,畢竟是一種非常直觀有效的加入 label 資訊的方式。
第二個這方面的工作是由 OpenAI 提出的 Improved GAN[19],其中重點提出了兩個訓練 GAN 的技巧,feature matching 和 minibatch discrimination。feature matching 是指,既然 G 和 D 的訓練不夠穩定,常常 D 太強,G 太弱,那麼不如就把 D 網路學到的特徵直接“傳”給 G,讓 G 不僅能知道 D 的輸出,還能知道 D 是基於什麼輸出的。所以就有了如下的新的目標函式:
也就是說,現在的 D 直接就是神經網路的某一箇中間層了。這個方法在實驗中發現對於訓練的穩定度提升非常有幫助。與此同時,他們還提出了第二個方法,叫 minibatch discrimination:
這其實是讓 D 在判斷當前傳給它的樣本是真是假的同時,不要只關注當前的,也要關注其他的樣本。這會增加 D 判斷樣本時候的多樣性,從而增加了 G 生成樣本的多樣性,因為它不再會只基於一種“逼真”樣本的方向來改進自己。
第三個工作是來自 UC Berkeley 的 iGAN/GVM[24],也是開篇介紹 GAN 應用中的解放靈魂畫手的工作。他們的工作中蘊含了兩種指導資訊,一個是使用者的輸入,比如藍色的筆觸,比如綠色的線條,比如影象改變的方向和程度(拉伸、變形)。但是如果只利用這樣的資訊,生成的影象往往比較模糊,比如鞋子的紋理變得不夠清晰。為此它們的解決辦法是為在生成的鞋子的形狀上“貼”上原始真實圖片中的高清紋理。所以難點就是如何讓“貼”的過程變得可靠,不能“貼”出區域,也不能“貼”少了。他們在此利用了差值空間中的光場資訊,從而能捕捉到相鄰差值空間中的點對點對映關係,也就可以基於這樣的對映,迭代“貼”上紋理,直到最後一步:
iGAN 的工作之後,他們又繼續做了 pix2pix 的工作[21],用於生成一些影象兩兩之間的“變換”。也就是開篇介紹的,“從分割圖變成真實照片,從黑白圖變成彩色圖,從線條畫變成富含紋理、陰影和光澤的圖”,還有第一個 zi2zi 的字型變換,也是基於這個 pix2pix 的工作[21]。pix2pix 裡,將 D 的輸出從一張圖片變成了一對圖片,所以 D 的任務就變成了去判斷當前的兩張圖片是否是一個“真實”的“變換”。比如我們的需求是給一個黑白的 Hello Kitty 上色,那麼 pix2pix 的框架大概如下:
而Partial Guidance 中的最後一個重要任務就是非常新的 GP-GAN[25],目標是將直接複製貼上過來的圖片,更好地融合進原始圖片中,做一個 blending 的事情。
這個過程非常像 iGAN,也用到了類似 iGAN 中的一些約束,比如 color constraint。另一方面,這個工作也有點像 pix2pix,因為它是一種有監督訓練模型,在 blending 的學習過程中,會有一個有監督目標和有監督的損失函式。
解決方案一:Fine-grained Guidance
除了Partial Guidance 這種非常顯式的“半監督”(不是嚴格意義上的半監督)資訊,過去也有很多工作讓GAN 的生成過程拆解到多步,從而實現“無監督”的 Fine-grained Guidance。個人總結了以下一些重要工作:
第一篇 LAPGAN 是來自 Facebook[16],是第一篇將層次化或者迭代生成的思想運用到 GAN 中的工作。在原始 GAN[2] 和後來的 CGAN[15] 中,GAN 還只能生成 16*16, 28*28, 32*32 這種低畫素小尺寸的圖片。而這篇工作[16] 是首次成功實現 64*64 的影象生成。思想就是,與其一下子生成這麼大的(包含資訊量這麼多),不如一步步由小轉大,這樣每一步生成的時候,可以基於上一步的結果,而且還只需要“填充”和“補全”新大小所需要的那些資訊。這樣資訊量就會少很多:
而為了進一步減少資訊量,他們甚至讓 G 每次只生成“殘差”圖片,生成後的插值圖片與上一步放大後的圖片做加法,就得到了這一步生成的圖片。
第二篇 Fine-grained Guidance 方面的工作[18]討論的是從 Text 生成 Image,比如從圖片標題生成一個具體的圖片。這個過程需要不僅要考慮生成的圖片是否真實,還應該考慮生成的圖片是否符合標題裡的描述。比如要標題形容了一個黃色的鳥,那麼就算生成的藍色鳥再真實,也是不符合任務需求的。為了捕捉或者約束這種條件,他們提出了 matching-aware discriminator 的思想,讓本來的 D 的目標函式中的兩項,擴大到了三項:
第三篇這方面的工作[20]可以粗略認為是 LAPGAN[16] 和 matching-aware[18] 的結合。他們提出的 StackGAN[20] 做的事情從標題生成鳥類,但是生成的過程則是像 LAPGAN 一樣層次化的,從而實現了 256*256 解析度的圖片生成過程。StackGAN 將圖片生成分成兩個階段,階段一去捕捉大體的輪廓和色調,階段二加入一些細節上的限制從而實現精修。這個過程效果很好,甚至在某些資料集上以及可以做到以假亂真:
最後一個這方面的工作[26],當時也因為效果逼真和工作夯實,引發了社交網路上和學術圈的廣泛關注,那就是去年年底的 PPGN[26],現在已被 CVPR 2017 接收。PPGN 也主張不要一次生成一張完整的圖片,而是要用一個迭代過程不斷地調整和完善。與 LAPGAN 和 StackGAN 不同的是,PPGN 使用了 Denoising AutoEncoder(DAE)的過程實現迭代,並在其網路結構中也多次體現了迭代和層次化的思想。
解決方案三:Special Architecture
針對GAN 的第一大難點,也就是神經網路本身訓練的不穩定和難調參,也有許多工作提出了一些特殊結構,來改善這些情況。
將GAN 成功從 MNIST 的多層感知機(MLP)結構擴充套件到卷積神經網路結構的就是DCGAN 這篇工作[17]。這篇工作中,他們提出了一組卷積神經網路,不僅使得可以 GAN 可以在 celebA 和 LSUN 這種現實世界的真實大規模資料集上訓練,還使得 batchnorm 等 trick 也被成功運用。
雖然DCGAN 的一度成為了 GAN 工作的標準,統治了大半年的江湖。但是隨後出現的效果非常驚豔的 pix2pix[21] 中卻指出了 U-Net 結構的優勢。pix2pix 中 G 和 D 使用的網路都是 U-Net 結構,是一種 encoder-decoder 完全對稱的結構,並且在這樣的結構中加入了 skip-connection 的使用。
這個結構對於生成效果至關重要,其也被後續的一些工作採用[9][11] 。skip-connection 不僅使得梯度傳導更通暢,網路訓練更容易,也因為這類工作多數是要學習圖片之間的對映,那麼讓 encoder 和 decoder 之間一一對應的層學到儘可能匹配的特徵將會對生成圖片的效果產生非常正面的影響。類似的討論可以見 [11]。
最後要指出的也是剛才就提到的 GP-GAN[25] 的工作。在這個工作中,它們提出了 blending GAN 的模組,雖然也是基於 encoder-decoder 的結構,但是略有不同的地方是,在兩者中間加入了一個 fully-connected layer:
這個全連線層的特殊之處在於,並不是卷積神經網路中的 channel-wise FCN,而是徹底全連線。這樣的好處是可以傳遞更多的全域性資訊,使得有監督學習變得更加有效。
訓練難點二:原始目標函式沒意義
其實,GAN 訓練之難,更多的源於它 GAN 目標函式自身。GAN 的 D 的目標函式上文已經提過:
而G 的目標函式相應的是:
也就是說,G 需要最小化讓 D 識別出自己生成的假樣本的概率。但其實,在 GAN 原始論文[2] 中,作者就指出使用如上的 G 的目標函式會給訓練造成問題。從形象化的角度來理解,在訓練的早期,G 生成的假樣本質量還非常差,與真實樣本相距過遠。這會知道 D 非常容易識別出 G 的假樣本,從而使得 D 的訓練幾乎沒有損失,也就沒有有效的梯度資訊回傳給 G 讓 G 去優化自己。這樣的現象叫做 gradient vanishing,梯度消失問題。
從偏理論的角度來理解,梯度消失的問題實際上更“複雜”一些。想要理解它需要先理解 GAN 的 min-max game 的平衡條件。當 G 和 D 的對抗訓練達到平衡時,可以認為取得了最優的 D(和最優的 G),此時最優的 D* 應該是兩個分佈的比值:
有了最優的 D* 的表達,就可以將它帶入原始的 D 的目標函式,從而得到上頁 slides 中的等價表達。也就是說,在 GAN 原始論文[2] 中就已經給出了,優化這樣一個目標函式等價於優化 JS 散度(因為 2log2 是常數)。
然而,問題就出在了這個 JS 散度上。在論文[1] 中,作者指出當兩個分佈(比如這裡的真實資料分佈 P_r 和 生成資料分佈 P_g 之間幾乎不重合或者重合部分可忽略不計時,JS 散度也是個常數!而這在由神經網路擬合的分佈中是非常常見的!也就是說,原始的 GAN 目標函式幾乎是常數,所以也就不難理解為什麼梯度幾乎消失了。
訓練難點三:替代目標函式不合理
針對梯度消失問題,原始 GAN 論文[2] 就提出了一個啟發性的替代目標函式:
這一函式相比原始的目標函式,相當於從最小化 D 揪出自己的概率,變成了最大化 D 抓不到自己的概率。雖然直觀上感覺是一致的,但其實並不在理論上等價,也更沒有了理論保證在這樣的替代目標函式訓練下,GAN 還會達到平衡。
即使如此,論文[1] 依然指出,就算是這個替代的目標函式,也同樣有問題!他們證明了,去優化這樣一個目標函式等價於最小化 KL 散度的同時最大化 JS 散度。
可是,KL 散度和 JS 散度是同向的:
也就是說,如果要最小化其中一個的同時卻要最大化另一個,這隻會導致優化目標不一致和訓練不穩定,也就是 gradient unstable issue。不過,既然在難點二中分析了,JS 散度在這種情況下經常為常數,不提供資訊,那麼只看 KL 散度行不行呢。答案依然是不行。即使我們只考慮優化 KL 散度,因為 KL 散度是不對稱的,也會導致問題。也就是說,當生成器無法生成真實影象和生成了非常不真實的影象,這兩種情況下,它得到的懲罰是不一樣的。這會導致,生成器 G 為了得到更少的懲罰,只得選擇懲罰最小的策略,也就是生成儘可能多的看起來真實的圖片而不考慮這些圖片是不是一樣!也就是說,只要它生成了一張判別器認為還面前湊合的圖片,它就不會再願意冒險去嘗試新的圖片,因為這種冒險會帶來更多的懲罰。所以只優化一個不對稱的 KL 散度,就會導致一個叫mode missing 的問題,這個在我們以前也專門分析過,點我傳送。
解決方法二:Encorder-Incorporated
為了解決上述 mode missing 的問題,有非常多的工作其實可以歸為一大類。那就是在原始 G 和 D 之上再加上一個自動編碼器 encoder。比如比較有代表性的工作[3],就是讓真實圖片通過一個編碼器 E 得到一個隱空間的表達 z,再在此基礎上用生成器 G 生成最後的圖片。所以,對於編碼器的目標函式是:
而對於加入了編碼器的生成器的目標函式就會變成:
在一個模擬實驗上可以看到,沒有編碼器的原始 GAN 會非常難以擬合多個分散的 mode,而加入了編碼器的 regularized GAN 則非常容易:
同時期還有許多相似的工作,比如 EBGAN[4] 和 BEGAN[5]。兩篇工作非常相似,EBGAN 將能量函式作為判別器 D 的輸出;而 BEGAN 則將這一條件“簡化”。
解決方法二:Noisy Input
雖然介紹了這些加入了編碼器的工作,但是他們為什麼就能解決 mode missing 的問題呢。這主要還是因為加入了編碼器後,就可以儘量讓生成資料的分佈 P_g 和真實資料的分佈 P_r 更相近,重合的可能性和程度更高。從而緩解 JS 散度幾乎為常數導致的梯度無意義的問題。
然而其實有更簡單的一些技巧和方法來實現相似的目的:
在論文[1] 中,作者們就指出,如果給 P_g 和 P_r 都加入非常小的噪音,那麼它們從完全不重合到重合,從而其 JS 散度也會變得有意義。雖然這篇論文[1] 到2016年底才被提出,但相似的技巧早在之前的工作中就被人運用過。比如在 G 和 D 的神經網路中間層中加入噪音[4],或者直接在圖片輸入加入噪音[6] 等等。
解決方法二:Encoders-Constrained
但是上述工作其實並沒有完全解決 mode missing 的問題。這是為什麼呢?在最近介紹過的 DiscoGAN[22] 中,有針對 mode missing 的更深入的分析。關於DiscoGAN 的詳細介紹點我傳送。
在上圖中,(a) 代表理想狀態下學習到的生成規則,(b) 是普通 GAN 會學習到的規則,(c) 是隻加了一個 encoder,只做一次 reconstruction constraint 時候的 GAN 的情況。可以粗略地將剛才提到的 RegGAN[3] EBGAN[4] 和 BEGAN[5] 都歸為情況 (c)。可以看到,雖然情況 (c) 會比 (b) 好一些,但並不能完全避免 mode missing 的問題,而是在兩種 mode 之間“震盪”。
對此,近期有三篇想法相似的工作可以從理論上完全避免 mode missing 的問題。這三篇工作就是前陣子專門為大家推薦過的 CycleGAN [9], DiscoGAN [10]和 DualGAN[11],點我傳送。
CycleGAN[9] 就是開篇的“莫奈從春天醒來”、“馬變斑馬”、“四季更迭”背後的模型。它的論文開頭非常優美和引人入勝,先是放出了這些 impressive 的 result;同時用一種帶逛博物館的語氣寫了 Introduction:“當莫奈在一個和煦的春天的早上,站在河畔畫下這幅畫時,他眼前究竟是怎樣的景象呢?如果莫奈站在一個清爽的夏天的早上,又會看到怎樣的景象,畫出怎樣的作品呢?” 作者的寫作功底可見一斑。
作者用這樣的開頭,引出了一個 motivation:我們雖然沒有辦法真的穿越時空,站在莫奈身邊看到他當時看到的景象,但是我們卻可以通過他的畫作,想象當時的場景;同時也可以根據他的作品(和他的畫風),想象他畫出的其他場景會是怎樣的。也就是說,我們沒有 paired data 卻可以實現這種 “翻譯” 或者說對映。那麼我們是否也可以讓機器做到這件事呢?
我們人類之所以可以做到這件事,作者假設,在兩個領域(X,Y)之間,是存在一種底層的關係的,或者說隱含的關聯——這種隱含的關聯可能是,對於同一個事物,有兩種不同的對映後的表達,那麼這兩種表達之間就是針對這同一個事物的一種關聯。如果我們僅用一個對映把 G: X->Y 進行單向對映,那麼我們無法保證這個 G 是單一的。或者說,我們無法保證 X 中的所有樣本 x 和 Y 領域中的所有樣本 y 是合理對應的。這也就(可能)導致 mode collpase 的問題。對於這個問題的描述,在 CycleGAN 中,作者用了 meaningful 這個詞;而在 DiscoGAN 中,作者強調了我們希望的是 one-to-one mapping, rather than many-to-one mapping。
通過這樣的分析,很容易看出,一種自然的解決方案就是,我們不僅要求一個單向對映,而更要求一種雙向對映。在CycleGAN 中,這個問題被形式化為:我們有 G: X->Y, F: Y->X 兩個對映或者說翻譯器,我們希望 F(G(x)) ≈ x, G(F(y)) ≈ y. 在 DiscoGAN 中,作者直接把這個對映用 GAN 中的 generator 代表,所以為了實現這樣的雙向對映,DiscoGAN 中指出我們需要兩個 G,並且讓儘量 G1(G2(x)) = x,反之同理。DualGAN 的形式化與 DiscoGAN 相似。不過,三篇論文分別用了三種不同的術語來實現這樣的約束或者說目標。CycleGAN 中,作者用了 vision 中被應用多次的cycle consistency loss,CycleGAN 也因此得名;DiscoGAN 則是因為直接強調了一一對映,所以用了bijective map來闡述;DualGAN 因為是從去年 NIPS 2016 Dual Learning for MT 的 paper 受到啟發的,所以是從closed loop角度來寫的。因為 CycleGAN 的模型示意圖比較簡潔,所以這裡以它為示例:
上圖中紅色箭頭指向的就是兩個方向對應的各自的 cycle-consistency loss。在這篇工作中,它們還實現了一種基於畫家風格的風格轉換。這種風格轉換不再是基於某一幅圖畫的風格,所以可以理解為批量風格轉換。比如梵高的《星夜》和其《向日葵》的風格就很不相似:
那麼CycleGAN[9] 和 DiscoGAN[10] 等用雙向對映(也就是兩個編碼器)的思想,對於 mode missing problem 到底解決得如何呢?來看看下圖的實驗結果:
上圖中的 BiGAN[13] 和 CoGAN 雖然也是雙向對映,但是對映空間是在隱空間。從實驗結果來看,這樣的不同使得其效果大打折扣:
DiscoGAN[10] 則在這個問題的視覺化分析上做得更好:
上圖中 (a) 是原始資料分佈,(b) 是普通 GAN,(c) 是加了單向對映的 GAN,(d) 是 DiscoGAN。(c) (d) 都區分出了一定程度的 mode,但 (c) 還是 miss 掉了一些(右上角綠色背景的)。而 (d) 則完美地區分了10個 mode,並且從背景色來看(背景色代表判別器 D 的輸出),判別器對於同一種 mode 的輸出非常一致,幾乎沒有漸變色,這也說明了 DiscoGAN 的訓練優勢。綜上,這些基於編碼器的工作都可以認為幾乎解決了 GAN 訓練難點三:替代目標函式不合理,一定程度解決了 JS 散度在兩個分佈幾乎不重疊時候的問題。
解決方法三:Wasserstein Distance
其實從根本上講,GAN 目標函式的問題都是 KL 散度和 JS 散度衡量兩個分佈時候的不足造成的。那麼有沒有辦法直接用其他分佈度量來為 GAN 這種對抗遊戲提供優化目標呢?為此就有了論文[1] 的眼神,Wasserstein GAN[7],目前已被 ICML 2017 錄用。
Wasserstein GAN,簡稱 WGAN 基於的是 Wasserstein Distance,也叫 Earth-Mover Distance,推土機距離。
這個距離可以形象的理解為,將一個分佈變成另一個分佈所需要的消耗。如果用一個直觀的理解就是,把一個沙堆推到另一個地方,形成另一堆可能長得不一樣的沙堆所需要的“距離”。而這種“轉變”並不是唯一的,所以很可能有些“路徑”消耗大,有些消耗小。用比較嚴謹的說法,Wasserstein 距離表示的是“最有規劃路徑”下的最短距離。
這個距離有很多優良的性質,其中最最最重要的一條就是它可以在兩個分佈毫無重疊的情況下依然給出有效的度量。也就是說,用它作為優化目標則不需要擔心梯度無意義或者梯度消失的問題。但是 Wasserstein Distance 中的“求下界”的操作無法準確高效計算,所以作者用了 Kantorovich-Rubinstein 對偶將其變換了一下,就得到了 WGAN 的目標函式:
但是這樣的變換要求符合一個先決條件,也就是判別器 D 擬合的函式需要是 1-Lipschitz 連續函式。Lipschitz 連續實際上是要求一個連續函式的導函式的絕對值不大於某個常數,也就是說,它限制了一個連續函式的最大區域性變動幅度。這個對於由神經網路來擬合的函式來講,導數可以粗暴理解為神經網路的權重。所以在 WGAN[7] 中他們採取了 weight clipping,梯度剪裁的方式,將“導數”限制在 [-c,c] 範圍內。也就是每次更新 D 的引數後,超過這個範圍的都拉回來。
從上圖可以看到,WGAN 的 D 的導數很平滑(也就是所謂的 WGAN Critic,淺藍色線),而原始的 GAN 的梯度消失很嚴重(紅色線)。也就是說,有了基於 Wasserstein distance 的 WGAN,原始 GAN 中的難點二,梯度消失問題就解決了。
同時,他們還發現基於由於現在的 WGAN 中的 D 不再是做二分類任務,而是做一個“回顧”任務去擬合 Wasserstein distance,這個 distance 從實驗上發現,與生成的圖片質量呈負相關:
梯度裁剪的問題以及改進
雖然WGAN 在實驗中展現了自己比原始 GAN 穩定的一面,但它依然遺留了一個問題。也就是通過 weight clipping,梯度裁剪這種方法選擇的那個超參 c 對於實驗結果的影響有多大?其實這個問題在原始 WGAN[7] 的論文中作者就有討論。當 c 太大時,會出現梯度爆炸問題;過小也會導致梯度消失問題。
基於此,就有了 Improved WGAN[14] 這篇工作。他們首先分析了,到底基於梯度裁剪方式,會導致什麼樣的問題。首先在 Section 2.3 中他們證明,用這樣的方式實際上也存在一個最優的判別器 D,當達到這個最優判別器時,D 的所有權重都會傾向於等於c,如下:
而這樣的一個缺點就是,會導致學出來的網路過於簡單,對於複雜函式的擬合能力或者說對於分佈的建模能力會明顯下降。比如下面的模擬實驗中,就可以看到基於梯度裁剪的方法擬合分佈,會忽略掉高階動量。
為此,[14] 提出了一種新的方式去滿足 WGAN 目標函式的額外要求,也就是 Lipschitz 連續性。他們指出既然最優的判別器的權重會傾向於一個常數,不如就把這個常數當成“目標”,把當前的權重與這個常數的距離,當成一種懲罰項或者正則項,加入WGAN 的目標函式中:
也因此,這個方法被叫做 gradient penalty,這樣的 WGAN 就叫 WGAN-GP [14]。WGAN-GP 比原始 WGAN 的收斂速度更快,訓練也更穩定,得到的生成結果的質量也更好。
結語及資源
本文主要總結了 GAN 發展過程中的一些重要模型。這些模型的出現有些甚至甚至早於理論上的發展,但是當理論發展到一定程度,回過頭再去看這些模型就會有一些新的理解。如果大家對 GAN 很感興趣,也想自己上手試試,優先推薦以下的一些模型和技巧:
最後再次附上這份文字版乾貨對應的完整 slides 和回顧視訊。只要公眾號後臺回覆“原理篇”就可以獲取126頁完整 PDF 和分享視訊啦!
參考文獻
[1] Arjovsky and Bottou, “Towards Principled Methods for Training Generative Adversarial Networks”. ICLR 2017.[2] Goodfellow et al., “Generative Adversarial Networks”. ICLR 2014.[3] Che et al., “Mode Regularized Generative Adversarial Networks”. ICLR 2017.[4] Zhao et al., “Energy-based Generative Adversarial Networks”. ICLR 2017.[5] Berthelot et al., “BEGAN: Boundary Equilibrium Generative Adversarial Networks”. arXiv preprint 2017.[6] Snderby, et al., “Amortised MAP Inference for Image Super-Resolution”. ICLR 2017.[7] Arjovsky et al., “Wasserstein GANs”. ICML 2017.[8] Villani, Cedric. “Optimal transport: old and new”, volume 338. Springer Science & Business Media, 2008.[9] Jun-Yan Zhu*, Taesung Park*, Phillip Isola, Alexei A. Efros. “Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”. arXiv preprint 2017.[10] Taeksoo Kim, Moonsu Cha, Hyunsoo Kim, Jung Kwon Lee, Jiwon Kim. “Learning to Discover Cross-Domain Relations with Generative Adversarial Networks”. ICML 2017.[11] Zili Yi, Hao Zhang, Ping Tan, Minglun Gong. “DualGAN: Unsupervised Dual Learning for Image-to-Image Translation”. arXiv preprint 2017.[12] Jeff Donahue, Philipp Krhenbühl, Trevor Darrell. “Adversarial Feature Learning”. ICLR 2017.[13] Vincent Dumoulin, Ishmael Belghazi, Ben Poole, Olivier Mastropietro, Alex Lamb, Martin Arjovsky, Aaron Courville. “Adversarially Learned Inference”. ICLR 2017.[14] Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin, Aaron Courville. “Improved Training of Wasserstein GANs”. arXiv preprint 2017.[15] Mehdi Mirza, Simon Osindero. “Conditional Generative Adversarial Nets”. arXiv preprint 2014.[16] Emily Denton, Soumith Chintala, Arthur Szlam, Rob Fergus. “Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks”. arXiv preprint 2015.[17] Alec Radford, Luke Metz, Soumith Chintala. “Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks”. ICLR 2016.[18] Scott Reed, Zeynep Akata, Xinchen Yan, Lajanugen Logeswaran, Bernt Schiele, Honglak Lee. “Generative Adversarial Text to Image Synthesis”. ICML 2016.[19] Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, Xi Chen. “Improved Techniques for Training GANs”. arXiv preprint 2016.[20] Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaolei Huang, Xiaogang Wang, Dimitris Metaxas. “StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks”. arXiv preprint 2016.[21] Phillip Isola, Jun-Yan Zhu, Tinghui Zhou, Alexei A. Efros. “Image-to-Image Translation with Conditional Adversarial Networks”. CVPR 2017.[22] Yaniv Taigman, Adam Polyak, Lior Wolf. “Unsupervised Cross-Domain Image Generation”. ICLR 2017.[23] Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, Yoshua Bengio. “Generative Adversarial Nets”. NIPS 2014.[24] Jun-Yan Zhu, Philipp Krhenbühl, Eli Shechtman and Alexei A. Efros. “Generative Visual Manipulation on the Natural Image Manifold”, ECCV 2016.[25] Huikai Wu, Shuai Zheng, Junge Zhang, Kaiqi Huang. “GP-GAN: Towards Realistic High-Resolution Image Blending”. arXiv preprint 2017.[26] Anh Nguyen, Jeff Clune, Yoshua Bengio, Alexey Dosovitskiy, Jason Yosinski. “Plug & Play Generative Networks: Conditional Iterative Generation of Images in Latent Space”. CVPR 2017.
推薦課程
GAN的原理與應用專題
http://campus.swarma.org/gpac=8?src=2
轉載宣告:本文轉載自「程式媛的日常」,搜尋「girlswhocode」即可關注。
集智QQ群|292641157
商務合作|[email protected]
投稿轉載|[email protected]
相關推薦
深入淺出 GAN·原理篇文字版(完整)| 乾貨
常見GAN 最後,作為 GAN 專題的結尾,我們列舉一下目前常見的 GAN 模型(可以根據 arxiv id 去尋找、下載文獻),歡迎補充。 GAN - Ian Goodfellow, arXiv:1406.2661v1 DCGAN - Alec Radford & Luke Metz, arxiv
深入淺出 GAN·原理篇文字版(完整)
導語 這次的內容主要是想梳理 GAN 從 NIPS 2014 被提出,到 2017年5月,都有哪些重要的從原理和方法上的重要研究。一共覆蓋了25篇重要論文(論文列表見本文最下方)。 引言:GAN的驚豔應用 首先來看看 GAN 現在能做到哪些驚豔的事呢? GAN 可以被用來學習生成各種各樣的字
Maven的安裝文字版(Windows/Linux/Mac)(轉)
版本 驗證 系統路徑 strong jdk1 編譯 found 編譯器 opts 以下內容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_environment_setup.html
深入淺出數據結構C語言版(9)——多重表(廣義表)
不同 滿足 大學 logs 維數 我會 明顯 http 多維 在深入淺出數據結構系列前面的文章中,我們一直在討論的表其實是“線性表”,其形式如下: 由a1,a2,a3,……a(n-1)個元素組成的序列,其中每一個元素ai(0<i<n)都是一個“原子”,“
深入淺出數據結構C語言版(12)——從二分查找到二叉樹
額外 最終 匹配 應對 點數據 隨機數 普通 釋放 三種 在很多有關數據結構和算法的書籍或文章中,作者往往是介紹完了什麽是樹後就直入主題的談什麽是二叉樹balabala的。但我今天決定不按這個套路來。我個人覺得,一個東西或者說一種技術存在總該有一定的道理,不是能解決某個
深入淺出數據結構C語言版(14)——散列表
type unsigned size 表示 發現 blog 情況 減少 orb 我們知道,由於二叉樹的特性(完美情況下每次比較可以排除一半數據),對其進行查找算是比較快的了,時間復雜度為O(logN)。但是,是否存在支持時間復雜度為常數級別的查找的數據結構呢?答案是存在
深入淺出數據結構C語言版(15)——優先隊列(堆)
turn github png 操作 pri 整數 過程 不難 nbsp 在普通隊列中,元素出隊的順序是由元素入隊時間決定的,也就是誰先入隊,誰先出隊。但是有時候我們希望有這樣的一個隊列:誰先入隊不重要,重要的是誰的“優先級高”,優先級越高越先出隊。這樣的數據結構我們稱
深入淺出數據結構C語言版(19)——堆排序
-- 解決辦法 訪問 nsf 可能 bre 操作 數據塊 src 在介紹優先隊列的博文中,我們提到了數據結構二叉堆,並且說明了二叉堆的一個特殊用途——排序,同時給出了其時間復雜度O(N*logN)。這個時間界是目前我們看到最好的(使用Sedgewick序列的希爾排序時間
深入淺出數據結構C語言版(22)——排序決策樹與桶式排序
不改變 自然 只需要 都是 變種 限定 style buck oid 在(17)中我們對排序算法進行了簡單的分析,並得出了兩個結論: 1.只進行相鄰元素交換的排序算法時間復雜度為O(N2) 2.要想時間復雜度低於O(N2),算法必須進行遠距離的元素交換
FPGA定點小數計算(Verilog版)第三篇——除法運算(一)
更多精彩內容,請微信搜尋“FPGAer俱樂部”關注我們。 定點小數除法運算,相比加法和乘法來說要複雜很多了,但是演算法的基本思想還是很簡單的。和整數除法類似,演算法的核心思想就是,將除法運算轉換為移位和減法運算。從具體實現的角度來看,一般有兩種方式: 一種是除數不變,擴充
GAN網路從入門教程(二)之GAN原理
在一篇部落格[GAN網路從入門教程(一)之GAN網路介紹](https://www.cnblogs.com/xiaohuiduan/p/13237486.html)中,簡單的對GAN網路進行了一些介紹,介紹了其是什麼,然後大概的流程是什麼。 在這篇部落格中,主要是介紹其數學公式,以及其演算法流程。當然數學公
GAN網路之入門教程(三)之DCGAN原理
[TOC] 如果說最經常被用來處理影象的網路模型,那麼毋庸置疑,應該是CNN了,而本次入土教程的最終目的是做一個動漫頭像生成的網路模型,因此我們可以將CNN與GAN結合,也就是組成了傳說中的DCGAN網路。 ## DCGAN簡介 DCGAN全稱[Deep Convolutional Generative
功能第五篇——批量處理(JDBC)
需要 res col dsta 添加 name call table creat 綜述 批量處理一般指批量插入,批量更新,刪除通過可
安全技能樹簡版(轉)
lap tin kmp ioc document scp jsf rc4 bug Expand - Collapse 安全技能樹簡版 說明 V1 By @余弦 201706 聯系我:[email protected]/* */ 更新動態關註
深入淺出之正則表達式(二)
規則 方法 else 解決辦法。 test 開啟 spa 多次 前言 前言: 本文是前一片文章《深入淺出之正則表達式(一)》的續篇,在本文中講述了正則表達式中的組與向後引用,先前向後查看,條件測試,單詞邊界,選擇符等表達式及例子,並分析了正則引擎在執行匹配時的內
基礎篇之集合(一)(List)總結
intern ansi [] 集合 add 引用 public log ++ 1. List集合下常用的集合(ArrayList,LinkedList,Vector); JVM垃圾回收GC,Java中采取了可達性分析法,標記所有從根節點開始的可達對象,未被標記的對象就
基礎篇之集合(二)總結
線程不安全 emp abstract 和集 write next 不可變 叠代器 關系 1. Map集合和collection結合的區別 1》Collection一次存一個元素;Map一次存一對元素; 2》Collection是單列集合;Map是雙列集合; 3》Map中的存
意外篇2017-10(mySQL)
自己 電腦 重新啟動 幫助 ges log 關閉 http 分享 註:意外篇是寫我自己在平常寫代碼遇到錯誤,借此分享各位,當碰到這樣錯誤,又無法解決,給各位幫助 1.這是我最近碰到的錯誤,如果你出現以下錯誤,有兩個解決方法。 <1>
PL/SQL輕量版(三)——遊標與異常處理
多個 次循環 指向 count dbms 都是 不能 weight acl 一、遊標 1.概念 遊標是一個 指向上下文的句柄( handle) 或指針。通過遊標,PL/SQL 可以控制上下文區和處理語句時上下文區會發生些什麽事情。 2.遊標處理
PL/SQL輕量版(四)——存儲函數/存儲過程
調用 輸出 dbm 表示 不返回 逗號 oracle oracl col 概述 ORACLE 提供可以把 PL/SQL 程序存儲在數據庫中,並可以在任何地方來運行它。這樣就叫存儲過程或函數。過程和函數統稱為 PL/SQL 子程序,他們是被命名的 PL/SQL 塊,均存