back to index

GAN Lecture 4 (2018): Basic Theory


link |
00:01.000
各位同學大家好,那我們就來上課吧。
link |
00:05.000
那上週我們講了什麼呢?上週我們講了Gan的直觀的想法。
link |
00:12.000
那今天呢,我們要來講Gan背後的理論。
link |
00:16.000
那我們今天要講的是當初2014年Ian Goodfellow在propose Gan的時候他的想法。
link |
00:22.000
那等一下可以仔細聽看看,聽看看說跟我們上週講的Gan的直觀的想法裡面,
link |
00:28.000
有沒有矛盾的地方,其實是有一些地方還不矛盾的。
link |
00:34.000
至今仍然沒有好的solution,沒有好的說法可以解決。
link |
00:38.000
欸你說,可以開冷氣嗎?
link |
00:41.000
呃,好啊,這樣子開就好。
link |
00:48.000
好,等一下大家有什麼問題要問嗎?
link |
00:50.000
好,如果大家沒有什麼問題要問的話呢,
link |
00:58.000
那我們就來講一下這個Gan背後的理論,當初Ian Goodfellow是怎麼說的。
link |
01:06.000
好,那這個是我們上週說的,要大家在這個作業三之一裡面,
link |
01:11.000
要讓Gan做的事情,就讓自己看了很多動畫的圖以後呢,
link |
01:15.000
自己產生二次元人物的頭像。
link |
01:19.000
那我們知道說,Gan他要做的事情,就是根據很多example去進行生成。
link |
01:26.000
那所謂生成這件事情,到底是一個什麼樣的問題呢?
link |
01:31.000
而假設我們今天要生成的東西是image,那我們用X來代表一張image。
link |
01:39.000
那每一個image都是high dimensional,高維空間中的一個點。
link |
01:44.000
那假設今天產生64x64的image,它是64x64維空間中的一個點。
link |
01:49.000
那這邊呢,為了畫圖方便,我們假設每一個X就是二維空間中的一個點。
link |
01:54.000
所以它實際上呢,是高維空間中的一個點。
link |
01:58.000
好,那我們現在要產生的東西,比如說我們要產生的image,
link |
02:03.000
它其實有一個固定的distribution,我們這邊呢,寫成pdata.x。
link |
02:10.000
它有一個固定的distribution,什麼意思呢?
link |
02:14.000
在這整個image的space裡面,在這整個image所構成的高維空間中,
link |
02:20.000
其實只有非常少的部分,其實只有一小部分,
link |
02:25.000
它sample出來的image看起來像是人臉。
link |
02:30.000
在多數的空間中sample出來的image,它都不像是人臉。
link |
02:35.000
舉例來說,在這個圖上的例子裡面,可能只有藍色的這個區域,
link |
02:40.000
你去sample出x,去sample一個image,它看起來呢,像是人臉。
link |
02:45.000
舉例來說,你在這個地方sample呢,你看起來的圖片長得是這個樣子。
link |
02:50.000
那你在其他地方sample呢,看起來的圖片,看起來就不像是人臉。
link |
02:56.000
所以假設我們今天要生存的x是人臉的話,它有一個固定的distribution,
link |
03:01.000
這個distribution在藍色的這個區域,它的機率是高的,
link |
03:06.000
在藍色區域以外,它的機率是低的。
link |
03:10.000
那我們今天要機器做的事情是什麼呢?
link |
03:13.000
我們要機器去找出這個distribution,
link |
03:17.000
而這個distribution它到底長什麼樣子,我們實際上是不知道的。
link |
03:22.000
我們可以收集很多的image,我們可以收集很多的x,
link |
03:26.000
知道說x可能在某些地方分布比較高,但是要我們把它的式子找出來,
link |
03:32.000
我們是不知道要怎麼做的。
link |
03:34.000
所以現在GAN做的事,一個generative model做的事情,
link |
03:38.000
就是要找出這個distribution。
link |
03:40.000
那在有GAN之前,我們怎麼做generative這件事呢?
link |
03:45.000
我們是用maximum likelihood estimation,
link |
03:48.000
那其實maximum likelihood estimation我們在這個,
link |
03:51.000
之前Machine Learning的時候有講過了,這邊只是一個很快的複習。
link |
03:56.000
而我們現在有一個data的distribution,它是data的base,
link |
04:01.000
這個distribution實際上長什麼樣子,
link |
04:03.000
就是這個distribution它實際上它的formulation長什麼樣子,
link |
04:08.000
我們是不知道的。
link |
04:10.000
我們可以從裡面sample它,所謂從這個distributionsample它的意思就是,
link |
04:14.000
假設你做的是二次元人物的生成,
link |
04:17.000
那你就是從你的data base裡面sample出image,
link |
04:20.000
這個就是從這個distribution裡面sample一些data出來。
link |
04:24.000
我們可以sample它,但是我們不知道它長什麼樣子。
link |
04:28.000
好,那接下來我們要自己去找一個distribution,
link |
04:32.000
這個distribution寫成P下標Geobase,
link |
04:36.000
那這個distribution是由一組參數Theta所操控的,
link |
04:41.000
所謂由Theta所操控的意思是說,
link |
04:43.000
這個distribution舉例來說,假設它是一個Gaussian mixture的model,
link |
04:48.000
那這個Theta指的就是那個Gaussian的mean跟variance。
link |
04:53.000
那我們要去調整這個Gaussian的mean跟variance,
link |
04:56.000
使得我們得到的這個distribution Pg跟真實的distribution Pdata越接近越好。
link |
05:03.000
所以雖然我們不知道Pdata長什麼樣子,
link |
05:06.000
我們只能夠從Pdata裡面去sample,
link |
05:09.000
但是我們希望這個Pg,我們可以找一個這個Theta,
link |
05:13.000
讓Pg跟Pdata越接近越好。
link |
05:17.000
好,那怎麼做呢?
link |
05:19.000
假設你是用maximum likelihood的話,怎麼做呢?
link |
05:22.000
首先我們可以從Pdata裡面sample一些東西出來,
link |
05:25.000
sample x1, x2到xn,
link |
05:28.000
可以sample出一堆x出來。
link |
05:30.000
好,接下來呢,對每一個sample出來的x,
link |
05:34.000
我們都可以計算它的likelihood,
link |
05:37.000
所謂可以計算它的likelihood的意思是說,
link |
05:39.000
假設給定一組參數Theta,
link |
05:42.000
給定一組參數Theta,我們就知道Pg這個probability的distribution長什麼樣子。
link |
05:48.000
知道這個probability的distribution長什麼樣子,
link |
05:50.000
我們就可以計算從這個distribution裡面sample出某一個xi的機率,
link |
05:57.000
我們可以計算出這個likelihood。
link |
06:00.000
好,接下來我們要做的事情就是,
link |
06:02.000
我們要找出一個Theta,使得Pg跟Pdata越接近越好。
link |
06:08.000
這件事情的意思就是說,
link |
06:10.000
我們希望這些從Pdata裡面sample出來的example,
link |
06:16.000
如果是用Pg這個distribution來產生的話,
link |
06:19.000
它的likelihood越大越好。
link |
06:21.000
那每一筆data它從Pg裡面產生出來的likelihood,
link |
06:25.000
我們都是可以算出來的,
link |
06:27.000
那我們把所有的機率乘起來,
link |
06:29.000
就得到一個total的likelihood,
link |
06:31.000
那我們希望這個total的likelihood越大越好。
link |
06:34.000
那怎麼讓total的likelihood越大越好呢?
link |
06:36.000
你就是要去找一個Theta star,
link |
06:40.000
找一組最佳的參數,
link |
06:42.000
它可以去maximizeL這個值。
link |
06:47.000
舉例來說,在這個case裡面,
link |
06:49.000
假設你是一個Gaussian mixture model,
link |
06:51.000
你就可能希望它的mean落在這些地方,
link |
06:54.000
它的variance長這樣,
link |
06:56.000
這個Gaussian mixture model,
link |
06:57.000
它產生這些data的機率就是最大。
link |
07:01.000
那這個是maximum likelihood,
link |
07:03.000
我記得我們在machine learning課裡面講generating model的時候,
link |
07:07.000
就已經提過這些東西了。
link |
07:10.000
好,那maximum likelihood,
link |
07:12.000
其實如果你覺得它沒有很直觀的話,
link |
07:15.000
這邊給你maximum likelihood的另外一個解釋。
link |
07:17.000
這個maximum likelihood,
link |
07:19.000
它等同於minimizeKL的divergence。
link |
07:23.000
什麼意思呢?
link |
07:24.000
我們說在maximum likelihood裡面,
link |
07:26.000
我們做的事情就是,
link |
07:27.000
我們從Pdata裡面sample出Mvdata,
link |
07:31.000
然後給我們一組參數θ,
link |
07:33.000
我們就可以計算每一個x被sample出來的機率,
link |
07:37.000
我們把這些機率全部乘起來,
link |
07:39.000
這個是我們要去maximize的對象。
link |
07:42.000
那這個式子你可以稍微改變一下,
link |
07:45.000
你就在前面取一個log,
link |
07:47.000
取一個log不影響你找出來的最好的θ。
link |
07:51.000
這個大家都可以很快的知道。
link |
07:53.000
你可以把log放進去,
link |
07:55.000
本來是很多項相乘取log,
link |
07:57.000
等同於每一項取log以後相加。
link |
08:01.000
這個我相信對大家來說也沒有問題。
link |
08:03.000
接下來,這件事情是什麼意思呢?
link |
08:06.000
Summation over i等於1到M,
link |
08:09.000
Summation over dE比example到dM比example,
link |
08:13.000
這件事情其實就是在approximate,
link |
08:16.000
從Pdata這個distribution裡面sample x出來。
link |
08:20.000
從Pdata這個distribution裡面sample x出來,
link |
08:23.000
你就得到x1,x2到xn。
link |
08:26.000
所以今天這個式子,
link |
08:28.000
它要maximize的對象其實就是maximize
link |
08:32.000
log Pg of x,
link |
08:34.000
maximize這一項的expected value,
link |
08:39.000
那你這個expectation的distribution
link |
08:42.000
是你要sample的data。
link |
08:45.000
接下來,我們可以把這一項,
link |
08:49.000
我們可以把這個expectation這一項把它展開,
link |
08:53.000
它其實就是一個積分,
link |
08:55.000
這個expectation從x,
link |
08:57.000
這個x是從Pdata裡面sample出來的,
link |
09:00.000
從Pdata裡面sample出來的意思就是說,
link |
09:02.000
對x做積分,
link |
09:04.000
然後把它乘Pdata of x,
link |
09:06.000
然後乘上log Pg of x。
link |
09:09.000
接下來,加一項看起來沒有什麼用的東西,
link |
09:13.000
我們在後面加這麼一項,
link |
09:16.000
這一項是什麼東西呢?
link |
09:18.000
你看一下這一項,
link |
09:20.000
這一項裡面它只有Pdata,
link |
09:23.000
它跟Pg是完全沒有任何關係的,
link |
09:28.000
所以今天加這一項根本不會影響
link |
09:32.000
你找出來的最大的x,
link |
09:35.000
那既然加這一項一點用都沒有,
link |
09:37.000
為什麼要加這一項呢?
link |
09:39.000
加這一項的目的是為了要告訴你說,
link |
09:42.000
maximum likelihood它就是KL divergence,
link |
09:46.000
因為加上這一項以後,
link |
09:48.000
你就可以把這個式子做一下整理,
link |
09:51.000
這邊是對x做積分,
link |
09:54.000
乘上Pdata of x,
link |
09:56.000
再乘上log Pg of x,
link |
09:58.000
這邊是減掉對x做積分,
link |
10:00.000
Pdata of x,
link |
10:02.000
乘上log Pdata of x,
link |
10:04.000
所以這邊有積分Pdata of x,
link |
10:07.000
這邊有積分Pdata of x,
link |
10:09.000
所以可以把它提出來,
link |
10:12.000
所以這一項跟這一項可以把它提出來,
link |
10:15.000
然後這邊就剩下log Pg,
link |
10:17.000
減掉log Pdata,
link |
10:19.000
那大家一秒鐘就可以反映說,
link |
10:21.000
log Pg減掉log Pdata,
link |
10:23.000
就是Pg除以Pdata,
link |
10:25.000
總之這個式子它就是Pdata跟Pg的KL divergence,
link |
10:30.000
所以你找一個setup,
link |
10:32.000
去maximize likelihood,
link |
10:34.000
等同於找一個setup,
link |
10:36.000
去minimize Pdata跟Pg的KL divergence,
link |
10:39.000
那如果你看到這邊覺得數學式太多,
link |
10:41.000
你沒有看懂的話呢,
link |
10:43.000
其實你只要知道一件事就好,
link |
10:45.000
所謂的maximum likelihood,
link |
10:47.000
就我們之前在機器學習裡面講說,
link |
10:49.000
我們今天要找一個generated model,
link |
10:51.000
去maximum likelihood,
link |
10:53.000
這個maximum likelihood這件事情,
link |
10:55.000
其實就等同於,
link |
10:57.000
minimize你的generated model,
link |
11:00.000
所定義的這個distribution Pg,
link |
11:03.000
跟你現在的data,
link |
11:05.000
Pdata之間的KL divergence,
link |
11:10.000
好,那接下來我們會遇到的問題是,
link |
11:14.000
假設我們的Pg只是一個Gaussian mixture model,
link |
11:19.000
那它顯然有非常多的限制,
link |
11:21.000
我們希望Pg是一個general distribution,
link |
11:25.000
它可以不是Gaussian,
link |
11:27.000
它可以是比Gaussian更複雜的東西,
link |
11:30.000
但是假設你今天把Pg,
link |
11:32.000
換成一個比Gaussian更複雜的東西,
link |
11:34.000
你會遇到什麼問題呢,
link |
11:36.000
你會遇到的問題就是,
link |
11:37.000
你算不出你的likelihood,
link |
11:40.000
你算不出PgX,
link |
11:44.000
而且假設今天PgX這個東西,
link |
11:46.000
它是一個Gaussian mixture model,
link |
11:49.000
給你一個X,
link |
11:50.000
你可以計算它被sample出來的機率,
link |
11:52.000
但是如果它是一個很複雜的東西,
link |
11:55.000
等一下我會講說,
link |
11:57.000
它可能是一個neural network,
link |
11:58.000
那你就沒有辦法計算它的likelihood,
link |
12:02.000
所以怎麼辦呢,
link |
12:04.000
所以怎麼辦呢,
link |
12:05.000
所以就有了一些新的想法,
link |
12:07.000
那其實讓machine自動的產生成東西,
link |
12:10.000
比如說做image generation,
link |
12:12.000
從來都不是新的題目,
link |
12:14.000
你可能看說最近用電呢,
link |
12:16.000
做了很多image generation的task,
link |
12:18.000
好像image generation是這幾年才有的東西,
link |
12:21.000
其實不是,
link |
12:22.000
image generation這件事情呢,
link |
12:24.000
在80年代就有人做過了,
link |
12:26.000
那個時候的做法就是,
link |
12:28.000
用Gaussian mixture model,
link |
12:29.000
你就收集很多很多的image,
link |
12:31.000
那每個image其實就是高維中間一個data point,
link |
12:34.000
然後你就可以用一個Gaussian mixture model,
link |
12:36.000
去maximize產生那些image likelihood,
link |
12:39.000
但是如果你看這個文獻的話呢,
link |
12:42.000
你看這個古聖先賢留下來的東西,
link |
12:45.000
就會發現說過去做的,
link |
12:46.000
如果你用Gaussian mixture model,
link |
12:48.000
產生出來的image,
link |
12:49.000
非常非常的糊,
link |
12:50.000
非常非常的糊,
link |
12:52.000
那這個可能原因是因為image啊,
link |
12:55.000
它是高維空間中的一個manifold,
link |
12:58.000
大家可能知道說image在高維空間中,
link |
13:01.000
它其實是高維空間中的一個低維的manifold,
link |
13:04.000
所以如果用Gaussian mixture model,
link |
13:06.000
它其實就不是一個manifold,
link |
13:08.000
就是你用Gaussian mixture model,
link |
13:10.000
你不管怎麼調你的mean跟variance,
link |
13:12.000
它就不像是你的target distribution,
link |
13:15.000
所以你怎麼做都是做不好,
link |
13:17.000
所以我們需要更generalize,
link |
13:19.000
又有更generalize的方式呢,
link |
13:21.000
來learn generation這件事情,
link |
13:23.000
好那在這個篇裡面啊,
link |
13:25.000
在generation of the personal network裡面呢,
link |
13:28.000
我們的generator就是一個network,
link |
13:31.000
我們把它寫作G,
link |
13:33.000
等一下我們就會告訴大家說,
link |
13:35.000
一個network它怎麼被看作是一個probability的distribution,
link |
13:41.000
好我們知道說我們generator就是一個network,
link |
13:44.000
那我們也都知道說network呢,
link |
13:46.000
就是input一個東西,
link |
13:48.000
然後呢output一個東西,
link |
13:50.000
舉例來說呢,
link |
13:51.000
你input一個從某一個distribution sample出來的noise z,
link |
13:55.000
你input一個隨機的vector z,
link |
13:57.000
然後呢它就會output一個x,
link |
14:01.000
那這個x呢,
link |
14:03.000
如果我們把這個generator G看作是一個function的話,
link |
14:06.000
這個x呢就是G of z,
link |
14:09.000
這個x呢就是G of z,
link |
14:11.000
如果你今天是做image generation的話呢,
link |
14:13.000
那你的x呢就是一個image,
link |
14:16.000
好然後我們說這個z呢,
link |
14:18.000
是從某一個prior distribution,
link |
14:20.000
比如說是從一個normal distribution裡面sample出來的,
link |
14:25.000
而今天每次sample出一個z,
link |
14:27.000
你把它丟到這個generator裡面,
link |
14:30.000
你就會得到一個x,
link |
14:32.000
你sample不同的z,
link |
14:34.000
你得到的x呢就不一樣,
link |
14:37.000
那今天這個z呢,
link |
14:38.000
是從一個Gaussian distribution裡面sample出來的,
link |
14:41.000
那你現在呢,
link |
14:43.000
把這些從Gaussian distribution裡面sample出來的z,
link |
14:46.000
通通通過去得到另外一大堆sample,
link |
14:50.000
把這些sample通通集合起來,
link |
14:52.000
你得到的就會是另外一個distribution,
link |
14:57.000
那雖然input是一個normal distribution,
link |
15:00.000
是一個單純的Gaussian distribution,
link |
15:03.000
但是你通過這個generator以後,
link |
15:07.000
因為這個generator是一個network,
link |
15:10.000
它可以把這個z呢,
link |
15:12.000
通過一個非常複雜的轉換把它變成x,
link |
15:15.000
所以你今天把通過這個generator,
link |
15:18.000
產生出來的x通通集合起來,
link |
15:20.000
它可以是一個非常複雜的distribution,
link |
15:25.000
而這個distribution呢,
link |
15:27.000
就是我們所謂的Pg,
link |
15:30.000
那有人可能會問說,
link |
15:31.000
這個prior distribution應該要設成什麼樣子呢,
link |
15:35.000
在文獻上有人會用normal distribution,
link |
15:38.000
有人會用uniform distribution,
link |
15:40.000
那你可以在作業裡面verify一下說,
link |
15:42.000
你覺得哪一種比較好,
link |
15:44.000
其實哪一種比較好,
link |
15:45.000
我其實也忘記了這樣,
link |
15:47.000
我覺得呢,
link |
15:48.000
其實這邊prior distribution用哪種distribution,
link |
15:51.000
也許影響並沒有那麼大,
link |
15:54.000
因為generator它是一個network,
link |
15:57.000
我們在一開學,
link |
15:59.000
第一堂課就有講過說,
link |
16:01.000
一個hidden layer的network,
link |
16:03.000
它就可以approximate任何function,
link |
16:05.000
那更何況是有多個hidden layer的network,
link |
16:08.000
它可以approximate非常複雜的function,
link |
16:11.000
所以今天就算是你的input distribution,
link |
16:13.000
是一個非常簡單的distribution,
link |
16:16.000
通過了這個network以後,
link |
16:19.000
它也可以把這個簡單的distribution,
link |
16:22.000
凹成各式各樣不同的形狀,
link |
16:25.000
所以不用擔心說,
link |
16:26.000
我這邊如果是input normal distribution,
link |
16:29.000
會不會對alpha來說有很大的限制,
link |
16:31.000
其實不會,
link |
16:32.000
因為通過一個generator以後,
link |
16:34.000
你可以把一個單純的normal distribution,
link |
16:36.000
凹成各式各樣複雜的形狀,
link |
16:39.000
那我們接下來的目標是什麼,
link |
16:41.000
我們接下來的目標是,
link |
16:42.000
希望generator,
link |
16:44.000
根據這個generator,
link |
16:45.000
所定義出來的distribution pg,
link |
16:48.000
它跟我們的目標,
link |
16:50.000
跟我們的data的distribution pdata,
link |
16:53.000
越接近越好,
link |
16:54.000
如果要寫一個optimization formulation的話,
link |
16:58.000
這個formulation看起來是這個樣子,
link |
17:01.000
我們要找一個generator,
link |
17:03.000
我們要找一個generator g,
link |
17:05.000
這個generator,
link |
17:06.000
可以讓它所定義出來的distribution pg,
link |
17:10.000
跟我們的data,
link |
17:11.000
pdata之間的某種divergence,
link |
17:15.000
越小越好,
link |
17:16.000
舉例來說,
link |
17:17.000
如果是maximum likelihood的話,
link |
17:19.000
就是要minimize KL divergence,
link |
17:21.000
等一下我們會看到說,
link |
17:22.000
其實在GAN裡面,
link |
17:23.000
我們minimize的不是KL divergence,
link |
17:25.000
而是其他的divergence,
link |
17:27.000
然後這邊寫一個div,
link |
17:29.000
就代表說反正它是某一種divergence,
link |
17:32.000
我們現在要做的事情就是,
link |
17:33.000
找一個generator,
link |
17:34.000
這個generator定義出一個distribution pg,
link |
17:37.000
這個pg,
link |
17:38.000
可以跟我們的pdata的divergence,
link |
17:40.000
越接近越好,
link |
17:43.000
再來的問題就是,
link |
17:44.000
怎麼計算這個divergence,
link |
17:47.000
假設你能夠計算這個divergence,
link |
17:49.000
你要找一個g去minimize這個divergence,
link |
17:52.000
那不就只是gradient descent,
link |
17:54.000
用gradient descent就可以做了對不對,
link |
17:56.000
但是問題就是,
link |
17:57.000
你要怎麼計算出這個divergence呢,
link |
18:01.000
pdata它的formulation,
link |
18:04.000
我們是不知道的,
link |
18:05.000
它並不是什麼Gaussian distribution,
link |
18:07.000
它的formulation我們是不知道的,
link |
18:09.000
pg它的formulation,
link |
18:11.000
我們也是不知道的,
link |
18:13.000
假設pg跟pdata它的formulation,
link |
18:15.000
我們是知道的,
link |
18:16.000
我們其實帶進那個divergence的formulation裡面,
link |
18:19.000
我們其實就可以算出它的divergence是多少,
link |
18:22.000
然後我們就用gradient descent,
link |
18:23.000
去minimize它的divergence,
link |
18:25.000
那問題就是,
link |
18:26.000
pg跟pdata它的formulation,
link |
18:28.000
我們是不知道的,
link |
18:29.000
它formulation是不知道的,
link |
18:30.000
我們根本就不知道要,
link |
18:32.000
怎麼去計算它的divergence,
link |
18:33.000
所以根本就不知道要怎麼找一個g,
link |
18:35.000
去minimize它的divergence,
link |
18:37.000
所以怎麼辦呢,
link |
18:38.000
這個就是gain神奇的地方,
link |
18:42.000
那在進入比較多的數學式之前,
link |
18:44.000
我們先很直觀的來講一下說,
link |
18:47.000
GaN到底是怎麼做到,
link |
18:49.000
minimize divergence這件事情的,
link |
18:52.000
那這邊的前提是,
link |
18:54.000
我們不知道pg跟pdata的distribution,
link |
18:58.000
長什麼樣子,
link |
18:59.000
但是我們可以從這兩個distribution裡面,
link |
19:03.000
去sample data出來,
link |
19:05.000
什麼意思呢,
link |
19:07.000
什麼叫做從pdata,
link |
19:09.000
去sample distribution出來呢,
link |
19:11.000
你就是把你的database拿出來,
link |
19:13.000
假設我們做二次元人物頭像生成的話,
link |
19:15.000
就把你的database拿出來,
link |
19:17.000
然後從裡面sample很多image出來,
link |
19:19.000
這個就是從pdata這個distribution裡面做sample,
link |
19:23.000
怎麼對pg做sample呢,
link |
19:25.000
我們說這個pg啊,
link |
19:27.000
它是由你的generator所定義的,
link |
19:29.000
那我們在使用這個generator的時候,
link |
19:32.000
我們是從某一個prime distribution裡面,
link |
19:34.000
去sample一大堆的vector,
link |
19:36.000
每一個vector就會產生一張image,
link |
19:39.000
所以所謂的從pg裡面做sample,
link |
19:42.000
其實就是random sample一個vector,
link |
19:44.000
把這個vector呢,
link |
19:46.000
丟到generator裡面產生一張image,
link |
19:48.000
這個就是從pg裡面做sample,
link |
19:51.000
所以我們可以從pdata裡面做sample,
link |
19:53.000
我們也可以從pg裡面做sample,
link |
19:56.000
我們現在的問題,
link |
19:57.000
接下來的問題就是,
link |
19:58.000
我們可以從pg和pdata做sample,
link |
20:01.000
根據這個sample,
link |
20:02.000
我們要怎麼知道這兩個distribution的divergence呢,
link |
20:07.000
那更神奇的地方就是,
link |
20:09.000
透過discriminator,
link |
20:11.000
我們可以來量這兩個distribution間的divergence,
link |
20:16.000
就假設這個藍色的星星,
link |
20:18.000
是從pdata裡面sample出來的東西,
link |
20:21.000
紅色的星星呢,
link |
20:22.000
是從pg裡面sample出來的東西,
link |
20:25.000
那根據這些data,
link |
20:27.000
我們去訓練一個discriminator,
link |
20:30.000
那上週我們已經講過說,
link |
20:31.000
所謂訓練discriminator的意思就是,
link |
20:34.000
給pdata的分數越大越好,
link |
20:38.000
給pg的分數越小越好,
link |
20:41.000
你去訓練一個discriminator,
link |
20:43.000
這個訓練的結果就會告訴我們,
link |
20:46.000
pdata跟pg他們之間的divergence有多大,
link |
20:52.000
有多大,
link |
20:53.000
那我們上週講過說,
link |
20:54.000
我們要訓練一個discriminator,
link |
20:56.000
我們是怎麼訓練一個discriminator的呢,
link |
20:58.000
我們會寫一個objective function,
link |
21:01.000
我們會寫一個objective function B,
link |
21:03.000
那這個objective function它跟兩項有關,
link |
21:06.000
一個是跟你的generator有關,
link |
21:08.000
一個是跟你的discriminator有關,
link |
21:11.000
那我們在train這個discriminator的時候呢,
link |
21:13.000
我們會fix住generator,
link |
21:15.000
所以g這一項是fix住的,
link |
21:17.000
我們只是去調這個discriminator的參數,
link |
21:19.000
想辦法去maximize後面這一項,
link |
21:22.000
那後面這一項是什麼意思呢,
link |
21:24.000
後面這一項的意思是說,
link |
21:26.000
假設x是從pdata裡面sample出來的,
link |
21:30.000
那我們希望log d of x越大越好,
link |
21:33.000
也就是我們希望discriminator的output,
link |
21:35.000
假設x是從pdata裡面sample出來的,
link |
21:37.000
我們就希望這個d of x越大越好,
link |
21:41.000
反之假設x是從generator sample出來的,
link |
21:44.000
那因為我們要maximize B這一項,
link |
21:47.000
所以我們是要maximize第一項,
link |
21:48.000
也要maximize第二項,
link |
21:50.000
而如果x是從pg裡面sample出來的,
link |
21:52.000
那我們要maximize log 1-d of x,
link |
21:55.000
maximize log 1-d of x,
link |
21:57.000
就是要maximize 1-d of x,
link |
21:59.000
也就是要minimize d of x,
link |
22:01.000
所以x如果是從pg裡面sample出來的,
link |
22:04.000
我們就希望它的值越小越好,
link |
22:07.000
然後在訓練的時候,
link |
22:08.000
我們就是要找一個d,
link |
22:10.000
它可以maximize這個objective function,
link |
22:13.000
那其實如果你之前的machine learning有學通的話,
link |
22:18.000
下面這個optimization的式子,
link |
22:21.000
跟train一個binary classify的式子,
link |
22:25.000
其實是完全一模一樣的,
link |
22:28.000
假設你今天要train一個logistic regression的model,
link |
22:33.000
logistic regression model是一個binary classifier,
link |
22:36.000
然後你就把p data當作是class 1,
link |
22:40.000
把pg當作是class 2,
link |
22:43.000
然後你train一個logistic regression model,
link |
22:45.000
你會發現你的objective function,
link |
22:47.000
其實就是下面這個式子,
link |
22:50.000
其實就是下面這個式子,
link |
22:52.000
所以今天這個discriminator在做的事情,
link |
22:55.000
跟一個binary classifier在做的事情,
link |
22:57.000
其實是一模一樣的,
link |
23:00.000
假設藍色的點是class 1,
link |
23:03.000
紅色的點是class 2,
link |
23:05.000
discriminator就是一個binary classifier,
link |
23:08.000
train下去,
link |
23:09.000
然後這個binary classifier,
link |
23:10.000
它是在minimize cross entropy,
link |
23:12.000
我們之前講過binary classifier,
link |
23:14.000
是要minimize cross entropy,
link |
23:15.000
不能minimize mean square error,
link |
23:17.000
要minimize cross entropy,
link |
23:19.000
如果你minimize cross entropy的話,
link |
23:21.000
你其實就是在解這個optimization的problem,
link |
23:27.000
那這邊神奇的地方是,
link |
23:30.000
當我們解完這個optimization的problem的時候,
link |
23:34.000
你最後會得到一個loss,
link |
23:37.000
你會得到一個最小的loss,
link |
23:39.000
或者是得到一個最大的objective value,
link |
23:43.000
我們今天這邊並不是minimize loss,
link |
23:46.000
而是maximize一個objective function,
link |
23:48.000
這個b是我們的objective value,
link |
23:51.000
我們要去調d,
link |
23:53.000
去maximize這個objective function,
link |
23:55.000
我們要去調d,
link |
23:57.000
去maximize這個objective value,
link |
24:00.000
然後這邊神奇的地方是,
link |
24:02.000
這個maximize的objective value,
link |
24:05.000
就是你把這個dtrain到最好,
link |
24:07.000
給了這些data,
link |
24:08.000
你把這個dtrain到最好,
link |
24:10.000
找出最大的,
link |
24:12.000
d可以達到的objective value,
link |
24:15.000
這個value其實會跟js divergence,
link |
24:19.000
是有非常密切的關係,
link |
24:21.000
甚至你可以說,
link |
24:22.000
等一下會有更詳細的證明,
link |
24:25.000
你可以說這個結果,
link |
24:26.000
它其實就是js divergence,
link |
24:30.000
也許你聽了覺得很神奇,
link |
24:31.000
但是我們可以給你一個非常直觀的解釋,
link |
24:34.000
一秒鐘就知道說,
link |
24:35.000
為什麼這個東西,
link |
24:37.000
它應該跟某一個divergence是有關係的,
link |
24:40.000
因為想想看,
link |
24:41.000
假設我們現在sample出來的data,
link |
24:44.000
它們靠得很近,
link |
24:46.000
藍色的這些星星跟紅色的星星,
link |
24:49.000
如果把它們試成兩個類別的話,
link |
24:51.000
它們靠得很近,
link |
24:52.000
對一個binary classifier來說,
link |
24:54.000
它很難區別紅色的星星,
link |
24:57.000
跟藍色的星星的不同,
link |
24:59.000
因為對一個binary classifier,
link |
25:01.000
也就是discriminator來說,
link |
25:02.000
它很難區別這兩個類別的不同,
link |
25:05.000
所以你今天train下去,
link |
25:06.000
你的loss就沒有辦法壓低,
link |
25:08.000
對不對?
link |
25:09.000
就假設今天這兩個class,
link |
25:10.000
它們靠得很近,
link |
25:11.000
它們很難分別,
link |
25:12.000
很分別,
link |
25:13.000
在training data上的loss,
link |
25:14.000
就會壓不下去,
link |
25:15.000
或是反過來說,
link |
25:16.000
你在training data上的loss壓不下去,
link |
25:18.000
就是我們剛才看到的objective的value,
link |
25:21.000
你沒有辦法把它拉得很高,
link |
25:24.000
你沒有辦法把剛才看到的v這一項,
link |
25:27.000
你沒有辦法找到那個d,
link |
25:29.000
它讓v的值變得很大,
link |
25:31.000
這個時候意味著什麼?
link |
25:33.000
這個時候意味著說,
link |
25:34.000
今天這兩堆data,
link |
25:36.000
它們是非常接近的,
link |
25:38.000
它們的divergence是小的,
link |
25:40.000
所以如果今天對一個discriminator來說,
link |
25:42.000
很難分別這兩種data之間的不同,
link |
25:44.000
它很難達到很大的objective的value,
link |
25:47.000
那意味著這兩堆data的divergence是小的,
link |
25:51.000
所以最後你可以達到最好的objective的value,
link |
25:55.000
跟divergence是會有非常緊密的關係的,
link |
25:59.000
或者是說,
link |
26:00.000
這個是一樣的例子,
link |
26:01.000
假設你的藍色的星星跟紅色的星星,
link |
26:03.000
它們距離很遠,
link |
26:04.000
它們有很大的divergence,
link |
26:06.000
那對discriminator來說,
link |
26:08.000
它就可以輕易地分辨這兩堆data的不同,
link |
26:11.000
也就是說,
link |
26:12.000
它可以輕易地讓你的objective value,
link |
26:14.000
也就是這個V的value,變得很大,
link |
26:18.000
所以當V的value變得很大的時候,
link |
26:20.000
意味著你的兩堆data,
link |
26:23.000
從pdata裡面generate出來的東西,
link |
26:25.000
和從pggenerate出來的東西,
link |
26:28.000
它們的divergence是大的,
link |
26:29.000
所以discriminator就可以輕易地分辨它的不同,
link |
26:32.000
discriminator就可以輕易地maximizeobjective的value,
link |
26:37.000
好,那在我們進入數學之前,
link |
26:39.000
有沒有在這邊先稍微停一下,
link |
26:42.000
看有沒有同學有問題要問的呢?
link |
26:45.000
OK嗎?
link |
26:48.000
好,如果沒有問題要問的話呢,
link |
26:51.000
接下來就是實際上證明給你看說,
link |
26:54.000
為什麼這個objective value跟divergence是有關係的,
link |
26:59.000
再來就是一堆數學式,
link |
27:01.000
這個數學式是這樣,
link |
27:03.000
那個objective value我們就寫在右上角,
link |
27:06.000
寫在右上角,
link |
27:07.000
它長這個樣子,
link |
27:08.000
它長這個樣子,
link |
27:09.000
好,那我們現在要做的事情是,
link |
27:11.000
找一個d,
link |
27:13.000
找一個discriminator d,
link |
27:15.000
它可以maximize這個式子,
link |
27:19.000
g是固定的,
link |
27:20.000
g是固定的,
link |
27:21.000
然後maximize這個式子,
link |
27:23.000
maximize這個式子,
link |
27:24.000
好,怎麼maximize這個式子呢?
link |
27:26.000
我們把它展開,
link |
27:28.000
把本來expectation換成積分,
link |
27:31.000
積分,
link |
27:32.000
所以這邊是從x,
link |
27:33.000
從pdata裡面sample x出來,
link |
27:34.000
就變成對x做積分,
link |
27:36.000
乘上pdata of x,
link |
27:38.000
乘上這個log d of x,
link |
27:41.000
這邊是對pg,
link |
27:43.000
從pg sample x出來,
link |
27:44.000
就是對x做積分,
link |
27:46.000
乘上pg,
link |
27:47.000
乘上log 1-d of x,
link |
27:49.000
這個對大家來說應該都不成問題,
link |
27:52.000
接下來就是整理一下,
link |
27:55.000
因為這邊都對x做積分,
link |
27:57.000
對x做積分,
link |
27:58.000
所以你把放在積分裡面的這一項,
link |
28:01.000
跟放在積分裡面的這一項加起來,
link |
28:03.000
加起來,
link |
28:05.000
接下來我們要想辦法找一個d,
link |
28:07.000
它可以讓這個式子呢,
link |
28:09.000
越大越好,
link |
28:10.000
這邊前提有一個假設是,
link |
28:12.000
d of x,
link |
28:13.000
它可以是任何的function,
link |
28:16.000
它可以是任何的function,
link |
28:18.000
但這邊實際上不見得是成立的,
link |
28:21.000
因為假設d of x是一個network的話,
link |
28:23.000
network除非它的neuron無窮多,
link |
28:26.000
不然它其實也沒有辦法變成任何的function,
link |
28:29.000
除非你的neuron是無窮多的,
link |
28:32.000
不然你也沒有辦法變成任何的function,
link |
28:35.000
但我們這邊做一個非常強烈的假設,
link |
28:37.000
是假設d of x,
link |
28:39.000
它可以是任意的function,
link |
28:42.000
假設d of x可以是任意的function的話,
link |
28:46.000
就是你input一個x,
link |
28:49.000
它的值可以是任何的值,
link |
28:52.000
沒有限制,
link |
28:53.000
你可以assign給d of x任何的值,
link |
28:56.000
你可以assign給d of x1任何的值,
link |
28:58.000
你可以assign給d of x2任何的值,
link |
29:01.000
這個時候假設你要maximize這一項的話,
link |
29:04.000
它實際上等同於什麼呢?
link |
29:07.000
等同於說,
link |
29:08.000
你知道這邊對x做積分,
link |
29:10.000
把中括號裡面的式子,
link |
29:13.000
代各個不同的x,
link |
29:15.000
再把它通通加起來,
link |
29:17.000
這就是積分在做的事情,
link |
29:19.000
但你要maximize這一項,
link |
29:21.000
d of x又可以代任何的值,
link |
29:23.000
意思就是說,
link |
29:24.000
你可以把各個不同的x,
link |
29:27.000
通通都分開算,
link |
29:30.000
所以今天你要找一個d,
link |
29:32.000
去maximize這個式子,
link |
29:34.000
那意思就是說,
link |
29:35.000
你就把某一個x拿出來,
link |
29:38.000
某一個x拿出來,
link |
29:39.000
這邊是p beta of x log d of x,
link |
29:41.000
加上p g log 1-d of x,
link |
29:43.000
你把某一個x拿出來,
link |
29:44.000
然後你要找一個d,
link |
29:46.000
它可以讓這個式子越大越好,
link |
29:49.000
那所有不同的x,
link |
29:50.000
通通都分開來算,
link |
29:53.000
因為所有的x都是沒有任何關係的,
link |
29:57.000
因為不管是哪一個x,
link |
29:58.000
你都可以assign給它一個不同的d of x,
link |
30:01.000
所以這個積分裡面的每一項,
link |
30:03.000
你都分開來算,
link |
30:04.000
你就可以分開為它找一個最好的d of x,
link |
30:08.000
講到這邊,
link |
30:09.000
大家有沒有問題要問呢?
link |
30:11.000
有沒有問題要問呢?
link |
30:14.000
好,如果你可以接受這個想法的話,
link |
30:17.000
再來的問題就是,
link |
30:18.000
怎麼找一個d,
link |
30:20.000
讓這一項最大?
link |
30:22.000
好,那這個數學其實是蠻簡單的,
link |
30:25.000
這個數學其實蠻簡單的,
link |
30:26.000
我們現在的問題是,
link |
30:27.000
找一個d,
link |
30:28.000
讓這個式子最大,
link |
30:30.000
p data是固定的,
link |
30:32.000
p g也是固定的,
link |
30:34.000
我們唯一要做的事情就是,
link |
30:36.000
找一個d of x,
link |
30:38.000
找一個d of x的值,
link |
30:39.000
讓這個式子算起來最大,
link |
30:41.000
那等一下為了計算方便,
link |
30:42.000
我們把p data用a來表示,
link |
30:44.000
d of x用大d來表示,
link |
30:46.000
p g用小d來表示,
link |
30:47.000
d of x用大d來表示,
link |
30:51.000
好,那所以整個式子呢,
link |
30:52.000
寫起來就是這個樣子,
link |
30:54.000
怎麼找一個d去maximize這個式子呢?
link |
30:57.000
可以用,你就算求一下它的gradient,
link |
31:01.000
求一下它的微分,
link |
31:03.000
然後呢,
link |
31:04.000
先找出它的critical point,
link |
31:07.000
就找出微分是0的地方,
link |
31:10.000
找出微分是0的地方,
link |
31:12.000
好,那把這項做微分以後,
link |
31:13.000
得到什麼樣的結果呢?
link |
31:14.000
a log d對d做微分,
link |
31:17.000
等於a乘上1除以d,
link |
31:20.000
b log 1.d對d做微分,
link |
31:22.000
你得到的結果是,
link |
31:23.000
b乘上1除以1.d,
link |
31:26.000
再乘上-1,
link |
31:28.000
然後我們要找微分是0的地方,
link |
31:31.000
找微分是0的地方,
link |
31:32.000
然後把式子整理一下,
link |
31:34.000
把這個-1這項拿到右邊去,
link |
31:37.000
所以-1就沒有了,
link |
31:39.000
所以a乘以1除以d star,
link |
31:41.000
等於b乘以1除以1.d star,
link |
31:46.000
接下來呢,
link |
31:47.000
就要求一下這個d star是多少,
link |
31:49.000
要求一下說,
link |
31:51.000
什麼樣的d可以讓這個微分的值是0,
link |
31:56.000
什麼樣的d它是critical的point,
link |
32:00.000
那就整理一下,
link |
32:01.000
這邊都是很簡單的數學,
link |
32:03.000
就整理一下,
link |
32:04.000
這邊是a乘以1.d star,
link |
32:05.000
等於b乘以d star,
link |
32:07.000
把a乘進去,
link |
32:09.000
得到a-a乘以d star,
link |
32:11.000
右邊是b乘以d star,
link |
32:13.000
整理一下,
link |
32:14.000
把有d star的數量挪到同一邊去,
link |
32:16.000
所以變成a等於a加b,
link |
32:18.000
乘上d star,
link |
32:20.000
d star就等於a除以a加b,
link |
32:23.000
所以我們現在知道說,
link |
32:25.000
假設我們的d star,
link |
32:27.000
我們d star等於a除以a加b,
link |
32:29.000
a就是這一項,
link |
32:31.000
然後b就是這一項,
link |
32:33.000
a就是pθ,
link |
32:35.000
b就是pg,
link |
32:37.000
假設我們現在d star of x的值,
link |
32:41.000
是pθ of x除以pθ of x加pg of x,
link |
32:46.000
它就可以讓這一項的最低的微分為零,
link |
32:52.000
然後你可以輕易的檢查說,
link |
32:54.000
它現在是一個local maxima,
link |
32:59.000
而不是local minima,
link |
33:00.000
也不是saddle point,
link |
33:01.000
你可以輕易的檢查說,
link |
33:02.000
它是一個local的,
link |
33:04.000
它其實是一個maxima,
link |
33:07.000
它不是一個minima,
link |
33:09.000
也不是一個saddle point,
link |
33:11.000
所以今天要怎麼讓這一項最大,
link |
33:14.000
你就把d of x帶這樣的值,
link |
33:18.000
你就可以讓這一項最大,
link |
33:22.000
好,所以接下來呢,
link |
33:24.000
接下來要做的事情是什麼呢,
link |
33:26.000
接下來要做的事情就是,
link |
33:28.000
把這一項帶到這個式子裡面,
link |
33:32.000
把這一項帶到這個式子裡面,
link |
33:34.000
我們想知道說,
link |
33:35.000
當我們找出一個最好的d,
link |
33:38.000
也就是d star的時候,
link |
33:40.000
我們的objective function的值,
link |
33:42.000
到底長什麼樣子,
link |
33:44.000
最後你展開以後,
link |
33:45.000
就會發現說,
link |
33:46.000
這一項其實就是js divergence,
link |
33:49.000
好,現在我們知道說,
link |
33:52.000
d star它的formulation就寫成這個樣子,
link |
33:55.000
好,我們把d star帶到這裡面去,
link |
33:58.000
帶到這裡面去,
link |
34:00.000
我們把這個d of x用p data,
link |
34:03.000
處理p data加p g來表示,
link |
34:05.000
所以把這一項放進來,
link |
34:08.000
把這一項放進來,
link |
34:10.000
你得到的結果就長這樣,
link |
34:12.000
就長這樣,就長這樣,
link |
34:14.000
好,那接下來呢,
link |
34:17.000
這邊有expectation,
link |
34:18.000
把expectation展開,
link |
34:20.000
這邊是對p data sample x,
link |
34:23.000
就對x做積分,
link |
34:25.000
這邊是對p g sample x,
link |
34:27.000
就對p g做積分,
link |
34:29.000
得到的式子長這個樣子,
link |
34:32.000
好,接下來呢,
link |
34:34.000
為了要把它整理成,
link |
34:35.000
看起來像是js divergence,
link |
34:38.000
所以呢,就做一些,
link |
34:40.000
看起來沒有什麼,
link |
34:42.000
好像什麼事都沒有做的變換,
link |
34:44.000
就把這個分子跟分母呢,
link |
34:46.000
都同除二,都同除二,
link |
34:48.000
分子分母呢,都同除二,都同除二,
link |
34:52.000
好,那接下來呢,
link |
34:54.000
你可以把二分之一這一項,
link |
34:56.000
你可以把二分之一這一項,
link |
34:58.000
把它提出來,
link |
35:00.000
把它提出來,
link |
35:01.000
你得到的結果呢,
link |
35:02.000
是兩倍的log二分之一,
link |
35:04.000
這個如果你沒有跟上的話呢,
link |
35:06.000
不太重要,反正這邊有二分之一,
link |
35:08.000
你可以把它提出來,
link |
35:09.000
變成兩倍的log二分之一,
link |
35:11.000
或等於負二log二,
link |
35:14.000
好,然後所以接下來呢,
link |
35:16.000
我們就知道說,
link |
35:17.000
今天啊,
link |
35:18.000
假設我們已經有一個generator g,
link |
35:22.000
我們找到了最佳的discriminator d,
link |
35:26.000
我們找到最佳的discriminator,
link |
35:28.000
也就是d star,
link |
35:29.000
d star的function,
link |
35:30.000
會長這個樣子,
link |
35:32.000
當我們找到最佳的d star的時候,
link |
35:34.000
d這個objective function啊,
link |
35:36.000
它就寫成這個看起來呢,
link |
35:38.000
很複雜的樣子,
link |
35:39.000
看起來很複雜的樣子,
link |
35:40.000
這個是負兩倍的log二,
link |
35:42.000
加上這個x做積分,
link |
35:44.000
然後呢,
link |
35:45.000
p data of x乘上log p data of x,
link |
35:47.000
除上p data跟p g的平均,
link |
35:50.000
還有第二項,
link |
35:51.000
這個是積分s,
link |
35:53.000
p g乘上log p g,
link |
35:55.000
除掉p g和p data的平均,
link |
35:57.000
後面這一項是什麼呢,
link |
35:59.000
後面這一項是,
link |
36:01.000
這個p data跟二分之一p data跟p g的平均的k l divergence,
link |
36:07.000
如果你不知道它是什麼的話,
link |
36:09.000
沒有關係,
link |
36:10.000
反正後面這兩項合起來,
link |
36:12.000
就叫做js divergence,
link |
36:14.000
或許你比較常聽過k l divergence,
link |
36:17.000
或者是inverse k l divergence,
link |
36:19.000
不常聽過js divergence,
link |
36:21.000
但是反正後面這個式子啊,
link |
36:24.000
它就是p data跟p g的某一種divergence,
link |
36:29.000
如果今天p data跟p g它們距離的越遠,
link |
36:32.000
這兩項合起來就越大,
link |
36:36.000
反之呢,
link |
36:37.000
它們合起來就越小,
link |
36:39.000
總之我們現在得到的結論就是,
link |
36:42.000
如果今天我們找到一個最佳的d star,
link |
36:45.000
帶進去以後,
link |
36:47.000
我們得到的這個value啊,
link |
36:49.000
它是負兩倍的log2,
link |
36:51.000
加上兩倍的p data和p g的js divergence,
link |
36:55.000
所以我們現在知道說,
link |
36:57.000
假設我們認一個discriminator,
link |
36:59.000
我們寫出了某一個objective function,
link |
37:01.000
我們去maximize那個objective function以後,
link |
37:04.000
我們得到的結果,
link |
37:05.000
最後可以maximize那個objective function,
link |
37:08.000
我們最後maximize的那個value,
link |
37:10.000
其實就是p data跟p g的js divergence,
link |
37:15.000
所以假設這邊的數學推導,
link |
37:17.000
你沒有辦法跟上的話呢,
link |
37:19.000
也沒有關係,
link |
37:20.000
反正這邊想要告訴你的事情就是說,
link |
37:22.000
當我們在train一個discriminator的時候,
link |
37:24.000
我們想要做的事情是什麼?
link |
37:26.000
當我們在train一個discriminator的時候,
link |
37:28.000
我們想做的事情就是去evaluate,
link |
37:31.000
p data跟p g這兩個distribution,
link |
37:33.000
sample出來的data,
link |
37:34.000
這兩個distribution,
link |
37:36.000
它們之間的這個js divergence,
link |
37:38.000
如果你今天定的這個objective function,
link |
37:41.000
是跟前面的式子一樣的話,
link |
37:43.000
你就是在量js divergence,
link |
37:45.000
那等下會看到說,
link |
37:46.000
如果把那個objective function寫的不一樣,
link |
37:49.000
那你就可以量其他的各種不同的divergence,
link |
37:54.000
那所以現在整個問題變成這個樣子,
link |
37:57.000
我們本來是要找一個g,
link |
37:59.000
它去minimize p g跟p data的divergence,
link |
38:02.000
我們說後面這個式子,
link |
38:04.000
你沒有辦法算,
link |
38:05.000
但現在是可以算的,
link |
38:06.000
後面這個式子到底是什麼呢?
link |
38:08.000
後面這個式子到底是什麼呢?
link |
38:10.000
後面這個式子就是,
link |
38:11.000
我們今天寫出一個objective function,
link |
38:15.000
v of t g,
link |
38:16.000
找一個d去maximize這個式子,
link |
38:20.000
它就是p g和p data之間的divergence,
link |
38:23.000
所以我們現在就可以把divergence這一項,
link |
38:25.000
用max這一項把它替換掉,
link |
38:29.000
變成這個樣子,
link |
38:31.000
所以我們現在要找一個generator,
link |
38:35.000
它generate出來的東西,
link |
38:37.000
跟你的data越接近越好,
link |
38:39.000
你實際上要解這樣一個optimization的problem,
link |
38:44.000
你要解一個minmax的problem,
link |
38:46.000
這個optimization的problem裡面,
link |
38:48.000
它有一個minimum,
link |
38:49.000
它有一個maximum,
link |
38:52.000
這個看起來非常的複雜,
link |
38:54.000
這個非常的拗口,
link |
38:56.000
你要找一個generator,
link |
38:58.000
它要去minimize這一個式子,
link |
39:00.000
在這個式子裡面,
link |
39:01.000
它有一個discriminator,
link |
39:03.000
要去maximize這個式子,
link |
39:05.000
我知道說這個看起來非常的複雜,
link |
39:08.000
它實際上做的事情,
link |
39:10.000
像是以下這個例子所講的這樣,
link |
39:13.000
假設世界上只有三個generator,
link |
39:17.000
假設我們要選一個generator,
link |
39:19.000
去minimize這個objective function,
link |
39:21.000
我們現在可以選的generator,
link |
39:23.000
總共只有三個,
link |
39:25.000
一個是G1,
link |
39:26.000
一個是G2,
link |
39:27.000
一個是G3,
link |
39:29.000
假設我們選了G1這個generator的話,
link |
39:33.000
那V of G1D,
link |
39:35.000
它長這個樣子,
link |
39:37.000
假設你的generator固定是G1,
link |
39:40.000
但是你的discriminator,
link |
39:42.000
它可以是不同的discriminator,
link |
39:44.000
我們假設discriminator,
link |
39:46.000
它可以用一個參數來操控,
link |
39:48.000
所以這個橫坐標在改變的時候,
link |
39:50.000
代表你選擇了不同的discriminator,
link |
39:52.000
但實際上是更複雜的狀況,
link |
39:54.000
實際上discriminator是一個neural network,
link |
39:56.000
它是由數百萬個參數所控制的,
link |
40:00.000
它應該是分佈在一個高危的空間裡面,
link |
40:02.000
不過這邊為了簡化問題,
link |
40:04.000
我們就說,
link |
40:05.000
假設當橫坐標變化的時候,
link |
40:07.000
代表你選擇了不同的discriminator,
link |
40:13.000
今天同樣的,
link |
40:14.000
假設你的generator是G2,
link |
40:17.000
你把G2帶進去,
link |
40:18.000
你選擇不同的discriminator的時候,
link |
40:20.000
你就得到了不同的V of G2D,
link |
40:23.000
假設你的generator是G3,
link |
40:25.000
你選擇不同的discriminator的時候,
link |
40:27.000
你就得到不同的V of G3D,
link |
40:30.000
我們接下來的問題是,
link |
40:32.000
我們在給定一個generator的時候,
link |
40:36.000
我們要找一個discriminator,
link |
40:38.000
它可以讓V of GD最大,
link |
40:41.000
假設我們現在固定我們的generator是G1的時候,
link |
40:45.000
假設我們固定我們的generator是G1的時候,
link |
40:51.000
那哪一個discriminator可以讓V of GD最大呢?
link |
40:55.000
那個是落在這個這裡的discriminator,
link |
40:58.000
可以讓V of G1D最大,
link |
41:00.000
落在這裡的discriminator,
link |
41:02.000
可以讓V of G2D最大,
link |
41:04.000
落在這裡的discriminator,
link |
41:07.000
可以讓V of G3D最大,
link |
41:11.000
接下來我們要找一個G,
link |
41:15.000
去minimize最大的discriminator可以找到的value,
link |
41:20.000
這大家聽得懂嗎?
link |
41:21.000
我們找一個G,
link |
41:23.000
它可以最小化最大的discriminator得到的value,
link |
41:27.000
找一個G,
link |
41:28.000
它可以minimize這個V of GD,
link |
41:32.000
用不同的最大的d可以達到的value,
link |
41:35.000
這個時候,
link |
41:36.000
假設我們的V of GD,
link |
41:37.000
長得最像是下面這個例子的話,
link |
41:40.000
那這個問題的solution,
link |
41:42.000
最好的G,
link |
41:43.000
到底應該是哪一個呢?
link |
41:46.000
到底應該是哪一個呢?
link |
41:49.000
給你十秒鐘的時間想一下,
link |
41:53.000
剛才按投影片的時候已經不小心按到了,
link |
41:55.000
所以你應該知道答案是什麼了,
link |
42:02.000
好,十秒鐘的時間過了,
link |
42:04.000
假設這是我們optimization的problem,
link |
42:07.000
V of GD它就是長這個樣子,
link |
42:10.000
我們現在要解這個optimization的problem,
link |
42:13.000
哪一個G,
link |
42:14.000
才是我們的solution呢?
link |
42:16.000
哪一個G,
link |
42:17.000
才是我們的solution呢?
link |
42:19.000
你覺得,
link |
42:20.000
就假設G現在只有三個,
link |
42:22.000
你只有三個選擇,
link |
42:23.000
所以你隨便猜,
link |
42:24.000
你也有整個三分之一的正確率,
link |
42:26.000
你覺得G1是正確選擇的同學舉手一下,
link |
42:30.000
你覺得G1,
link |
42:31.000
它可以minimize上面這個四個同學舉手一下,
link |
42:34.000
假設你覺得G2可以minimize上面這個四個同學舉手一下,
link |
42:38.000
你覺得G3可以minimize上面這個四個同學舉手一下,
link |
42:44.000
好,手放下,
link |
42:45.000
好,多數人都選擇G3,
link |
42:48.000
沒錯,正確答案就是G3,
link |
42:50.000
所以如果你選擇G3的話,
link |
42:52.000
代表說你了解這個前面加min,後面又加max,
link |
42:56.000
到底是什麼樣的意思,
link |
42:59.000
好,那我們現在找出來的這個G star,
link |
43:03.000
就是這個G3,
link |
43:07.000
就是這個G3,
link |
43:08.000
好,那這邊的每,
link |
43:11.000
當我們給定一個G1的時候,
link |
43:13.000
當我們給定一個G1的時候,
link |
43:15.000
這邊這個G1,
link |
43:17.000
D1 star的這個高,
link |
43:19.000
其實就代表了G1的這個generator,
link |
43:22.000
它所,
link |
43:23.000
G1的這個generator,
link |
43:25.000
它所generate出來的distribution,
link |
43:27.000
跟P data之間的距離,
link |
43:29.000
所以這個高,
link |
43:30.000
就代表G2的這個generator,
link |
43:32.000
它所定的distribution,
link |
43:34.000
跟data之間的距離,
link |
43:35.000
這個高,
link |
43:36.000
就代表G3的這個generator,
link |
43:38.000
它的distribution,
link |
43:39.000
它之間的距離,
link |
43:41.000
所以今天呢,
link |
43:43.000
這個G1的這個generator,
link |
43:45.000
它的divergence,
link |
43:46.000
它跟那個data的divergence是這麼大,
link |
43:49.000
G2它所定的distribution,
link |
43:53.000
跟data之間的divergence是這麼大,
link |
43:55.000
G3它所定的distribution,
link |
43:57.000
跟data之間的divergence是這麼大,
link |
43:59.000
那我們今天呢,
link |
44:00.000
要minimize我們的divergence,
link |
44:02.000
所以你會選擇G3呢,
link |
44:03.000
當作是最好的結果。
link |
44:08.000
好,那接下來呢,
link |
44:09.000
我們就是要想辦法解這個minmax的problem,
link |
44:13.000
那這個minmax的problem,
link |
44:15.000
怎麼解呢?
link |
44:16.000
你記得我們在講GAMES的時候,
link |
44:18.000
我們說GAMES是怎麼做的?
link |
44:20.000
GAMES是說,
link |
44:21.000
我們有一個generator,
link |
44:22.000
有一個discriminator,
link |
44:23.000
然後我們在train的時候,
link |
44:25.000
我們是iterative的去,
link |
44:26.000
你去train generator跟discriminator,
link |
44:29.000
我們固定住generator,
link |
44:31.000
去update discriminator,
link |
44:33.000
我們固定住discriminator,
link |
44:35.000
接下來去update generator,
link |
44:38.000
那如果以下等一下要講的東西,
link |
44:39.000
你聽不太懂的話,
link |
44:40.000
你就知道一件事情,
link |
44:41.000
左邊的這個演算法,
link |
44:43.000
就是在解這個minmax的problem,
link |
44:47.000
在解這個minmax的problem,
link |
44:49.000
為什麼要解這個minmax的problem,
link |
44:50.000
解這個minmax的problem的目的,
link |
44:52.000
就是要minimize你的generator,
link |
44:54.000
跟你的data之間的jsdivergence,
link |
44:57.000
如果你V寫成像之前的投影片,
link |
44:59.000
放的那個樣子,
link |
45:01.000
就是jsdivergence,
link |
45:02.000
你可以寫別的樣子,
link |
45:03.000
那你就是minimize其他的divergence,
link |
45:06.000
那為什麼下面這一個algorithm,
link |
45:09.000
是在解這一個optimization的problem呢?
link |
45:12.000
那以下幾個投影片就是要解釋說,
link |
45:14.000
為什麼這一個algorithm,
link |
45:16.000
是在解這個optimization的problem,
link |
45:19.000
我們來看看說,
link |
45:20.000
假設你要解這個optimization的problem的話,
link |
45:23.000
你要怎麼做?
link |
45:25.000
那這個maxD,V of GD,
link |
45:29.000
找一個D去maximize,
link |
45:30.000
V of GD這個式子看起來有點複雜,
link |
45:32.000
所以我們把它用LG來取代,
link |
45:36.000
因為它其實跟D是沒有關係的,
link |
45:39.000
你是give一個G,
link |
45:40.000
反正你就會找到一個最好的D,
link |
45:43.000
讓L of G的值越大越好,
link |
45:45.000
所以讓這個V of GD的值越大越好,
link |
45:49.000
那我們假設這個最大的值,
link |
45:51.000
就是L of G,
link |
45:55.000
那所以現在這整個問題就變成,
link |
45:57.000
你要找一個最好的generator G,
link |
45:59.000
它可以minimize L of G,
link |
46:01.000
那這個問題,
link |
46:03.000
任何人都會這樣,
link |
46:04.000
它就是一個,
link |
46:06.000
它就是跟train一般的network是一樣的,
link |
46:09.000
就是用gradient descent來解它,
link |
46:11.000
所以你用gradient descent來解它,
link |
46:12.000
你對L of G,
link |
46:14.000
算天維分,
link |
46:15.000
你要算這個gradient,
link |
46:17.000
你要找一個G,
link |
46:18.000
去minimize L of G,
link |
46:20.000
你把這個theta G,
link |
46:22.000
算這個theta G對L of G的gradient,
link |
46:25.000
然後用gradient descent去update theta G,
link |
46:28.000
那你就可以minimize這一個式子,
link |
46:31.000
你就可以optimize這一個optimization的problem,
link |
46:35.000
找出你的G star,
link |
46:38.000
但是現在有一個麻煩的地方就是,
link |
46:40.000
這個L of G,
link |
46:43.000
如果你把式子寫出來的話,
link |
46:45.000
它長得是這個樣子的,
link |
46:47.000
這個式子裡面是有max的,
link |
46:50.000
那有人就會問說,
link |
46:51.000
這個式子裡面有max,
link |
46:53.000
它可以微分嗎?
link |
46:55.000
會不會不能夠微分?
link |
46:57.000
因為你今天要算這個L of G的gradient,
link |
47:00.000
L of G這個式子裡面如果有max,
link |
47:02.000
它會不會沒有辦法做微分?
link |
47:04.000
其實不會,
link |
47:05.000
因為你想想看,
link |
47:06.000
我們之前在學的時候,
link |
47:07.000
學到一個max out network,
link |
47:10.000
max out network裡面也有max的operation,
link |
47:12.000
但它顯然是有辦法用gradient descent解的,
link |
47:16.000
那到底實際上是怎麼做的呢?
link |
47:18.000
我們現在假設有一個function f of x,
link |
47:21.000
它裡面是有max的operation的,
link |
47:24.000
我們來看一下有max的operation的這種function,
link |
47:26.000
你要怎麼對它做微分?
link |
47:29.000
現在有一個f of x,
link |
47:30.000
它裡面有max的operation,
link |
47:32.000
它是對f1,f2和f3這三個function裡面,
link |
47:36.000
找一個最大的出來,
link |
47:38.000
它就是f of x,
link |
47:40.000
那假設f1長這個樣子,
link |
47:43.000
f2長這個樣子,
link |
47:45.000
f3長這個樣子,
link |
47:47.000
那今天這個f of x,
link |
47:49.000
它是f1,f2,f3裡面取大的那個,
link |
47:52.000
那f of x長什麼樣子呢?
link |
47:53.000
f of x就是長這個樣子,
link |
47:56.000
它就是取,
link |
47:57.000
如果f1比f2,f3大的話就取f1,
link |
48:01.000
如果f2比f1,f3都大的話就取f2,
link |
48:04.000
如果f3是最大的話就取f3,
link |
48:07.000
所以今天這個f of x,
link |
48:09.000
它長的會是這個樣子,
link |
48:11.000
就我滑鼠現在移動的位置,
link |
48:13.000
它長的是這個樣子,
link |
48:15.000
那如果你現在要把這個f of x,
link |
48:20.000
對x做微分的話,
link |
48:22.000
那其實這件事情等同於什麼呢?
link |
48:25.000
這件事情等同於看看現在的x,
link |
48:30.000
可以讓哪一個function,
link |
48:33.000
f1,f2,f3最大,
link |
48:35.000
就拿最大的那個出來算微分,
link |
48:38.000
就是x對f的微分,
link |
48:41.000
這樣可能有點抽象,
link |
48:43.000
我們就舉很具體的例子,
link |
48:45.000
現在假設你要在這個地方,
link |
48:51.000
對f of x做微分,
link |
48:53.000
那你算出來的微分值多少呢?
link |
48:55.000
你算出來的微分就等同於是在對f1做微分,
link |
49:00.000
那如果你在這個區域,
link |
49:02.000
你算出來的微分就等同於是在對f2做微分,
link |
49:06.000
如果你在這個區域,
link |
49:07.000
你算出來的微分就等同於是在對f3做微分,
link |
49:11.000
所以今天假如你的這個function裡面,
link |
49:14.000
有一個max的operation,
link |
49:16.000
實際上你在算微分的時候,
link |
49:18.000
你只是看說現在在f1,f2,f3裡面哪一個人最大,
link |
49:22.000
你就把最大的那個人拿出來算微分,
link |
49:25.000
你就可以用gradient descent去optimize這樣的式子,
link |
49:29.000
舉例來說假設你要用gradient descent,
link |
49:31.000
去optimize這個f of x,
link |
49:33.000
那實際上的做法就是說,
link |
49:35.000
假設initialize的時候在這個地方,
link |
49:37.000
算一下它的gradient就向右移,
link |
49:40.000
而如果今天向右移的時候,
link |
49:41.000
你已經移到了另外一個region,
link |
49:43.000
本來是在這個region裡面是f1最大,
link |
49:45.000
那跑到這邊以後就變成f2最大,
link |
49:49.000
假設移到另外一個region,
link |
49:50.000
這個region是f2最大,
link |
49:52.000
這個時候你算出來的微分就會變成是f2的微分,
link |
49:56.000
以此類推,以此類推,
link |
49:58.000
總之就算是你的,
link |
50:01.000
總之我們剛才講那麼多,
link |
50:02.000
我只想要告訴你說,
link |
50:03.000
就算是我們的objective function裡面,
link |
50:06.000
有max的operation,
link |
50:08.000
其實你也不需要害怕,
link |
50:10.000
你一樣是可以對它做微分的,
link |
50:14.000
你一樣是可以對它做微分的,
link |
50:16.000
好,那所以就回到了我們現在要解的這個optimization problem,
link |
50:21.000
那實際上你會怎麼解它呢?
link |
50:23.000
我們剛才有講說,
link |
50:25.000
如果一個optimization problem裡面,
link |
50:28.000
你的loss function是有max的,
link |
50:30.000
那你要怎麼解它呢?
link |
50:31.000
你會先看說,
link |
50:33.000
現在你落在哪一個region裡面,
link |
50:37.000
再算說,
link |
50:38.000
現在在那個region裡面,
link |
50:40.000
哪一個function是max的,
link |
50:41.000
對那個max的function做微分,
link |
50:43.000
對不對?
link |
50:44.000
你現在出事的地方在這個地方,
link |
50:47.000
你就看說,
link |
50:49.000
這個function它是最大的,
link |
50:50.000
就對它做微分,
link |
50:52.000
現在你update參數以後,
link |
50:53.000
你要重新檢查一下,
link |
50:54.000
你落在哪個region,
link |
50:55.000
發現說你落在這個region,
link |
50:57.000
落在這個中間這個f2這個function是最大的region,
link |
51:01.000
那你就要對f2做微分,
link |
51:03.000
所以今天呢,
link |
51:06.000
把它套用到我們的這個要optimize的這個midmax problem裡面,
link |
51:10.000
其實也是一樣的,
link |
51:12.000
其實也是一樣的,
link |
51:14.000
一開始我們有一個初始的G0,
link |
51:18.000
我們有一個初始的G0,
link |
51:20.000
然後接下來我們要算G0對L2G的gradient,
link |
51:27.000
但是在算G0對L2G的gradient之前,
link |
51:30.000
因為L2G裡面有max,
link |
51:33.000
所以我們不知道L2G長什麼樣子,
link |
51:35.000
所以我們要把max的d找出來,
link |
51:37.000
所以我們假設說,
link |
51:38.000
現在在基本G0的前提之下,
link |
51:41.000
哪一個d可以讓L2G最大呢?
link |
51:45.000
它是d0 star,
link |
51:47.000
d0 star可以讓V of G0最大,
link |
51:50.000
你就可以,
link |
51:51.000
也就是說這個V of G0,
link |
51:53.000
就如果我們今天這個d帶d0 star的話,
link |
51:57.000
我們就可以得到這個L2G,
link |
52:00.000
你這件事情你可以用gradient asset,
link |
52:03.000
就可以找出這個d,
link |
52:05.000
它可以maximize這個objective function,
link |
52:07.000
找到d可以maximize這個objective function以後,
link |
52:11.000
之後這個東西就是L2G了,
link |
52:16.000
接下來你就可以把θG對這一項算gradient,
link |
52:21.000
你就可以update你的參數,
link |
52:23.000
你就得到新的generator G1,
link |
52:26.000
你updateG的參數,
link |
52:27.000
你就得到新的generator G1,
link |
52:30.000
接下來你有新的generator G1以後,
link |
52:34.000
你有了新的G1,
link |
52:36.000
你就要重新找一下最好的d,
link |
52:39.000
因為你可能已經,
link |
52:40.000
本來你的region在這邊,
link |
52:42.000
最好的d是這一個,
link |
52:46.000
但是你現在移動你的G1以後,
link |
52:48.000
你可能已經進入下一個region,
link |
52:50.000
所以你要重新找一個最好的d,
link |
52:52.000
所以現在我們把這個generator從G0,
link |
52:55.000
update到G1,
link |
52:58.000
可以讓這個V of G1最大的那個d,
link |
53:01.000
假設是d1 star,
link |
53:04.000
接下來你就有一個新的objective function,
link |
53:07.000
它是V of G d1 star,
link |
53:09.000
你再把它對generator算gradient,
link |
53:13.000
再update你的generator,
link |
53:15.000
你就得到G2,
link |
53:17.000
所以這整個operation就是,
link |
53:19.000
你有一個G,G0,
link |
53:21.000
找一個可以讓V of G0 d最大的d0 star,
link |
53:25.000
那你就得到了你的V的function,
link |
53:27.000
然後讓它對G做微分,
link |
53:29.000
然後再重新去找一個新的d,
link |
53:31.000
再重新對你的objective function做微分,
link |
53:33.000
你會發現說這整個process,
link |
53:35.000
其實跟GAN是一模一樣的,
link |
53:39.000
其實跟GAN是一模一樣的,
link |
53:42.000
那你可以把它想成說,
link |
53:44.000
現在在找這個d0 star,
link |
53:47.000
去maximize這個objective function的process,
link |
53:50.000
其實就是在量d star,
link |
53:53.000
跟PG0的JS divergence,
link |
53:57.000
當我們今天找到一個G1,
link |
53:59.000
我們去找到一個d1 star,
link |
54:01.000
它可以讓這個objective function值被maximize,
link |
54:03.000
其實我們就是在計算,
link |
54:05.000
Pdata跟PG1的JS divergence,
link |
54:10.000
而下面這個式子,
link |
54:13.000
我們說這一項,
link |
54:15.000
它就是你的JS divergence,
link |
54:17.000
那你要update你的generator,
link |
54:19.000
去minimize你的JS divergence,
link |
54:21.000
這個時候,
link |
54:22.000
你其實就是在減少你的JS divergence,
link |
54:25.000
就是在達成你的目標,
link |
54:28.000
就是要去minimize你的JS divergence,
link |
54:31.000
但是這邊呢,
link |
54:34.000
我們打了一個問號,
link |
54:36.000
這邊為什麼打一個問號呢?
link |
54:38.000
因為這件事情,
link |
54:39.000
未必等同於真的在minimizeJS divergence,
link |
54:43.000
為什麼這麼說?
link |
54:44.000
因為我們有說過說,
link |
54:46.000
假設給你一個generator,
link |
54:48.000
假設你的generator就是G0,
link |
54:51.000
那你的V of G0D,
link |
54:53.000
假設它長這個樣子,
link |
54:55.000
你找到一個d0 star,
link |
54:57.000
這個d0 star的值啊,
link |
54:59.000
就是G0跟你的data之間的JS divergence,
link |
55:04.000
但是當你今天update你的G0的時候,
link |
55:11.000
當你今天update你的G0,
link |
55:13.000
變成G1的時候,
link |
55:15.000
這個時候呢,
link |
55:16.000
這個V of G1D,
link |
55:18.000
它的function可能就會變了,
link |
55:20.000
本來V of G0D是這個樣子,
link |
55:24.000
V of G0D0 star,
link |
55:26.000
就是G0跟你的data的JS divergence,
link |
55:29.000
但是今天你update你的G0,
link |
55:31.000
變成G1,
link |
55:33.000
這個時候你的整個function就變了,
link |
55:36.000
這個時候因為你的G0 star仍然是固定的,
link |
55:39.000
但是因為你的G0 star仍然是固定的,
link |
55:42.000
所以你的V of G1D0 star,
link |
55:44.000
它就不是在evaluate JS divergence,
link |
55:47.000
我們說evaluate JS divergence的D呢,
link |
55:50.000
是今天這個V of GD的這個值裡面呢,
link |
55:55.000
最大的那一個,
link |
55:57.000
最大的那一個,
link |
55:58.000
所以今天當你的G變了,
link |
56:00.000
你的這個function就變了,
link |
56:02.000
當你的function變的時候,
link |
56:03.000
同樣的D就不是在evaluate你的JS divergence,
link |
56:08.000
如果在這個例子裡面,
link |
56:09.000
JS divergence會變成是這個值,
link |
56:12.000
而不是這個值,
link |
56:14.000
而不是這個值,
link |
56:16.000
那但是為什麼我們又說,
link |
56:19.000
這一項可以看作是在減少JS divergence呢,
link |
56:23.000
我們今天做的一個前提的假設就是,
link |
56:25.000
這兩個式子可能是非常的像的,
link |
56:29.000
假設你只update一點點的G,
link |
56:31.000
從G0變到G1,
link |
56:33.000
G的參數只動了一點點,
link |
56:35.000
那這兩個function,
link |
56:37.000
它們的長相可能是比較像的,
link |
56:41.000
所以因為它們的長相仍是比較像的,
link |
56:45.000
所以一樣用D0 star,
link |
56:47.000
一樣用D0 star,
link |
56:49.000
你仍然是在量JS divergence,
link |
56:51.000
這樣子的情形就這邊本來值很小,
link |
56:54.000
突然變很高的情形,
link |
56:55.000
可能是不會發生的,
link |
56:56.000
因為G0跟G1是很像的,
link |
56:58.000
所以這兩個function應該是比較接近,
link |
57:00.000
所以你可以同樣用固定的D0 star,
link |
57:04.000
就可以evaluate G0跟G1的JS divergence,
link |
57:08.000
所以今天在train這個game的時候,
link |
57:10.000
它的tip就是,
link |
57:11.000
因為你有這個假設,
link |
57:13.000
就是G0跟G1應該是比較像的,
link |
57:16.000
所以今天在train你的generator的時候,
link |
57:18.000
你就不能夠一次update太多,
link |
57:20.000
但是你在train你的discriminator的時候,
link |
57:23.000
理論上你應該把它train到底,
link |
57:25.000
應該把它update多次一點,
link |
57:28.000
因為今天在量你的discriminator的時候,
link |
57:30.000
你必須要找到maximum的值,
link |
57:34.000
你才是在量JS divergence,
link |
57:36.000
所以在traindiscriminator的時候,
link |
57:37.000
你其實會需要比較多的iteration把它train到底,
link |
57:40.000
但是generator的話,
link |
57:42.000
你應該只要跑比較少的iteration,
link |
57:45.000
免得今天你現在在這個投影片上講的假設,
link |
57:49.000
是不成立的。
link |
57:51.000
接下來我們來講一下,
link |
57:54.000
實際上你在做game的時候,
link |
57:56.000
你其實是這麼做的,
link |
57:58.000
我們說我們的objective function裡面,
link |
58:00.000
要對X取expectation,
link |
58:05.000
但是在實際上,
link |
58:06.000
你沒有辦法真的算expectation,
link |
58:09.000
所以我們都是用sample來代替expectation,
link |
58:13.000
所以本來是對pdata,
link |
58:15.000
sampleX取它的expectation,
link |
58:18.000
但實際上你在做的時候,
link |
58:20.000
就是從pdata這個distribution裡面,
link |
58:22.000
sampleM比data,
link |
58:24.000
把這M比data的d of X統統算出來,
link |
58:26.000
然後再把它統統平均起來,
link |
58:28.000
就當作是expectation,
link |
58:30.000
一樣,本來你要從pg裡面,
link |
58:32.000
sampleX一對X出來算它expectation,
link |
58:34.000
但在實作上你沒有辦法這麼做,
link |
58:36.000
所以實作上你做的行為,
link |
58:38.000
是從pg裡面sample出M比data,
link |
58:41.000
再把這M比data,
link |
58:43.000
都去計算它的log1減d of X delta,
link |
58:46.000
然後把它全部平均起來,
link |
58:48.000
你就得到正向的approximation,
link |
58:52.000
所以實際上我們在做的時候,
link |
58:54.000
我們就是在maximize這個式子,
link |
58:56.000
而不是真的去maximize它的expectation,
link |
58:59.000
而這個式子啊,
link |
59:01.000
如果你回去檢查看看的話,
link |
59:03.000
我們剛才也講過,
link |
59:04.000
這件事情就等同於是在train一個binary的classifier,
link |
59:10.000
所以今天在實作Gantt的時候,
link |
59:12.000
它並不是一個,
link |
59:14.000
你完全不需要用什麼你原來不知道的東西,
link |
59:17.000
你在train discriminator的時候,
link |
59:19.000
你就是在train一個binary的classifier,
link |
59:22.000
所以實際上在做的時候是怎樣,
link |
59:24.000
你的discriminator是一個binary的classifier,
link |
59:26.000
這個binary classifier,
link |
59:28.000
它是一個logistic regression,
link |
59:31.000
就是它的output有接一個sigmoid,
link |
59:35.000
所以它output的值是介於0到1之間的,
link |
59:38.000
然後從pdata裡面你sampleM比data出來,
link |
59:41.000
M比data就當作是positive sample,
link |
59:44.000
或是class 1的example,
link |
59:46.000
然後你從pg裡面再sample另外M比data出來,
link |
59:50.000
這M比data就當作是negative sample,
link |
59:53.000
就當作是class 2的example,
link |
59:55.000
接下來就train你的binary classifier,
link |
59:58.000
你train你的criterion,
link |
59:59.000
你會minimize cross entropy,
link |
01:00:01.000
你會發現說,
link |
01:00:02.000
如果你在minimize cross entropy,
link |
01:00:04.000
你把你的式子寫出來,
link |
01:00:05.000
它會等同於上面maximize這個objective function,
link |
01:00:10.000
minimize cross entropy,
link |
01:00:11.000
等同於maximize上面這個objective function,
link |
01:00:15.000
最後我們就再重新複習一次game的algorithm,
link |
01:00:19.000
整個game的algorithm是這樣子,
link |
01:00:21.000
我們有一個thetaD,
link |
01:00:23.000
我們有一個thetaG,
link |
01:00:25.000
這個是你initialize的parameter,
link |
01:00:27.000
在每一個iteration裡面,
link |
01:00:29.000
你做的事情是什麼,
link |
01:00:30.000
你從pdata這個distribution裡面,
link |
01:00:33.000
sampleM比example,
link |
01:00:36.000
你從你的某一個quiet distribution,
link |
01:00:38.000
它可以是gaussian distribution,
link |
01:00:40.000
可以是normal distribution,
link |
01:00:41.000
其實沒有那麼重要,
link |
01:00:42.000
你就固定住某一個quiet distribution,
link |
01:00:44.000
你從這個quiet distribution裡面,
link |
01:00:46.000
去sample出M的vector,
link |
01:00:48.000
這些vector用Z來表示,
link |
01:00:50.000
根據這些vector Z,
link |
01:00:52.000
你把它丟到generator裡面,
link |
01:00:54.000
它會產生一堆image,
link |
01:00:56.000
也就是x tilde,
link |
01:00:58.000
所以你產生一堆x tilde,
link |
01:01:00.000
這邊有一堆real的image,
link |
01:01:01.000
你這邊有一堆generated image,
link |
01:01:04.000
接下來你要train你的discriminator,
link |
01:01:07.000
這個discriminator在training的時候,
link |
01:01:09.000
它就是maximize下面這個objective function,
link |
01:01:13.000
我們剛才有講過說,
link |
01:01:14.000
maximize下面這個objective function,
link |
01:01:16.000
其實就等同於,
link |
01:01:18.000
直接train一個binary classifier,
link |
01:01:20.000
把這邊的x當作是一類,
link |
01:01:23.000
把這邊的x tilde當作是另外一類,
link |
01:01:26.000
直接train一個binary classifier,
link |
01:01:28.000
你的binary classifier是minimum cost entropy,
link |
01:01:30.000
就是在maximize下面這個式子,
link |
01:01:33.000
就是在maximize下面這個式子,
link |
01:01:35.000
你train了一個discriminator出來,
link |
01:01:38.000
我們之前有講過說,
link |
01:01:40.000
我們traindiscriminator的目的是什麼,
link |
01:01:42.000
是為了要evaluate jth divergence,
link |
01:01:45.000
而什麼時候discriminator可以evaluate jth divergence,
link |
01:01:48.000
當它可以讓你的v的值最大的時候,
link |
01:01:51.000
discriminator才是在evaluate jth divergence,
link |
01:01:55.000
你要讓v的值被maximize,
link |
01:01:57.000
它才是在evaluate jth divergence,
link |
01:01:59.000
為了要讓這個v的值最大,
link |
01:02:02.000
你一定要train很多次,train到收斂為止,
link |
01:02:06.000
它才能夠讓v的值最大,對不對,
link |
01:02:08.000
那在實作上你沒有辦法真的train很多次,
link |
01:02:10.000
train到收斂為止,
link |
01:02:11.000
但是你會說,
link |
01:02:12.000
我今天train這個d的時候,
link |
01:02:15.000
我要反覆k次,
link |
01:02:16.000
我這個參數要updatek次,
link |
01:02:19.000
而不是像投影片上面只寫update一次而已,
link |
01:02:21.000
你可能會update比如說三次或五次,
link |
01:02:24.000
才停止。
link |
01:02:28.000
好,那這個步驟是在解這個問題,
link |
01:02:31.000
找一個d,它可以maximize v of gd,
link |
01:02:35.000
但是其實你沒有辦法真的找到一個最好的d,
link |
01:02:38.000
去maximize v of gd,
link |
01:02:39.000
你能夠找的其實只是一個lower bound而已,
link |
01:02:43.000
因為這邊你通常是在實作的時候,
link |
01:02:45.000
你沒有辦法真的train到收斂,
link |
01:02:47.000
你沒有辦法真的一直train d,
link |
01:02:49.000
train到說你可以讓v of gd真的變得最大,
link |
01:02:52.000
你通常就是train幾步,然後就停下來,
link |
01:02:55.000
而就算我們退一萬步說,
link |
01:02:57.000
你這邊你可以一直train到收斂,
link |
01:02:59.000
你其實也未必真的能夠maximize這個objective function,
link |
01:03:03.000
對不對,因為你在train的時候,
link |
01:03:04.000
你的d的capacity並不是無窮大的,
link |
01:03:08.000
你會蹭蹭蹭就卡在一個local minima,
link |
01:03:11.000
然後就結束了,對不對,
link |
01:03:13.000
所以你並不真的可以maximize這個式子,
link |
01:03:17.000
然後再退一萬步說,
link |
01:03:18.000
假設你沒有那個什麼local minima,
link |
01:03:22.000
local maxima的問題,
link |
01:03:23.000
你可以直接解這個問題,
link |
01:03:25.000
你的d呢,它的capacity也是有限的,
link |
01:03:28.000
你記得我們有說過說,
link |
01:03:29.000
如果你要量js divergence,
link |
01:03:31.000
我們一個假設是你的d可以是任何function,
link |
01:03:34.000
但事實上你的d是一個network,
link |
01:03:35.000
所以它也不可以,
link |
01:03:36.000
它其實也不是任何function,
link |
01:03:38.000
所以你沒有辦法真的maximize這一項,
link |
01:03:41.000
你能夠找到的只是一個lower bound而已,
link |
01:03:43.000
但我們就假設你其實可以maximize這一項就是了,
link |
01:03:46.000
好,那接下來呢,
link |
01:03:47.000
要train generator,
link |
01:03:50.000
那我們說train discriminator的時候是為了量js divergence,
link |
01:03:54.000
train generator的時候是為了要minimize js divergence,
link |
01:03:58.000
為了要減少js divergence,
link |
01:04:00.000
前面這個步驟是在量出js divergence,
link |
01:04:03.000
接下來下一個步驟是在減少js divergence,
link |
01:04:06.000
怎麼做呢,
link |
01:04:08.000
你就從你的,
link |
01:04:10.000
你就先一樣呢,
link |
01:04:11.000
sample and vector出來,
link |
01:04:16.000
然後接下來呢,
link |
01:04:17.000
你就要解下面這個式子,
link |
01:04:20.000
一樣,就我們說本來這個discriminator是要minimize這個式子嘛,
link |
01:04:24.000
那generator呢,
link |
01:04:25.000
要minimize一個一模一樣的式子,
link |
01:04:28.000
但是下面這個式子裡面,
link |
01:04:30.000
你會發現說第一項,
link |
01:04:32.000
第一項呢,
link |
01:04:33.000
跟generator呢,
link |
01:04:35.000
是沒有關係的,
link |
01:04:37.000
因為第一項只跟discriminator有關,
link |
01:04:40.000
它跟generator沒有關係,
link |
01:04:42.000
所以你要train你的generator去minimize這個式子的時候,
link |
01:04:46.000
第一項呢,
link |
01:04:47.000
你是可以不用考慮它的,
link |
01:04:48.000
所以你把第一項拿掉,
link |
01:04:49.000
只去minimize第二項的式子,
link |
01:04:52.000
好,這個第二個步驟呢,
link |
01:04:54.000
就是在train你的generator,
link |
01:04:57.000
那我們剛才有講過說,
link |
01:04:58.000
generator你不能夠train太多,
link |
01:05:01.000
因為一旦你train太多的話,
link |
01:05:03.000
你的discriminator就沒有辦法evaluatejs divergence,
link |
01:05:06.000
所以你的generator不能train太多,
link |
01:05:09.000
你只能夠少量的update它的參數而已,
link |
01:05:12.000
所以通常你的generator,
link |
01:05:13.000
這邊update一次就好,
link |
01:05:15.000
所以你可以update discriminator很多次,
link |
01:05:17.000
但是generator你update一次就好,
link |
01:05:20.000
你用discriminator算出js divergence以後,
link |
01:05:23.000
你只用generator少少的update一次,
link |
01:05:26.000
讓你的js divergence變小,
link |
01:05:27.000
但你不能走太多,
link |
01:05:28.000
你update太多,
link |
01:05:29.000
你量出來js divergence,
link |
01:05:30.000
不對了,
link |
01:05:31.000
你就不是在量js divergence,
link |
01:05:32.000
所以這邊呢,
link |
01:05:33.000
你就不能夠update太多,
link |
01:05:36.000
好,那我們到目前為止,
link |
01:05:39.000
我們講說,
link |
01:05:40.000
今天在train generator的時候,
link |
01:05:41.000
你要去minimize的式子,
link |
01:05:43.000
長這個樣子,
link |
01:05:45.000
那在Ian Gruffalo原始的paper裡面,
link |
01:05:47.000
他從開篇,
link |
01:05:48.000
從有game以來,
link |
01:05:50.000
從開篇PD以來,
link |
01:05:51.000
他就不是用,
link |
01:05:52.000
他就不是在minimize這個式子,
link |
01:05:55.000
因為他在paper裡面加了一小段,
link |
01:05:56.000
他說,
link |
01:05:57.000
這個式子啊,
link |
01:05:59.000
log1-dx,
link |
01:06:01.000
它長的是這個樣子,
link |
01:06:04.000
而我們一開始在做training的時候,
link |
01:06:07.000
你的dx的值呢,
link |
01:06:10.000
通常是很小的,
link |
01:06:12.000
因為你的discriminator會知道說,
link |
01:06:14.000
你的generator產生出來的image,
link |
01:06:16.000
它是fake的,
link |
01:06:17.000
所以他會給它很小的值,
link |
01:06:19.000
所以一開始,
link |
01:06:20.000
你的dx的值呢,
link |
01:06:21.000
會落在這個地方,
link |
01:06:23.000
那它的微分是很小的,
link |
01:06:24.000
所以你在training的時候,
link |
01:06:25.000
會造成你在training的一些問題,
link |
01:06:28.000
所以他說呢,
link |
01:06:29.000
我們把它改成這個樣子,
link |
01:06:32.000
沒有為什麼,
link |
01:06:33.000
我們把它改成這個樣子,
link |
01:06:34.000
本來是log1-dx,
link |
01:06:37.000
把它換成-logdx,
link |
01:06:41.000
那-logdx,
link |
01:06:42.000
它長的是這個樣子,
link |
01:06:44.000
那這兩個式子的趨勢是一樣的,
link |
01:06:48.000
在這邊,
link |
01:06:49.000
最大的東西,
link |
01:06:50.000
在這邊還是最大,
link |
01:06:51.000
在這邊最小的東西,
link |
01:06:52.000
在這邊還是最小,
link |
01:06:53.000
它們的趨勢是一樣的,
link |
01:06:55.000
但是它們在同一個位置的斜率呢,
link |
01:06:58.000
就變得是不一樣,
link |
01:07:00.000
所以一開始,
link |
01:07:01.000
dx的值還很小的時候,
link |
01:07:02.000
你算出來的微分會比較大,
link |
01:07:04.000
那所以Ian Goodfellow覺得說,
link |
01:07:06.000
這樣子training是比較容易的,
link |
01:07:09.000
那你再從另外,
link |
01:07:10.000
其實你再從另外一個實作的角度來看,
link |
01:07:14.000
如果你是要maximize這個式子,
link |
01:07:19.000
你會發現說,
link |
01:07:20.000
你需要改code的,
link |
01:07:22.000
有點麻煩,
link |
01:07:23.000
如果你再仔細想想,
link |
01:07:25.000
你今天如果是要minimize這個式子,
link |
01:07:29.000
說錯了,
link |
01:07:30.000
如果你要minimize這個式子,
link |
01:07:31.000
其實你要改code的,
link |
01:07:33.000
如果你是minimize這個式子,
link |
01:07:35.000
你可以不用改code的,
link |
01:07:38.000
你直接把你剛才,
link |
01:07:39.000
我們剛才不是說,
link |
01:07:40.000
你在trainDiscriminator的時候,
link |
01:07:41.000
你就是train了一個binary的classifier嘛,
link |
01:07:43.000
它就分辨兩個不同的類別,
link |
01:07:45.000
對嗎?
link |
01:07:46.000
今天如果你是用下面這個式子來,
link |
01:07:49.000
要minimize下面這個式子的時候,
link |
01:07:52.000
你其實只是把那個binary classifier的label,
link |
01:07:55.000
換過來,
link |
01:07:56.000
就本來是說sample的data,
link |
01:07:59.000
從data裡面sample出來的是class1,
link |
01:08:02.000
從generator sample出來的是class2,
link |
01:08:05.000
所以把它label換過來,
link |
01:08:06.000
把generator sample出來的改標成label1,
link |
01:08:10.000
然後用同樣的code去跑下去,
link |
01:08:12.000
就可以了,
link |
01:08:13.000
我認為Ian Goodfellow他其實只是懶得改code而已,
link |
01:08:16.000
所以就胡亂編一個理由說,
link |
01:08:17.000
應該要用下面這個式子,
link |
01:08:19.000
那實際上後來有人試了比較,
link |
01:08:21.000
這兩種不同的方法,
link |
01:08:22.000
發現都是可以train得起來,
link |
01:08:24.000
performance其實也是差不多的,
link |
01:08:26.000
不知道為什麼Ian Goodfellow一開始就選擇這個,
link |
01:08:28.000
我覺得只是因為他implement下去才發現說,
link |
01:08:31.000
弄錯了這樣子,
link |
01:08:33.000
然後又懶得改code了,
link |
01:08:35.000
所以他就用這個東西繼續做下去,
link |
01:08:39.000
這些東西是有名字的啦,
link |
01:08:41.000
因為這些方法就是,
link |
01:08:45.000
有人就會說這個叫做original GAN,
link |
01:08:48.000
這個叫做modified GAN,
link |
01:08:49.000
然後都搞不清楚什麼是什麼,
link |
01:08:50.000
所以後來Ian Goodfellow還寫了另外一篇文章,
link |
01:08:53.000
他說我們應該把這些GAN證明,
link |
01:08:55.000
上面這個叫做minimax GAN,
link |
01:08:58.000
就是NN GAN,
link |
01:08:59.000
下面這個叫做non-stationary GAN,就是NS GAN,
link |
01:09:06.000
好,那在下課之前呢,
link |
01:09:08.000
我們在講一些,
link |
01:09:09.000
剛才講了很多的數學,
link |
01:09:11.000
現在我們講一些比較直觀的東西,
link |
01:09:13.000
所以按照Ian Goodfellow的想法,
link |
01:09:15.000
今天這個generator和discriminator,
link |
01:09:18.000
他們之間的關係是什麼樣子呢?
link |
01:09:20.000
假設這個是你的data的distribution,
link |
01:09:24.000
這個是你的generator所產生出來的data distribution,
link |
01:09:29.000
好,那你現在要認一個discriminator,
link |
01:09:32.000
discriminator要給綠色的點比較高的分數,
link |
01:09:35.000
給藍色的點比較低的分數,
link |
01:09:38.000
這個discriminator的objective value,
link |
01:09:41.000
就是這兩堆data的JS divergence,
link |
01:09:46.000
或某種其他的divergence,
link |
01:09:48.000
好,那你現在有了這個discriminator以後,
link |
01:09:51.000
有了這個discriminator以後,
link |
01:09:52.000
這些generated的點,
link |
01:09:54.000
因為在train的時候呢,
link |
01:09:55.000
這個generator會希望呢,
link |
01:09:58.000
它產生出來的東西,
link |
01:10:00.000
通過discriminator以後,
link |
01:10:02.000
得到的分數越大越好,
link |
01:10:04.000
所以這些點呢,
link |
01:10:05.000
就會往右移動,
link |
01:10:07.000
這些點呢,
link |
01:10:08.000
就會往右移動,
link |
01:10:09.000
那它可能會一下子跑太多,
link |
01:10:11.000
就跑到藍色的點的右邊去,
link |
01:10:13.000
但沒有關係,
link |
01:10:14.000
接下來呢,
link |
01:10:15.000
你會再train一次你的discriminator,
link |
01:10:18.000
那因為現在藍色的點跟綠色的點比較近,
link |
01:10:20.000
所以這個discriminator呢,
link |
01:10:22.000
它的loss就比較大,
link |
01:10:23.000
它的loss比較大,
link |
01:10:24.000
代表說這兩種點的JS divergence呢,
link |
01:10:26.000
是比較小的,
link |
01:10:29.000
好,那接下來呢,
link |
01:10:30.000
這些藍色的點呢,
link |
01:10:31.000
會順著這個discriminator的,
link |
01:10:33.000
給的這個gradient的方向呢,
link |
01:10:35.000
往左移,
link |
01:10:36.000
往左移,
link |
01:10:37.000
好,最後呢,
link |
01:10:38.000
藍色distribution跟綠色distribution,
link |
01:10:41.000
就會越來越近,
link |
01:10:43.000
當這兩種distribution,
link |
01:10:45.000
完全一模一樣的時候,
link |
01:10:47.000
完全一模一樣的時候,
link |
01:10:49.000
你train一個discriminator,
link |
01:10:51.000
這個discriminator,
link |
01:10:52.000
會完全沒有辦法分別這兩種data,
link |
01:10:54.000
因為對這個discriminator來說,
link |
01:10:56.000
這兩種data是一模一樣的,
link |
01:10:58.000
不管他怎麼努力,
link |
01:10:59.000
都沒有辦法分別這兩種data,
link |
01:11:01.000
所以最後discriminator會壞掉,
link |
01:11:03.000
會壞掉,
link |
01:11:04.000
對他來說,
link |
01:11:05.000
每一個地方都是一樣的,
link |
01:11:07.000
每一個地方,
link |
01:11:08.000
這個pdata跟pg出現機率都是一樣的,
link |
01:11:11.000
所以discriminator呢,
link |
01:11:12.000
就會變成一條水平的線,
link |
01:11:14.000
他沒有辦法再做任何事情,
link |
01:11:17.000
把箭頭叫出來,
link |
01:11:19.000
把箭頭叫出來,
link |
01:11:20.000
這個demo是這個樣子的,
link |
01:11:22.000
綠色的點是你的pdata,
link |
01:11:25.000
藍色的點是你的pg,
link |
01:11:27.000
所以綠色的點是你的目標,
link |
01:11:29.000
藍色的點是generator產生出來的東西,
link |
01:11:31.000
背景這個顏色,
link |
01:11:33.000
是discriminator的值,
link |
01:11:35.000
discriminator會assign給每一個x,
link |
01:11:38.000
就是faceup每一個x一個值,
link |
01:11:40.000
所以背景的這個顏色,
link |
01:11:42.000
是discriminator的值,
link |
01:11:44.000
這個demo看起來是這個樣子,
link |
01:11:46.000
你就會發現說呢,
link |
01:11:48.000
這個discriminator呢,
link |
01:11:49.000
就把你的pg產生出來的藍色的點趕來趕去,
link |
01:11:53.000
趕來趕去,
link |
01:11:54.000
直到最後呢,
link |
01:11:55.000
藍色的點跟綠色的點重合在一起的時候,
link |
01:11:58.000
那對你的discriminator來說,
link |
01:12:00.000
他就會壞掉,
link |
01:12:01.000
他完全沒有辦法分辨pg跟pdata之間的差別,
link |
01:12:05.000
好,再播一次嗎,
link |
01:12:07.000
他長得這樣子,
link |
01:12:08.000
就這樣子,
link |
01:12:14.000
好,
link |
01:12:15.000
最後呢,
link |
01:12:16.000
你的discriminator呢,
link |
01:12:17.000
就會壞掉,
link |
01:12:18.000
因為他完全沒有辦法分辨generator跟discriminator之間的差別,
link |
01:12:22.000
他就會壞掉,
link |
01:12:23.000
講到這邊,
link |
01:12:24.000
大家有沒有問題要問的呢,
link |
01:12:26.000
請說,
link |
01:12:33.000
一般在做的時候,
link |
01:12:34.000
你知道我們今天在training classifier的時候,
link |
01:12:37.000
我們其實會害怕data imbalance的問題,
link |
01:12:40.000
那今天在這個task裡面,
link |
01:12:42.000
data是我們自己sample出來的,
link |
01:12:44.000
所以我們不會故意給自己製造data imbalance的問題,
link |
01:12:48.000
所以你的兩種task,
link |
01:12:50.000
你會sample一樣的數目,
link |
01:12:52.000
就是說假設你從generator裡面generate256筆data,
link |
01:12:56.000
那你今天從你的sample的data base裡面,
link |
01:12:58.000
你也會sample256筆data,
link |
01:13:02.000
好,講到這邊,
link |
01:13:03.000
大家還有問題要問的嗎,
link |
01:13:07.000
如果你沒有問題要問的話,
link |
01:13:09.000
其實我有一個問題要問這樣子,
link |
01:13:12.000
我的問題是這個樣子的,
link |
01:13:15.000
你不覺得今天講的跟上週講的,
link |
01:13:17.000
是有點矛盾的嗎,
link |
01:13:20.000
如果按照Ian Goodfellow的講法,
link |
01:13:23.000
下面這個圖是Ian Goodfellow paper上的圖啦,
link |
01:13:26.000
他說最後discriminator圈圈圈圈到後來,
link |
01:13:29.000
他就會爛掉,
link |
01:13:30.000
變成一個水平線,
link |
01:13:31.000
但我們上週說discriminator其實就是evaluation的function,
link |
01:13:36.000
也就是說discriminator的值,
link |
01:13:38.000
代表他想要評斷說,
link |
01:13:40.000
這一個object,
link |
01:13:42.000
這個generate出來的東西,
link |
01:13:44.000
他到底是好還是不好,
link |
01:13:47.000
如果今天你的discriminator是一條水平線,
link |
01:13:50.000
他就不是一個evaluation的function啦,
link |
01:13:52.000
對他來說所有的東西都是一樣好,
link |
01:13:55.000
或者是一樣壞的,
link |
01:13:57.000
這個是Ian Goodfellow畫的圖,
link |
01:14:01.000
而右上角這個啊,
link |
01:14:02.000
是Yann LeCun畫的圖,
link |
01:14:05.000
你看Yann LeCun他在畫那個圖的時候,
link |
01:14:07.000
這個他也是在講game啦,
link |
01:14:08.000
他也是在講game,
link |
01:14:09.000
然後他畫的這個圖就是discriminator的圖,
link |
01:14:13.000
然後這個綠色的點啊,
link |
01:14:15.000
這個綠色的點就是real data的分布,
link |
01:14:17.000
你發現他在畫的時候,
link |
01:14:18.000
在他的想像裡面,
link |
01:14:19.000
最後discriminator並沒有死掉,
link |
01:14:22.000
並沒有爛掉,
link |
01:14:23.000
變成一個水平線,
link |
01:14:24.000
而是說有data分布的地方,
link |
01:14:26.000
他會得到比較小的值,
link |
01:14:28.000
而沒有data分布的地方,
link |
01:14:29.000
他會得到比較大的值,
link |
01:14:32.000
他跟我上課講的是相反,
link |
01:14:34.000
上課講說有data分布的地方值比較大,
link |
01:14:36.000
沒有data分布的地方值比較小,
link |
01:14:38.000
上課講的是正好相反,
link |
01:14:39.000
但是意思完全是一樣的,
link |
01:14:40.000
只有data分布的地方值是比較小,
link |
01:14:42.000
其他地方值是比較大,
link |
01:14:44.000
跟Yann LeCun畫講的是有一些矛盾的,
link |
01:14:48.000
而這個就是神奇的地方就是了,
link |
01:14:53.000
因為這個都是上代發展中的理論,
link |
01:14:55.000
所以有很多的問題是未知的,
link |
01:14:58.000
也許明年我們在開同樣的課的時候,
link |
01:15:02.000
我又會有不一樣,
link |
01:15:03.000
完全不一樣的想法也說不定,
link |
01:15:05.000
就好像以前我們在train deep learning的時候,
link |
01:15:08.000
我們都要用restricted Boltzmann machine,
link |
01:15:10.000
過去我們都相信說沒有restricted Boltzmann machine,
link |
01:15:13.000
是train不起來的,
link |
01:15:16.000
所以像我們之前第一次開MLDS的時候,
link |
01:15:22.000
其實都會花兩週講restricted Boltzmann machine,
link |
01:15:25.000
那今天如果再講restricted Boltzmann machine,
link |
01:15:27.000
我相信就生氣了,
link |
01:15:28.000
覺得在拖台錢這樣子,
link |
01:15:29.000
因為根本就用不上這個技術,
link |
01:15:32.000
所以這個變化是非常快的,
link |
01:15:34.000
也許我們明年再來講同樣的東西的時候,
link |
01:15:36.000
就會有截然不同的講法也說不定,
link |
01:15:39.000
那今天如果你問我說,
link |
01:15:41.000
到底是哪一種的話,
link |
01:15:44.000
就假設你硬要我給你一個答案告訴你說,
link |
01:15:46.000
到底應該是Ian Goodfellow講的比較對,
link |
01:15:49.000
還是Jan Larkin講的比較對,
link |
01:15:51.000
那我的感覺是,
link |
01:15:53.000
首先你可以從實驗上來看看,
link |
01:15:56.000
如果你真的train完你的gap,
link |
01:16:00.000
然後你去evaluate一下你的discriminator,
link |
01:16:03.000
它的感覺好像是介於這兩個case中間,
link |
01:16:08.000
就它絕對不是爛掉,
link |
01:16:09.000
它絕對不是變成一個完全爛掉的discriminator,
link |
01:16:13.000
你自己回去是做做看你幾時train出這樣子的結果,
link |
01:16:18.000
就算是這種簡單的例子,
link |
01:16:19.000
你也train不出這個結果的,
link |
01:16:20.000
真的,
link |
01:16:21.000
所以就算是這個一維的例子,
link |
01:16:24.000
你都做不出這個結果,
link |
01:16:25.000
所以不太像是Ian Goodfellow講的這樣,
link |
01:16:27.000
但是你的discriminator也不完全反映了data的distribution,
link |
01:16:31.000
所以感覺是介於這兩個case之間,
link |
01:16:35.000
好,
link |
01:16:36.000
那這些觀點到底對我們了解更有什麼幫助呢?
link |
01:16:39.000
也許Gan的algorithm就是一樣,
link |
01:16:41.000
那個演算法就是那個樣子,
link |
01:16:42.000
就是train,
link |
01:16:43.000
generator,
link |
01:16:44.000
traindiscriminator,
link |
01:16:45.000
traingradient,
link |
01:16:46.000
也許它的algorithm是不會隨著你的觀點不同,
link |
01:16:51.000
但是你用不同的觀點來看待Gan,
link |
01:16:54.000
你其實在設計你的algorithm的時候,
link |
01:16:57.000
中間會有一些微妙差別,
link |
01:16:58.000
也許這些微妙差別導致最後training的結果會是很不一樣的,
link |
01:17:03.000
但其實我覺得也許Ian Goodfellow的這個講法反而是,
link |
01:17:08.000
就是說我上週講的discriminator是在evaluate一個object的好還是不好,
link |
01:17:15.000
它是在反映了data的distribution這件事,
link |
01:17:18.000
也許更接近現實,
link |
01:17:20.000
為什麼我會這麼說呢?
link |
01:17:22.000
首先,
link |
01:17:23.000
你在文件上看到很多人會做什麼事情,
link |
01:17:26.000
他會把discriminator當作一個classifier來用,
link |
01:17:29.000
就你先train好一個Gan,
link |
01:17:31.000
然後你把那個discriminator拿來做其他的事情,
link |
01:17:34.000
假設今天discriminator其實train到最後,
link |
01:17:37.000
按照Ian Goodfellow猜想會爛掉的話,
link |
01:17:40.000
那你拿它來當作pre-training根本就沒有意義啊,
link |
01:17:43.000
但很多人會拿它來當作pre-training,
link |
01:17:44.000
也顯示它是有用的,
link |
01:17:46.000
所以它不太可能是真的train到後來就壞掉,
link |
01:17:51.000
這是第一個evidence,
link |
01:17:52.000
另外一個evidence是說,你想想看你今天在trainGan的時候,
link |
01:17:57.000
你並不是每一次都重新train你的discriminator對不對,
link |
01:18:02.000
我們不是每次都重traindiscriminator,
link |
01:18:06.000
而是會拿前一個iteration的discriminator,
link |
01:18:10.000
當作下一個iteration的initialize的參數,
link |
01:18:14.000
如果你今天你的discriminator,
link |
01:18:16.000
是想要衡量兩個data distribution的divergence的話,
link |
01:18:21.000
你其實沒有必要把前一個iteration的東西拿來用,
link |
01:18:26.000
因為現在你的generator已經變啦,
link |
01:18:29.000
你保留前一個iteration的東西有什麼意義呢,
link |
01:18:31.000
所以這樣子感覺是不太合理的,
link |
01:18:36.000
也有人可能會說,
link |
01:18:37.000
因為今天的generator它update的參數,
link |
01:18:40.000
它update的量是比較小的,
link |
01:18:42.000
所以也許把前一個time state得到generator,
link |
01:18:46.000
當作下一個time state的initialization,
link |
01:18:48.000
可以加快discriminator訓練的速度,
link |
01:18:52.000
也說不定,那這個理由感覺也是成立的,
link |
01:18:57.000
不過在文件上我們會看到說,
link |
01:18:59.000
有人在trainGan的時候他有一招,
link |
01:19:01.000
是他每次train的時候,
link |
01:19:04.000
他不只拿現在的generator去sample data,
link |
01:19:07.000
他也會拿過去的generator也sample data,
link |
01:19:11.000
然後把這些各個不同的generator,
link |
01:19:14.000
sample data統統集合起來,
link |
01:19:15.000
再去traindiscriminator,可以得到的performance會是比較好,
link |
01:19:20.000
那如果今天discriminator是在evaluate你現在的generator,
link |
01:19:24.000
跟你的data distribution的差異的話,
link |
01:19:26.000
好像做這件事情也沒有太大的意義,
link |
01:19:29.000
就你拿過去的generator,
link |
01:19:30.000
因為現在量現在的generator跟你data之間的差異,
link |
01:19:32.000
你拿過去的generator產生出來的東西,
link |
01:19:34.000
有什麼用呢,沒有什麼用啊,
link |
01:19:36.000
為什麼要這麼做,
link |
01:19:37.000
但是在實作上有發現,
link |
01:19:38.000
拿過去的generator所產生出來的東西,
link |
01:19:40.000
再去訓練discriminator,
link |
01:19:42.000
是可以得到比較好的成果的,
link |
01:19:45.000
所以這樣看起來,
link |
01:19:46.000
也許這是另外一個support支持說,
link |
01:19:49.000
也許discriminator來做的事情,
link |
01:19:52.000
並不見得是在evaluate兩個distribution之間的divergence,
link |
01:19:57.000
不過至少Ian Goodfellow一開始是這麼說的,
link |
01:20:00.000
所以我們也把Gen最開始的理論告訴大家,
link |
01:20:04.000
好,那我們就在這邊先休息10分鐘,
link |
01:20:09.000
等一下下一堂課要講到40分到50分之間,
link |
01:20:13.000
然後助教會來講作業32。