NVIDIA新作解讀:用GAN生成前所未有的高清圖像(附PyTorch復現) | PaperDaily #15

2021-03-02 PaperWeekly

今天要介紹的文章是 NVIDIA 投稿 ICLR 2018 的一篇文章,Progressive Growing of GANs for Improved Quality, Stability, and Variation[1],姑且稱它為 PG-GAN。

從行文可以看出文章是臨時趕出來的,畢竟這麼大的實驗,用 P100 都要跑 20 天,更不用說調參時間了,不過人家在 NVIDIA,不缺卡。作者放出了基於 Lasagna 的代碼,今天我也會簡單解讀一下代碼。另外,我也在用 PyTorch 做復現。 

在 PG-GAN 出來以前,訓練高解析度圖像生成的 GAN 方法主要就是 LAPGAN[2] 和 BEGAN[6]。後者主要是針對人臉的,生成的人臉逼真而不會是鬼臉。

這裡也提一下,生成鬼臉的原因是 Discriminator 不再更新,它不能再給予 Generator 其他指導,Generator 找到了一種騙過 Discriminator 的方法,也就是生成鬼臉,而且很大可能會 mode collapse。

下圖是我用 PyTorch 做的 BEGAN 復現,當時沒有跑很高的解析度,但是效果確實比其他 GAN 好基本沒有鬼臉。

PG-GAN 能夠穩定地訓練生成高解析度的 GAN。我們來看一下 PG-GAN 跟別的 GAN 不同在哪裡。

1. 訓練方式 

作者採用 progressive growing 的訓練方式,先訓一個小解析度的圖像生成,訓好了之後再逐步過渡到更高解析度的圖像。然後穩定訓練當前解析度,再逐步過渡到下一個更高的解析度。

如上圖所示。更具體點來說,當處於 fade in(或者說 progressive growing)階段的時候,上一解析度(4x4)會通過 resize+conv 操作得到跟下一解析度(8x8)同樣大小的輸出,然後兩部分做加權,再通過 to_rgb 操作得到最終的輸出。

這樣做的一個好處是它可以充分利用上個解析度訓練的結果,通過緩慢的過渡(w 逐漸增大),使得訓練生成下一解析度的網絡更加穩定。 

上面展示的是 Generator 的 growing 階段。下圖是 Discriminator 的 growing,它跟 Generator 的類似,差別在於一個是上採樣,一個是下採樣。這裡就不再贅述。

不難想像,網絡在 growing 的時候,如果不引入 progressive (fade in),那麼有可能因為比較差的初始化,導致原來訓練的進度功虧一簣,模型不得不從新開始學習,如此一來就沒有充分利用以前學習的成果,甚至還可能誤導。我們知道 GAN的訓練不穩定,這樣的突變有時候是致命的。所以 fade in 對訓練的穩定性來說至關重要。 

說到 growing 的訓練方式,我們很容易想到 autoencoder 也有一種類似的訓練方式:先訓各一層的 encoder 和 decoder,訓好了以後再過渡到訓練各兩層的 encoder 和 decoder,這樣的好處是避免梯度消失,導致離 loss 太遠的層更新不夠充分。PG-GAN 的做法可以說是這種 autoencoder 訓練方式在 GAN 訓練上的應用。 

此外,訓練 GAN 生成高解析度圖像,還有一種方法,叫 LAPGAN[2]。LAPGAN 藉助 CGAN,高解析度圖像的生成是以低解析度圖像作為條件去生成殘差,然後低解析度圖上採樣跟殘差求和得到高解析度圖,通過不斷堆疊 CGAN 得到我們想要的解析度。

LAPGAN 是多個 CGAN 堆疊一起訓練,當然可以拆分成分階段訓練,但是它們本質上是不同的,LAPGAN 學的是殘差,而 PG-GAN 存在 stabilize 訓練階段,學的不是殘差,而直接是圖像。 

作者在代碼中設計了一個 LODSelectLayer 來實現 progressive growing。對於 Generator,每一層插入一個 LODSelectLayer,它實際上就是一個輸出分支,實現在特定層的輸出。

