日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RealNVP与Glow:流模型的传承与升华

發(fā)布時(shí)間:2024/10/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RealNVP与Glow:流模型的传承与升华 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


作者丨蘇劍林

單位丨廣州火焰信息科技有限公司

研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)

個(gè)人主頁(yè)丨kexue.fm


話在開(kāi)頭


在上一篇文章細(xì)水長(zhǎng)flow之NICE:流模型的基本概念與實(shí)現(xiàn)中,我們介紹了 flow 模型中的一個(gè)開(kāi)山之作:NICE 模型。從 NICE 模型中,我們能知道 flow 模型的基本概念和基本思想,最后筆者還給出了 Keras 中的 NICE 實(shí)現(xiàn)。


本文我們來(lái)關(guān)心 NICE 的升級(jí)版:RealNVP 和 Glow。


Glow 模型的采樣演示:




精巧的flow


不得不說(shuō),flow 模型是一個(gè)在設(shè)計(jì)上非常精巧的模型。總的來(lái)看,flow 就是想辦法得到一個(gè) encoder 將輸入 x 編碼為隱變量 z,并且使得 z 服從標(biāo)準(zhǔn)正態(tài)分布。得益于 flow 模型的精巧設(shè)計(jì),這個(gè) encoder 是可逆的,從而我們可以立馬從 encoder 寫(xiě)出相應(yīng)的 decoder(生成器)出來(lái),因此,只要 encoder 訓(xùn)練完成,我們就能同時(shí)得到 decoder,完成生成模型的構(gòu)建。?


為了完成這個(gè)構(gòu)思,不僅僅要使得模型可逆,還要使得對(duì)應(yīng)的雅可比行列式容易計(jì)算,為此,NICE 提出了加性耦合層,通過(guò)多個(gè)加性耦合層的堆疊,使得模型既具有強(qiáng)大的擬合能力,又具有單位雅可比行列式。就這樣,一種不同于 VAE 和 GAN 的生成模型——flow 模型就這樣出來(lái)了,它通過(guò)巧妙的構(gòu)造,讓我們能直接去擬合概率分布本身。


待探索的空間


NICE 提供了 flow 模型這樣一種新的思路,并完成了簡(jiǎn)單的實(shí)驗(yàn),但它同時(shí)也留下了更多的未知的空間。flow 模型構(gòu)思巧妙,相比之下,NICE 的實(shí)驗(yàn)則顯得過(guò)于粗糙:只是簡(jiǎn)單地堆疊了全連接層,并沒(méi)有給出諸如卷積層的用法,論文雖然做了多個(gè)實(shí)驗(yàn),但事實(shí)上真正成功的實(shí)驗(yàn)只有 MNIST,說(shuō)服力不夠。?


因此,flow 模型還需要進(jìn)一步挖掘,才能在生成模型領(lǐng)域更加出眾。些拓展,由它的“繼承者”RealNVP 和 Glow 模型完成了,可以說(shuō),它們的工作使得 flow 模型大放異彩,成為生成模型領(lǐng)域的佼佼者。


RealNVP


這部分我們來(lái)介紹 RealNVP 模型,它是 NICE 的改進(jìn),來(lái)自論文 Density estimation using Real NVP?[1]它一般化了耦合層,并成功地在耦合模型中引入了卷積層,使得可以更好地處理圖像問(wèn)題。更進(jìn)一步地,它還提出了多尺度層的設(shè)計(jì),這能夠降低計(jì)算量,通過(guò)還提供了強(qiáng)大的正則效果,使得生成質(zhì)量得到提升。至此,flow 模型的一般框架開(kāi)始形成。?


后面的 Glow 模型基本上沿用了 RealNVP 的框架,只是對(duì)部分內(nèi)容進(jìn)行了修改(比如引入了可逆 1x1 卷積來(lái)代替排序?qū)?#xff09;。不過(guò)值得一提的是,Glow 簡(jiǎn)化了 RealNVP 的結(jié)構(gòu),表明 RealNVP 中某些比較復(fù)雜的設(shè)計(jì)是沒(méi)有必要的。因此本文在介紹 RealNVP 和 Glow 時(shí),并沒(méi)有嚴(yán)格區(qū)分它們,而只是突出它們的主要貢獻(xiàn)。??


