換臉效果媲美GAN!一文解析OpenAI流生成模型Glow

換臉效果媲美GAN!一文解析OpenAI流生成模型Glow

來自專欄 PaperWeekly43 人贊了文章

本期推薦的論文筆記來自 PaperWeekly 社區用戶 @TwistedW。基於流的生成模型在 2014 年已經被提出,但是一直被忽視。由 OpenAI 帶來的 Glow 展示了流生成模型強大的圖像生成能力。文章使用可逆 1 x 1 卷積在已有的流模型 NICE 和 RealNVP 基礎上進行擴展,精確的潛變數推斷在人臉屬性上展示了驚艷的實驗效果。

關於作者:武廣,合肥工業大學碩士生,研究方向為圖像生成。

論文 | Glow: Generative Flow with Invertible 1x1 Convolutions

鏈接 | paperweekly.site/papers

源碼 | github.com/openai/glow

圖像生成在GAN和VAE誕生後得到了很快的發展,現在圍繞GAN的論文十分火熱。生成模型只能受限於GAN和VAE嗎?OpenAI給出了否定的答案,OpenAI帶來了Glow, 一種基於流的生成模型,雖然基於流的生成模型在2014年就已經提出來了,但是一直沒有得到重視。Glow的作者在之前已經在基於流的生成模型上提出了NICE和RealNVP, Glow正是在這兩個模型基礎加入可逆1x1卷積進行擴展,精確的潛在變數推斷在人臉屬性上展示了驚艷的實驗效果,具體效果可在OpenAI放出的Demo下查看。

論文引入

隨著深度神經網路的發展,生成模型也得到了巨大的飛躍。目前已有的生成模型除了Glow外包括三大類,GAN、VAE和Autoregressive model(自回歸模型)。 其中自回歸模型和VAE是基於似然的方法,GAN則是通過縮小樣本和生成之間的分布實現數據的生成。文中對這些已有的生成模型也做了一個小結:

1. 自回歸模型(Autoregressive model):自回歸模型在PixelCNN和PixelRNN上展示了很不錯的實驗效果,但是由於是按照像素點去生成圖像導致計算成本高, 在可並行性上受限,在處理大型數據如大型圖像或視頻是具有一定麻煩的。

2. 變分自編碼器(VAE):VAE是在Autoencoder的基礎上讓圖像編碼的潛在向量服從高斯分布從而實現圖像的生成,優化了數據對數似然的下界,VAE在圖像生成上是可並行的, 但是VAE存在著生成圖像模糊的問題,Glow文中稱之為優化相對具有挑戰性。

3. 生成對抗網路(GAN):GAN的思想就是利用博弈不斷的優化生成器和判別器從而使得生成的圖像與真實圖像在分布上越來越相近。GAN生成的圖像比較清晰, 在很多GAN的拓展工作中也取得了很大的提高。但是GAN生成中的多樣性不足以及訓練過程不穩定是GAN一直以來的問題,同時GAN沒有潛在空間編碼器, 從而缺乏對數據的全面支持。

基於流的生成模型,首先在NICE中得到提出並在RealNVP中延伸。可以說流的生成模型被GAN的光芒掩蓋了,但是是金子總會發光。Glow一文算是將流生成模型 推到了學術的前沿,已經有很多學者在討論Glow的價值,甚至有說Glow將超越GAN。具體還要看學術圈的進一步發展,不過Glow確實在圖像的生成, 尤其是在圖像編碼得到的潛在向量精確推斷上展示了很好的效果。在OpenAI放出的Demo上展示了很驚艷的實驗效果,就人臉合成和屬性變化上可以看出Glow確實可以媲美GAN。

基於流的生成模型總結一下具有以下優點

  • 精確的潛在變數推斷和對數似然評估,在VAE中編碼後只能推理出對應於數據點的潛在變數的近似值,GAN根本就沒有編碼器更不用談潛在變數的推斷了。在Glow這樣的可逆生成模型中,可以在沒有近似的情況下實現潛在變數的精確的推理,還可以優化數據的精確對數似然,而不是其下限。
  • 高效的推理和合成,自回歸模型如PixelCNN,也是可逆的,然而這樣的模型合成難以實現並行化,並且通常在並行硬體上效率低下。而基於流的生成模型如Glow和RealNVP都能有效實現推理與合成的並行化。
  • 對下游任務有用的潛在空間,自回歸模型的隱藏層有未知的邊際分布,使其執行有效的數據操作上很困難;在GAN中,由於模型沒有編碼器使得數據點通常不能在潛在空間中直接被表徵,並且表徵完整的數據分布也是不容易的。而在可逆生成模型和VAE中不會如此,它們允許多種應用,例如數據點之間的插值,和已有數據點的有目的修改。
  • 內存的巨大潛力,如RevNet論文所述,在可逆神經網路中計算梯度需要一定量的內存,而不是線性的深度。

