本文來給大家分享一下筆者最近的一個(gè)工作:通過簡單地修改原來的 GAN 模型,就可以讓判別器變成一個(gè)編碼器,從而讓 GAN 同時(shí)具備生成能力和編碼能力,并且?guī)缀醪粫黾佑?xùn)練成本。 這個(gè)新模型被稱為 O-GAN(正交 GAN,即 Orthogonal Generative Adversarial Network),因?yàn)樗腔趯ε袆e器的正交分解操作來完成的,是對判別器自由度的最充分利用。 ▲ FFHQ線性插值效果圖 筆者掉進(jìn)生成模型的大坑已經(jīng)很久時(shí)間了,不僅寫了多篇有關(guān)生成模型的文章,而且還往 arXiv 上也提交了好幾篇跟生成模型相關(guān)的小 paper。自掉坑以來,雖然說對生成模型尤其是 GAN 的理解漸深,有時(shí)也覺得自己做出了一點(diǎn)改進(jìn)工作(所以才提交到 arXiv上),但事實(shí)上那些東西都是無關(guān)痛癢的修修補(bǔ)補(bǔ),意義實(shí)在不大。 而本文要介紹的這個(gè)模型,自認(rèn)為比以往我做的所有 GAN 相關(guān)工作的價(jià)值總和還要大:它提供了目前最簡單的方案,來訓(xùn)練一個(gè)具有編碼能力的 GAN 模型。 現(xiàn)如今,GAN 已經(jīng)越來越成熟,越做越龐大,諸如 BigGAN 、StyleGAN 等算是目前最先進(jìn)的 GAN 模型也已被人熟知,甚至玩得不亦樂乎。不過,這幾個(gè)最先進(jìn)的 GAN 模型,目前都只有生成器功能,沒有編碼器功能,也就是說可以源源不斷地生成新圖片,卻不能對已有的圖片提取特征。 當(dāng)然,帶有編碼器的 GAN 也有不少研究,甚至本人就曾做過。但不管有沒有編碼能力,大部分 GAN 都有一個(gè)特點(diǎn):訓(xùn)練完成后,判別器都是沒有用的。因?yàn)槔碚撋显接?xùn)練,判別器越退化(比如趨于一個(gè)常數(shù))。 做過 GAN 的讀者都知道,GAN 的判別器和生成器兩個(gè)網(wǎng)絡(luò)的復(fù)雜度是相當(dāng)?shù)模ㄈ绻€有編碼器,那么復(fù)雜度也跟它們相當(dāng)),訓(xùn)練完 GAN 后判別器就不要了,那實(shí)在是對判別器這個(gè)龐大網(wǎng)絡(luò)的嚴(yán)重浪費(fèi)! 一般來說,判別器的架構(gòu)跟編碼器是很相似的,那么一個(gè)很自然的想法是能不能讓判別器和編碼器共享大部分權(quán)重? 據(jù)筆者所知,過去所有的 GAN 相關(guān)的模型中,只有 IntroVAE 做到了這一點(diǎn)。但相對而言 IntroVAE 的做法還是比較復(fù)雜的,而且目前網(wǎng)上還沒有成功復(fù)現(xiàn) IntroVAE 的開源代碼,筆者也嘗試復(fù)現(xiàn)過,但也失敗了。 而本文的方案則極為簡單——通過稍微修改原來的GAN模型,就可以讓判別器轉(zhuǎn)變?yōu)橐粋€(gè)編碼器,不管是復(fù)雜度還是計(jì)算量都幾乎沒有增加。 事不宜遲,馬上來介紹這個(gè)模型。首先引入一般的 GAN 寫法: 為了不至于混淆,這里還是不厭其煩地對符號做一些說明。其中,p(x) 是真實(shí)圖片集的“證據(jù)分布”,q(z) 是噪聲的分布(在本文中,它是 有時(shí)候我們會加一些標(biāo)準(zhǔn)化或者正則化手段上去,比如譜歸一化或者梯度懲罰,簡單起見,這些手段就不明顯地寫出來了。 然后定義幾個(gè)向量算符: 寫起來貌似挺高大上的,但其實(shí)就是向量各元素的均值、方差,以及標(biāo)準(zhǔn)化的向量。特別指出的是,當(dāng) nz≥3 時(shí)(真正有價(jià)值的 GAN 都滿足這個(gè)條件),[avg(z),std(z),N(z)] 是函數(shù)無關(guān)的,也就是說它相當(dāng)于是原來向量 z 的一個(gè)“正交分解”。 接著,我們已經(jīng)說了判別器的結(jié)構(gòu)其實(shí)和編碼器有點(diǎn)類似,只不過編碼器輸出一個(gè)向量而判別器輸出一個(gè)標(biāo)量罷了,那么我可以把判別器寫成復(fù)合函數(shù): 這里 E 是 怎么實(shí)現(xiàn)呢?只需要加一個(gè) loss:Pearson 相關(guān)系數(shù)! 其中: 如果 λ=0,那么就是普通的 GAN 而已(只不過判別器被分解為兩部分 E 和 T 兩部分)。加上了這個(gè)相關(guān)系數(shù),直觀上來看,就是希望 z 和 E(G(z)) 越線性相關(guān)越好。為什么要這樣加?我們留到最后討論。 顯然這個(gè)相關(guān)系數(shù)可以嵌入到任意現(xiàn)成的 GAN 中,改動量顯然也很?。ú鸱忠幌屡袆e器、加一個(gè) loss),筆者也做了多種 GAN 的實(shí)驗(yàn),發(fā)現(xiàn)都能成功訓(xùn)練。 這樣一來,GAN 的判別器 D 分為了 E 和 T 兩部分,E 變成了編碼器,也就是說,判別器的大部分參數(shù)已經(jīng)被利用上了。但是還剩下 T,訓(xùn)練完成后 T 也是沒用的,雖然 T 的參數(shù)量比較少,這個(gè)浪費(fèi)量是很少的,但對于有“潔癖”的人(比如筆者)來說還是很難受的。 能不能把 T 也省掉?經(jīng)過筆者多次試驗(yàn),結(jié)論是:還真能!因?yàn)槲覀兛梢灾苯佑?avg(E(x)) 做判別器: 這樣一來整個(gè)模型中已經(jīng)沒有 T 了,只有純粹的生成器 G 和編碼器 E,整個(gè)模型沒有絲毫冗余的地方,潔癖患者可以不糾結(jié)了。 這樣做為什么可以?我們放到最后再說。先看看實(shí)驗(yàn)效果,畢竟實(shí)驗(yàn)不好的話,原理說得再漂亮也沒有意義。 注意,理論上來講,本文引入的相關(guān)系數(shù)項(xiàng)并不能提高生成模型的質(zhì)量,所以實(shí)驗(yàn)的目標(biāo)主要有兩個(gè): 1)這個(gè)額外的 loss 會不會有損原來生成模型的質(zhì)量? 2)這個(gè)額外的 loss 是不是真的可以讓 E 變成一個(gè)有效的編碼器? 這個(gè)方法可以嵌入到任意 GAN 中,這次實(shí)驗(yàn)用的是 GAN 是我之前的 GAN-QP 的變種: 其中: 數(shù)據(jù)集上,這次的實(shí)驗(yàn)做得比較完整,在 CelebA HQ、FFHQ、LSUN-churchoutdoor、LSUN-bedroom 四個(gè)數(shù)據(jù)集上都做了實(shí)驗(yàn),分辨率都是 128 × 128 (其實(shí)還做了一點(diǎn) 256 × 256 的實(shí)驗(yàn),結(jié)果也不錯(cuò),但是沒放到論文上)。模型架構(gòu)跟以往一樣都是 DCGAN ,其余細(xì)節(jié)直接看論文或者代碼吧。 上圖: ▲ CelebA HQ隨機(jī)生成 ▲ CelebA HQ重構(gòu)效果 ▲ CelebA HQ線性插值 ▲ FFHQ隨機(jī)生成 ▲ FFHQ重構(gòu)效果 ▲ FFHQ線性插值 ▲ LSUN-church隨機(jī)生成 ▲ LSUN-church重構(gòu)效果 ▲ LSUN-church線性插值 ▲ LSUN-bedroom隨機(jī)生成 ▲ LSUN-bedroom重構(gòu)效果 ▲ LSUN-bedroom線性插值 不管你們覺得好不好,反正我是覺得還好了。 1. 隨機(jī)生成效果還不錯(cuò),說明新引入的相關(guān)系數(shù)項(xiàng)沒有降低生成質(zhì)量; 2. 重構(gòu)效果還不錯(cuò),說明 E(x) 確實(shí)提取到了 x 的主要特征; 3. 線性插值效果還不錯(cuò),說明 E(x) 確實(shí)學(xué)習(xí)到了接近線性可分的特征。 好,確認(rèn)過眼神,哦不對,是效果,就可以來討論一下原理了。 很明顯,這個(gè)額外的重構(gòu)項(xiàng)的作用就是讓 z 盡可能與 E(G(z)) “相關(guān)”,對于它,相信大多數(shù)讀者的第一想法應(yīng)該是 mse 損失 根據(jù)前面的定義,E(x) 輸出一個(gè) 如果最小化 但是 ρ(z,E(G(z))) 不一樣,ρ(z,E(G(z))) 跟 avg(E(G(z))) 和 std(E(G(z))) 都沒關(guān)系(只改變向量 E(G(z)) 的 avg 和 std,不會改變 ρ(z,E(G(z))) 的值,因?yàn)?ρ 本身就先減均值除標(biāo)準(zhǔn)差了),這意味著就算我們最大化 ρ(z,E(G(z))),我們也留了至少兩個(gè)自由度給判別器。 這也是為什么在 (6) 中我們甚至可以直接用 avg(E(x)) 做判別器,因?yàn)樗粫?ρ(z,E(G(z))) 的影響的。 一個(gè)相似的例子是 InfoGAN 。InfoGAN 也包含了一個(gè)重構(gòu)輸入信息的模塊,這個(gè)模塊也和判別器共享大部分權(quán)重(編碼器),而因?yàn)?InfoGAN 事實(shí)上只重構(gòu)部分輸入信息,因此重構(gòu)項(xiàng)也沒占滿編碼器的所有自由度,所以 InfoGAN 那樣做是合理的——只要給判別器留下至少一個(gè)自由度。 另外還有一個(gè)事實(shí)也能幫助我們理解。因?yàn)槲覀冊趯褂?xùn)練的時(shí)候,噪聲是 進(jìn)一步推論下去,對于 應(yīng)用這個(gè)結(jié)論,如果我們希望重構(gòu)效果好,也就是希望 G(E(x)) 是一張逼真的圖片,那么必要的條件是 avg(E(x))≈0 以及 std(E(x))≈1。 這就說明,對于一個(gè)好的 E(x),我們可以認(rèn)為 avg(E(x)) 和 std(E(x)) 都是已知的(分別等于 0 和 1),既然它們是已知的,我們就沒有必要擬合它們,換言之,在重構(gòu)項(xiàng)中可以把它們排除掉。而事實(shí)上: 也就是說在 mse 損失中排除掉 avg(E(x)) 和 std(E(x)) 的話,然后省去常數(shù),它其實(shí)就是 ?ρ(z,E(G(z))),這再次說明了 ρ(z,E(G(z))) 的合理性。并且由這個(gè)推導(dǎo),重構(gòu)過程并不是 G(E(x)) 而是: 最后,這個(gè)額外的重構(gòu)項(xiàng)理論上還能防止 mode collapse 的出現(xiàn)。其實(shí)很明顯,因?yàn)橹貥?gòu)質(zhì)量都不錯(cuò)了,生成質(zhì)量再差也差不到哪里去,自然就不會怎么 mode collapse 了。 非要說數(shù)學(xué)依據(jù)的話,我們可以將 ρ(z, E(G(z))) 理解為 Z 和 G(Z) 的互信息上界,所以最小化 ?ρ(z, E(G(z))) 事實(shí)上在最大化 Z 與 G(Z) 的互信息,這又等價(jià)于最大化 G(Z) 的熵。而 G(Z) 的熵大了,表明它的多樣性增加了,也就遠(yuǎn)離了 mode collapse。 本文介紹了一個(gè)方案,只需要對原來的 GAN 進(jìn)行簡單的修改,就可以將原來 GAN 的判別器轉(zhuǎn)化為一個(gè)有效的編碼器。多個(gè)實(shí)驗(yàn)表明這樣的方案是可行的,而對原理的進(jìn)一步思考得出,這其實(shí)就是對原始判別器(編碼器)的一種正交分解,并且對正交分解后的自由度的充分利用,所以模型也被稱為“正交 GAN(O-GAN)”。 小改動就收獲一個(gè)編碼器,何樂而不為呢?歡迎大家試用。 事后看,本文模型的思想其實(shí)本質(zhì)上就是“直徑和方向”的分解,并不難理解,但做到這件事情不是那么輕松的。 最開始我也一直陷入到 接著我嘗試將 E(x) 分解為模長和方向向量,然后用模長 ||E(x)|| 做判別器,用 cos 做重構(gòu)損失,判別器的 loss 用 hinge loss。這樣做其實(shí)幾何意義很明顯,說起來更漂亮些,部分?jǐn)?shù)據(jù)集是 work 的,但是通用性不好(CelebA 還行,LSUN 不行),而且還有一個(gè)問題是 ||E(x)|| 非負(fù),無法嵌入到一般的 GAN,很多穩(wěn)定 GAN 的技巧都不能用。 然后我想怎么把模長變成可正可負(fù),開始想著可以對模長取對數(shù),這樣小于 1 的模長取對數(shù)后變成負(fù)數(shù),大于 1 的模長取對數(shù)變成正數(shù),自然達(dá)成了目的。但是很遺憾,效果還是不好。后來陸續(xù)實(shí)驗(yàn)了諸多方案都不成功,最后終于想到可以放棄模長(對應(yīng)于方差)做判別器的 loss,直接用均值就行了。所以后來轉(zhuǎn)換成 avg(E(x)),這個(gè)轉(zhuǎn)變經(jīng)歷了相當(dāng)長的時(shí)間。 還有,重構(gòu)損失一般認(rèn)為要度量 x 和 G(E(x)) 的差異,而我發(fā)現(xiàn)只需要度量 z 和 E(G(z)) 的差異,這是最低成本的方案,因?yàn)橹貥?gòu)是需要額外的時(shí)間的。最后,我還做過很多實(shí)驗(yàn),很多想法哪怕在 CelebA上都能成功,但LSUN上就不行。所以,最后看上去簡單的模型,實(shí)際上是艱難的沉淀。 整個(gè)模型源于我的一個(gè)執(zhí)念:判別器既然具有編碼器的結(jié)構(gòu),那么就不能被浪費(fèi)掉。加上有 IntroVAE 的成功案例在先,我相信一定會有更簡單的方案實(shí)現(xiàn)這一點(diǎn)。前前后后實(shí)驗(yàn)了好幾個(gè)月,跑了上百個(gè)模型,直到最近終于算是完整地解決了這個(gè)問題。 對了,除了 IntroVAE,對我啟發(fā)特別大的還有 Deep Infomax 這篇論文,Deep Infomax 最后的附錄里邊提供了一種新的做 GAN 的思路,我開始也是從那里的方法著手思考新模型的。
[1] Andrew Brock, Jeff Donahue, Karen Simonyan, Large Scale GAN Training for High Fidelity Natural Image Synthesis, arXiv:1809.11096. [2] Tero Karras, Samuli Laine, Timo Aila, A Style-Based Generator Architecture for Generative Adversarial Networks, arXiv:1812.04948. [3] Huaibo Huang, Zhihang Li, Ran He, Zhenan Sun, Tieniu Tan, ntroVAE: Introspective Variational Autoencoders for Photographic Image Synthesis, NeurIPS 2018. [4] Alec Radford, Luke Metz, Soumith Chintala, Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks, ICLR 2016. [5] Xi Chen, Yan Duan, Rein Houthooft, John Schulman, Ilya Sutskever, Pieter Abbeel, InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets, NIPS 2016. [6] R Devon Hjelm, Alex Fedorov, Samuel Lavoie-Marchildon, Karan Grewal, Phil Bachman, Adam Trischler, Yoshua Bengio, Learning deep representations by mutual information estimation and maximization, ICLR 2019.
|
|