從代碼來看,作者應該是這樣訓練的(參見這裡的 train_gan 函數),先構建 4x4 解析度的網絡,訓練,然後把網絡存出去。再構建 8x8 解析度的網絡,導入原來 4x4 的參數,然後訓 fade in,再訓 stabilize,再存出去。我在復現的時候,根據文章的意思,修改了 LODSelectLayer 層,因為 PyTorch 是動態圖,能夠很方便地寫 if-else 邏輯語句。 

藉助這種 growing 的方式,PG-GAN 的效果超級好。另外,我認為這種 progressive growing 的方法比較適合 GAN 的訓練,GAN 訓練不穩定可以通過 growing 的方式可以緩解。

不只是在噪聲生成圖像的任務中可以這麼做,在其他用到 GAN 的任務中都可以引入這種訓練方式。我打算將 progressive growing 引入到 CycleGAN 中,希望能夠得到更好的結果。

2. 增加生成多樣性 

增加生成樣本的多樣性有兩種可行的方法:通過 loss 讓網絡自己調整、通過設計判別多樣性的特徵人為引導。 

WGAN 屬於前者,它採用更好的分布距離的估計(Wasserstein distance)。模型收斂意味著生成的分布和真實分布一致,能夠有多樣性的保證。PG-GAN 則屬於後者。 

作者沿用 improved GAN 的思路,通過人為地給 Discriminator 構造判別多樣性的特徵來引導 Generator 生成更多樣的樣本。Discriminator 能探測到 mode collapse 是否產生了,一旦產生,Generator 的 loss 就會增大,通過優化 Generator 就會往遠離 mode collapse 的方向走,而不是一頭栽進坑裡。 

Improved GAN 引入了 minibatch discrimination 層,構造一個 minibatch 內的多樣性衡量指標。它引入了新的參數。

而 PG-GAN 不引入新的參數,利用特徵的標準差作為衡量標準。

這裡囉嗦地說明上面那張圖做了什麼。我們有 N 個樣本的 feature maps(為了畫圖方便,不妨假設每個樣本只有一個 feature map),我們對每個空間位置求標準差,用 numpy 的 std 函數來說就是沿著樣本的維度求 std。這樣就得到一張新的 feature map(如果樣本的 feature map 不止一個,那麼這樣構造得到的 feature map 數量應該是一致的),接著 feature map 求平均得到一個數。

這個過程簡單來說就是求 mean std,作者把這個數複製成一張 feature map 的大小,跟原來的 feature map 拼在一起送給 Discriminator。 

從作者放出來的代碼來看,這對應 averaging=「all」的情況。作者還嘗試了其他的統計量:「spatial」,「gpool」,「flat」等。它們的主要差別在於沿著哪些維度求標準差。至於它們的作用,等我的代碼復現完成了會做一個測試。估計作者調參發現「all」的效果最好。

3. Normalization 

從 DCGAN[3]開始,GAN 的網絡使用 batch (or instance) normalization 幾乎成為慣例。使用 batch norm 可以增加訓練的穩定性,大大減少了中途崩掉的情況。作者採用了兩種新的 normalization 方法,不引入新的參數(不引入新的參數似乎是 PG-GAN 各種 tricks 的一個賣點)。 

第一種 normalization 方法叫 pixel norm,它是 local response normalization 的變種。Pixel norm 沿著 channel 維度做歸一化,這樣歸一化的一個好處在於,feature map 的每個位置都具有單位長度。這個歸一化策略與作者設計的 Generator 輸出有較大關係,注意到 Generator 的輸出層並沒有 Tanh 或者 Sigmoid 激活函數,後面我們針對這個問題進行探討。

第二種 normalization 方法跟凱明大神的初始化方法[4]掛鈎。He 的初始化方法能夠確保網絡初始化的時候,隨機初始化的參數不會大幅度地改變輸入信號的強度。

根據這個式子,我們可以推導出網絡每一層的參數應該怎樣初始化。可以參考 PyTorch 提供的接口。 

作者走得比這個要遠一點,他不只是初始化的時候對參數做了調整,而是動態調整。初始化採用標準高斯分布,但是每次迭代都會對 weights 按照上面的式子做歸一化。作者 argue 這樣的歸一化的好處在於它不用再擔心參數的 scale 問題,起到均衡學習率的作用(euqalized learning rate)。

4. 有針對性地給樣本加噪聲