基於流的生成模型的優勢展示了Glow的魅力,但是在Glow論文解讀前,我們還是先回顧一下前兩個基於流的生成模型NICE和RealNVP。

NICE

NICE的全稱為NON-LINEAR INDEPENDENT COMPONENTS ESTIMATION翻譯過來就是「非線性獨立分量估計」。整體上來說,NICE是為了對複雜的高維數據進行 非線性變換,將高維數據映射到潛在空間,產生獨立的潛在變數。這個過程是可逆的,即可以從高維數據映射到潛在空間,也可以從潛在空間反過來映射到高維數據。

為了實現這個可逆的映射關係,就需要找到一個滿足映射的函數f,使得h=f(x),這裡的x就是高維數據,對應到圖像生成上x就是輸入的圖像, h就是映射到的潛在空間。這個過程是可逆的,也就是 x=f^{-1}(h) 。這個潛在空間可以給定一個先驗分布 p_H(h) ,即 h sim p_H(h) 。 所以實現NICE的關鍵就是找到這個可逆的映射f,這個不是一件容易的事,此時就引入了一個矩陣用於輔助實現映射,這就是雅克比矩陣。

雅可比矩陣

假設 F:{R_n} 	o {R_m} 是一個從歐式n維空間轉換到歐式m維空間的函數. 這個函數由m個實函數組成:y_1(x_1,...,x_n),...,y_m(x_1,...,x_n) 。 這些函數的偏導數(如果存在)可以組成一個m行n列的矩陣,這就是所謂的雅可比矩陣:

% <![CDATA[ egin{bmatrix} frac{partial y_1}{partial x_1} & cdots & frac{partial y_1}{partial x_n} \ vdots & ddots & vdots \ frac{partial y_m}{partial x_1} & cdots & frac{partial y_m}{partial x_n} end{bmatrix} %]]>

此矩陣表示為: {J_F}({x_1}, ldots ,{x_n}) ,或者 frac{{partial ({y_1}, ldots ,{y_m})}}{{partial ({x_1}, ldots ,{x_n})}}

雅可比行列式

如果m = n,那麼F是從n維空間到n維空間的函數,且它的雅可比矩陣是一個方塊矩陣,此時存在雅克比行列式。

雅克比矩陣有個重要的性質就是一個可逆函數(存在反函數的函數)的雅可比矩陣的逆矩陣即為該函數的反函數的雅可比矩陣。即,若函數 F:{R_n} 	o {R_n} 在點 p in R_n 的雅可比矩陣是連續且可逆的,則F在點p的某一鄰域內也是可逆的,且有 J_{F^{-1}} circ f = J_F^{-1}

對雅克比矩陣有所了解後就可以實現映射:

p_X(x) = p_H(f(x))vert det frac{partial f(x)}{partial x} vert

其中 frac{partial f(x)}{partial x} 就是x處的函數f的雅可比矩陣。

設計這個映射函數f的核心就是將輸入x進行分塊,即 xRightarrow (x_1,x_2)

egin{cases} y_1 = x_1 \ y_2 = x_2 + m(x_1) end{cases}

其中m是任意複雜的函數,但是這個分塊對於任何m函數都具有單位雅克比行列式,切下面是可逆的:

egin{cases} x_1 = y_1 \ x_2 = y_2 - m(y_1) end{cases}

上面的映射用對數表示就是:

log(p_X(x)) = log(p_H(f(x))) + log(vert det frac{partial f(x)}{partial x} vert)

計算具有高維域函數的雅可比行列式並計算大矩陣的行列式通常計算量是很大的,所以直接去算雅克比行列式是不現實的,所以需要對計算做一定的簡化。 NICE論文採用分層和組合變換的思想處理,即 f=f_L circ ... circ f_2 circ f_1 (此處符號根據NICE一文與Glow有些許出入)。 在一些細節優化上可以採用矩陣的上三角矩陣和下三角矩陣做變換表示方陣。

有了分層和組合變換的處理,接著就是對組合關係的確立,文中採用尋找三角形雅克比矩陣函數簇,通過耦合層關聯組合關係,也就是對x做分塊找到合適的函數m。 具體的細節這裡不展開了,有興趣的可以閱讀原文了解。

RealNVP

RealNVP的全稱為real-valued non-volume preserving強行翻譯成中文就是「實值非體積保持」,文章的全稱為DENSITY ESTIMATION USING REAL NVP, 翻譯過來就是「使用RealNVP進行密度估計」。RealNVP是在NICE的基礎上展開的,在NICE的基礎上將分層和組合變換的思想進一步延伸。

NICE中採用的耦合關係是加性耦合層,即對於一般的耦合層:

egin{cases} y_{I_1} = x_{I_1} \ y_{I_2} = g(x_{I_2};m(x_{I_1})) end{cases}