仿射耦合層


其實(shí) NICE 和 RealNVP 的第一作者都是 Laurent Dinh,他是 Bengio 的博士生,他對(duì) flow 模型的追求和完善十分讓我欽佩。在第一篇 NICE 中,他提出了加性耦合層,事實(shí)上也提到了乘性耦合層,只不過(guò)沒(méi)有用上;而在 RealNVP 中,加性和乘性耦合層結(jié)合在一起,成為一個(gè)一般的“仿射耦合層”。



這里的 s,t 都是 x1 的向量函數(shù),形式上第二個(gè)式子對(duì)應(yīng)于 x2 的一個(gè)仿射變換,因此稱為“仿射耦合層”。


仿射耦合的雅可比矩陣依然是一個(gè)三角陣,但對(duì)角線不全為 1,用分塊矩陣表示為:



很明顯,它的行列式就是 s 各個(gè)元素之積。為了保證可逆性,一般我們約束 s 各個(gè)元素均大于零,所以一般情況下,我們都是直接用神經(jīng)網(wǎng)絡(luò)建模輸出 log s,然后取指數(shù)形式。?


注:從仿射層大概就可以知道 RealNVP 的名稱來(lái)源了,它的全稱為“real-valued non-volume preserving”,強(qiáng)行翻譯為“實(shí)值非體積保持”。相對(duì)于加性耦合層的行列式為 1,RealNVP 的雅可比行列式不再恒等于 1,而我們知道行列式的幾何意義就是體積(請(qǐng)參考《新理解矩陣5:體積=行列式》[2]),所以行列式等于 1 就意味著體積沒(méi)有變化,而仿射耦合層的行列式不等于 1 就意味著體積有所變化,所謂“非體積保持”。?


隨機(jī)打亂維度


在 NICE 中,作者通過(guò)交錯(cuò)的方式來(lái)混合信息流(這也理論等價(jià)于直接反轉(zhuǎn)原來(lái)的向量),如下圖(對(duì)應(yīng)地,這里已經(jīng)換為本文的仿射耦合層圖示):


?NICE通過(guò)交叉耦合,充分混合信息


而 RealNVP 發(fā)現(xiàn),通過(guò)隨機(jī)的方式將向量打亂,可以使信息混合得更加充分,最終的 loss 可以更低,如圖:


?RealNVP通過(guò)隨機(jī)打亂每一步輸出的整個(gè)向量,使得信息混合得更充分均勻


這里的隨機(jī)打亂,就是指將每一步 flow 輸出的兩個(gè)向量 h1,h2 拼接成一個(gè)向量 h,然后將這個(gè)向量重新隨機(jī)排序。


引入卷積層


RealNVP 中給出了在 flow 模型中合理使用卷積神經(jīng)網(wǎng)絡(luò)的方案,這使得我們可以更好地處理圖像問(wèn)題,并且減少參數(shù)量,還可以更充分發(fā)揮模型的并行性能。


注意,不是任意情況下套用卷積都是合理的,用卷積的前提是輸入(在空間維度)具有局部相關(guān)性。圖像本身是具有局部相關(guān)性的,因?yàn)橄噜徶g的像素是有一定關(guān)聯(lián)的,因此一般的圖像模型都可以使用卷積。


但是我們注意 flow 中的兩個(gè)操作:


1. 將輸入分割為兩部分 x1,x2,然后輸入到耦合層中,而模型 s,t 事實(shí)上只對(duì) x1 進(jìn)行處理;


2. 特征輸入耦合層之前,要隨機(jī)打亂原來(lái)特征的各個(gè)維度(相當(dāng)于亂序的特征)。這兩個(gè)操作都會(huì)破壞局部相關(guān)性,比如分割操作有可能割裂原來(lái)相鄰的像素,隨機(jī)打亂也可能將原來(lái)相鄰的兩個(gè)像素分割得很遠(yuǎn)。