通過給真實樣本加噪聲能夠起到均衡 Generator 和 Discriminator 的作用,起到緩解 mode collapse 的作用,這一點在 WGAN 的前傳中就已經提到[5]。儘管使用 LSGAN 會比原始的 GAN 更容易訓練,然而它在 Discriminator 的輸出接近 1 的適合,梯度就消失,不能給 Generator 起到引導作用。

針對 D 趨近 1 的這種特性,作者提出了下面這種添加噪聲的方式:

其中,分別為第 t 次迭代判別器輸出的修正值、第 t-1 次迭代真樣本的判別器輸出。 

從式子可以看出,當真樣本的判別器輸出越接近 1 的時候,噪聲強度就越大,而輸出太小(<=0.5)的時候,不引入噪聲,這是因為 0.5 是 LSGAN 收斂時,D 的合理輸出(無法判斷真假樣本),而小於 0.5 意味著 D 的能力太弱。 

文章還有其他很多 tricks,有些 tricks 不是作者提出的,如 Layer norm,還有一些比較細微的 tricks,比如每個解析度訓練好做 sample 的時候學習率怎麼 decay,每個解析度的訓練迭代多少次等等,我們就不再詳細展開。具體可以參見官方代碼,也可以看我復現的代碼。 

目前復現的結果還在跑,現在訓練到了 16x16 解析度的 fade in 階段,放一張當前的結果圖,4 個方格的每個方格左邊 4 列是生成的圖,右邊 4 列是真實樣本。現在還處於訓練早期,解析度太低,過幾天看一下高解析度的結果。

5. 相關代碼

官方 Lasagna 代碼:

https://github.com/tkarras/progressive_growing_of_gans

作者 PyTorch 復現:

https://github.com/github-pengge/PyTorch-progressive_growing_of_gans

6. 參考文獻

[1]. Karras T, Aila T, Laine S, et al. Progressive Growing of GANs for Improved Quality, Stability, and Variation[J]. arXiv preprint arXiv:1710.10196, 2017. 

[2]. Denton E L, Chintala S, Fergus R. Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks[C]//Advances in neural information processing systems. 2015: 1486-1494. 

[3]. Radford A, Metz L, Chintala S. Unsupervised representation learning with deep convolutional generative adversarial networks[J]. arXiv preprint arXiv:1511.06434, 2015. 

[4]. He K, Zhang X, Ren S, et al. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1026-1034. 

[5]. Arjovsky M, Bottou L. Towards principled methods for training generative adversarial networks[J]. arXiv preprint arXiv:1701.04862, 2017. 

[6]. Berthelot D, Schumm T, Metz L. Began: Boundary equilibrium generative adversarial networks[J]. arXiv preprint arXiv:1703.10717, 2017.

本文由 AI 學術社區 PaperWeekly 精選推薦,社區目前已覆蓋自然語言處理、計算機視覺、人工智慧、機器學習、數據挖掘和信息檢索等研究方向,點擊「閱讀原文」即刻加入社區!

          

 我是彩蛋


 解鎖新姿勢:用微信刷論文!

PaperWeekly小程序上線啦

今日arXiv√猜你喜歡√熱門資源

隨時緊跟最新最熱論文

 

 解鎖方式 

1. 識別下方二維碼打開小程序

2. 用PaperWeekly社區帳號進行登陸

3. 登陸後即可解鎖所有功能

 

長按識別二維碼,使用小程序

*點擊閱讀原文即可註冊