所謂加性耦合層就是取 g(a;b) = a + b ,其中 a = x_{I_2}, b = m(x_{I_1}) 此時:

egin{cases} y_{I_2} = x_{I_2} + m(x_{I_1}) \ x_{I_2} = y_{I_2} - m(y_{I_1}) end{cases}

除了可以選擇加性耦合層,還可以選擇乘法耦合層或者仿射耦合層(affine coupling layer)

而RealNVP正是採用仿射耦合層來代替加性耦合層,仿射耦合層採用 g(a;b) = a odot b_1 + b_2 ,其中 b_1 
eq 0 此時的m函數為:  R^d 	o R^{D-d},odot 為哈達馬積,也就是矩陣的乘法表示,RealNVP引入仿射耦合層後模型更加靈活。 用s代表尺度,t代表平移量,此時的分塊表示為: egin{cases} y_{1:d} = x_{1:d} \ y_{d+1:D} = x_{d+1:D} odot exp(s(x_{1:d})) + t(x_{1:d}) end{cases}

Longrightarrow

egin{cases} x_{1:d} = y_{1:d} \ x_{d+1:D} = (y_{d+1:D} - t(x_{1:d})) odot exp(-s(x_{1:d})) end{cases}

這樣就實現了通過堆疊一系列簡單的雙射來構建靈活且易處理的雙射函數。

RealNVP在NICE的基礎上的另一大改進就是做多尺度框架的設計。所謂的多尺度就是映射得到的最終潛在空間不是一次得到的,而是通過不同尺度的 潛在變數拼接而成的。我們看一下RealNVP給出的多樣性示例解釋圖,這個圖其實還不太清晰,在Glow中給的圖就已經很清晰了。

上圖的意思就是每一次做流生成潛在變數時,由於要將兩個潛在變數拼接後輸出,為了保證多尺度就每次保留一個潛在變數,將另一個潛在變數返回到輸入再次進行流操作, 經過L-1次流操作後將不再返回到輸入而是直接輸出和之前的L-1個潛在變數拼接形成最後的潛在變數的輸出。我們再結合公式理解一下,這裡稍微有點繞:

h^{(0)} = x

(z^{(i+1)},h^{(i+1)}) = f^{(i+1)}(h^{(i)})

z^{(L)} = f^{(L)}(h^{(L-1)})

z = (z^{(1)},...,z^{(L)})

舉個例子就是,比如輸入x有D維,第一次經過流 f^1(x) 得到潛在變數 (z_1,h_1) 其中 z_1h_1 維度都是 frac{D}{2} , 保留z_1,將h_1送入下一輪流將得到 frac{D}{4} 的潛在變數,保留一個,送入另一個,直到第L-1輪將潛在變數直接輸出和其餘的潛在變數拼接形成最終的輸出z。 這裡強調一下,多尺度框架的循環和流內部的經歷的次數沒關係,這裡為了保留RealNVP原文的符號,採用的符號都是原文中的符號。

RealNVP基本上就是這樣,但是細節還有很多,這裡不詳細展開,深入了解的可讀原文。

Glow模型

我們先一起來看看Glow的模型框架:

可以看到整個模型分為(a),(b),其實(a)只是對(b)中的「step of flow」的展開。Glow的思想和前兩篇整體上是一致的,都是為了找到可逆的雙射來實現輸入和潛在空間的相互轉換。 在設計映射函數時,採用分層變換的思想,將映射f函數變換為 f = f_1 odot f_2 odot cdots odot f_K ,也就是一個完整的流需要K次單步流才能完成,即 xstackrel{f_1}{longleftrightarrow}h_1stackrel{f_2}{longleftrightarrow}h_2 cdots stackrel{f_K}{longleftrightarrow}z (這裡的h值是內部流的過渡符號和上文提到的多尺度結構不同)。在完整流結束後經過split後做多尺度循環,經過L-1循環最終的潛在變數就是  z = (z^{(1)},...,z^{(L)})

我們把單步流的框架再仔細分析一下。

Actnorm

單步流中的第一層就是Actnorm層,全稱為activation normalization翻譯為激活標準化,整體的作用類似於批歸一化。但是批量歸一化添加的激活雜訊的方差與GPU或其他處理單元(PU) 的小批量大小成反比,這樣造成了性能上的下降,所以文章退出了Actnorm。Actnorm使用每個通道的標度和偏差參數執行激活的仿射變換,類似於批量標準化, 初始化這些參數,使得在給定初始數據小批量的情況下,每個通道的後行為動作具有零均值和單位方差。初始化後,標度和偏差被視為與數據無關的常規可訓練參數。 可以理解Actnorm就是對輸入數據做預處理。

Invertible 1x1 convolution

可逆1x1卷積是在NICE和RealNVP上的改進,NICE和RealNVP是反轉通道的排序,而可逆1×1卷積替換該固定置換,其中權重矩陣被初始化為隨機旋轉矩陣。 具有相等數量的輸入和輸出通道的1×1卷積是置換操作的概括。通過矩陣的簡化計算,可以簡化整體的計算量。

Affine Coupling Layers

仿射耦合層在RealNVP中就已有應用,而Glow的基礎是默認讀者已經掌握了NICE和RealNVP所以單單只讀Glow可能不能輕易的理解文章。

仿射耦合層的映入是實現可逆轉換的關鍵,仿射耦合的思想我們上面也有提過,Glow將其分為三部分講解。

零初始化(Zero initialization):用零初始化每個NN()的最後一個卷積,使得每個仿射耦合層最初執行一個同一性函數,這有助於訓練深層網路。

拆分和連接(Split and concatenation):split()函數將輸入張量沿通道維度分成兩半,而concat()操作執行相應的反向操作:連接成單個張量。 RealNVP中採用的是另一種類型的分裂:沿著棋盤圖案的空間維度拆分。Glow中只沿通道維度執行拆分,簡化了整體架構。

排列(Permutation):上面的每個流程步驟之前都應該對變數進行某種排列,以確保在充分的流程步驟之後,每個維度都可以影響其他每個維度。 NICE完成的排列類型是在執行加性耦合層之前簡單地反轉通道(特徵)的排序;RealNVP是執行(固定)隨機排列;Glow則是採用可逆1x1卷積。 文中也對三種方法做了實驗上的比較。

對於單步流的內部操作,文章也做了解釋:

Glow實驗

實驗的開篇是比較Glow和RealNVP,反轉操作上NICE採用反轉,RealNVP採用固定隨機排列,Glow採用可逆1×1卷積,並且耦合方式也影響實驗的效果,文章比較了加性耦合層和 仿射耦合層的性能差距。通過在CIFAR-10數據集的平均負對數似然(每維度的比特)來衡量不同操作的差距,其中所有模型都經過K = 32和L = 3的訓練, 實驗效果如下圖:

可以從上圖看出,Glow採用的方法都取得了較小的平均負對數似然,這說明了在實驗上是由於其他幾個模型的。

為了驗證RealNVP和Glow整體的框架下的差距,實驗進一步擴展,比較了CIFAR-10,ImageNet和LSUN數據集上兩者的差距,在相同預處理下得到的結果如下:

正如表2中顯示的,模型在所有數據集上實現了顯著的改進。

在高解析度圖像的生成上,Glow使用了CelebA-HQ數據集,數據集包含3萬張高解析度的圖片。實驗生成256x256圖像,設置K = 32,L = 6。我們看到這裡的L取了6, 在高解析度下,多尺度的豐富可能會讓得到的潛在變數具有更多的圖像細節。試驗中採用了退火演算法來優化實驗,在退火參數T = 0.7時候,合成的隨機樣本如下圖:

可以看到合成的圖像質量和合理性都是很高的,為了對潛在變數插值生成圖像,實驗以兩組真實圖片為依據,插值中間的過渡,生成的結果如下:

從上圖能看出整體的過渡還是相當順暢的,感覺很自然,這就是Glow在潛在變數精確推斷的優勢所在,這樣的實驗結果讓人很驚訝!

為了生成更多含語義的圖像,文章利用了一些標籤來監督訓練,對於不同人臉屬性合成的圖像如下:

生成的效果和過渡都是很自然合理。

退火模型對提高生成也是很重要的環節,文章對比了不同退火參數T下的實驗效果,合理的T的選擇對於實驗效果還是很重要的。

為了說明模型深度(多尺度)的意義,文中對比了L = 4和L = 6的效果,可以看出多尺度對於整體模型的意義還是很大的。

總結

Glow提出了一種新的基於流的生成模型,並在標準圖像建模基準上的對數似然性方面展示了改進的定量性能,特別是在高解析度人臉圖像合成和插值生成上取得了 驚艷的效果。從整體的閱讀上可以看出Glow可以完成較好的圖像合成和變換的工作,具體的工作還要在吃透代碼再進一步了解。寫的過程中有什麼問題,歡迎指正,謝謝!

關於PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智慧前沿論文成果的學術平台。如果你研究或從事 AI 領域,歡迎在公眾號後台點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

加入社區:paperweek.ly

微信公眾號:PaperWeekly

新浪微博:@PaperWeekly


推薦閱讀:

在lintcode刷AI題:貓狗分類器
Live :面向自動駕駛的計算機視覺 一 開篇
skimage例子學習(七)filters模塊介紹之邊緣檢測的實現
【Rotation探索】PCN/DRBox/textboxes++
圖像風格化演算法綜述三部曲之 (三) (Neural Style Transfer: A Review)

TAG:計算機視覺 | 機器學習 | 人工智慧 |