所以,如果還要堅(jiān)持使用卷積,就要想辦法保留這種空間的局部相關(guān)性。我們知道,一幅圖像有三個(gè)軸:高度(height)、寬度(width)、通道(channel),前兩個(gè)屬于空間軸,顯然具有局部相關(guān)性,因此能“搞”的就只有“通道”軸。


為此,RealNVP 約定分割和打亂操作,都只對(duì)“通道”軸執(zhí)行。也就是說(shuō),沿著通道將輸入分割為 x1,x2 后,x1 還是具有局部相關(guān)性的,還有沿著通道按著同一方式打亂整體后,空間部分的相關(guān)性依然得到保留,因此在模型 s,t 中就可以使用卷積了。


?沿著通道軸進(jìn)行分割,不損失空間上的局部相關(guān)性


?沿著空間軸交錯(cuò)(棋盤)分割,也是一種保持空間局部相關(guān)性的方案


注:在 RealNVP 中,將輸入分割為兩部分的操作稱為 mask,因?yàn)檫@等價(jià)于用 0/1 來(lái)區(qū)別標(biāo)注原始輸入。除了前面說(shuō)的通過(guò)通道軸對(duì)半分的 mask 外,RealNVP 事實(shí)上還引入了一種空間軸上的交錯(cuò) mask,如上圖的右邊,這種 mask 稱為棋盤式 mask(格式像國(guó)際象棋的棋盤)。


這種特殊的分割也保留了空間局部相關(guān)性,原論文中是兩種 mask 方式交替使用的,但這種棋盤式 mask 相對(duì)復(fù)雜,也沒(méi)有什么特別明顯的提升,所以在 Glow 中已經(jīng)被拋棄。


不過(guò)想想就會(huì)發(fā)現(xiàn)有問(wèn)題。一般的圖像通道軸就只有三維,像 MNIST 這種灰度圖還只有一維,怎么分割成兩半?又怎么隨機(jī)打亂?為了解決這個(gè)問(wèn)題,RealNVP 引入了稱為 squeeze 的操作,來(lái)讓通道軸具有更高的維度。


其思想很簡(jiǎn)單:直接 reshape,但 reshape 時(shí)局部地進(jìn)行。具體來(lái)說(shuō),假設(shè)原來(lái)圖像為 h×w×c 大小,前兩個(gè)軸是空間維度,然后沿著空間維度分為一個(gè)個(gè) 2×2×c 的塊(這個(gè) 2 可以自定義),然后將每個(gè)塊直接 reshape 為 1×1×4c,也就是說(shuō)最后變成了 h/2×w/2×4c。


?squeeze操作圖示,其中2x2的小區(qū)域可以換為自定義大小的區(qū)域


有了 squeeze 這個(gè)操作,我們就可以增加通道軸的維數(shù),但依然保留局部相關(guān)性,從而我們前面說(shuō)的所有事情都可以進(jìn)行下去了,所以 squeeze 成為 flow 模型在圖像應(yīng)用中的必備操作。


多尺度結(jié)構(gòu)


除了成功地引入卷積層外,RealNVP 的另一重要進(jìn)展是加入了多尺度結(jié)構(gòu)。跟卷積層一樣,這也是一個(gè)既減少了模型復(fù)雜度、又提升了結(jié)果的策略。


?RealNVP中的多尺度結(jié)構(gòu)圖示


多尺度結(jié)構(gòu)其實(shí)并不復(fù)雜,如圖所示。原始輸入經(jīng)過(guò)第一步 flow 運(yùn)算(“flow 運(yùn)算”指的是多個(gè)仿射耦合層的復(fù)合)后,輸出跟輸入的大小一樣,這時(shí)候?qū)⑤斎雽?duì)半分開(kāi)兩半 z1,z2(自然也是沿著通道軸),其中 z1 直接輸出,而只將 z2 送入到下一步 flow 運(yùn)算,后面的依此類推。比如圖中的特例,最終的輸出由 z1,z3,z5 組成,總大小跟輸入一樣。


