本文不涉及的內(nèi)容
首先乍丈,你不會在本文中發(fā)現(xiàn):
復(fù)雜的技術(shù)說明
代碼(盡管有為那些感興趣的人留的代碼鏈接)
詳盡的研究清單(點擊這里進行查看 鏈接:http://suo.im/2opXlF)
本文涉及的內(nèi)容
關(guān)于 GAN 的相關(guān)主題的總結(jié)
許多其他網(wǎng)站抹缕、帖子和文章的鏈接,幫助你確定專注點
目錄
1. 理解 GAN
2. GAN: 一場革命
1. DCGAN
2. 改進的 DCGAN
3. 條件性 GAN
4. InfoGAN
5. Wasserstein GAN
3. 結(jié)語
理解 GAN
如果你熟悉 GAN启搂,可以跳過本節(jié)。
如果你正在閱讀本文,很有可能已聽說 GAN 大有前途。這種夸張說法合理嗎儡陨?以下是 Facebook人工智能研究室主任楊立昆(Yann LeCun)對 GAN 的看法:
生成對抗網(wǎng)絡(luò)(GAN)是過去十年機器學(xué)習(xí)中最有趣的想法。
我個人認為量淌,GAN 有巨大的潛力骗村,但我們還有很多事情要搞明白。
那么呀枢,什么是
GAN胚股?接下來我將要對其做一個簡要描述。如果你不熟悉并想了解更多裙秋,有很多很棒的網(wǎng)站有很好的解釋琅拌。我個人推薦 Eric
Jang(鏈接:http://suo.im/4y0bxU)和 Brandon Amos(鏈接:http://suo.im/3Ur3DW)的博客。
GAN 最初由 Ian Goodfellow 提出摘刑,它有兩個網(wǎng)絡(luò):生成器和鑒別器进宝。兩個網(wǎng)絡(luò)在同一時間進行訓(xùn)練,并在極小極大(minimax)游戲中相互博弈泣侮。生成器通過創(chuàng)建逼真的圖像來愚弄鑒別器即彪,而鑒別器被訓(xùn)練從而不被生成器所愚弄紧唱。
訓(xùn)練概述
首先活尊,生成器生成圖像。它通過從簡單分布中(例如正態(tài)分布)采樣向量噪聲
Z漏益,然后將該矢量上采樣到圖像來生成圖像蛹锰。在第一次迭代中,這些圖像看起來很嘈雜绰疤。然后铜犬,鑒別器被給予真、假圖像,并學(xué)習(xí)區(qū)分它們癣猾。生成器稍后通過反向傳播步驟接收鑒別器的「反饋」敛劝,在產(chǎn)生圖像時變得更好。最后纷宇,我們希望假圖像的分布盡可能接近真實圖像的分布夸盟。或者像捶,簡單來說上陕,我們希望假圖像看起來盡可能貌似真實。
值得一提的是拓春,由于 GAN 中使用的極小極大(minimax)優(yōu)化释簿,訓(xùn)練有可能相當不穩(wěn)定。但是硼莽,有一些技巧可以用來使得訓(xùn)練更魯棒庶溶。
這就是使得生成的臉部圖像逐漸變得更加真實的一個例子:
前兩個階段 GAN 的輸出結(jié)果。使用的數(shù)據(jù)集是 CelebA沉删。
代碼
如果您對 GAN 的基本實現(xiàn)感興趣渐尿,這里是一些簡短代碼的鏈接:
Tensorflow(鏈接:http://suo.im/pLYbO)
Torch 和 Python(PyTorch):[代碼](鏈接:http://suo.im/1LcbX5)[博客文章](鏈接:http://suo.im/2V9ICE)
Torch 和 Lua
這些不是較先進的,但它們很好地抓住了核心思想矾瑰。如果你正在尋找較佳實現(xiàn)來做自己的東西砖茸,請看下一節(jié)。
GAN: 一場革命
在這里殴穴,我將按照時間順序大體描述一下過去幾年出現(xiàn)的一些有關(guān) GAN 的進展和類型凉夯。
深度卷積 GAN(DCGAN)
TL; DR:DCGAN 是 GAN 架構(gòu)的第一大改進。它們在訓(xùn)練方面更穩(wěn)定采幌,并產(chǎn)生更高質(zhì)量的采樣劲够。
[文章](鏈接:https://arxiv.org/abs/1511.06434)
DCGAN 的作者著重于改進初始 GAN 的架構(gòu)。我認為他們花了很長時間來做深度學(xué)習(xí)里最令人興奮的事情:嘗試很多參數(shù)休傍!好極了征绎!最后,它完全有了回報磨取。除此之外人柿,他們發(fā)現(xiàn):
兩個網(wǎng)絡(luò)都必須進行批量歸一化。
采用完全隱藏的連接層不是一個好主意忙厌。
避免池化(pooling)凫岖,簡單地跨越你的卷積!
ReLU 激活是你的朋友(幾乎總是)逢净。
DCGAN
也是相關(guān)的哥放,因為它們已經(jīng)成為實現(xiàn)和使用 GAN 的主要基準之一歼指。在本文發(fā)表之后不久,Theano甥雕、Torch踩身、Tensorflow 和
Chainer 中有容易獲得的不同實現(xiàn)用于測試你所能想到的任何數(shù)據(jù)集。因此社露,如果你遇到奇怪的生成數(shù)據(jù)集惰赋,你完全可以責怪這些人。
在以下情況呵哨,你可能想要使用 DCGAN:
你想要比常規(guī) GAN 更好的東西(或者說赁濒,總是)。常規(guī) GAN 可以在簡單的數(shù)據(jù)集上工作孟害,但是 DCGAN 相比要好得多拒炎。
你正在尋找一個堅實的基準,以便與挨务、較先進的 GAN算法進行比較击你。
從這一點上,我將描述的所有類型的 GAN 都被假定為具有 DCGAN 架構(gòu)谎柄,除非明確說明丁侄。
改進的 DCGAN
TL; DR:一系列改進以前 DCGAN 的技術(shù)。比如朝巫,這個改進的基準允許生成更好的高分辨率圖像鸿摇。
[文章](鏈接:https://arxiv.org/abs/1606.03498)
與 GAN 有關(guān)的主要問題之一是它們的收斂性。它是不能保證的劈猿,而且即使優(yōu)化了 DCGAN 架構(gòu)拙吉,訓(xùn)練仍然相當不穩(wěn)定。在這篇文章中揪荣,作者提出了對 GAN 訓(xùn)練的不同增強方案筷黔。這里是其中的一些:
特征匹配:他們沒有使生成器盡可能地欺騙鑒別器,而是提出了一個新的目標函數(shù)仗颈。該目標要求生成器生成與實際數(shù)據(jù)的統(tǒng)計信息相匹配的數(shù)據(jù)佛舱。在這種情況下,鑒別器僅用于指出哪些是值得匹配的統(tǒng)計信息挨决。
歷史平均:更新參數(shù)時请祖,還要考慮其過去值。
單邊標簽平滑:這一點很簡單:只需將你的鑒別器目標輸出從 [0 = 假圖像凰棉,1 = 真圖像] 切換到 [0 = 假圖像损拢,0.9 =真圖像]陌粹。是的撒犀,這改善了訓(xùn)練。
虛擬批量歸一化:通過使用在一個參考批處理中收集的統(tǒng)計信息,避免同一批次的數(shù)據(jù)依賴性或舞。它在計算上的代價很大荆姆,所以僅用于生成器。
所有這些技術(shù)都可以使模型更好地生成高分辨率圖像映凳,這是 GAN 的弱點之一胆筒。作為對比,請參見原始 DCGAN 與改進的 DCGAN 在 128x128 圖像上的區(qū)別:
這些應(yīng)該是狗的圖像诈豌。如你所見仆救,DCGAN 無法表征它們,而使用改進的 DCGAN矫渔,你至少可以看到有一些像小狗一樣的東西彤蔽。這也暴露了 GAN 的另一個局限,即生成結(jié)構(gòu)化的內(nèi)容庙洼。
你也許想要使用改進的 DCGAN顿痪,如果:
你想要一個改進版本的 DCGAN(我確信你原本不指望:P)以生成更高分辨率的圖像。
條件性 GAN(CGAN)
TL; DR:這些是使用額外標簽信息的 GAN油够。這會帶來更好質(zhì)量的圖像蚁袭,并能夠在一定程度上控制生成圖像的外觀。
[來源文章](https://arxiv.org/abs/1411.1784)
條件性 GAN 是 GAN 框架的擴展石咬。這里我們有條件信息 Y 來描述數(shù)據(jù)的一些方面揩悄。例如,如果我們正在處理人臉鬼悠,則 Y 可以描述頭發(fā)顏色或性別等屬性虏束。然后,將該屬性信息插入生成器和鑒別器厦章。
具有面部屬性信息的條件性 GAN 概述镇匀。
條件性 GAN 有趣的原因有兩個:
1. 當你向模型輸入更多信息時,GAN 學(xué)習(xí)利用它袜啃,因此能夠生成更好的樣本汗侵。
2.
我們有 2 種方式來控制圖像表示。沒有條件性 GAN群发,所有的圖像信息都被編碼在 Z 中晰韵。有了 cGAN,當我們添加條件信息 Y 時熟妓,現(xiàn)在這兩個
Z 和 Y 將編碼不同的信息雪猪。例如,假設(shè) Y 編碼手寫數(shù)的數(shù)字(從 0 到 9)起愈。然后只恨,Z 將編碼所有不在 Y
中編碼的其它變量译仗。例如,可以是數(shù)字的樣式(大小官觅、重量纵菌、旋轉(zhuǎn)等)。
MNIST 樣本上 Z 和 Y 之間的差異休涤。Z 固定在行上咱圆,Y 在列上。Z 編碼數(shù)字的樣式功氨,Y 編碼數(shù)字本身序苏。
最近的研究
有很多關(guān)于這個主題的有趣文章。我重點說這其中的兩個:
學(xué)習(xí)畫什么和在哪里畫
[文章](鏈接:https://arxiv.org/abs/1610.02454)[代碼](鏈接:https://github.com/reedscot/nips2016):在這篇文章中捷凄,作者提出了一種機制來告訴
GAN(通過文本描述)杠览,(a)你想要得到的圖像內(nèi)容是什么樣,(b)通過邊界框/地標來告知元素的位置纵势□獍ⅲ看看它的生成結(jié)果:
StackGAN
[article](鏈接:https://arxiv.org/abs/1612.03242)[code](https://github.com/hanzhanggit/StackGAN):這篇文章與前一篇相似。在這種情況下钦铁,他們專注于通過同時使用
2 個 GAN 來提高圖像的質(zhì)量:Stage-I 和 Stage-II软舌。Stage-I 用于獲取包含圖像「一般」構(gòu)想的低分辨率圖像。Stage
II 采用更多的細節(jié)和更高的分辨率來優(yōu)化 Stage-I 的圖像牛曹。據(jù)我所知佛点,這篇在生成高質(zhì)量圖像里是較好的模型之一。請自己看:
你也許想要使用條件性 GAN黎比,如果:
你有一個已標記的訓(xùn)練集超营,并希望提高生成圖像的質(zhì)量。
你想要明確控制圖像的某些方面(例如阅虫,我想在這一特定位置生成這一尺寸的紅鳥)演闭。
InfoGANs
TL; DR:能夠以無監(jiān)督的方式在噪聲向量 Z 的一部分中編碼有意義的圖像特征的 GAN。例如颓帝,對一個數(shù)字的旋轉(zhuǎn)進行編碼米碰。
[文章](https://arxiv.org/abs/1606.03657)
你有沒有想過輸入噪聲 Z 在一個 GAN 中編碼的信息是什么?它通常以非彻撼牵「嘈雜」的方式編碼圖像不同類型的特征吕座。例如,你可以選擇 Z 向量的一個位置瘪板,并將其值從 -1 和 1 插值吴趴。這是你會在一個通過 MNIST 數(shù)字數(shù)據(jù)集訓(xùn)練的模型上看到的:
對 Z 插值。左上圖像的 Z 位置設(shè)置為 -1侮攀。然后锣枝,它被內(nèi)插到 1(右下圖像)厢拭。
在上圖中,生成的圖像看上去像是數(shù)字
4 慢慢變換成「Y」(最可能的是 4 和 9 之間的混合)惊橱。所以,這就是我所指的通過嘈雜的方式編碼這個信息:Z
的單一位置是圖像多個特征的參數(shù)箭昵。在這種情況下税朴,這個位置改變了數(shù)字本身(某種程度上從 4 到 9)和樣式(從粗體到斜體)。然后家制,你無法定義 Z
的該位置的任何確切含義正林。
如果我們可以有一些
Z 的位置來表示和受限的信息會怎么樣呢,就像 cGAN 中的條件信息 Y 一樣颤殴?例如觅廓,如果第一個位置是一個 0 到 9
之間的值,它來控制數(shù)字的數(shù)量涵但,而第二個位置控制其旋轉(zhuǎn)杈绸,這會怎樣呢?這正是作者在文章中提出的矮瘟。有意思的部分是瞳脓,與 cGAN
不同,他們以無監(jiān)督的方式實現(xiàn)了這一點澈侠,無需標簽信息劫侧。
將 Z 矢量分成兩部分——C 和 Z——是他們成功的原因:
C 對數(shù)據(jù)分布的語義特征進行編碼。
Z 編碼該分布的所有非結(jié)構(gòu)噪聲哨啃。
他們?nèi)绾螐娭?/p>
C 對這些特征進行編碼烧栋?他們改變了損失函數(shù)以防止 GAN 簡單地忽略 C。因此拳球,他們采用一個信息理論的規(guī)則审姓,來確保 C
與生成器分配之間的高互信息。換句話說祝峻,如果 C 改變邑跪,生成的圖像也需要改變。結(jié)果呼猪,你無法明確控制哪種類型的信息會被編碼進 C画畅,但 C
的每個位置都具有的含義∷尉啵看一些視覺示例:
C 的第一個位置編碼數(shù)字類別轴踱,而第二個位置編碼旋轉(zhuǎn)。
但是谚赎,不使用標簽信息需要付出代價淫僻。這里的限制是這些編碼僅適用于相當簡單的數(shù)據(jù)集诱篷,例如
MNIST 數(shù)字。此外雳灵,你仍然需要「手工制作」C 的每個位置棕所。例如在文章中,他們需要指定 C 的第一個位置是 0 到 9
之間的整數(shù)悯辙,因此它適用于數(shù)據(jù)集的 10 個數(shù)字類別琳省。所以,你可能會認為這不是 100% 無監(jiān)督躲撰,因為你可能需要向模型提供一些小細節(jié)针贬。
你也許想要使用 infoGAN,如果:
你的數(shù)據(jù)集不是很復(fù)雜拢蛋。
你想訓(xùn)練 cGAN桦他,但你沒有標簽信息。
你希望看到數(shù)據(jù)集的主要的有意義的圖像特征是什么谆棱,并且可以控制它們快压。
Wasserstein GAN
TL; DR:改變損失函數(shù)以包含 Wasserstein 距離。結(jié)果垃瞧,WassGAN 具有與圖像質(zhì)量相關(guān)的損失函數(shù)嗓节。此外,訓(xùn)練穩(wěn)定性也提高了皆警,而且不依賴于架構(gòu)拦宣。
[文章](https://arxiv.org/abs/1701.07875)
GAN 一直在收斂性方面存在問題,結(jié)果是信姓,你不知道何時停止訓(xùn)練鸵隧。換句話說,損失函數(shù)與圖像質(zhì)量不相關(guān)意推。這是一個頭痛的大問題豆瘫,因為:
你需要不斷查看樣本,以了解你的模型是否在正確訓(xùn)練菊值。
你不知道何時應(yīng)該停止訓(xùn)練(沒有收斂)外驱。
你沒有一個量化數(shù)值告訴你調(diào)整參數(shù)的效果如何。
例如腻窒,看這兩個能夠完美生成 MNIST 樣本的 DCGAN 的毫無信息量的損失函數(shù)圖:
僅通過看這個圖你知道什么時候停止訓(xùn)練嗎昵宇?我也不行。
這個可解釋性問題是
Wasserstein GAN 旨在解決的問題之一儿子。怎么樣瓦哎?GAN 可被解釋以最小化 Jensen-Shannon
發(fā)散,如果真和假的分布不重疊(通常是這種情況),則它為 0蒋譬。所以割岛,作者使用了 Wasserstein 距離,而不是最小化 JS
發(fā)散犯助,它描述了從一個分布到另一個分布的「點」之間的距離癣漆。這大概是其主要思想,但如果你想了解更多剂买,我強烈建議你訪問這一鏈接(http://suo.im/1wmf2t)進行更深入的分析或閱讀文章本身惠爽。
因此,WassGAN 具有與圖像質(zhì)量相關(guān)的損失函數(shù)并能夠?qū)崿F(xiàn)收斂雷恃。它也更加穩(wěn)定疆股,也就意味著它不依賴于架構(gòu)费坊。例如倒槐,即使你去掉批處理歸一化或嘗試奇怪的架構(gòu),它也能很好地工作附井。
這是 WassGAN 損失函數(shù)的圖讨越。損失越低,圖像質(zhì)量越高永毅。整齊把跨!
你也許想要使用 Wasserstein GAN,如果:
你正在尋找具有較高訓(xùn)練穩(wěn)定性的較先進的 GAN沼死。
你想要一個有信息量的可解釋的損失函數(shù)着逐。
結(jié)語
所以,現(xiàn)在就是這些意蛀!我知道還有更有趣的研究去評論耸别,但在這篇文章中,我決定專注于一個有限的集合县钥。只是舉幾個例子秀姐,下面是一些我沒有評論的文章的簡短列表,也許你想去看看:
GAN 應(yīng)用于視頻:https://github.com/SKTBrain/DiscoGAN
圖像完成:https://arxiv.org/abs/1609.04802
GAN + 可變性 AutoEncoder 混合:https://github.com/junyanz/iGAN
向 GAN 添加一個編碼器以重建樣本:https://phillipi.github.io/pix2pix/
圖像到圖像的翻譯:https://ishmaelbelghazi.github.io/ALI/
交互式圖像生成:https://arxiv.org/abs/1512.09300
使用 GAN 增加圖像質(zhì)量:https://bamos.github.io/2016/08/09/deep-completion/
將鞋子變成等價的包(DiscoGAN):http://web.mit.edu/vondrick/tinyvideo/
更廣泛的研究列表若贮,請查看此鏈接:https://github.com/zhangqianhui/AdversarialNetsPapers省有。
此外,在這個 repo(https://github.com/wiseodd/generative-models)中谴麦,你會發(fā)現(xiàn) Tensorflow 和 Torch 中的各種 GAN 實現(xiàn)蠢沿。
原文參考: