back to index
Flow-based Generative Model

link |
今天要講一個叫做flow的技術,那flow這個英文單字就是流的意思,流動的流的意思,那它是一個generative的model,就跟game一樣,你知道可以用game稱東西嗎?
link |
flow是另外一種generative的model,那它不像game那麼有名,所以我相信多數的同學都沒有這麼熟悉這個技術,那我今天要來講一下flow這個generative的model。
link |
在這個課程錄影裡面,我們已經介紹過三種generative的model,那這一頁投影片是從上課的錄影節錄出來的,那我假設你是有看上課錄影的,所以你應該知道這一頁投影片裡面的三個component都在講些什麼。
link |
那我們之前講說generative的model有三種,第一種是component by component的generation,就是你要產生的一個object非常複雜,比如說你要產生一張圖片,那我們就要說圖片是由很多的pixel所構成的,你一次產生一個pixel,那上課的時候我們用生存寶可夢來作為component by component的例子。
link |
那其實這種component by component的generation,更常見的名字叫做autoregressive的model,所以有人常常聽到說用autoregressive的model來做generation,其實指的就是component by component的generation。
link |
那我們也講了variational的autoencoder,我們也講了gap,我們講了三種generative的model,其實還有第四種model,第四種model就是我們今天要介紹的low-base model。
link |
好,那我們之前講過的三種generative的model,各自有各自的問題,這個autoregressive的model,也就是component by component的model,它的第一個問題是,既然component是一個一個生成的,那到底這個生成的順序怎麼樣才是對的呢?
link |
如果是影像生成,今天通常是從左上角的第一個pixel開始生成,一個一個的row,一個一個的row把pixel生成出來,那為什麼是從左上角呢?為什麼不是從右下角呢?
link |
沒有很好的答案,因為用右下角你也會問同樣的問題就是了,所以今天這個component by component的生成,你不知道這個component的順序怎麼樣才是對的。
link |
因為component和component在一個image上面,所有的component之間都是有關係的,如果像game這樣的方法,它是一致產生整張image,你不會有哪一個component先生成,哪一個componentdepend上前面的component生成這樣的問題。
link |
但在這種component by component,就是overaggressive model裡面,有這種問題你不知道誰應該先出現,誰應該接續在另外一個pixel後面出現。
link |
那也許有一些種類的生成,有一些種類的物件,它的component的先後順序是非常清楚的,比如說語音。
link |
你也可以用這樣子的技術,overaggressive model來生成語音,一次生成聲音訊號的一個sample,那聲音訊號它就是有順序性的嘛,所以你一定是從第一個sample開始生成,再生第二個,再生第三個,再生第四個影像。
link |
所以今天你在做這個生成的時候,如果你今天要用這種generation model再做雲合成,你一秒鐘至少要生二十萬個sample point,才能夠讓你聽起來覺得那個聲音是好聽的,像是人的聲音的。
link |
那如果你要一個一個sample生成,那顯然非常的慢。之前有一個知名的autoregressive生成聲音的技術叫做WebNet,它雖然生出來的聲音非常真實,可以以假亂真,
link |
但是WebNet最大的問題就是,一個一個sample生成,一秒鐘要產生至少二十萬個sample,太慢了,所以有人就說它要試著生成一秒鐘的聲音,要花九十分鐘的時間,所以根本就不太實用。
link |
那這個是component by component生成的問題,其他技術也有問題,像VAE有什麼問題呢?我們在講VAE的時候,我們證明了VAE它今天它在optimize的對象是這個log likelihood的一個lower bound,
link |
它不是真的去maximize我們要maximize的那個likelihood,而是去maximizelikelihood的一個lower bound,那我們不知道這個lower bound跟我們真正想要maximize的對象中間差距有多大,這是VAE的一個問題。
link |
那等一下看到的flow的model,它可以解決這個問題,它並沒有用approximation,它並不是optimize一個lower bound,它是直接optimize probability的本體,等一下我們會看說這個flow是怎麼做到這件事的。
link |
那當然還有一個非常強的model就是game,game可能是今天用來做生成或產生出來的quality,就假設你要做image generation要產生quality最好的東西的話,還是要用game啦,你用別的model,game就笑了這樣子。
link |
就今天看到用flow生成的結果,我覺得還是沒有真的可以打敗game,game還是最強的,但大家都知道說game很難train,因為它在train你的時候,你的generator跟discriminator目標是不一致的,很容易train一train就不小心就壞掉。
link |
那等一下講的flow,它沒有這樣子的問題,但它有別的問題,等一下我們看看它有什麼樣的問題。
link |
好,那我們回過頭來看一下這個generation是一個什麼樣的問題,那這個generator它是一個network,我們這邊generator用G來表示,這個G呢,它這個generator是一個network,這個network其實它定義了一個probability的distribution,這邊用PG來表示。
link |
怎麼說一個network是一個probability distribution呢?我們現在有一個generator G,我們給它input一個Z,它就會output一個X。
link |
那如果我們今天是要做,舉例來說,人臉的生成,那這個X就是一張人臉,這個X會是一個非常高微的向量,這個向量裡面的每一個element就是人臉的一個pixel。
link |
那這個Z,我們通常假設它是從一個很簡單的distribution,舉例來說,normal distribution裡面sample出來的,我們每次sample出一個Z,我們就把這個Z丟到這個generator裡面,讓這個generator去產生一個對應的X。
link |
雖然input的這個Z是從一個normal distribution裡面sample出來的,但是通過這個G以後,X可能會形成一個非常複雜的distribution,這個distribution我們用PG來表示。
link |
好,那對我們而言,什麼樣的G是好的呢?什麼樣的G是我們想要找出來的呢?我們會希望這個G,它所定義出來的那個probability distribution P大G跟real data的distribution越接近越好。
link |
假設我們現在做的這個例子是人臉的生成,我們就把所有的人臉通通集合起來,把所有人臉圖片通通集合起來,形成一個distribution,就是我們的P data,是吧?
link |
我一個好的G,非常直覺地,它定義出來的PG應該跟P data越接近越好,怎麼讓PG跟P data越接近越好呢?
link |
常見的做法是我們訓練G的時候,它的訓練目標是maximize likelihood,也就是說,我們從P data這個distribution裡面sample出m比data。
link |
再講更具體一點,你就是從這個人臉的照片裡面隨便samplem張照片出來,然後你在訓練的時候,你的目標就是希望這m張照片由PG所產生出來,所sample出來的likelihood越大越好。
link |
所以你要找一個G,它可以maximize這個objective function,這個objective function是什麼呢?這個objective function是log PG of Xi,我們要讓Xi它被PG所產生出來的機率越大越好。
link |
那這件事情就是大家都熟知的maximum likelihood,那maximum likelihood如果你覺得沒有辦法非常了解說為什麼要讓產生這些data的機率越大越好的話,那我這邊提供給大家一個更直觀的解釋。
link |
更直觀的解釋是,其實maximum likelihood等同於minimize PG跟P data的KL divergence,至於為什麼,這個我們在上課錄影裡面有,我把reference列在這邊給大家參考。
link |
總之maximize likelihood等同於讓PG跟P data它們的KL divergence越相近越好,也就是讓PG跟P data它們越相越好。
link |
那flow這個model有什麼厲害的地方呢?因為G是一個network,所以PG它顯然非常的複雜,一般我們不知道怎麼去maximize這個objective function。
link |
那flow-based model它說,不用擔心,它有一個好方法可以直接optimize這個objective function,可以直接maximize likelihood。
link |
需要講一些數學,flow-based model我想比較沒有那麼知名的原因也許就是因為它背後需要用到的數學真的是比較多了,其他方法都可以有比較非數學的理解方式,但是flow-based model需要用到的數學是比較多的。
link |
那跟大家講flow-based model之前,你需要知道三件事,第一個事情就是jacobian,第二個事情是你要知道什麼是determinant,第三個事情是你要知道什麼是change of variable,那我就跟大家很快的講一下這三件事情。
link |
好,怎麼是jacobian呢?jacobian的意思是說,我們現在有一個function f,這個function f的輸入是要做Z,Z是一個二維的向量,假設這邊Z是一個二維的向量,它的輸出叫做S,S這邊也是一個二維的向量。
link |
但實際上,更general的jacobian,input跟output的dimension不需要是一樣的,不過我們這邊先在舉例的時候就假設是一樣的。那你可以想像說,這個f其實就是你的generator,Z就是你的input,X就是你generate出來的東西。
link |
所以你可以想像說,等一下一定是會,這個jacobian跟這個generation是很有關係的。好,那所謂的jacobian是什麼呢?這個f這個function,它的jacobian就是把input的component跟output的component,兩兩去做偏為分以後,全部收集起來形成一個matrix,形成一個矩陣,這個矩陣就是這個f的jacobian。
link |
就是Z有兩個component,X有兩個component,把這兩個,Z1、Z2分別在X1、X2去做偏為分,你總共有四種組合,這四種組合集合起來就是function f的jacobian matrix。
link |
在寫這個jacobian matrix的時候,你的定義是不同的row,不同的row,放不同的output的variable,不同的color,不同的color,放不同的input的variable。
link |
就是第一個row,你的分子的地方就是X1,然後第二個row,你的分子的地方就是X2,然後第一個color,你的分母的地方是Z1,第二個color,你的分母的地方就是Z2。
link |
那我們舉一個例子,假設我們現在有一個function f,它長這個樣子,就是你input Z1、Z2,那你的X1是Z1加Z2,你的X2是兩倍的Z1。那這個function f,它的jacobian matrix長什麼樣子呢?你就在左邊這個式子,把Z1對X1做偏為分。
link |
把Z1對X1做偏為分,得到多少?得到1,1放在左上角。Z2對X1做偏為分,你已經覺得有點無聊了,Z2對X1做偏為分,得到1,放在右上角。
link |
左下角呢,Z1對X2做偏為分,Z1對X2做偏為分,得到2,放在這邊。Z2對X2做偏為分,Z2對X2做偏為分,得到0,放在這邊。
link |
好,那假設我們現在有一個f的inverse的function,它吃X、output Z,那這個f inverse它的jacobian matrix就寫成這個樣子,就本來是input Z、output X,那現在變成input X、output Z,所以這個X跟Z的關係呢,就倒過來,就是f inverse的jacobian。
link |
那f inverse的jacobian跟f的jacobian它們之間是有一個關係的,什麼樣的關係呢?你把這個function,不是function,你把這個matrix跟這個matrix相乘,它們會是identity matrix,也就是說這兩個matrix它們互為inverse,互為對方的inverse。
link |
所以為什麼我就不解釋,我直接舉個例子給你看說它們互為inverse。然後這邊,這個f的inverse長什麼樣子呢?f的inverse就是input X1、X2, Z1的地方就把X2除2, Z2的地方就把X1減掉2分之X2,這樣子X1、X2跟Z1、Z2的關係是f的inverse。
link |
好,那你把f的inverse的jacobian算出來,按照左邊這個式子代進去算一算,你會得到f inverse的jacobian是長這個樣子。你實際乘一下,Jf這個matrix乘上Jf inverse這個matrix,會等於identity的matrix。
link |
所以Jf跟Jf的inverse它們互為inverse,就是如果f inverse是f的inverse function,那f的jacobian跟f inverse的jacobian它們之間也會有inverse的關係,這個很神奇,function是inverse的,它們function之間有inverse的關係,那它們的jacobian也會有inverse的關係,就這樣。
link |
Determinant是什麼呢?Determinant就是給你一個matrix,有一個operation把這個matrix代進去算一算,就可以算出一個scalar,這個scalar就叫做determinant。
link |
那這個operation長什麼樣子呢?高中的時候都學過determinant的公式,就是如果是二乘二的矩陣,它長這樣,有一個二乘二的矩陣,它四個component是ABCD,它的determinant是長什麼樣子呢?它的determinant就是把A乘上B,減掉B乘上C,這個高中的數學教科書都有公式。
link |
三乘以三的matrix的determinant也有公式,就是你把三乘以三的matrix的對角線相乘,然後再把這三個東西相乘,再把這三個東西相乘,然後再減掉一大堆東西。
link |
這個公式其實等一下用不上,沒有那麼重要,只是想告訴你說,determinant就是這麼一回事,你高中都學過了。那你會說四乘四是怎麼樣呢?四乘四,大學線性代數有教過,不過我相信你大概就是忘記了。
link |
好,總之就是這麼一回事。這個determinant是這樣子的,這個matrixA的determinant等於matrixA的inverse的determinant的導數,或者是說,因為這個A跟A的inverse的determinant有導數的關係,
link |
所以f這個function的Jacobian跟f這個function的inverse的Jacobian,它們的determinant也有導數的關係。這兩項,如果把Jf取determinant跟Jf inverse取determinant,它們中間會有導數的關係。
link |
那我要跟大家講的就是這個結果,你要記得這個東西。然後determinant這個東西有什麼含義呢?determinant的含義我們等一下是用得上的,不是每一本現代教科書都會告訴你determinant有什麼含義,很多教科書就是直接給你一個定義,說determinant就按照這個公式套進去算一算,考試有可能會考,然後就結束了這樣子。
link |
那determinant這個東西到底代表了什麼意思呢?determinant這個東西你可以想像它是一個高維空間中的體積的概念,如果是D為二乘二的matrix,或三乘三的matrix,你比較容易理解,如果是一個二乘以二的matrix,你把它的每一個row拿出來,你把AB拿出來,把AB當作一個vector拿出來,你把CD當作一個vector拿出來,
link |
那matrix A的determinant到底是什麼呢?matrix A的determinant取絕對值就是AB跟CD這兩個row展開出來的面積,就是它的determinant。
link |
那這個三乘以三的matrix,你把三乘以三的matrix的三個row拿出來,展開成一個立方體,這個立方體的體積就是這個三乘以三的matrix的determinant取絕對值,至少取絕對值,因為determinant有時候算出來是負的,有可能是正的,有可能是負的,但體積一定是正的,所以你要取一個絕對值,你把determinant取絕對值就是體積。
link |
所以同理你可以想像說,在高維空間中,假設你一個四乘以四的matrix,把那個四乘以四的matrix的四個row都拿出來,它就是展開出一個四維空間中的立方體,但它也不能夠叫做立方體,因為它在四維空間中的一個什麼東西,它展開出來,它算出來的determinant就是四維空間中的體積,當然這個體積要加一個雙引號啦,
link |
其實四維空間中的那個東西並不叫做體積,我也不知道該怎麼描述它,它是一個東西,總之高維空間中像是體積的東西,就是determinant,你甚至可以想成是determinant就是高維空間中的體積。
link |
好,所以這樣大家稍微知道一下determinant的物理意義,這個等一下是會用得上的。再來要講change of variable,當然那個determinant就是為了要解釋change of variable的部分,所以要講一下那個determinant。
link |
好,那change of variable是什麼意思呢?假設我們有一個distribution pi of z,假設我這個z代進f以後會得到x,那這個x也形成了一個distribution到p of x,我們現在想知道pi of z跟p of x中間有什麼樣的關係。
link |
如果我們可以寫出pi of z跟p of x之間的關係,假設在知道f的情況下,我們可以寫出這兩者之間的關係,其實你就可以分析一個generator,對不對?
link |
因為這個是generator input的distribution,這是generator output的distribution,你寫得出pi of z跟p of x之間的關係,你就可以知道generator給他一個input的distribution output到底會長什麼樣。
link |
這兩者之間的關係寫不寫得出來呢?這兩者之間的關係是寫得出來的。我們現在要問的問題就是,假設在input的這個z的這個space上面有一個z',它通過f以後會得到一個x', z'它的probability density的value是pi of z', x'它的probability density的value是p of x',到底pi of z'跟p of x之間有什麼樣的?
link |
我們先舉一個簡單的例子來說明我們要問的問題是什麼?假設我們現在有一個distribution叫做pi of z,它是一個非常簡單的uniform distribution,它的分布就在z等於0跟z等於1之間,
link |
所以它只有z等於0跟z等於1之間有值,其他地方probability density function的值都是0,在z等於0到z等於1之間probability density function是一個固定的值,那這個固定的值的高度應該是多少呢?
link |
我們知道probability density function它的積分要等於1,就是你把pi of z對所有的z進行積分要等於1,今天既然這個d是1,那這個方形的面積必須要是1,所以這個高就是1,那這個都是機率學過的東西,我相信對大家來說都非常非常的簡單,非常非常的直覺。
link |
那現在,假設x跟z之間的關係是x等於兩倍的z加1,所以本來在0的位置,兩倍的z加1就跑到1的位置,反正在1的位置,兩倍的z加1就跑到3的位置,
link |
所以本來在0到1之間的分布,通過這個function f以後,這個function f是2z加1,分布就跑到1到3之間。好,那這邊本來是uniform的,所以跑到這邊應該也仍然是uniform,那它的高是多少呢?
link |
我們知道說這個distribution,這個x的distribution,它的積分也要是1,那現在既然底變寬了,底變原來的兩倍,那高度就會變成原來的二分之一。
link |
所以本來高度是1,因為現在通過了f這個function以後,把z乘上了兩倍,所以底變成兩倍的寬,所以高度就變成原來的二分之一,因為這兩個面積必須要是一樣的,這兩個面積都是1,所以底變寬了,高度就變成原來的二分之一。
link |
好,那現在從z'到x'中間,這個πz'跟px'中間有什麼樣的關係呢?你把πz'乘上二分之一就變成px',非常直覺,對大家來說應該都不成問題。
link |
接下來我們來考慮更general的case,我們有一個它的function我們不太確定是長什麼樣子的distribution,叫做πof z,我把它的distribution用一個淺藍色的線畫一下,那它通過一個transform以後變成另外一個distribution,叫做p of x,我用淺綠色的線畫一下。
link |
那本來在z'的位置,通過了一個function f以後就跑到了x'的位置,本來在z'的位置,你的probability density是πof z'跑到x'以後,你的probability density變成p of x',這個πof z'跟p of x'之間有什麼樣的關係呢?
link |
我們現在並不知道說這個π of z in general長什麼樣子,p of x in general長什麼樣子,但是我們能不能夠寫出,假設我們知道中間的function長什麼樣子的話,我們能不能夠寫出π of z'跟π of x'之間的關係呢?
link |
其實是可以的,這個就是change of variable的概念。我們現在假設我們把z'做一點小小的移動,從z'的位置移到z'加Δz,我們把z'加Δz帶到function f裡面,它會產生x'加Δx。
link |
你可以想像說,本來分佈在這一段裡面的probability density,現在被拉寬分佈到x'到x'加Δx之間,那我們現在假設說,在這個範圍之內的probability density function可以把它看作是uniform的,
link |
因為從這個x',這個Δz假設是一個非常小的值,所以這中間的probability density就假設是uniform,假設這個Δx這一段距離之內的probability density也是uniform。
link |
這個uniform的值在這邊等於π of z'在這邊等於π of x'.這個時候我們就可以寫出π of z'跟π of x'的關係了,因為我們現在是把這個藍色的方塊拉寬變成綠色的方塊,所以這兩塊的面積是一樣的。
link |
所以藍色方塊跟綠色方塊它們有同樣的面積,所以π of x'×Δx,就是這個綠色方形的底層高等於藍色方形的底層高等於π of z'×Δz。
link |
現在把Δz挪到右邊,這邊沒做什麼大不了的事,所以π of x'等於π of z'×Δz除以Δx,所以我們現在知道π of z'跟π of x'它們之間的關係,它們中間差的就是Δz除以Δx。
link |
Δz除以Δx是什麼呢?假設這個Δ非常非常小的話,你就可以把Δ換成d,對不對?
link |
所以這個Δx分之Δz就是x對z的微分結束,就是這樣,就是x對z的微分。
link |
那我們怎麼知道x對z的微分呢?如果你知道x跟z它們中間的那個function的inverse,你就可以算x對z的微分。
link |
所以在知道方形的前提之下,x對z的微分是可以被算出來的,所以你就可以算出π of z'跟π of x'之間有什麼樣的關係。
link |
那實際上它們中間的關係,要記得加上一個絕對值,要加上一個絕對值,為什麼要加上絕對值呢?
link |
最簡單的想法是,這個x分之Δz是有正有負的,對不對?微分可以是正的,也可以是負的。
link |
z增加,x也跟著增加,或是x增加,下面是x,x增加,z也跟著增加,這一項是正的,dx分之dz是正的。
link |
但是有時候x跟z的關係是相反的,就是x增加,z可能倒過來反而減少,這個也是有可能的,這個時候dx分之dz就會是負數,是負的,是小於零的。
link |
但如果它是小於零的,也不會影響我們這個式子,因為我們本來是把這個範圍內的東西拉寬到這邊,
link |
我們如果是改成把這個範圍內的東西拉寬到這邊,雖然本來是左邊跑到左邊,右邊跑到右邊,下面右邊跑到左邊,左邊跑到右邊,
link |
但是π of z'跟π of x'中間的高度的關係仍然是會變的,所以我們直接把dx分之dz加一個絕對值,就可以解我們剛才說的這兩個case。
link |
實際上關係是一樣的,但是這個微分算出來不一樣的問題,所以這邊要加一個絕對值。
link |
這邊是一維的case,就假設z跟x都是一維,那如果z跟x不是一維是二維的,那是怎麼樣呢?我們現在就舉一個二維的例子。
link |
現在z跟x都是二維的vector,現在把z'丟到一個function裡面,它會得到x'.
link |
現在我們要問的是,z'的probability density,π of z'跟x'的probability density,這個p of x',它們之間有什麼樣的關聯性?
link |
我們現在假設我們在這個π of z'附近取一個小小的正方形,假設這個小小的正方形之內的probability density都可以寫作π of z'.
link |
這個小小的正方形的寬是Δdy,高是Δdt。
link |
這一個小小的藍色正方形投影到這個x1、x2的space上面變成一個綠色的菱形,就是左下角跑到左下角,右上角跑到右上角,這一點可能跑到這一點,這一點可能跑到這一點。
link |
所以這個藍色的方形通過一個function以後變成綠色的菱形。
link |
好,那這個綠色的菱形的面積我們是可以算,假設這個綠色的菱形,這個邊,這個邊,這個向量,它底下這個邊的這個向量,它的x軸是Δx11,y軸是Δx21。
link |
這一個向量,它的x軸是Δx12,它的y軸是Δx22,這一個菱形的面積可以直接用這兩個向量所形成的矩陣的determinant的絕對值算出來。
link |
所以今天我們剛才有講過說,πz'乘以這個正方形的體積,就是πz'現在變成是這個正方形的高,第三位,就在跟投影片垂直的方向,只是在這個投影片上我畫不出來而已。
link |
這個πz'乘以正方形的面積要等於Px'乘以這個菱形的面積,所以式子寫出來就是這樣,這個πz'乘以Δz1乘以Δz2,跟Px'乘以這個菱形的面積,這個菱形的面積怎麼算呢?
link |
就是把這個向量跟這個向量拿出來當做matrix的兩個row,把Δx11,Δx21,Δx11,Δx21,跟Δx12,跟Δx22,Δx12,Δx22拿出來變成兩個向量再去determinant,再去絕對值,就是這個菱形的面積。
link |
把菱形的面積乘以Px'應該等於藍色方形的面積乘上πz',就這樣。假如這邊大家可以接受嗎?如果大家沒有問題的話,接下來就是對下面這個式子做一番整理就結束了。
link |
在進行整理之前呢,跟大家講一下,這個Δx11它是什麼意思呢?它是z1改變的時候x1的改變量。
link |
這個Δx21是什麼意思呢?它是z1改變的時候x2的改變量。Δx12是什麼意思呢?它是z2改變的時候x2的改變量,說錯了x1的改變量,它是z2改變的時候x1的改變量。
link |
那Δx22呢?它是z2改變的時候x2的改變量,這個是這四個Δx的含義。
link |
好,那接下來就是做一番整理。首先把Δz1跟Δz2除到左邊來。然後,接下來呢,你要把這個Δz1跟Δz2分別除進去determinant的第一個row跟第二個row。
link |
你把Δz1除第一個row,把Δz2除第二個row。你可能會問說,怎麼不是直接上下兩個row都除Δz1跟Δz2呢?沒有,為什麼?determinant的定義就是這樣,懂嗎?
link |
就是你把Δz1跟Δz2提出來,它們是會變成這個樣子的。就這一項跟這一項相等的,如果你這邊是上下都除Δz1跟Δz2,上下是不會相等的。
link |
這個有點難在正門課裡面解釋,假設你現今代數很熟的話,你就會知道說,這個應該就是這個樣子的。你把一個metric乘兩倍,它的determinant不是變成兩倍。
link |
如果這個metric是一個nxn的metric的話,你把它乘兩倍,它的determinant會變成二的n次方倍,determinant就是這麼回事。
link |
所以這邊,你要讓這個絕對值裡面的東西跟這個絕對值裡面的東西相等的話,那你是把Δz1除在第一個row,把Δz2除在第二個row,就這樣。
link |
那這個把Δx11除以Δz1是什麼意思呢?Δx11的意思是,當z1改變的時候,x1的改變量。
link |
所以Δx11除以Δz1就是z1對x1的偏微分。
link |
同理,Δx21是什麼?Δx21是z1改變的時候x2的改變量。
link |
所以Δx21除以Δz1就是z1對x2的偏微分。同理,下面這兩項也都可以分別化作是偏微分。
link |
接下來,我們把這個矩陣做transpose,一個矩陣做transpose不會改變它的determinant,所以我們可以放心地把這兩項做對調,不會改變它的determinant。
link |
接下來,這一項是什麼呢?這一項其實就是function f的Jacobian的matches。
link |
所以我們知道說,Px'跟Pyz'之間有什麼關係呢?
link |
你把Px'乘上現在這個x跟z之間的關係,這個function f的Jacobian match的determinant在一起絕對值,就變成Pyz'.
link |
所以Pyz'跟Px'之間的關係是可以寫出來的,它們中間就差一個Jacobian。
link |
你可以把這個Jacobian除到右邊去,然後這個Jacobian1除以determinant jf可以換成determinant jf的inverse。
link |
所以你就知道說,Pyz'要怎麼變成Px'呢?你把Pyz'乘以f inverse這個function的Jacobian,再去determinant,再去絕對值,就變成Px'.
link |
這個就是change of variable。
link |
如果剛才講的東西你沒有聽得很懂,那你唯一要做的事情就是背下來這兩個式子,
link |
知道說,如果今天z乘上一個function f會變成x,那z的distribution跟f的distribution,它們中間的關係就是差一個Jacobian的determinant的絕對值,就是這麼回事。
link |
好,接下來我們就進入flow的部分。
link |
把我們剛才學到的change of variable的式子呢,寫在右上角。
link |
好,那我們回到generation這件事。
link |
我們說generator是怎麼train出來的呢?
link |
generator訓練的目標就是要maximize Pg of xi,xi是從real data裡面sample出來的一粒data。
link |
我們叫maximize Pg of xi。
link |
有了change of variable的formulation以後,我們就可以把Pg of xi寫出來了。
link |
因為Pg of xi等於pi of zi乘上g inverse的Jacobian的determinant再取絕對值。
link |
我們就帶這邊這個change of variable的式子,我們就得到Pg of xi跟pi of zi的關係。
link |
而zi是把xi帶進g inverse以後得到的結果,就是pi,把xi帶進g inverse以後的結果就是zi。
link |
那我們可以把這個Pg of xi取log,左右都取log。
link |
所以log Pg of xi等於log pi of,把這個zi換成g inverse of xi。
link |
等於pi of g inverse of xi加上log g inverse的Jacobian metric的determinant取絕對值。
link |
所以現在我們知道log Pg of xi長什麼樣子了,就是這個樣子。
link |
那我們只要能夠maximize這個式子,就結束了,就可以change generator。
link |
但是想要maximize這個式子,假設你要用gradient descent maximize這個式子,
link |
那你得知道這一個我們要maximize的function長什麼樣子。
link |
而要知道這個function長什麼樣子,有一些前提。
link |
有什麼樣的前提呢?首先你要知道怎麼算這個g inverse的Jacobian的determinant。
link |
或者是說你要知道怎麼算g的Jacobian的determinant。
link |
要算generator的Jacobian還比較有辦法,
link |
因為你只要知道你怎麼計算 partial z分之partial x,
link |
你怎麼計算z對x的變化,你就可以算g的Jacobian。
link |
但是這一個Jacobian metric可能很大,
link |
如果你今天input是1000微,output是1000微,
link |
那這個Jacobian metric就是1000乘1000那麼大。
link |
那這麼大的metric要算它的determinant是非常花時間的。
link |
2乘2的metric你會算determinant,3乘3你會算determinant,
link |
所以今天我們需要好好設計我們generator的樣子,
link |
讓它的Jacobian metric很容易算determinant的。
link |
那第二個條件是,今天我們需要能夠把si變成zi,
link |
所以我們必須要知道g inverse長什麼樣子。
link |
這個generator如果它是一個network的話,
link |
但是我們如何保證我們有辦法算g inverse呢?
link |
我們也要好好的設計一下network架構,
link |
讓g inverse變成是好算的,變成是容易算的,變成是可以算的。
link |
為了確保g它會是invertible的,
link |
所以其實在做flow based model的時候,
link |
z跟x它們的dimension都會是一樣的。
link |
所以假設說你現在是要做image的generation,
link |
那image通常一個pixel有三個channel,
link |
那假設現在你要產生的是100x100的大小的image,
link |
那你input的這個z它的大小也得是100x100x3才可以,
link |
你input的z跟output的x的dimension必須是一樣。
link |
它的input跟output的dimension是一樣,
link |
並不代表g一定是invertible,
link |
那g就不可能是invertible。
link |
所以今天至少z跟x的dimension必須是一樣。
link |
接下來我們會設計network架構,
link |
讓g inverse變成是很容易計算的。
link |
所以這個flow based model它跟game不太一樣。
link |
你知道在做game或在做VAE的時候,
link |
你的generator都是input一個low dimensional的vector,
link |
然後output一個high dimensional的vector,
link |
也就是z的dimension遠小於x,
link |
z的每一維它代表了某種我們產生image的時候的vector。
link |
但flow based model不是。
link |
flow based modelinput跟output,
link |
z跟x的dimension居然是一樣的。
link |
那這個是我覺得flow based model的問題,
link |
好,然後現在既然我們要能夠算g的架構,
link |
變成determine跟算g inverse,
link |
所以g它沒有辦法是任意的network,
link |
不像我們今天在做game或做VAE的時候,
link |
今天既然我們對g的network架構很大的限制,
link |
所以今天flow based model的flow的意思其實就是,
link |
就好像是一條河一樣,就叫做flow based model。
link |
g1它是pi of x當作input output p1 of x,
link |
接下來p1 of x變成g2的input產生p2 of x,
link |
p2 of x變成g3的input產生p3 of x,
link |
你可能會疊一大堆的generator,
link |
把這些generator通通合起來,
link |
單一個generator可能它的能力有限,
link |
但所有的generator它們catenate起來,
link |
所有的generatorcompose起來,
link |
好,那我們現在看一下pi跟p1的關係,
link |
pi of zi乘上g1的inverse的jacobian的determinant,
link |
p2就是pi of zi乘上g1的inverse的jacobian,
link |
再取determinant,再取絕對值,
link |
再乘上g2的inverse的jacobian,
link |
再取determinant,再取絕對值,
link |
那假設我們現在疊k一個generator,
link |
最終產生出來的distribution是pk,
link |
你就把一堆generator的inverse的jacobian的determinant的絕對值
link |
好,那我們可以對pk取一下log啦,
link |
這個zi就是你有sample到一個real data xi,
link |
把這個xi呢,通過gk的inverse,
link |
一直到通過g1的inverse,最終呢,就得到zi。
link |
我們是要maximize這個probability。
link |
那實際上,我們是怎麼train這個flow-based model的呢?
link |
我們先假設我們只有一個generator,
link |
我們先考慮一個generator的case,
link |
那時候多個generator其實也是一樣。
link |
在我們的這個pg of xi這個式子裡面,
link |
我們會從real data裡面sample一些xi出來,
link |
好,那我們現在來看看我們上面這個式子,
link |
inverse output的這個zi,
link |
因為我們知道pi是一個normal distribution,
link |
normal distribution,
link |
如果input zero vector,
link |
這個generator的inverse,
link |
是讓output都變成zero vector。
link |
但是如果今天generator的inverse,
link |
output都是zero vector,
link |
如果你為了要maximize第一項,
link |
那g-inverse的jacobian,
link |
那你算出來的gradient當然是零,
link |
那g-inverse的jacobian,
link |
zero matrix的determinant是零,
link |
那這樣就沒有辦法maximize pg of xi,
link |
為了maximize pg of xi,
link |
他對這個g-inverse做一些限制,
link |
通通都making到zero vector,
link |
使用的g叫做coupling layer,
link |
這個被用在兩個知名的flow based model,
link |
coupling layer的意思是說,
link |
你input是一個vector叫做z,
link |
output是一個vector叫做x,
link |
dimension一樣的vector,
link |
這個vector裡面的element,
link |
也通過另外一個function h,
link |
這個element wise相乘的意思,
link |
這一個coupling layer,
link |
把前d為通過這兩個function,
link |
這兩個function不需要是invertible了,
link |
把這個vector通過這兩個function,
link |
所以這個function design,
link |
還要能夠算Jacobian的determinant,
link |
怎麼算Jacobian的determinant呢?
link |
這個半部對這個半部的Jacobian,
link |
這個半部對這個半部的Jacobian,
link |
就是identity matrix,對不對?
link |
因為你是直接把z1copy變成x1,
link |
所以今天z1跟zd是完全沒有關係的,
link |
你改變深綠色vector這裡面的值,
link |
不會影響淺綠色vector裡面的值,
link |
左下角I don't care這樣子,
link |
因為如果左上角是identity matrix,
link |
這整個matrix的determinant,
link |
會等於右下角這個部分的determinant,
link |
就是這個東西的determinant,
link |
就是這個東西的determinant這樣子,
link |
如果這邊是identity matrix,
link |
這整個灰色大的matrix的determinant,
link |
就等於右下角的determinant,
link |
右下角這個matrix的determinant,
link |
那它等於大的matrix的determinant,
link |
因為我們先把這兩個vector之間的關係,
link |
這整個Jacobian matrix的determinant,
link |
就是這一個右下角的matrix的對角線相乘,
link |
也就是把zd1對xd加1的偏微分乘上,
link |
zd2對xd加2的偏微分乘到z大d對x大d的偏微分,
link |
所以今天這個Jacobian的determinant,
link |
output的這個element相乘,
link |
所以今天如果這個coupling layer,
link |
它的Jacobian的determinant,
link |
因為我們說f跟h可以是任意複雜的function,
link |
那通過了這麼複雜的function以後,
link |
反正我算determinant的時候,
link |
好,那我們會把這些coupling layer疊起來,
link |
當我們把這些coupling layer疊起來的時候,
link |
我們說我們在這個coupling layer的input跟output的關係,
link |
所以你會發現說,你這個output的image的前面的部分,
link |
假設這邊這個部分對應到image的左上角的話,
link |
所以在疊這個coupling layer的時候,
link |
就是第一個coupling layer是複製前面,
link |
第二個coupling layer就變成複製後面,
link |
第三個coupling layer再變成複製前面,
link |
這樣子你第一個layer到第二個layer這邊複製過來,
link |
但是你就不會把原來input的這邊,
link |
這個是從那個random的Gaussian noise sample出來的,
link |
你就不會把Gaussian noise一直帶到最後的output,
link |
因為Gaussian noise只帶到第一層以後,
link |
它就會通過transform,就會變成別的東西了。
link |
很常用的application就是生成image,
link |
如果我們今天要做的是image的生成的話,
link |
一半copy,一半做一些其他事情呢?
link |
index有兩個嘛,有縱軸跟橫軸的index,
link |
奇數的不copy做transform,
link |
你可能有些layer是奇數的copy,
link |
有些layer是偶數的copy,奇數的做transform,
link |
或者是現在一張image通常都有三個channel,
link |
因為output RGB三個channel,
link |
你input的每一層通通都會是有三個channel的,
link |
那你就其中某幾個channel做copy,
link |
某幾個channel做transform,
link |
那每次copy的channel跟transform的channel,
link |
coupling layer是一個例子,
link |
第二個例子叫做1乘以1的convolution,
link |
這是用在一個非常知名的flow based model叫做glow裡面,
link |
flow這個model其實很早已經被提出來了,
link |
舉例來說我們剛才講的nice或real MVP,
link |
所以在我們deep learning這個community,
link |
上古時代的東西為什麼最近又被挖出來在講呢?
link |
那就是因為有flow這個model,
link |
flow這個model是去年被提出來的,
link |
我是覺得它的結果應該是還沒有game看起來產生的image quality那麼高啦,
link |
怎麼會產生出來的image會這麼清楚這樣子,
link |
它有一種除了剛才講的coupling layer以外,
link |
它還有一個神奇的layer叫做1乘以1的convolution layer,
link |
那每一張image就是由很多pixel所組成的,
link |
每一個pixel裡面都有RGB三個value,
link |
每一個pixel裡面都有RGB三個value,
link |
它的1乘以1的convolution,
link |
就是把這邊的每一個pixel裡面的三個value,
link |
變成output的對應到同樣位置的pixel的三個value,
link |
那第二個pixel的三個value,
link |
它可以shuffle不同的channel,
link |
它可以把不同的channel之間的關係,
link |
所以如果你有1乘以1的convolution,
link |
我都只copy第一個channel,
link |
反正現在有1乘以1的convolution,
link |
你現在的input的這三個value,
link |
把這個vector乘上這個matrix,
link |
他要怎麼交換這些channel的位置。
link |
而copy and layer就不要動它,
link |
copy and layer可能都,
link |
只固定copy某幾個channel,
link |
它也必須要是invertible的。
link |
如果W是一個invertible的matrix,
link |
如果W是一個invertible的matrix,
link |
W它只是一個三乘以三的matrix,
link |
output就是它的inverse。
link |
認出來一定是invertible的嗎?
link |
它故意把W用一個invertible的matrix去做initialize,
link |
如果initialize的時候是invertible的,
link |
認完以後它仍然是invertible的,
link |
突然invertible的情形出現,
link |
invertible這件事情是比較容易出現的,
link |
就你隨機sample一個matrix,
link |
你隨機sample一個matrix,
link |
一個matrix不能inverse的條件是什麼?
link |
它determinant正好算出來是0,
link |
那determinant只要算出來是別的值,
link |
所以你隨便sample一個matrix,
link |
因為可能隨便論一論都是invertible的。
link |
我在paper裡面沒有看到太多這方面的解釋,
link |
它的Jacobian的determinant,
link |
它的Jacobian的determinant,
link |
我們先來考慮一個比較簡單的case。
link |
假設有一個簡單的function叫做f,
link |
把z乘上一個3乘以3的matrix w得到x。
link |
那它的Jacobian長什麼樣子呢?
link |
就是假設你把一個三維的vector z,
link |
它的Jacobian就直接是這個w,
link |
它的Jacobian就直接是這個w。
link |
假設你有一個generator g,
link |
但實際上做operation很簡單,
link |
它的generator的Jacobian長什麼樣子呢?
link |
它的generator的Jacobian就是,
link |
放一大堆3乘以3的matrix w,
link |
放一大堆3乘以3的matrix w。
link |
只有對應到同樣的position的,
link |
藍色跟綠色的vector是有關係的,
link |
藍色跟綠色的vector是有關係的,
link |
而這個vector跟它就沒有任何關係,
link |
這一個Jacobian的matrix,
link |
它的determinant是什麼呢?
link |
w的determinant的d乘以d次方,
link |
假設這邊有d乘以d的三維的vector,
link |
假設這個image的resolution,
link |
它的Jacobian的determinant,
link |
這個Jacobian的determinant,
link |
就是w的determinant的d乘以d次方,
link |
那w的determinant能不能夠算呢?
link |
三乘以三的矩陣的determinant的公式,
link |
你只是把它再乘以一個d乘以d次方而已,
link |
好,那剛才講說flow-based model,
link |
那Glow那個model的結果真的很好,
link |
這個OpenAI有做一個Glow的model的demo的website,
link |
它是把它圈在那個select a那個coder上,
link |
那幾年前生成人臉這個case還非常的潮,
link |
不過現在可能看起來就是沒那麼潮就是了,
link |
那在OpenAI的那個demo website上,
link |
比如說你可以把兩張人臉mix在一起,
link |
通過generator的inverse,
link |
你把她的老公通過G-inverse,
link |
做interpolation,做結合以後,
link |
那它在demo webpage上面,
link |
你需要收集一堆笑的臉跟一堆不笑的臉,
link |
然後把不笑的臉的Z都找出來取一個平均,
link |
然後把它通過一個G的inverse,
link |
總之這個demo的webpage在這邊。
link |
好,那這個Glow還可以做什麼事呢?
link |
Glow現在最常做的應用就是拿來做語音合成,
link |
那Auto Requested Model,
link |
就是一個一個sample產生出來的結果很好,
link |
一個叫Paramount Web Name,
link |
接下來要請作業前五名的同學上台來講一下,