多尺度結(jié)構(gòu)有點(diǎn)“分形”的味道,原論文說(shuō)它啟發(fā)于 VGG。每一步的多尺度操作直接將數(shù)據(jù)尺寸減少到原來(lái)的一半,顯然是非常可觀的。但有一個(gè)很重要的細(xì)節(jié),在 RealNVP 和 Glow 的論文中都沒(méi)有提到,我是看了源碼才明白的,那就是最終的輸出 [z1,z3,z5] 的先驗(yàn)分布應(yīng)該怎么取?按照 flow 模型的通用假設(shè),直接設(shè)為一個(gè)標(biāo)準(zhǔn)正態(tài)分布?


事實(shí)上,作為不同位置的多尺度輸出,z1,z3,z5 的地位是不對(duì)等的,而如果直接設(shè)一個(gè)總體的標(biāo)準(zhǔn)正態(tài)分布,那就是強(qiáng)行將它們對(duì)等起來(lái),這是不合理的。最好的方案,應(yīng)該是寫(xiě)出條件概率公式:



由于 z3,z5 是由 z2 完全決定的,z5 也是由 z4 完全決定的,因此條件部分可以改為:



RealNVP 和 Glow 假設(shè)右端三個(gè)概率分布都是正態(tài)分布,其中 p(z1|z2) 的均值方差由 z2 算出來(lái)(可以直接通過(guò)卷積運(yùn)算,這有點(diǎn)像 VAE),p(z3|z4) 的均值方差由 z4 算出來(lái),p(z5) 的均值方差直接學(xué)習(xí)出來(lái)。


顯然這樣的假設(shè)會(huì)比簡(jiǎn)單認(rèn)為它們都是標(biāo)準(zhǔn)正態(tài)分布要有效得多。我們還可以換一種表述方法:上述的先驗(yàn)假設(shè)相當(dāng)于做了如下的變量代換:



然后認(rèn)為 [z?1,z?3,z?5] 服從標(biāo)準(zhǔn)正態(tài)分布。同 NICE 的尺度變換層一樣,這三個(gè)變換都會(huì)導(dǎo)致一個(gè)非 1 的雅可比行列式,也就是要往 loss 中加入形如的這一項(xiàng)。?


乍看之下多尺度結(jié)構(gòu)就是為了降低運(yùn)算量,但并不是那么簡(jiǎn)單。由于 flow 模型的可逆性,輸入輸出維度一樣,事實(shí)上這會(huì)存在非常嚴(yán)重的維度浪費(fèi)問(wèn)題,這往往要求我們需要用足夠復(fù)雜的網(wǎng)絡(luò)去緩解這個(gè)維度浪費(fèi)。


多尺度結(jié)構(gòu)相當(dāng)于拋棄了 p(z) 是標(biāo)準(zhǔn)正態(tài)分布的直接假設(shè),而采用了一個(gè)組合式的條件分布,這樣盡管輸入輸出的總維度依然一樣,但是不同層次的輸出地位已經(jīng)不對(duì)等了,模型可以通過(guò)控制每個(gè)條件分布的方差來(lái)抑制維度浪費(fèi)問(wèn)題(極端情況下,方差為 0,那么高斯分布坍縮為狄拉克分布,維度就降低 1),條件分布相比于獨(dú)立分布具有更大的靈活性。而如果單純從 loss 的角度看,多尺度結(jié)構(gòu)為模型提供了一個(gè)強(qiáng)有力的正則項(xiàng)(相當(dāng)于多層圖像分類模型中的多條直連邊)。


Glow


整體來(lái)看,Glow 模型在 RealNVP 的基礎(chǔ)上引入了 1x1 可逆卷積來(lái)代替前面說(shuō)的打亂通道軸的操作,并且對(duì) RealNVP 的原始模型做了簡(jiǎn)化和規(guī)范,使得它更易于理解和使用。


■?論文 | https://www.paperweekly.site/papers/2101

■ 博客 | https://blog.openai.com/glow/

■ 源碼 |?https://github.com/openai/glow


可逆1x1卷積


這部分介紹 Glow 的主要改進(jìn)工作:可逆 1x1 卷積。?


置換矩陣