相關焦點

  • 能生成Deepfake也能診斷癌症,GAN與惡的距離
    也就是說,這些圖像完全是用GPU計算層層疊加,並且通過燒錢生成的。能夠做出這些東西的算法就是對抗生成網絡,對於那些剛開始學習機器學習的人而言,編寫GAN是一個漫長的旅途。在過去的幾年中,基於對抗生成網絡應用的創新越來越多,甚至比Facebook上發生的隱私醜聞還多。
  • 【專知薈萃11】GAN生成式對抗網絡知識資料全集(理論/報告/教程/綜述/代碼等)
    最新NIPS2016也有最新的關於訓練GAN模型的總結參考連結:[https://github.com/soumith/ganhacks]The GAN Zoo千奇百怪的生成對抗網絡,都在這裡了。/soumith/ganhacks]OpenAI生成模型參考連結:[https://blog.openai.com/generative-models/]用Keras實現MNIST生成對抗模型參考連結:[https://oshearesearch.com/index.PHP/2016/07/01/mnist-generative-adversarial-model-in-keras
  • 用GAN來做圖像生成,這是最好的方法
    前言在我們之前的文章中,我們學習了如何構造一個簡單的 GAN 來生成 MNIST 手寫圖片。對於圖像問題,卷積神經網絡相比於簡單地全連接的神經網絡更具優勢,因此,我們這一節我們將繼續深入 GAN,通過融合卷積神經網絡來對我們的 GAN 進行改進,實現一個深度卷積 GAN。
  • 涵蓋18+ SOTA GAN實現,這個圖像生成領域的PyTorch庫火了
    我們可以將 GAN 分為兩類,一類是無條件下的生成;另一類是基於條件信息的生成。近日,來自韓國浦項科技大學的碩士生在 GitHub 上開源了一個項目,提供了條件 / 無條件圖像生成的代表性生成對抗網絡(GAN)的實現。
  • 不僅僅是生成二次元萌妹子,來看 GAN 模型還有哪些有趣應用吧!
    它的全稱是 Generator adversarial networks,中文是生成對抗網絡,是一種生成式模型,由 good fellow 在 14 年提出,近四年來被 AI 研究者瘋狂研(guan)究(shui),更有大神建立一個 GAN zoo,收集了上百種不同的GAN:https://github.com/hindupuravinash/the-gan-zoo
  • GAN快速入門資料推薦:17種變體的Keras開原始碼,附相關論文
    這項「造假神技」的創作範圍,已經從最初的手寫數字和幾百像素小渣圖,拓展到了壁紙級高清照片、明星臉,甚至藝術畫作。心癢難耐想趕快入門?通過自己動手、探索模型代碼來學習,當然是墜吼的~如果用簡單易上手的Keras框架,那就更贊了。
  • 科普 | ​生成對抗網絡(GAN)的發展史
    它可以生成高質量的圖像,圖片增強,從文本生成圖像,將圖像從一個域轉換為另一個域,隨年齡增長改變臉部外觀等等。這個名單是遠遠不夠的。我們將在本文中介紹一些流行的GAN架構。第三,圍繞GAN不斷的研究是如此令人著迷,以至於它吸引了其他所有行業的注意力。我們將在本文後面部分討論重大技術突破。誕生生成對抗網絡(GAN)具有兩個網絡,生成器網絡和鑑別器網絡。
  • 今日Paper|TRANSFORMER結構;圖像到圖像翻譯;缺失標註目標檢測解決...
    from=leiphonecolumn_paperreview0221推薦原因這篇論文提出了一個新的圖像到圖像遷移方法,通過生成對抗網絡將可控因素(即自然語言描述)嵌入到圖像到圖像的遷移中,從而使文字描述可以確定合成圖像的視覺屬性。
  • 輕鬆構建 PyTorch 生成對抗網絡(GAN)
    生成對抗網絡(GAN)是一種生成式機器學習模型,它被廣泛應用於廣告、遊戲、娛樂、媒體、製藥等行業,可以用來創造虛構的人物、場景,模擬人臉老化,圖像風格變換,以及產生化學分子式等等。生成對抗網絡模型算法原理DCGAN模型的生成網絡包含10層,它使用跨步轉置卷積層來提高張量的解析度,輸入形狀為 (batchsize, 100) ,輸出形狀為 (batchsize, 64, 64, 3)。換句話說,生成網絡接受噪聲向量,然後經過不斷變換,直到生成最終的圖像。
  • 今日Paper | TRANSFORMER結構;圖像到圖像翻譯;缺失標註目標檢測...
    from=leiphonecolumn_paperreview0221推薦原因這篇論文提出了一個新的圖像到圖像遷移方法,通過生成對抗網絡將可控因素(即自然語言描述)嵌入到圖像到圖像的遷移中,從而使文字描述可以確定合成圖像的視覺屬性。
  • 看GAN如何一步步控制圖像生成風格?詳解StyleGAN進化過程
    那麼,GAN 能夠有條不紊地控制其生成圖像的風格嗎?原版 GAN 基於潛在因子(latent factor)z 生成圖像。通常,潛在因子 z 採樣自正態或均勻分布,它們決定了生成內容的類型和風格。基於此,我們需要解答以下兩個重要問題:為什麼 z 是均勻或正態分布?
  • GAN生成式對抗網絡及應用詳解
    這個想法最初是由 Ian Goodfellow 提出的,他曾就職於蒙特婁大學的 Google Brain 團隊,現就職於 OpenAI 團隊。什麼是GANGAN 的關鍵過程很容易理解,就好像製作贗品的過程一樣,贗品製作是仿造未被原創者授權藝術品的過程,原創者通常是更有名的藝術家。
  • GAN(生成對抗網絡)的最新應用狀況
    涉及的圖像修改包括:單圖像超解析度(single image super-resolution)、交互式圖像生成、圖像編輯、圖像到圖像的翻譯等。單圖像超解析度單圖像超解析度任務(SISR)就是給定單張低解析度圖像,生成它的高解析度圖像。傳統方法一般是插值,但是插值不可避免地會產生模糊。
  • 生成對抗網絡GANs學習路線
    這份完整的GANs資源合集為研究者提供了完美的生成對抗網絡學習路線。生成對抗網絡由一個生成網絡與一個判別網絡組成。生成網絡從潛在空間(latent space)中隨機採樣作為輸入,其輸出結果需要儘量模仿訓練集中的真實樣本。判別網絡的輸入則為真實樣本或生成網絡的輸出,其目的是將生成網絡的輸出從真實樣本中儘可能分辨出來。而生成網絡則要儘可能地欺騙判別網絡。兩個網絡相互對抗、不斷調整參數,最終目的是使判別網絡無法判斷生成網絡的輸出結果是否真實。
  • GAN(生成對抗網絡)萬字長文綜述
    點擊文末「閱讀原文」立刻申請入群~本文介紹了一篇最新的有關GAN綜述的paper,四十餘頁,介紹了GAN的各個方面,關注「極市平臺」,在公眾號後臺回復GAN,即可獲取本文PDF版文件下載。醫學圖像分割 [16] 提出了一種 segmentor-critic 結構用於分割醫學圖像。segmentor 類似於 GAN 中的生成器用於生成分割圖像,critic 則最大化生成的分割圖像和 ground truth 之間的距離。
  • 經典GAN實戰教程:理解並運行自己的GAN生成手寫數字
    、「這些生成的圖像是否足夠多樣化?」而且GAN的黑盒屬性使得我們並不清楚模型的哪些組件對學習過程和結果質量造成影響。上圖演示了在建築物上生成門而非在生成到樹上或在天空中的可能性可視化GAN的另一種有趣方式是可以進行潛在空間插值(記住,GAN通過從學習的潛在空間中採樣來生成新實例),這可能是查看生成的樣本之間過渡的平滑程度的有用方法
  • 一些fancy的GAN應用
    ,是一種生成式模型,由good fellow在14年提出,近四年來被AI研究者瘋狂研(guan)究(shui),更有大神建立一個GAN zoo,收集了上百種不同的GAN:https://github.com/hindupuravinash/the-gan-zoo 事實上隨著GAN理論的不斷完善,GAN逐漸展現出了自己非凡的魅力,在一些應用領域開始大放異彩,由此衍生了一些非常fancy
  • 訓練GAN,你應該知道的二三事
    GANs 最初由 Ian Goodfellow [1] 於 2014 年提出,目前已經在圖像、語音、文字等方面得到廣泛研究和應用,特別是在圖像生成方面,可謂是遍地開花,例如圖像風格遷移(style transfer)、圖像修復(image inpainting)、超解析度(super resolution)等。
  • 萬字綜述之生成對抗網絡(GAN)
    超分辨SRGAN 中使用 GAN 和感知損失生成細節豐富的圖像。感知損失重點關注中間特徵層的誤差,而不是輸出結果的逐像素誤差。避免了生成的高分辨圖像缺乏紋理細節信息問題。醫學圖像分割[16] 提出了一種 segmentor-critic 結構用於分割醫學圖像。segmentor 類似於 GAN 中的生成器用於生成分割圖像,critic 則最大化生成的分割圖像和 ground truth 之間的距離。
  • 經典論文復現 | ICML 2017大熱論文:Wasserstein GAN
    隨著人工智慧領域的發展,打破不可復現性將是必要的。為此,PaperWeekly 聯手百度 PaddlePaddle 共同發起了本次論文有獎復現,我們希望和來自學界、工業界的研究者一起接力,為 AI 行業帶來良性循環。