back to index

Flow-based Generative Model


link |
00:00.400
今天要講一個叫做flow的技術,那flow這個英文單字就是流的意思,流動的流的意思,那它是一個generative的model,就跟game一樣,你知道可以用game稱東西嗎?
link |
00:14.180
flow是另外一種generative的model,那它不像game那麼有名,所以我相信多數的同學都沒有這麼熟悉這個技術,那我今天要來講一下flow這個generative的model。
link |
00:28.460
在這個課程錄影裡面,我們已經介紹過三種generative的model,那這一頁投影片是從上課的錄影節錄出來的,那我假設你是有看上課錄影的,所以你應該知道這一頁投影片裡面的三個component都在講些什麼。
link |
00:46.540
那我們之前講說generative的model有三種,第一種是component by component的generation,就是你要產生的一個object非常複雜,比如說你要產生一張圖片,那我們就要說圖片是由很多的pixel所構成的,你一次產生一個pixel,那上課的時候我們用生存寶可夢來作為component by component的例子。
link |
01:10.220
那其實這種component by component的generation,更常見的名字叫做autoregressive的model,所以有人常常聽到說用autoregressive的model來做generation,其實指的就是component by component的generation。
link |
01:25.900
那我們也講了variational的autoencoder,我們也講了gap,我們講了三種generative的model,其實還有第四種model,第四種model就是我們今天要介紹的low-base model。
link |
01:41.260
好,那我們之前講過的三種generative的model,各自有各自的問題,這個autoregressive的model,也就是component by component的model,它的第一個問題是,既然component是一個一個生成的,那到底這個生成的順序怎麼樣才是對的呢?
link |
02:00.940
如果是影像生成,今天通常是從左上角的第一個pixel開始生成,一個一個的row,一個一個的row把pixel生成出來,那為什麼是從左上角呢?為什麼不是從右下角呢?
link |
02:17.660
沒有很好的答案,因為用右下角你也會問同樣的問題就是了,所以今天這個component by component的生成,你不知道這個component的順序怎麼樣才是對的。
link |
02:28.300
因為component和component在一個image上面,所有的component之間都是有關係的,如果像game這樣的方法,它是一致產生整張image,你不會有哪一個component先生成,哪一個componentdepend上前面的component生成這樣的問題。
link |
02:42.820
但在這種component by component,就是overaggressive model裡面,有這種問題你不知道誰應該先出現,誰應該接續在另外一個pixel後面出現。
link |
02:51.860
那也許有一些種類的生成,有一些種類的物件,它的component的先後順序是非常清楚的,比如說語音。
link |
03:00.180
你也可以用這樣子的技術,overaggressive model來生成語音,一次生成聲音訊號的一個sample,那聲音訊號它就是有順序性的嘛,所以你一定是從第一個sample開始生成,再生第二個,再生第三個,再生第四個影像。
link |
03:14.980
所以今天你在做這個生成的時候,如果你今天要用這種generation model再做雲合成,你一秒鐘至少要生二十萬個sample point,才能夠讓你聽起來覺得那個聲音是好聽的,像是人的聲音的。
link |
03:32.900
那如果你要一個一個sample生成,那顯然非常的慢。之前有一個知名的autoregressive生成聲音的技術叫做WebNet,它雖然生出來的聲音非常真實,可以以假亂真,
link |
03:46.820
但是WebNet最大的問題就是,一個一個sample生成,一秒鐘要產生至少二十萬個sample,太慢了,所以有人就說它要試著生成一秒鐘的聲音,要花九十分鐘的時間,所以根本就不太實用。
link |
04:03.700
那這個是component by component生成的問題,其他技術也有問題,像VAE有什麼問題呢?我們在講VAE的時候,我們證明了VAE它今天它在optimize的對象是這個log likelihood的一個lower bound,
link |
04:20.900
它不是真的去maximize我們要maximize的那個likelihood,而是去maximizelikelihood的一個lower bound,那我們不知道這個lower bound跟我們真正想要maximize的對象中間差距有多大,這是VAE的一個問題。
link |
04:36.820
那等一下看到的flow的model,它可以解決這個問題,它並沒有用approximation,它並不是optimize一個lower bound,它是直接optimize probability的本體,等一下我們會看說這個flow是怎麼做到這件事的。
link |
04:50.900
那當然還有一個非常強的model就是game,game可能是今天用來做生成或產生出來的quality,就假設你要做image generation要產生quality最好的東西的話,還是要用game啦,你用別的model,game就笑了這樣子。
link |
05:07.180
就今天看到用flow生成的結果,我覺得還是沒有真的可以打敗game,game還是最強的,但大家都知道說game很難train,因為它在train你的時候,你的generator跟discriminator目標是不一致的,很容易train一train就不小心就壞掉。
link |
05:21.900
那等一下講的flow,它沒有這樣子的問題,但它有別的問題,等一下我們看看它有什麼樣的問題。
link |
05:29.480
好,那我們回過頭來看一下這個generation是一個什麼樣的問題,那這個generator它是一個network,我們這邊generator用G來表示,這個G呢,它這個generator是一個network,這個network其實它定義了一個probability的distribution,這邊用PG來表示。
link |
05:56.980
怎麼說一個network是一個probability distribution呢?我們現在有一個generator G,我們給它input一個Z,它就會output一個X。
link |
06:06.480
那如果我們今天是要做,舉例來說,人臉的生成,那這個X就是一張人臉,這個X會是一個非常高微的向量,這個向量裡面的每一個element就是人臉的一個pixel。
link |
06:23.120
那這個Z,我們通常假設它是從一個很簡單的distribution,舉例來說,normal distribution裡面sample出來的,我們每次sample出一個Z,我們就把這個Z丟到這個generator裡面,讓這個generator去產生一個對應的X。
link |
06:42.440
雖然input的這個Z是從一個normal distribution裡面sample出來的,但是通過這個G以後,X可能會形成一個非常複雜的distribution,這個distribution我們用PG來表示。
link |
06:59.780
好,那對我們而言,什麼樣的G是好的呢?什麼樣的G是我們想要找出來的呢?我們會希望這個G,它所定義出來的那個probability distribution P大G跟real data的distribution越接近越好。
link |
07:19.320
假設我們現在做的這個例子是人臉的生成,我們就把所有的人臉通通集合起來,把所有人臉圖片通通集合起來,形成一個distribution,就是我們的P data,是吧?
link |
07:32.900
我一個好的G,非常直覺地,它定義出來的PG應該跟P data越接近越好,怎麼讓PG跟P data越接近越好呢?
link |
07:46.060
常見的做法是我們訓練G的時候,它的訓練目標是maximize likelihood,也就是說,我們從P data這個distribution裡面sample出m比data。
link |
07:57.940
再講更具體一點,你就是從這個人臉的照片裡面隨便samplem張照片出來,然後你在訓練的時候,你的目標就是希望這m張照片由PG所產生出來,所sample出來的likelihood越大越好。
link |
08:17.100
所以你要找一個G,它可以maximize這個objective function,這個objective function是什麼呢?這個objective function是log PG of Xi,我們要讓Xi它被PG所產生出來的機率越大越好。
link |
08:34.700
那這件事情就是大家都熟知的maximum likelihood,那maximum likelihood如果你覺得沒有辦法非常了解說為什麼要讓產生這些data的機率越大越好的話,那我這邊提供給大家一個更直觀的解釋。
link |
08:53.840
更直觀的解釋是,其實maximum likelihood等同於minimize PG跟P data的KL divergence,至於為什麼,這個我們在上課錄影裡面有,我把reference列在這邊給大家參考。
link |
09:12.020
總之maximize likelihood等同於讓PG跟P data它們的KL divergence越相近越好,也就是讓PG跟P data它們越相越好。
link |
09:26.240
那flow這個model有什麼厲害的地方呢?因為G是一個network,所以PG它顯然非常的複雜,一般我們不知道怎麼去maximize這個objective function。
link |
09:38.780
那flow-based model它說,不用擔心,它有一個好方法可以直接optimize這個objective function,可以直接maximize likelihood。
link |
09:49.420
需要講一些數學,flow-based model我想比較沒有那麼知名的原因也許就是因為它背後需要用到的數學真的是比較多了,其他方法都可以有比較非數學的理解方式,但是flow-based model需要用到的數學是比較多的。
link |
10:09.360
那跟大家講flow-based model之前,你需要知道三件事,第一個事情就是jacobian,第二個事情是你要知道什麼是determinant,第三個事情是你要知道什麼是change of variable,那我就跟大家很快的講一下這三件事情。
link |
10:27.620
好,怎麼是jacobian呢?jacobian的意思是說,我們現在有一個function f,這個function f的輸入是要做Z,Z是一個二維的向量,假設這邊Z是一個二維的向量,它的輸出叫做S,S這邊也是一個二維的向量。
link |
10:46.300
但實際上,更general的jacobian,input跟output的dimension不需要是一樣的,不過我們這邊先在舉例的時候就假設是一樣的。那你可以想像說,這個f其實就是你的generator,Z就是你的input,X就是你generate出來的東西。
link |
11:03.460
所以你可以想像說,等一下一定是會,這個jacobian跟這個generation是很有關係的。好,那所謂的jacobian是什麼呢?這個f這個function,它的jacobian就是把input的component跟output的component,兩兩去做偏為分以後,全部收集起來形成一個matrix,形成一個矩陣,這個矩陣就是這個f的jacobian。
link |
11:31.260
就是Z有兩個component,X有兩個component,把這兩個,Z1、Z2分別在X1、X2去做偏為分,你總共有四種組合,這四種組合集合起來就是function f的jacobian matrix。
link |
11:50.900
在寫這個jacobian matrix的時候,你的定義是不同的row,不同的row,放不同的output的variable,不同的color,不同的color,放不同的input的variable。
link |
12:09.160
就是第一個row,你的分子的地方就是X1,然後第二個row,你的分子的地方就是X2,然後第一個color,你的分母的地方是Z1,第二個color,你的分母的地方就是Z2。
link |
12:23.140
那我們舉一個例子,假設我們現在有一個function f,它長這個樣子,就是你input Z1、Z2,那你的X1是Z1加Z2,你的X2是兩倍的Z1。那這個function f,它的jacobian matrix長什麼樣子呢?你就在左邊這個式子,把Z1對X1做偏為分。
link |
12:43.380
把Z1對X1做偏為分,得到多少?得到1,1放在左上角。Z2對X1做偏為分,你已經覺得有點無聊了,Z2對X1做偏為分,得到1,放在右上角。
link |
12:56.380
左下角呢,Z1對X2做偏為分,Z1對X2做偏為分,得到2,放在這邊。Z2對X2做偏為分,Z2對X2做偏為分,得到0,放在這邊。
link |
13:07.660
好,那假設我們現在有一個f的inverse的function,它吃X、output Z,那這個f inverse它的jacobian matrix就寫成這個樣子,就本來是input Z、output X,那現在變成input X、output Z,所以這個X跟Z的關係呢,就倒過來,就是f inverse的jacobian。
link |
13:30.660
那f inverse的jacobian跟f的jacobian它們之間是有一個關係的,什麼樣的關係呢?你把這個function,不是function,你把這個matrix跟這個matrix相乘,它們會是identity matrix,也就是說這兩個matrix它們互為inverse,互為對方的inverse。
link |
13:50.660
所以為什麼我就不解釋,我直接舉個例子給你看說它們互為inverse。然後這邊,這個f的inverse長什麼樣子呢?f的inverse就是input X1、X2, Z1的地方就把X2除2, Z2的地方就把X1減掉2分之X2,這樣子X1、X2跟Z1、Z2的關係是f的inverse。
link |
14:14.660
好,那你把f的inverse的jacobian算出來,按照左邊這個式子代進去算一算,你會得到f inverse的jacobian是長這個樣子。你實際乘一下,Jf這個matrix乘上Jf inverse這個matrix,會等於identity的matrix。
link |
14:30.660
所以Jf跟Jf的inverse它們互為inverse,就是如果f inverse是f的inverse function,那f的jacobian跟f inverse的jacobian它們之間也會有inverse的關係,這個很神奇,function是inverse的,它們function之間有inverse的關係,那它們的jacobian也會有inverse的關係,就這樣。
link |
14:57.660
Determinant是什麼呢?Determinant就是給你一個matrix,有一個operation把這個matrix代進去算一算,就可以算出一個scalar,這個scalar就叫做determinant。
link |
15:09.660
那這個operation長什麼樣子呢?高中的時候都學過determinant的公式,就是如果是二乘二的矩陣,它長這樣,有一個二乘二的矩陣,它四個component是ABCD,它的determinant是長什麼樣子呢?它的determinant就是把A乘上B,減掉B乘上C,這個高中的數學教科書都有公式。
link |
15:32.660
三乘以三的matrix的determinant也有公式,就是你把三乘以三的matrix的對角線相乘,然後再把這三個東西相乘,再把這三個東西相乘,然後再減掉一大堆東西。
link |
15:49.660
這個公式其實等一下用不上,沒有那麼重要,只是想告訴你說,determinant就是這麼一回事,你高中都學過了。那你會說四乘四是怎麼樣呢?四乘四,大學線性代數有教過,不過我相信你大概就是忘記了。
link |
16:02.660
好,總之就是這麼一回事。這個determinant是這樣子的,這個matrixA的determinant等於matrixA的inverse的determinant的導數,或者是說,因為這個A跟A的inverse的determinant有導數的關係,
link |
16:25.660
所以f這個function的Jacobian跟f這個function的inverse的Jacobian,它們的determinant也有導數的關係。這兩項,如果把Jf取determinant跟Jf inverse取determinant,它們中間會有導數的關係。
link |
16:42.660
那我要跟大家講的就是這個結果,你要記得這個東西。然後determinant這個東西有什麼含義呢?determinant的含義我們等一下是用得上的,不是每一本現代教科書都會告訴你determinant有什麼含義,很多教科書就是直接給你一個定義,說determinant就按照這個公式套進去算一算,考試有可能會考,然後就結束了這樣子。
link |
17:07.420
那determinant這個東西到底代表了什麼意思呢?determinant這個東西你可以想像它是一個高維空間中的體積的概念,如果是D為二乘二的matrix,或三乘三的matrix,你比較容易理解,如果是一個二乘以二的matrix,你把它的每一個row拿出來,你把AB拿出來,把AB當作一個vector拿出來,你把CD當作一個vector拿出來,
link |
17:35.420
那matrix A的determinant到底是什麼呢?matrix A的determinant取絕對值就是AB跟CD這兩個row展開出來的面積,就是它的determinant。
link |
17:48.420
那這個三乘以三的matrix,你把三乘以三的matrix的三個row拿出來,展開成一個立方體,這個立方體的體積就是這個三乘以三的matrix的determinant取絕對值,至少取絕對值,因為determinant有時候算出來是負的,有可能是正的,有可能是負的,但體積一定是正的,所以你要取一個絕對值,你把determinant取絕對值就是體積。
link |
18:13.220
所以同理你可以想像說,在高維空間中,假設你一個四乘以四的matrix,把那個四乘以四的matrix的四個row都拿出來,它就是展開出一個四維空間中的立方體,但它也不能夠叫做立方體,因為它在四維空間中的一個什麼東西,它展開出來,它算出來的determinant就是四維空間中的體積,當然這個體積要加一個雙引號啦,
link |
18:39.380
其實四維空間中的那個東西並不叫做體積,我也不知道該怎麼描述它,它是一個東西,總之高維空間中像是體積的東西,就是determinant,你甚至可以想成是determinant就是高維空間中的體積。
link |
18:52.980
好,所以這樣大家稍微知道一下determinant的物理意義,這個等一下是會用得上的。再來要講change of variable,當然那個determinant就是為了要解釋change of variable的部分,所以要講一下那個determinant。
link |
19:10.980
好,那change of variable是什麼意思呢?假設我們有一個distribution pi of z,假設我這個z代進f以後會得到x,那這個x也形成了一個distribution到p of x,我們現在想知道pi of z跟p of x中間有什麼樣的關係。
link |
19:32.740
如果我們可以寫出pi of z跟p of x之間的關係,假設在知道f的情況下,我們可以寫出這兩者之間的關係,其實你就可以分析一個generator,對不對?
link |
19:44.900
因為這個是generator input的distribution,這是generator output的distribution,你寫得出pi of z跟p of x之間的關係,你就可以知道generator給他一個input的distribution output到底會長什麼樣。
link |
19:58.980
這兩者之間的關係寫不寫得出來呢?這兩者之間的關係是寫得出來的。我們現在要問的問題就是,假設在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 |
20:28.900
我們先舉一個簡單的例子來說明我們要問的問題是什麼?假設我們現在有一個distribution叫做pi of z,它是一個非常簡單的uniform distribution,它的分布就在z等於0跟z等於1之間,
link |
20:48.580
所以它只有z等於0跟z等於1之間有值,其他地方probability density function的值都是0,在z等於0到z等於1之間probability density function是一個固定的值,那這個固定的值的高度應該是多少呢?
link |
21:04.100
我們知道probability density function它的積分要等於1,就是你把pi of z對所有的z進行積分要等於1,今天既然這個d是1,那這個方形的面積必須要是1,所以這個高就是1,那這個都是機率學過的東西,我相信對大家來說都非常非常的簡單,非常非常的直覺。
link |
21:26.220
那現在,假設x跟z之間的關係是x等於兩倍的z加1,所以本來在0的位置,兩倍的z加1就跑到1的位置,反正在1的位置,兩倍的z加1就跑到3的位置,
link |
21:43.380
所以本來在0到1之間的分布,通過這個function f以後,這個function f是2z加1,分布就跑到1到3之間。好,那這邊本來是uniform的,所以跑到這邊應該也仍然是uniform,那它的高是多少呢?
link |
22:01.740
我們知道說這個distribution,這個x的distribution,它的積分也要是1,那現在既然底變寬了,底變原來的兩倍,那高度就會變成原來的二分之一。
link |
22:14.620
所以本來高度是1,因為現在通過了f這個function以後,把z乘上了兩倍,所以底變成兩倍的寬,所以高度就變成原來的二分之一,因為這兩個面積必須要是一樣的,這兩個面積都是1,所以底變寬了,高度就變成原來的二分之一。
link |
22:30.820
好,那現在從z'到x'中間,這個πz'跟px'中間有什麼樣的關係呢?你把πz'乘上二分之一就變成px',非常直覺,對大家來說應該都不成問題。
link |
22:46.500
接下來我們來考慮更general的case,我們有一個它的function我們不太確定是長什麼樣子的distribution,叫做πof z,我把它的distribution用一個淺藍色的線畫一下,那它通過一個transform以後變成另外一個distribution,叫做p of x,我用淺綠色的線畫一下。
link |
23:09.140
那本來在z'的位置,通過了一個function f以後就跑到了x'的位置,本來在z'的位置,你的probability density是πof z'跑到x'以後,你的probability density變成p of x',這個πof z'跟p of x'之間有什麼樣的關係呢?
link |
23:31.340
我們現在並不知道說這個π of z in general長什麼樣子,p of x in general長什麼樣子,但是我們能不能夠寫出,假設我們知道中間的function長什麼樣子的話,我們能不能夠寫出π of z'跟π of x'之間的關係呢?
link |
23:49.300
其實是可以的,這個就是change of variable的概念。我們現在假設我們把z'做一點小小的移動,從z'的位置移到z'加Δz,我們把z'加Δz帶到function f裡面,它會產生x'加Δx。
link |
24:11.380
你可以想像說,本來分佈在這一段裡面的probability density,現在被拉寬分佈到x'到x'加Δx之間,那我們現在假設說,在這個範圍之內的probability density function可以把它看作是uniform的,
link |
24:29.380
因為從這個x',這個Δz假設是一個非常小的值,所以這中間的probability density就假設是uniform,假設這個Δx這一段距離之內的probability density也是uniform。
link |
24:43.220
這個uniform的值在這邊等於π of z'在這邊等於π of x'.這個時候我們就可以寫出π of z'跟π of x'的關係了,因為我們現在是把這個藍色的方塊拉寬變成綠色的方塊,所以這兩塊的面積是一樣的。
link |
25:03.780
所以藍色方塊跟綠色方塊它們有同樣的面積,所以π of x'×Δx,就是這個綠色方形的底層高等於藍色方形的底層高等於π of z'×Δz。
link |
25:18.340
現在把Δz挪到右邊,這邊沒做什麼大不了的事,所以π of x'等於π of z'×Δz除以Δx,所以我們現在知道π of z'跟π of x'它們之間的關係,它們中間差的就是Δz除以Δx。
link |
25:34.980
Δz除以Δx是什麼呢?假設這個Δ非常非常小的話,你就可以把Δ換成d,對不對?
link |
25:43.380
所以這個Δx分之Δz就是x對z的微分結束,就是這樣,就是x對z的微分。
link |
25:53.060
那我們怎麼知道x對z的微分呢?如果你知道x跟z它們中間的那個function的inverse,你就可以算x對z的微分。
link |
26:04.980
所以在知道方形的前提之下,x對z的微分是可以被算出來的,所以你就可以算出π of z'跟π of x'之間有什麼樣的關係。
link |
26:16.180
那實際上它們中間的關係,要記得加上一個絕對值,要加上一個絕對值,為什麼要加上絕對值呢?
link |
26:23.540
最簡單的想法是,這個x分之Δz是有正有負的,對不對?微分可以是正的,也可以是負的。
link |
26:31.540
z增加,x也跟著增加,或是x增加,下面是x,x增加,z也跟著增加,這一項是正的,dx分之dz是正的。
link |
26:41.300
但是有時候x跟z的關係是相反的,就是x增加,z可能倒過來反而減少,這個也是有可能的,這個時候dx分之dz就會是負數,是負的,是小於零的。
link |
26:56.020
但如果它是小於零的,也不會影響我們這個式子,因為我們本來是把這個範圍內的東西拉寬到這邊,
link |
27:04.900
我們如果是改成把這個範圍內的東西拉寬到這邊,雖然本來是左邊跑到左邊,右邊跑到右邊,下面右邊跑到左邊,左邊跑到右邊,
link |
27:14.100
但是π of z'跟π of x'中間的高度的關係仍然是會變的,所以我們直接把dx分之dz加一個絕對值,就可以解我們剛才說的這兩個case。
link |
27:25.940
實際上關係是一樣的,但是這個微分算出來不一樣的問題,所以這邊要加一個絕對值。
link |
27:33.860
假設大家有問題要問嗎?
link |
27:36.900
這邊是一維的case,就假設z跟x都是一維,那如果z跟x不是一維是二維的,那是怎麼樣呢?我們現在就舉一個二維的例子。
link |
27:49.220
現在z跟x都是二維的vector,現在把z'丟到一個function裡面,它會得到x'.
link |
28:00.180
現在我們要問的是,z'的probability density,π of z'跟x'的probability density,這個p of x',它們之間有什麼樣的關聯性?
link |
28:13.380
我們現在假設我們在這個π of z'附近取一個小小的正方形,假設這個小小的正方形之內的probability density都可以寫作π of z'.
link |
28:27.460
這個小小的正方形的寬是Δdy,高是Δdt。
link |
28:33.540
這一個小小的藍色正方形投影到這個x1、x2的space上面變成一個綠色的菱形,就是左下角跑到左下角,右上角跑到右上角,這一點可能跑到這一點,這一點可能跑到這一點。
link |
28:49.860
所以這個藍色的方形通過一個function以後變成綠色的菱形。
link |
28:57.220
好,那這個綠色的菱形的面積我們是可以算,假設這個綠色的菱形,這個邊,這個邊,這個向量,它底下這個邊的這個向量,它的x軸是Δx11,y軸是Δx21。
link |
29:17.460
這一個向量,它的x軸是Δx12,它的y軸是Δx22,這一個菱形的面積可以直接用這兩個向量所形成的矩陣的determinant的絕對值算出來。
link |
29:35.460
所以今天我們剛才有講過說,πz'乘以這個正方形的體積,就是πz'現在變成是這個正方形的高,第三位,就在跟投影片垂直的方向,只是在這個投影片上我畫不出來而已。
link |
29:49.780
這個πz'乘以正方形的面積要等於Px'乘以這個菱形的面積,所以式子寫出來就是這樣,這個πz'乘以Δz1乘以Δz2,跟Px'乘以這個菱形的面積,這個菱形的面積怎麼算呢?
link |
30:07.060
就是把這個向量跟這個向量拿出來當做matrix的兩個row,把Δx11,Δx21,Δx11,Δx21,跟Δx12,跟Δx22,Δx12,Δx22拿出來變成兩個向量再去determinant,再去絕對值,就是這個菱形的面積。
link |
30:24.900
把菱形的面積乘以Px'應該等於藍色方形的面積乘上πz',就這樣。假如這邊大家可以接受嗎?如果大家沒有問題的話,接下來就是對下面這個式子做一番整理就結束了。
link |
30:44.860
在進行整理之前呢,跟大家講一下,這個Δx11它是什麼意思呢?它是z1改變的時候x1的改變量。
link |
30:57.300
這個Δx21是什麼意思呢?它是z1改變的時候x2的改變量。Δx12是什麼意思呢?它是z2改變的時候x2的改變量,說錯了x1的改變量,它是z2改變的時候x1的改變量。
link |
31:13.780
那Δx22呢?它是z2改變的時候x2的改變量,這個是這四個Δx的含義。
link |
31:23.340
好,那接下來就是做一番整理。首先把Δz1跟Δz2除到左邊來。然後,接下來呢,你要把這個Δz1跟Δz2分別除進去determinant的第一個row跟第二個row。
link |
31:53.300
你把Δz1除第一個row,把Δz2除第二個row。你可能會問說,怎麼不是直接上下兩個row都除Δz1跟Δz2呢?沒有,為什麼?determinant的定義就是這樣,懂嗎?
link |
32:08.820
就是你把Δz1跟Δz2提出來,它們是會變成這個樣子的。就這一項跟這一項相等的,如果你這邊是上下都除Δz1跟Δz2,上下是不會相等的。
link |
32:26.660
這個有點難在正門課裡面解釋,假設你現今代數很熟的話,你就會知道說,這個應該就是這個樣子的。你把一個metric乘兩倍,它的determinant不是變成兩倍。
link |
32:38.260
如果這個metric是一個nxn的metric的話,你把它乘兩倍,它的determinant會變成二的n次方倍,determinant就是這麼回事。
link |
32:47.660
所以這邊,你要讓這個絕對值裡面的東西跟這個絕對值裡面的東西相等的話,那你是把Δz1除在第一個row,把Δz2除在第二個row,就這樣。
link |
33:03.420
那這個把Δx11除以Δz1是什麼意思呢?Δx11的意思是,當z1改變的時候,x1的改變量。
link |
33:15.060
所以Δx11除以Δz1就是z1對x1的偏微分。
link |
33:22.420
同理,Δx21是什麼?Δx21是z1改變的時候x2的改變量。
link |
33:28.580
所以Δx21除以Δz1就是z1對x2的偏微分。同理,下面這兩項也都可以分別化作是偏微分。
link |
33:37.740
接下來,我們把這個矩陣做transpose,一個矩陣做transpose不會改變它的determinant,所以我們可以放心地把這兩項做對調,不會改變它的determinant。
link |
33:57.420
接下來,這一項是什麼呢?這一項其實就是function f的Jacobian的matches。
link |
34:07.740
所以我們知道說,Px'跟Pyz'之間有什麼關係呢?
link |
34:13.260
你把Px'乘上現在這個x跟z之間的關係,這個function f的Jacobian match的determinant在一起絕對值,就變成Pyz'.
link |
34:24.980
所以Pyz'跟Px'之間的關係是可以寫出來的,它們中間就差一個Jacobian。
link |
34:32.100
你可以把這個Jacobian除到右邊去,然後這個Jacobian1除以determinant jf可以換成determinant jf的inverse。
link |
34:45.700
所以你就知道說,Pyz'要怎麼變成Px'呢?你把Pyz'乘以f inverse這個function的Jacobian,再去determinant,再去絕對值,就變成Px'.
link |
34:58.540
這個就是change of variable。
link |
35:01.260
如果剛才講的東西你沒有聽得很懂,那你唯一要做的事情就是背下來這兩個式子,
link |
35:09.140
知道說,如果今天z乘上一個function f會變成x,那z的distribution跟f的distribution,它們中間的關係就是差一個Jacobian的determinant的絕對值,就是這麼回事。
link |
35:23.020
好,接下來我們就進入flow的部分。
link |
35:28.540
把我們剛才學到的change of variable的式子呢,寫在右上角。
link |
35:34.700
好,那我們回到generation這件事。
link |
35:37.900
我們說generator是怎麼train出來的呢?
link |
35:41.260
generator訓練的目標就是要maximize Pg of xi,xi是從real data裡面sample出來的一粒data。
link |
35:51.140
我們叫maximize Pg of xi。
link |
35:54.300
那Pg of xi長什麼樣子呢?
link |
35:57.980
有了change of variable的formulation以後,我們就可以把Pg of xi寫出來了。
link |
36:04.500
因為Pg of xi等於pi of zi乘上g inverse的Jacobian的determinant再取絕對值。
link |
36:16.660
我們就帶這邊這個change of variable的式子,我們就得到Pg of xi跟pi of zi的關係。
link |
36:25.660
而zi是把xi帶進g inverse以後得到的結果,就是pi,把xi帶進g inverse以後的結果就是zi。
link |
36:37.900
那我們可以把這個Pg of xi取log,左右都取log。
link |
36:45.500
所以log Pg of xi等於log pi of,把這個zi換成g inverse of xi。
link |
36:54.300
等於pi of g inverse of xi加上log g inverse的Jacobian metric的determinant取絕對值。
link |
37:02.020
所以現在我們知道log Pg of xi長什麼樣子了,就是這個樣子。
link |
37:08.340
那我們只要能夠maximize這個式子,就結束了,就可以change generator。
link |
37:14.140
但是想要maximize這個式子,假設你要用gradient descent maximize這個式子,
link |
37:19.580
那你得知道這一個我們要maximize的function長什麼樣子。
link |
37:25.140
而要知道這個function長什麼樣子,有一些前提。
link |
37:29.700
有什麼樣的前提呢?首先你要知道怎麼算這個g inverse的Jacobian的determinant。
link |
37:38.780
或者是說你要知道怎麼算g的Jacobian的determinant。
link |
37:44.940
要算generator的Jacobian還比較有辦法,
link |
37:49.980
因為你只要知道你怎麼計算 partial z分之partial x,
link |
37:54.860
你怎麼計算z對x的變化,你就可以算g的Jacobian。
link |
37:58.780
但是這一個Jacobian metric可能很大,
link |
38:02.580
如果你今天input是1000微,output是1000微,
link |
38:06.620
那這個Jacobian metric就是1000乘1000那麼大。
link |
38:11.540
那這麼大的metric要算它的determinant是非常花時間的。
link |
38:17.540
2乘2的metric你會算determinant,3乘3你會算determinant,
link |
38:21.500
再大一點,運算量就非常可觀了。
link |
38:25.660
所以今天我們需要好好設計我們generator的樣子,
link |
38:30.820
讓它的Jacobian metric很容易算determinant的。
link |
38:35.340
那第二個條件是,今天我們需要能夠把si變成zi,
link |
38:42.580
所以我們必須要知道g inverse長什麼樣子。
link |
38:46.860
這個generator如果它是一個network的話,
link |
38:49.940
你要計算g of z不成問題,
link |
38:52.340
但是我們如何保證我們有辦法算g inverse呢?
link |
38:57.380
我們也要好好的設計一下network架構,
link |
38:59.980
讓g inverse變成是好算的,變成是容易算的,變成是可以算的。
link |
39:08.420
為了確保g它會是invertible的,
link |
39:12.540
所以其實在做flow based model的時候,
link |
39:15.300
z跟x它們的dimension都會是一樣的。
link |
39:20.780
所以假設說你現在是要做image的generation,
link |
39:24.140
那image通常一個pixel有三個channel,
link |
39:26.740
那假設現在你要產生的是100x100的大小的image,
link |
39:31.740
那你input的這個z它的大小也得是100x100x3才可以,
link |
39:39.220
你input的z跟output的x的dimension必須是一樣。
link |
39:44.060
它的input跟output的dimension是一樣,
link |
39:45.980
並不代表g一定是invertible,
link |
39:47.860
但如果它們不一樣的話,
link |
39:49.620
那g就不可能是invertible。
link |
39:51.900
所以今天至少z跟x的dimension必須是一樣。
link |
39:56.980
接下來我們會設計network架構,
link |
39:58.500
讓g inverse變成是很容易計算的。
link |
40:02.300
所以這個flow based model它跟game不太一樣。
link |
40:05.580
你知道在做game或在做VAE的時候,
link |
40:07.540
你的generator都是input一個low dimensional的vector,
link |
40:10.740
然後output一個high dimensional的vector,
link |
40:13.340
也就是z的dimension遠小於x,
link |
40:16.180
z的每一維它代表了某種我們產生image的時候的vector。
link |
40:21.580
但flow based model不是。
link |
40:23.180
flow based modelinput跟output,
link |
40:24.660
z跟x的dimension居然是一樣的。
link |
40:26.380
那這個是我覺得flow based model的問題,
link |
40:29.540
這一點是有點奇怪。
link |
40:33.500
好,然後現在既然我們要能夠算g的架構,
link |
40:36.460
變成determine跟算g inverse,
link |
40:38.620
我們顯然必須對g做一些限制。
link |
40:42.140
所以g它沒有辦法是任意的network,
link |
40:45.940
不像我們今天在做game或做VAE的時候,
link |
40:49.100
g可以是CNN也可以是RNN,
link |
40:52.180
它可以是任何的network,
link |
40:53.780
這並不影響我們的演算法。
link |
40:56.180
今天既然我們對g的network架構很大的限制,
link |
40:59.460
那麼就意味著g的能力是非常有限。
link |
41:03.900
既然g的能力很有限,那怎麼辦呢?
link |
41:07.500
一個g不夠,你有加第二個嗎?
link |
41:10.380
所以今天flow based model的flow的意思其實就是,
link |
41:13.940
它有一長串的g,
link |
41:16.500
就好像是一條河一樣,就叫做flow based model。
link |
41:20.420
所以我們的g1,
link |
41:21.780
g1它是pi of x當作input output p1 of x,
link |
41:25.980
接下來p1 of x變成g2的input產生p2 of x,
link |
41:30.220
p2 of x變成g3的input產生p3 of x,
link |
41:34.260
你可能會疊一大堆的generator,
link |
41:37.100
把這些generator通通合起來,
link |
41:39.100
單一個generator可能它的能力有限,
link |
41:42.100
但所有的generator它們catenate起來,
link |
41:45.220
所有的generatorcompose起來,
link |
41:47.460
那它們的能力應該就很可觀了。
link |
41:52.460
好,那我們現在看一下pi跟p1的關係,
link |
41:56.020
我們可以寫出來,
link |
41:57.500
pi of zi乘上g1的inverse的jacobian的determinant,
link |
42:02.980
再取絕對值就變成p1。
link |
42:05.500
那p2呢?
link |
42:06.540
p2就是pi of zi乘上g1的inverse的jacobian,
link |
42:11.180
再取determinant,再取絕對值,
link |
42:13.540
再乘上g2的inverse的jacobian,
link |
42:16.900
再取determinant,再取絕對值,
link |
42:18.900
最終就得到p2。
link |
42:20.900
那假設我們現在疊k一個generator,
link |
42:24.300
最終產生出來的distribution是pk,
link |
42:28.420
那這個pk怎麼算呢?
link |
42:29.940
你就把一堆generator的inverse的jacobian的determinant的絕對值
link |
42:35.300
通通乘起來,就得到了pk。
link |
42:40.180
好,那我們可以對pk取一下log啦,
link |
42:42.620
就左右同取log,
link |
42:44.620
那本來相乘就變成相加。
link |
42:48.020
好,那這個zi是什麼呢?
link |
42:50.020
這個zi就是你有sample到一個real data xi,
link |
42:54.220
把這個xi呢,通過gk的inverse,
link |
42:57.020
再通過gk-1的inverse,
link |
42:59.020
一直到通過g1的inverse,最終呢,就得到zi。
link |
43:04.900
那接下來我們在訓練的時候,
link |
43:06.900
我們是要maximize這個probability。
link |
43:10.420
那實際上,我們是怎麼train這個flow-based model的呢?
link |
43:14.980
我們先假設我們只有一個generator,
link |
43:17.980
我們先考慮一個generator的case,
link |
43:19.980
那時候多個generator其實也是一樣。
link |
43:22.460
你會發現說,
link |
43:24.460
在我們的這個pg of xi這個式子裡面,
link |
43:27.460
其實只有出現g-1,
link |
43:33.460
所以實際上我們在訓練的時候,
link |
43:36.460
我們訓練的是g-1,
link |
43:39.460
我們訓練出g-1以後,
link |
43:41.460
在生成的時候,
link |
43:43.460
我們把g-1倒過來用,搖身一變,
link |
43:46.460
本來是吃x產生z,
link |
43:48.460
但是搖身一變,把g倒過來,
link |
43:51.460
那就input z產生x了。
link |
43:54.460
那實際上在訓練的時候呢,
link |
43:57.460
我們會從real data裡面sample一些xi出來,
link |
44:00.460
然後把xi丟到g-1裡面,
link |
44:03.460
然後我們就得到zi。
link |
44:05.460
好,那我們現在來看看我們上面這個式子,
link |
44:07.460
這邊有兩項,
link |
44:09.460
第一項,我們希望把xi丟到g-1,
link |
44:12.460
inverse output的這個zi,
link |
44:14.460
可以讓log pi的zi越大越好。
link |
44:18.460
我們如果要讓第一項越大越好,
link |
44:20.460
怎麼做呢?
link |
44:21.460
最容易的做法是,
link |
44:22.460
因為我們知道pi是一個normal distribution,
link |
44:25.460
normal distribution,
link |
44:26.460
這個pi這個function,
link |
44:27.460
input什麼樣的東西,
link |
44:29.460
會讓算出來的機率最大呢?
link |
44:32.460
如果input zero vector,
link |
44:34.460
算出來的機率最大。
link |
44:37.460
所以今天如果我們單看第一項的話,
link |
44:40.460
generator,
link |
44:41.460
這個generator的inverse,
link |
44:42.460
它會想要做的事情,
link |
44:44.460
是讓output都變成zero vector。
link |
44:49.460
但是如果今天generator的inverse,
link |
44:51.460
output都是zero vector,
link |
44:53.460
那顯然是會非常大的問題的。
link |
44:56.460
好在我們還有第二項。
link |
44:59.460
第二項做的事情是什麼呢?
link |
45:01.460
如果今天zi真的通通都是零,
link |
45:04.460
如果你為了要maximize第一項,
link |
45:06.460
讓zi通通都變成零的話,
link |
45:09.460
那g-inverse的jacobian,
link |
45:11.460
就會變成zero matrix,
link |
45:13.460
因為你input不完,
link |
45:14.460
input什麼x,
link |
45:15.460
output通通都是零,
link |
45:16.460
input什麼東西,
link |
45:17.460
output都沒有用,
link |
45:18.460
output都不會動,
link |
45:19.460
input不完,
link |
45:20.460
input什麼東西,
link |
45:21.460
output都不會動,
link |
45:22.460
那你算出來的gradient當然是零,
link |
45:23.460
那g-inverse的jacobian,
link |
45:24.460
當然是zero matrix。
link |
45:26.460
zero matrix的determinant是零,
link |
45:30.460
如果這邊帶零進去,
link |
45:32.460
去log,
link |
45:33.460
你就會得到負無窮大,
link |
45:35.460
那這樣就沒有辦法maximize pg of xi,
link |
45:39.460
為了maximize pg of xi,
link |
45:41.460
我們必須同時考慮這兩項,
link |
45:44.460
一方面第一項,
link |
45:46.460
會讓所有的zi往原點集中,
link |
45:49.460
但是這一項又會要求,
link |
45:51.460
他對這個g-inverse做一些限制,
link |
45:53.460
讓他不會把所有的zi,
link |
45:55.460
通通都making到zero vector,
link |
45:58.460
這就是我們實際上,
link |
46:00.460
在做flow model的時候,
link |
46:01.460
所做的事情,
link |
46:02.460
使用的g叫做coupling layer,
link |
46:06.460
這個被用在兩個知名的flow based model,
link |
46:09.460
nice跟real MVP裡面,
link |
46:12.460
coupling layer的意思是說,
link |
46:14.460
你input是一個vector叫做z,
link |
46:16.460
output是一個vector叫做x,
link |
46:18.460
我們把z拆成兩部分,
link |
46:20.460
z的前d為一組,
link |
46:23.460
z的後d為另外一組,
link |
46:27.460
那z跟x中間有什麼樣的關係呢?
link |
46:30.460
x的前d為,
link |
46:32.460
是z的前d為,
link |
46:34.460
直接複製過去,
link |
46:36.460
等一下我會解釋說,
link |
46:37.460
為什麼直接複製過去,
link |
46:38.460
因為發生這樣的設計,
link |
46:39.460
就是為了要讓inverse,
link |
46:41.460
非常容易被計算,
link |
46:43.460
直接copy過去,
link |
46:45.460
接下來我們把前d為,
link |
46:48.460
通過某一個function f,
link |
46:50.460
得到一個跟後面這些維度,
link |
46:54.460
d為之後的東西,
link |
46:56.460
d為之後的東西,
link |
46:57.460
dimension一樣的vector,
link |
46:59.460
這個vector裡面的element,
link |
47:00.460
我們用beta d加1,
link |
47:02.460
到beta大d來表示,
link |
47:04.460
我們把這個前d為,
link |
47:06.460
也通過另外一個function h,
link |
47:08.460
他得到gamma d加1,
link |
47:10.460
跟gamma d,
link |
47:11.460
這邊的這個f跟h,
link |
47:13.460
可以是任意function,
link |
47:15.460
他不需要invertible,
link |
47:16.460
他要多複雜都可以,
link |
47:18.460
他可以是deep neural,
link |
47:19.460
可以疊個十層八層,
link |
47:21.460
可以是CNN,
link |
47:22.460
通通都沒問題,
link |
47:24.460
等一下會講說為什麼f跟h,
link |
47:26.460
他可以是任何function,
link |
47:28.460
不用是invertible,
link |
47:29.460
通通都沒問題,
link |
47:32.460
要多複雜都可以,
link |
47:34.460
接下來把這個vector,
link |
47:37.460
乘上這個vector,
link |
47:38.460
這個符號的意思是,
link |
47:40.460
這個element wise相乘的意思,
link |
47:42.460
把beta d加1乘上d d加1,
link |
47:44.460
到beta大d乘上d大d,
link |
47:47.460
然後再把這個vector,
link |
47:49.460
加上去,
link |
47:50.460
加上gamma這個vector,
link |
47:52.460
所以把gamma d加1,
link |
47:54.460
加上這兩個相乘,
link |
47:56.460
把gamma d加上這兩個相乘,
link |
47:58.460
就得到x d加1,
link |
48:00.460
到x大d,
link |
48:03.460
所以這個output的這個x,
link |
48:07.460
在e為之後的東西,
link |
48:09.460
就是zi乘上beta,
link |
48:10.460
再加上gamma,
link |
48:12.460
接下來要講說,
link |
48:13.460
這一個coupling layer,
link |
48:15.460
怎麼取他的invert,
link |
48:17.460
他的invert非常的簡單,
link |
48:20.460
如果我們現在不知道前面的z,
link |
48:23.460
只有後面的x,
link |
48:24.460
怎麼把前面的z找出來呢?
link |
48:26.460
前面的z的前d為非常容易找,
link |
48:29.460
直接複製過來就好,
link |
48:31.460
把x的前d為複製過來,
link |
48:34.460
就是z的前d為,
link |
48:36.460
那剩下的zd加1到z大d,
link |
48:39.460
要怎麼找呢?
link |
48:40.460
你既然已經找出前d為了,
link |
48:42.460
把前d為通過這兩個function,
link |
48:44.460
這兩個function不需要是invertible了,
link |
48:46.460
他們是正向的,
link |
48:47.460
直接算,
link |
48:48.460
把這個vector通過這兩個function,
link |
48:51.460
f跟h,
link |
48:52.460
你就得到beta跟gamma,
link |
48:54.460
現在你把這個x減掉gamma,
link |
48:59.460
再除以beta就得到z,
link |
49:01.460
剛才我們是把z乘上beta,
link |
49:03.460
再加上gamma得到x,
link |
49:05.460
現在我們把x減掉gamma,
link |
49:07.460
再除以beta就得到z,
link |
49:09.460
所以我們現在有x,
link |
49:11.460
你就可以輕易的把z算出來,
link |
49:13.460
所以這個function design,
link |
49:14.460
讓你可以非常容易的,
link |
49:16.460
把它的inverse算出來,
link |
49:18.460
這是第一件事,
link |
49:20.460
再來我們說,
link |
49:21.460
不只要能夠算inverse,
link |
49:23.460
還要能夠算Jacobian的determinant,
link |
49:26.460
好,這個carbon layer,
link |
49:28.460
怎麼算Jacobian的determinant呢?
link |
49:31.460
它是這樣算的,
link |
49:33.460
這個是input的z,
link |
49:36.460
這個是input的z,
link |
49:38.460
這個是output的x,
link |
49:40.460
這是output的x,
link |
49:41.460
z可以分成兩半,
link |
49:43.460
x也可以分成兩半,
link |
49:45.460
接下來我們先看,
link |
49:47.460
這個半部跟這個半部,
link |
49:50.460
這個半部對這個半部的Jacobian,
link |
49:54.460
長什麼樣子呢?
link |
49:56.460
這個半部對這個半部的Jacobian,
link |
49:58.460
就是identity matrix,對不對?
link |
50:01.460
因為你是直接把z1copy變成x1,
link |
50:05.460
你直接把zdcopy變成xd,
link |
50:07.460
所以今天z1跟zd是完全沒有關係的,
link |
50:10.460
今天zd跟x1是完全沒有關係的,
link |
50:13.460
所以除了對角線的值是1以外,
link |
50:15.460
其他部分通通都是0,
link |
50:18.460
淺藍色的這個vector,
link |
50:20.460
就是淺綠色這個vector,
link |
50:22.460
複製過來的結果,
link |
50:23.460
你改變深綠色vector這裡面的值,
link |
50:25.460
不會影響淺綠色vector裡面的值,
link |
50:27.460
你改變這個部分的值,
link |
50:29.460
根本不會改變這個部分的值,
link |
50:31.460
所以你拿這裡面的element,
link |
50:32.460
去對這裡面的element,
link |
50:34.460
都偏為分你得到的是0,
link |
50:36.460
所以這邊是zero vector,
link |
50:38.460
那左下角呢?
link |
50:40.460
左下角I don't care這樣子,
link |
50:43.460
為什麼I don't care呢?
link |
50:45.460
因為如果左上角是identity matrix,
link |
50:49.460
這邊是zero vector的話,
link |
50:51.460
這整個matrix的determinant,
link |
50:53.460
會等於右下角這個部分的determinant,
link |
50:57.460
你說為什麼?
link |
50:59.460
就是這個東西的determinant,
link |
51:02.460
就是這個東西的determinant這樣子,
link |
51:06.460
如果這邊是identity matrix,
link |
51:08.460
這邊是zero matrix,
link |
51:10.460
這整個灰色大的matrix的determinant,
link |
51:13.460
就等於右下角的determinant,
link |
51:15.460
所以我現在唯一在意的,
link |
51:16.460
就是右下角這個部分,
link |
51:18.460
長什麼樣子?
link |
51:20.460
只要知道右下角長什麼樣子,
link |
51:21.460
右下角這個matrix的determinant,
link |
51:23.460
算得出來,
link |
51:24.460
那它等於大的matrix的determinant,
link |
51:26.460
右下角這個matrix,
link |
51:28.460
它是diagonal的,
link |
51:31.460
它是diagonal的,
link |
51:32.460
為什麼它是diagonal的呢?
link |
51:34.460
因為我們先把這兩個vector之間的關係,
link |
51:38.460
把它畫出來,
link |
51:39.460
因為xi等於就是,
link |
51:43.460
深藍色的vector裡面的x,
link |
51:45.460
等於深綠色裡面的z,
link |
51:48.460
乘上β加上γ,
link |
51:50.460
所以今天zd加1只跟xd加1有關,
link |
51:53.460
z大d只跟x大d有關,
link |
51:55.460
zd加1跟x大d沒有關係,
link |
51:57.460
z大d跟xd加1也沒有關係,
link |
52:00.460
所以只有對角線的地方,
link |
52:01.460
是有值的其他地方,
link |
52:03.460
都是0,
link |
52:05.460
一個matrix,
link |
52:06.460
如果它是diagonal的,
link |
52:08.460
你算它的determinant,
link |
52:09.460
你就只要把對角線乘起來就好了,
link |
52:12.460
你只要把對角線乘起來就好了,
link |
52:14.460
所以今天這整個matrix,
link |
52:17.460
這整個Jacobian matrix的determinant,
link |
52:19.460
就是這一個右下角的matrix的對角線相乘,
link |
52:22.460
也就是把zd1對xd加1的偏微分乘上,
link |
52:27.460
zd2對xd加2的偏微分乘到z大d對x大d的偏微分,
link |
52:35.460
而這邊每一項偏微分是什麼呢?
link |
52:38.460
這邊每一項偏微分就是β,
link |
52:41.460
所以今天這個Jacobian的determinant,
link |
52:44.460
原來就是f這個function,
link |
52:46.460
output的這個element相乘,
link |
52:48.460
就是Jacobian了,
link |
52:50.460
結束這樣子,
link |
52:52.460
所以今天如果這個coupling layer,
link |
52:55.460
它的Jacobian也是,
link |
52:57.460
它的Jacobian的determinant,
link |
52:59.460
也是可以輕易的被算出來的,
link |
53:02.460
那也許左下角非常的複雜,
link |
53:04.460
因為我們說f跟h可以是任意複雜的function,
link |
53:08.460
因為這邊有一些些變動,
link |
53:11.460
那通過了這麼複雜的function以後,
link |
53:13.460
這邊的變動一定很複雜,
link |
53:14.460
但I don't care,
link |
53:15.460
反正我算determinant的時候,
link |
53:17.460
也是用不到左下角這個地方。
link |
53:19.460
好,那我們會把這些coupling layer疊起來,
link |
53:23.460
變成一個完整的generator,
link |
53:26.460
當我們把這些coupling layer疊起來的時候,
link |
53:29.460
會有一個莫名其妙的問題,
link |
53:31.460
這個莫名其妙的問題是什麼呢?
link |
53:33.460
我們說我們在這個coupling layer的input跟output的關係,
link |
53:36.460
都是把前半段直接複製過來,
link |
53:38.460
所以如果第一層直接複製過去,
link |
53:40.460
第二層直接複製過去,
link |
53:42.460
第三層也直接複製過去,
link |
53:44.460
最後就是什麼都沒有做這樣子,
link |
53:46.460
所以你會發現說,你這個output的image的前面的部分,
link |
53:50.460
就是input的noise,
link |
53:52.460
假設這邊這個部分對應到image的左上角的話,
link |
53:56.460
你的左上角就是個noise,
link |
53:58.460
這樣顯然不是我們要的。
link |
54:01.460
所以在疊這個coupling layer的時候,
link |
54:03.460
要做一些手腳,
link |
54:05.460
舉例來說一個可以做的手腳是,
link |
54:07.460
故意把它反向,
link |
54:10.460
就是第一個coupling layer是複製前面,
link |
54:14.460
第二個coupling layer就變成複製後面,
link |
54:17.460
第三個coupling layer再變成複製前面,
link |
54:19.460
這樣子你第一個layer到第二個layer這邊複製過來,
link |
54:22.460
下面這邊也複製過來,
link |
54:24.460
上面這邊再複製過來,
link |
54:26.460
但是你就不會把原來input的這邊,
link |
54:28.460
等於原來最開始的地方,
link |
54:30.460
這個是從那個random的Gaussian noise sample出來的,
link |
54:33.460
你就不會把Gaussian noise一直帶到最後的output,
link |
54:36.460
因為Gaussian noise只帶到第一層以後,
link |
54:38.460
它就會通過transform,就會變成別的東西了。
link |
54:40.460
我們再講更具體一點,
link |
54:42.460
如果你今天要做的是影像的生成的話,
link |
54:46.460
所以一般我們在做game的時候,
link |
54:48.460
很常用的application就是生成image,
link |
54:50.460
如果我們今天要做的是image的生成的話,
link |
54:53.460
那你怎麼把一張image拆成兩半,
link |
54:57.460
一半copy,一半做一些其他事情呢?
link |
55:01.460
那有兩種拆法,
link |
55:03.460
一種拆法是你把image裡面,
link |
55:06.460
index有兩個嘛,有縱軸跟橫軸的index,
link |
55:12.460
縱軸跟橫軸加起來是偶數的copy,
link |
55:17.460
奇數的不copy做transform,
link |
55:20.460
這是一個做法,
link |
55:22.460
你可能有些layer是奇數的copy,
link |
55:24.460
偶數的做transform,
link |
55:26.460
有些layer是偶數的copy,奇數的做transform,
link |
55:29.460
或者是現在一張image通常都有三個channel,
link |
55:35.460
RGB三個channel,
link |
55:36.460
因為output RGB三個channel,
link |
55:37.460
你input的每一層通通都會是有三個channel的,
link |
55:40.460
那你就其中某幾個channel做copy,
link |
55:44.460
某幾個channel做transform,
link |
55:46.460
那每次copy的channel跟transform的channel,
link |
55:49.460
可能每一層都是不一樣,
link |
55:51.460
那在實作的時候,
link |
55:53.460
這兩種case你也可以交替使用,
link |
55:55.460
你有時候是這樣,有時候是這樣,
link |
55:57.460
他們可以交替使用,
link |
55:59.460
coupling layer是一個例子,
link |
56:03.460
第二個例子叫做1乘以1的convolution,
link |
56:08.460
這是用在一個非常知名的flow based model叫做glow裡面,
link |
56:14.460
那之所以最近flow用,
link |
56:16.460
flow這個model其實很早已經被提出來了,
link |
56:18.460
舉例來說我們剛才講的nice或real MVP,
link |
56:20.460
都是14年15年的東西,
link |
56:22.460
那就是四五年前了,
link |
56:24.460
所以在我們deep learning這個community,
link |
56:26.460
四五年前的東西就是上古時代的東西,
link |
56:29.460
上古時代的東西為什麼最近又被挖出來在講呢?
link |
56:33.460
那就是因為有flow這個model,
link |
56:35.460
flow這個model是去年被提出來的,
link |
56:38.460
那它的結果很驚人,
link |
56:40.460
我是覺得它的結果應該是還沒有game看起來產生的image quality那麼高啦,
link |
56:45.460
但是重點就是說,
link |
56:46.460
哇靠你不用game也可以做到這樣,
link |
56:48.460
有它的感覺是這樣,
link |
56:49.460
你這個不是用game生成的,
link |
56:50.460
怎麼會產生出來的image會這麼清楚這樣子,
link |
56:54.460
那flow這個model裡面,
link |
56:56.460
它有一種除了剛才講的coupling layer以外,
link |
56:58.460
它還有一個神奇的layer叫做1乘以1的convolution layer,
link |
57:03.460
這是你的input Z,
link |
57:06.460
這是你的output X,
link |
57:08.460
我們知道這個,
link |
57:09.460
因為我們現在要產生的是image,
link |
57:11.460
那每一張image就是由很多pixel所組成的,
link |
57:14.460
每一個pixel裡面都有RGB三個value,
link |
57:17.460
每一個pixel裡面都有RGB三個value,
link |
57:20.460
在flow這個model裡面,
link |
57:23.460
它的1乘以1的convolution,
link |
57:25.460
就是把這邊的每一個pixel裡面的三個value,
link |
57:33.460
乘上一個3乘以3的matrix,
link |
57:37.460
變成output的對應到同樣位置的pixel的三個value,
link |
57:43.460
就是你把這三個value,
link |
57:45.460
乘上一個3乘以3的matrix,
link |
57:47.460
還是3乘以3的vector對不對,
link |
57:49.460
你把這個3乘以3的vector,
link |
57:51.460
乘上這個matrix,
link |
57:52.460
還是3乘以3的vector,
link |
57:53.460
那它本來放在最左上角,
link |
57:55.460
就把它放到最左上角,
link |
57:57.460
那第二個pixel的三個value,
link |
57:59.460
乘上這個matrix,
link |
58:00.460
再變成另外三個value,
link |
58:02.460
就把它放在第二個pixel的位置,
link |
58:04.460
所以整張image都做同樣的事情。
link |
58:08.460
那這個W有什麼涵義呢?
link |
58:10.460
這個W隱含著一個意思,
link |
58:12.460
當然實際上這個W是認出來的,
link |
58:14.460
並不是人手design的,
link |
58:16.460
並不是人手設計的,
link |
58:17.460
但它很有可能做到的意思是,
link |
58:19.460
它可以shuffle不同的channel,
link |
58:23.460
它可以把不同的channel之間的關係,
link |
58:25.460
進行對調,
link |
58:26.460
所以如果你有1乘以1的convolution,
link |
58:28.460
那你的copy layer,
link |
58:30.460
可以就固定說,
link |
58:31.460
我都只copy第一個channel,
link |
58:34.460
反正現在有1乘以1的convolution,
link |
58:36.460
會在適當的時機,
link |
58:38.460
把不同的channel進行對調。
link |
58:42.460
舉例來說,
link |
58:43.460
假設你今天認出來的W,
link |
58:45.460
長的是這個樣子,
link |
58:47.460
每一個row,
link |
58:49.460
只有一維是1,
link |
58:51.460
其他都是0。
link |
58:53.460
你現在的input,
link |
58:54.460
你現在的input的這三個value,
link |
58:56.460
是1,2,3,
link |
58:57.460
那通過這個3乘以3的matrix,
link |
58:59.460
會得到什麼東西呢?
link |
59:01.460
會變成3,1,2,
link |
59:02.460
把這個vector乘上這個matrix,
link |
59:04.460
變成3,1,2,
link |
59:05.460
等於就是你把,
link |
59:06.460
本來第三個channel的東西,
link |
59:08.460
挪到第一個channel,
link |
59:09.460
把第一個channel的東西,
link |
59:10.460
挪到第二個channel,
link |
59:11.460
把第二個channel的東西,
link |
59:12.460
挪到第三個channel,
link |
59:13.460
你等於就是,
link |
59:14.460
你去自己認說,
link |
59:17.460
他要怎麼交換這些channel的位置。
link |
59:18.460
而copy and layer就不要動它,
link |
59:19.460
copy and layer可能都,
link |
59:20.460
只固定copy某幾個channel,
link |
59:22.460
但是channel中間要怎麼交換,
link |
59:24.460
讓W自己學出來。
link |
59:27.460
好,那這個東西,
link |
59:29.460
也是我們的G,
link |
59:30.460
它也必須要是invertible的。
link |
59:34.460
那這個東西,
link |
59:35.460
能夠invertible嗎?
link |
59:37.460
如果W是一個invertible的matrix,
link |
59:40.460
那它就是invertible的,
link |
59:43.460
對不對?
link |
59:44.460
如果W是一個invertible的matrix,
link |
59:46.460
給你X,
link |
59:47.460
你就可以還原回憶,
link |
59:50.460
對不對?
link |
59:51.460
我想這個大家應該都沒有問題吧?
link |
59:52.460
而且,
link |
59:53.460
W它只是一個三乘以三的matrix,
link |
59:55.460
三乘以三的matrix,
link |
59:56.460
它的inverse是有公式解的,
link |
59:58.460
直接帶進去一個公式,
link |
01:00:00.460
output就是它的inverse。
link |
01:00:03.460
但是W認完,
link |
01:00:04.460
W是自動認出來的,
link |
01:00:05.460
認出來一定是invertible的嗎?
link |
01:00:09.460
GLOW這邊paper沒講,
link |
01:00:13.460
你知道答案就跟我講好了。
link |
01:00:16.460
它在initialize的時候,
link |
01:00:18.460
它故意把W用一個invertible的matrix去做initialize,
link |
01:00:24.460
也許它期待說,
link |
01:00:25.460
如果initialize的時候是invertible的,
link |
01:00:28.460
認完以後它仍然是invertible的,
link |
01:00:30.460
但會不會有認完以後,
link |
01:00:32.460
突然invertible的情形出現,
link |
01:00:34.460
這個就很難講這樣子。
link |
01:00:38.460
但是,
link |
01:00:39.460
另外一方面而言,
link |
01:00:41.460
invertible這件事情是比較容易出現的,
link |
01:00:44.460
就你隨機sample一個matrix,
link |
01:00:46.460
通常都是invertible的。
link |
01:00:48.460
你隨機sample一個matrix,
link |
01:00:49.460
要是正好不能inverse,
link |
01:00:52.460
是比較難的。
link |
01:00:53.460
為什麼?
link |
01:00:54.460
你想想看,
link |
01:00:55.460
一個matrix不能inverse的條件是什麼?
link |
01:00:58.460
它determinant正好算出來是0,
link |
01:01:00.460
才會不能inverse。
link |
01:01:02.460
那determinant只要算出來是別的值,
link |
01:01:04.460
通通都可以inverse。
link |
01:01:05.460
所以你隨便sample一個matrix,
link |
01:01:08.460
通常都是可以inverse的。
link |
01:01:10.460
所以也許一個matrix,
link |
01:01:12.460
能不能,
link |
01:01:13.460
這個w是不是invertible,
link |
01:01:15.460
問題不大,
link |
01:01:16.460
因為可能隨便論一論都是invertible的。
link |
01:01:19.460
總之,
link |
01:01:20.460
我在paper裡面沒有看到太多這方面的解釋,
link |
01:01:23.460
如果你知道的話,
link |
01:01:24.460
你再告訴我好了。
link |
01:01:29.460
好,
link |
01:01:30.460
接下來我們要看說,
link |
01:01:32.460
從這個地方到這個地方,
link |
01:01:35.460
它的Jacobian的determinant,
link |
01:01:38.460
好不好算?
link |
01:01:39.460
它的Jacobian的determinant,
link |
01:01:41.460
好不好算?
link |
01:01:42.460
我們先來考慮一個比較簡單的case。
link |
01:01:44.460
假設有一個簡單的function叫做f,
link |
01:01:46.460
這個簡單的function,
link |
01:01:47.460
f做的事情就是,
link |
01:01:48.460
把z乘上一個3乘以3的matrix w得到x。
link |
01:01:52.460
也就是說,
link |
01:01:53.460
這個f它做的事情,
link |
01:01:55.460
就像右上角這個樣子。
link |
01:01:58.460
那它的Jacobian長什麼樣子呢?
link |
01:02:00.460
它的Jacobian直接就是w,
link |
01:02:04.460
直接就是w。
link |
01:02:06.460
就是假設你把一個三維的vector z,
link |
01:02:10.460
乘上一個matrix w,
link |
01:02:12.460
得到三維的vector x,
link |
01:02:15.460
那這個function f,
link |
01:02:17.460
它Jacobian長什麼樣子,
link |
01:02:18.460
你就自己算一算,
link |
01:02:19.460
它的Jacobian就直接是這個w,
link |
01:02:22.460
它的Jacobian就直接是這個w。
link |
01:02:25.460
所以現在,
link |
01:02:27.460
這個全部的input這個z,
link |
01:02:30.460
跟全部的output這個x,
link |
01:02:32.460
假設你有一個generator g,
link |
01:02:35.460
把這邊東西吃進去,
link |
01:02:36.460
但實際上做operation很簡單,
link |
01:02:38.460
就是每一個pixel通通都乘上w,
link |
01:02:41.460
得到output的這個x。
link |
01:02:42.460
你把這個東西吃進去,
link |
01:02:44.460
得到這個output的x,
link |
01:02:45.460
它的generator的Jacobian長什麼樣子呢?
link |
01:02:49.460
它的generator的Jacobian就是,
link |
01:02:51.460
對角線的地方,
link |
01:02:52.460
放一大堆3乘以3的matrix w,
link |
01:02:55.460
放一大堆3乘以3的matrix w。
link |
01:02:57.460
因為這邊,
link |
01:02:58.460
假設這邊的每一個vector,
link |
01:03:00.460
都是一個三維的vector,
link |
01:03:01.460
它們都代表在這個image,
link |
01:03:03.460
上面的一個position的話,
link |
01:03:05.460
只有對應到同樣的position的,
link |
01:03:08.460
藍色跟綠色的vector是有關係的,
link |
01:03:12.460
只有對應到同樣position的,
link |
01:03:14.460
藍色跟綠色的vector是有關係的,
link |
01:03:17.460
而這個vector跟它就沒有任何關係,
link |
01:03:20.460
所以只有對角線的地方,
link |
01:03:22.460
你要放matrix w,
link |
01:03:24.460
讓其他地方始終填底。
link |
01:03:26.460
這一個Jacobian的matrix,
link |
01:03:30.460
它的determinant是什麼呢?
link |
01:03:32.460
如果你線性代數夠好的話,
link |
01:03:34.460
它的determinant就是,
link |
01:03:35.460
w的determinant的d乘以d次方,
link |
01:03:38.460
假設這邊有d乘以d的三維的vector,
link |
01:03:41.460
假設這個image的resolution,
link |
01:03:43.460
它的解析度是d乘以d,
link |
01:03:45.460
總共有d乘以d的pixel的話,
link |
01:03:47.460
那這一個matrix,
link |
01:03:48.460
它的Jacobian就是,
link |
01:03:50.460
它的Jacobian的determinant,
link |
01:03:52.460
這個Jacobian的determinant,
link |
01:03:54.460
就是w的determinant的d乘以d次方,
link |
01:03:58.460
那這個如果你熟悉線性代數的話,
link |
01:04:01.460
你就知道為什麼,
link |
01:04:02.460
如果你不熟悉線性代數的話,
link |
01:04:03.460
你就不知道為什麼,
link |
01:04:04.460
反正它就是長這個樣子就是了,
link |
01:04:06.460
那w的determinant能不能夠算呢?
link |
01:04:08.460
可以算的,
link |
01:04:09.460
因為w是一個三乘以三的矩陣,
link |
01:04:12.460
三乘以三的矩陣的determinant的公式,
link |
01:04:14.460
高中就教過你了,
link |
01:04:16.460
你只是把它再乘以一個d乘以d次方而已,
link |
01:04:19.460
這個你是可以算的,
link |
01:04:21.460
就這樣。
link |
01:04:23.460
好,那剛才講說flow-based model,
link |
01:04:26.460
現在有一個很知名的結果,
link |
01:04:28.460
就是Glow那個model,
link |
01:04:30.460
那Glow那個model的結果真的很好,
link |
01:04:32.460
那你可以google一下,
link |
01:04:33.460
這個OpenAI有做一個Glow的model的demo的website,
link |
01:04:36.460
它是把它圈在那個select a那個coder上,
link |
01:04:39.460
就可以拿它來生成人臉,
link |
01:04:41.460
那幾年前生成人臉這個case還非常的潮,
link |
01:04:44.460
不過現在可能看起來就是沒那麼潮就是了,
link |
01:04:47.460
那在OpenAI的那個demo website上,
link |
01:04:49.460
你就可以做到的事情是,
link |
01:04:50.460
比如說你可以把兩張人臉mix在一起,
link |
01:04:53.460
舉例來說,這邊有這個志玲姐姐的臉,
link |
01:04:56.460
跟她的老公,一個日本人,
link |
01:04:58.460
我也忘記名字的臉這樣子。
link |
01:05:00.460
好,那我們把志玲姐姐的臉呢,
link |
01:05:02.460
通過generator的inverse,
link |
01:05:04.460
你就會得到她的Z,叫做Z1,
link |
01:05:07.460
你把她的老公通過G-inverse,
link |
01:05:09.460
你就會得到Z2,
link |
01:05:11.460
你再把Z1跟Z2做平均,
link |
01:05:14.460
然後再把這個平均的vector,
link |
01:05:16.460
就是你可以想像說,
link |
01:05:17.460
如果他們的小孩應該長什麼樣子,
link |
01:05:19.460
就是這兩個vector的平均,
link |
01:05:21.460
通過generator以後,
link |
01:05:23.460
我發現是長這樣子啦。
link |
01:05:27.460
這個厲害的地方是什麼呢?
link |
01:05:29.460
就是我刻意剪一個臉,
link |
01:05:31.460
它是看左邊的,它是看右邊的,
link |
01:05:33.460
合起來居然是自動知道要看中間這樣,
link |
01:05:37.460
雖然一半邊是黑的,一半邊是白的,
link |
01:05:39.460
背景有點奇怪,
link |
01:05:41.460
但是它自動知道,
link |
01:05:42.460
是看左邊的臉跟看右邊的臉,
link |
01:05:44.460
做interpolation,做結合以後,
link |
01:05:46.460
就變成是看中間的臉。
link |
01:05:49.460
那它在demo webpage上面,
link |
01:05:51.460
也有一個功能是,
link |
01:05:53.460
可以把臉做種種的變形,
link |
01:05:55.460
比如說變金頭髮,
link |
01:05:57.460
或者是讓一個人笑起來。
link |
01:05:59.460
怎麼讓一個人笑起來呢?
link |
01:06:00.460
它的做法是這樣,
link |
01:06:01.460
你必須要先收集一堆不笑的臉,
link |
01:06:04.460
然後再收集一堆笑的臉,
link |
01:06:06.460
這個部分是需要人去label的,
link |
01:06:08.460
你需要收集一堆笑的臉跟一堆不笑的臉,
link |
01:06:11.460
然後把不笑的臉的Z都找出來取一個平均,
link |
01:06:15.460
把笑的臉的Z都找出來取一個平均,
link |
01:06:17.460
你把這兩個平均相減,
link |
01:06:19.460
你就知道Z的space裡面,
link |
01:06:21.460
往什麼方向移動,
link |
01:06:23.460
會讓一張臉笑起來。
link |
01:06:25.460
所以你現在就給它看一張臉,
link |
01:06:27.460
其實這個臉本來已經在笑了,
link |
01:06:29.460
這是一個死臭酸宅,
link |
01:06:30.460
這只是皮笑肉笑而已,
link |
01:06:32.460
然後把它通過一個G的inverse,
link |
01:06:35.460
得到一個vector Z,
link |
01:06:37.460
把Z再加上Z smile,
link |
01:06:40.460
然後再通過generator,
link |
01:06:42.460
它就笑起來了,
link |
01:06:44.460
你看這邊,
link |
01:06:46.460
它就笑起來了,
link |
01:06:47.460
這邊牙齒就變比較多,
link |
01:06:48.460
你看牙齒變得很雪白了,
link |
01:06:50.460
就笑起來了,
link |
01:06:52.460
總之這個demo的webpage在這邊。
link |
01:06:56.460
好,那這個Glow還可以做什麼事呢?
link |
01:06:58.460
Glow現在最常做的應用就是拿來做語音合成,
link |
01:07:02.460
我們剛才講說語音合成,
link |
01:07:04.460
不知道為什麼到目前為止,
link |
01:07:05.460
用Game都做得都很差,
link |
01:07:07.460
不知道為什麼就很慘這樣子,
link |
01:07:08.460
用Game做語音合成,
link |
01:07:10.460
總是沒有特別好的結果。
link |
01:07:13.460
那Auto Requested Model,
link |
01:07:14.460
就是一個一個sample產生出來的結果很好,
link |
01:07:16.460
但剛才問題有講過說,
link |
01:07:18.460
產生一秒聲音要90分鐘,
link |
01:07:19.460
這個實用上怎麼可能呢?
link |
01:07:21.460
所以要用Glow的Model,
link |
01:07:23.460
比如說這邊有Glow的變形,
link |
01:07:25.460
一個叫Paramount Web Name,
link |
01:07:26.460
一個叫Web Go,
link |
01:07:27.460
來做語音的生成。
link |
01:07:30.460
好,那這個就是Glow的部分,
link |
01:07:33.460
那因為時間的關係,
link |
01:07:35.460
我們就趕快停在這邊,
link |
01:07:37.460
接下來要請作業前五名的同學上台來講一下,
link |
01:07:40.460
他們是怎麼做的。
link |
01:07:43.460
我們這邊先休息個三分鐘,
link |
01:07:46.460
然後馬上就回來。