可逆 1x1 卷積源于我們對(duì)置換操作的一般化。我們知道,在 flow 模型中,一步很重要的操作就是將各個(gè)維度重新排列,NICE 是簡(jiǎn)單反轉(zhuǎn),而 RealNVP 則是隨機(jī)打亂。不管是哪一種,都對(duì)應(yīng)著向量的置換操作。?


事實(shí)上,對(duì)向量的置換操作,可以用矩陣乘法來(lái)描述,比如原來(lái)向量是 [1,2,3,4],分別交換第一、二和第三、四兩個(gè)數(shù),得到 [2,1,4,3],這個(gè)操作可以用矩陣乘法來(lái)描述:



其中右端第一項(xiàng)是“由單位矩陣不斷交換兩行或兩列最終得到的矩陣”稱為置換矩陣。?


一般化置換?


既然這樣,那很自然的想法就是:為什么不將置換矩陣換成一般的可訓(xùn)練的參數(shù)矩陣呢?所謂 1x1 可逆卷積,就是這個(gè)想法的結(jié)果。?


注意,我們一開(kāi)始提出 flow 模型的思路時(shí)就已經(jīng)明確指出,flow 模型中的變換要滿足兩個(gè)條件:一是可逆,二是雅可比行列式容易計(jì)算。如果直接寫(xiě)出變換:



那么它就只是一個(gè)普通的沒(méi)有 bias 的全連接層,并不能保證滿足這兩個(gè)條件。為此,我們要做一些準(zhǔn)備工作。首先,我們讓 h 和 x 的維度一樣,也就是說(shuō) W 是一個(gè)方陣,這是最基本的設(shè)置;其次,由于這只是一個(gè)線性變換,因此它的雅可比矩陣就是,所以它的行列式就是 det W,因此我們需要把 ?log |det W| 這一項(xiàng)加入到 loss 中;最后,初始化時(shí)為了保證 W 的可逆性,一般使用“隨機(jī)正交矩陣”初始化。


利用LU分解


以上做法只是一個(gè)很基本的解決方案,我們知道,算矩陣的行列式運(yùn)算量特別大,還容易溢出。而 Glow 給出了一個(gè)非常巧妙的解決方案:LU 分解的逆運(yùn)用。具體來(lái)說(shuō),是因?yàn)槿我饩仃嚩伎梢苑纸鉃?#xff1a;



其中 P 是一個(gè)置換矩陣,也就是前面說(shuō)的 shuffle 的等價(jià)矩陣;L 是一個(gè)下三角陣,對(duì)角線元素全為 1;U 是一個(gè)上三角陣。這種形式的分解稱為 LU 分解。如果知道這種矩陣的表達(dá)形式,顯然求雅可比行列式是很容易的,它等于:



也就是 U 的對(duì)角線元素的絕對(duì)值對(duì)數(shù)之和。既然任意矩陣都可以分解成 (7) 式,我們何不直接設(shè)W的形式為 (7) 式?這樣一來(lái)矩陣乘法計(jì)算量并沒(méi)有明顯提升,但求行列式的計(jì)算量大大降低,而且計(jì)算起來(lái)也更為容易。


這就是 Glow 中給出的技巧:先隨機(jī)生成一個(gè)正交矩陣,然后做 LU 分解,得到 P,L,U,固定 P,也固定 U 的對(duì)角線的正負(fù)號(hào),然后約束 L 為對(duì)角線全 1 的下三角陣,U 為上三角陣,優(yōu)化訓(xùn)練 L,U 的其余參數(shù)。?


結(jié)果分析?


上面的描述只是基于全連接的。如果用到圖像中,那么就要在每個(gè)通道向量上施行同樣的運(yùn)算,這等價(jià)于 1x1 的卷積,這就是所謂的可逆 1x1 卷積的來(lái)源。事實(shí)上我覺(jué)得這個(gè)名字起得不大好,它本質(zhì)上就是共享權(quán)重的、可逆的全連接層,單說(shuō) 1x1 卷積,就把它局限在圖像中了,不夠一般化。


?三種不同的打亂方案最終的loss曲線比較(來(lái)自O(shè)penAI博客)


Glow 的論文做了對(duì)比實(shí)驗(yàn),表明相比于直接反轉(zhuǎn),shuffle 能達(dá)到更低的 loss,而相比 shuffle,可逆 1x1 卷積能達(dá)到更低的 loss。我自己的實(shí)驗(yàn)也表明了這一點(diǎn)。


不過(guò)要指出的是:可逆 1x1 卷積雖然能降低 loss,但是有一些要注意的問(wèn)題。第一,loss 的降低不代表生成質(zhì)量的提高,比如 A 模型用了 shuffle,訓(xùn)練 200 個(gè) epoch 訓(xùn)練到 loss=-50000,B 模型用了可逆卷積,訓(xùn)練 150 個(gè) epoch 就訓(xùn)練到 loss=-55000,那么通常來(lái)說(shuō)在當(dāng)前情況下 B 模型的效果還不如 A(假設(shè)兩者都還沒(méi)有達(dá)到最優(yōu))。事實(shí)上可逆 1x1 卷積只能保證大家都訓(xùn)練到最優(yōu)的情況下,B 模型會(huì)更優(yōu)。第二,在我自己的簡(jiǎn)單實(shí)驗(yàn)中貌似發(fā)現(xiàn),用可逆 1x1 卷積達(dá)到飽和所需要的 epoch 數(shù),要遠(yuǎn)多于簡(jiǎn)單用 shuffle 的 epoch 數(shù)。


Actnorm


RealNVP 中用到了 BN 層,而 Glow 中提出了名為 Actnorm 的層來(lái)取代 BN。不過(guò),所謂 Actnorm 層事實(shí)上只不過(guò)是 NICE 中的尺度變換層的一般化,也就是 (5) 式提到的縮放平移變換:



其中 μ,σ 都是訓(xùn)練參數(shù)。Glow 在論文中提出的創(chuàng)新點(diǎn)是用初始的 batch 的均值和方差去初始化 μ,σ 這兩個(gè)參數(shù),但事實(shí)上所提供的源碼并沒(méi)有做到這一點(diǎn),純粹是零初始化。


所以,這一點(diǎn)是需要批評(píng)的,純粹將舊概念換了個(gè)新名字罷了。當(dāng)然,批評(píng)的是 OpenAI 在 Glow 中亂造新概念,而不是這個(gè)層的效果。縮放平移的加入,確實(shí)有助于更好地訓(xùn)練模型。而且,由于 Actnorm 的存在,仿射耦合層的尺度變換已經(jīng)顯得不那么重要了


我們看到,相比于加性耦合層,仿射耦合層多了一個(gè)尺度變換層,從而計(jì)算量翻了一倍。但事實(shí)上相比加性耦合,仿射耦合效果的提升并不高(尤其是加入了 Actnorm 后),所以要訓(xùn)練大型的模型,為了節(jié)省資源,一般都只用加性耦合,比如 Glow 訓(xùn)練 256x256 的高清人臉生成模型,就只用到了加性耦合。


源碼分析


事實(shí)上 Glow 已經(jīng)沒(méi)有什么可以特別解讀的了。但是 Glow 整體的模型比較規(guī)范,我們可以逐步分解一下 Glow 的模型結(jié)構(gòu),為我們自己搭建類似的模型提供參考。這部分內(nèi)容源自我對(duì) Glow 源碼的閱讀,主要以示意圖的方式給出。


模型總圖


整體來(lái)看,Glow 模型并不復(fù)雜,就是在輸入加入一定量的噪聲,然后輸入到一個(gè) encoder 中,最終用“輸出的平均平方和”作為損失函數(shù)(可以將模型中產(chǎn)生的對(duì)數(shù)雅可比行列式視為正則項(xiàng)),注意,loss 不是“平方平均誤差(MSE)”,而僅僅是輸出的平方和,也就是不用減去輸入。


?Glow模型總圖


encoder?


下面對(duì)總圖中的 encoder 進(jìn)行分解,大概流程為:


?encoder流程圖


encoder 由 L 個(gè)模塊組成,這些模塊在源碼中被命名為 revnet,每個(gè)模塊的作用是對(duì)輸入進(jìn)行運(yùn)算,然后將輸出對(duì)半分為兩份,一部分傳入下一個(gè)模塊,一部分直接輸出,這就是前面說(shuō)的多尺度結(jié)構(gòu)。Glow 源碼中默認(rèn) L=3,但對(duì)于 256x256 的人臉生成則用到 L=6。


revnet?


現(xiàn)在來(lái)進(jìn)一步拆解 encoder,其中 revnet 部分為:


?revnet結(jié)構(gòu)圖


其實(shí)它就是前面所說(shuō)的單步 flow 運(yùn)算,在輸入之前進(jìn)行尺度變換,然后打亂軸,并且進(jìn)行分割,接著輸入到耦合層中。如此訓(xùn)練 K 次,這里的 K 稱為“深度”,Glow 中默認(rèn)是 32。其中 actnorm 和仿射耦合層會(huì)帶來(lái)非 1 的雅可比行列式,也就是會(huì)改動(dòng) loss,在圖上也已注明。?


split2d


Glow 中的定義的 split2d 不是簡(jiǎn)單的分割,而是混合了對(duì)分割后的變換運(yùn)算,也就是前面所提到的多尺度輸出的先驗(yàn)分布選擇。


?glow中的split2d并不是簡(jiǎn)單的分割


對(duì)比 (5) 和 (9),我們可以發(fā)現(xiàn)條件先驗(yàn)分布與 Actnorm 的區(qū)別僅僅是縮放平移量的來(lái)源,Actnorm 的縮放平移參數(shù)是直接優(yōu)化而來(lái),而先驗(yàn)分布這里的縮放平移量是由另一部分通過(guò)某個(gè)模型計(jì)算而來(lái),事實(shí)上我們可以認(rèn)為這種一種條件式 Actnorm(Cond Actnorm)。


f


最后是 Glow 中的耦合層的模型(放射耦合層的 s,t),源碼中直接命名為 f,它用了三層 relu 卷積:


?glow中耦合層的變換模型


其中最后一層使用零初始化,這樣就使得初始狀態(tài)下輸入輸出一樣,即初始狀態(tài)為一個(gè)恒等變換,這有利于訓(xùn)練深層網(wǎng)絡(luò)。


復(fù)現(xiàn)


可以看到 RealNVP 其實(shí)已經(jīng)做好了大部分工作,而 Glow 在 RealNVP 的基礎(chǔ)上進(jìn)行去蕪存菁,并加入了自己的一些小修改(1x1 可逆卷積)和規(guī)范。但不管怎么樣,這是一個(gè)值得研究的模型。


Keras版本


官方開(kāi)源的 Glow 是 TensorFlow 版的。這么有意思的模型,怎么能少得了 Keras 版呢,先奉上筆者實(shí)現(xiàn)的 Keras 版:


https://github.com/bojone/flow/blob/master/glow.py?


已經(jīng) pull request 到 Keras 官方的 examples,希望過(guò)幾天能在 Keras 的 github 上看到它。


由于某些函數(shù)的限制,目前只支持 TensorFlow 后端,我的測(cè)試環(huán)境包括:Keras 2.1.5 + tensorflow 1.2 和 Keras 2.2.0 + tensorflow 1.8,均在 Python 2.7 下測(cè)試。


效果測(cè)試


剛開(kāi)始讀到 Glow 時(shí),我感到很興奮,仿佛像發(fā)現(xiàn)了新大陸一樣。經(jīng)過(guò)一番學(xué)習(xí)后,我發(fā)現(xiàn)......Glow 確實(shí)是一塊新大陸,然而卻非我等平民能輕松登上的。?


讓我們來(lái)看 Glow 的 github 上的兩個(gè) issue:


How many epochs will be take when training celeba??[3]

The samples we show in the paper are after about 4000 training epochs...?


Anyone reproduced the celeba-HQ results in the paper? [4]

Yes we trained with 40 GPU's for about a week, but samples did start to look good after a couple of days...


我們看到 256x256 的高清人臉圖像生成,需要訓(xùn)練 4000 個(gè) epoch,用 40 個(gè) GPU 訓(xùn)練了一周,簡(jiǎn)單理解就是用 1 個(gè) GPU 訓(xùn)練一年...(卒)


好吧,我還是放棄這可望而不可及的任務(wù)吧,我們還是簡(jiǎn)簡(jiǎn)單單玩?zhèn)€ 64x64,不,還是 32x32 的人臉生成,做個(gè) demo 出來(lái)就是了。


?用glow模型生成的32x32人臉,150個(gè)epoch


?用glow模型生成的cifar10,700個(gè)epoch


感覺(jué)還可以吧,我用的是 L=3,K=6,每個(gè) epoch 要 70s 左右(GTX1070)。跑了 150 個(gè) epoch,這里的 epoch 跟通常概念的 epoch 不一樣,我這里的一個(gè) epoch 就是隨機(jī)抽取的 3.2 萬(wàn)個(gè)樣本,如果每次跑完完整的 epoch,那么用時(shí)更久。同樣的模型,順手也跑了一下 cifar10,跑了 700 個(gè) epoch,不過(guò)效果不大好。就是遠(yuǎn)看似乎還可以,近看啥都不是的那種。


當(dāng)然,其實(shí) cifar10 雖然不大(32x32),但事實(shí)上生成 cifar10 可比生成人臉難多了(不管是哪種生成模型),我們就跳過(guò)吧。話說(shuō) 64x64 的人臉,我也作死地嘗試了一下,這時(shí)候用了 L=3,K=10,跑了 200 個(gè) epoch(這時(shí)候每個(gè) epoch 要 6 分鐘了)。結(jié)果..……


?用glow模型生成的64x64人臉,230個(gè)epoch


人臉是人臉了,不過(guò)看上去更像妖魔臉。看來(lái)網(wǎng)絡(luò)深度和 epoch 數(shù)都還不夠,我也跑不下去了。


艱難結(jié)束


好了,對(duì) RealNVP 和 Glow 的介紹終于可以結(jié)束了。本著對(duì) Glow 的興趣,利用前后兩篇文章把三個(gè) flow 模型都捋了一遍,希望對(duì)讀者有幫助。


總體來(lái)看,諸如 Glow 的 flow 模型整體確實(shí)很優(yōu)美,但運(yùn)算量還是偏大了,訓(xùn)練時(shí)間過(guò)長(zhǎng),不像一般的 GAN 那么友好。個(gè)人認(rèn)為 flow 模型要在當(dāng)前以 GAN 為主的生成模型領(lǐng)域中站穩(wěn)腳步,還有比較長(zhǎng)的路子要走,可謂任重而道遠(yuǎn)呀。


參考文獻(xiàn)


[1].?Dinh, L., Sohl-Dickstein, J., and Bengio, S. (2016). Density estimation using Real NVP. arXiv preprint arXiv:1605.08803.

[2].?https://kexue.fm/archives/2208

[3].?https://github.com/openai/glow/issues/14#issuecomment-406650950

[4].?https://github.com/openai/glow/issues/37#issuecomment-410019221




點(diǎn)擊以下標(biāo)題查看作者其他文章:?


  • 從無(wú)監(jiān)督構(gòu)建詞庫(kù)看「最小熵原理」

  • 基于CNN的閱讀理解式問(wèn)答模型:DGCNN

  • 再談最小熵原理:飛象過(guò)河之句模版和語(yǔ)言結(jié)構(gòu)

  • 再談變分自編碼器VAE:從貝葉斯觀點(diǎn)出發(fā)

  • 變分自編碼器VAE:這樣做為什么能成?

  • 全新視角:用變分推斷統(tǒng)一理解生成模型

  • 細(xì)水長(zhǎng)flow之NICE:流模型的基本概念與實(shí)現(xiàn)




#投 稿 通 道#

?讓你的論文被更多人看到?



如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢??答案就是:你不認(rèn)識(shí)的人。


總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?


PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。


與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的RealNVP与Glow:流模型的传承与升华的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。