back to index
【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條件式生成

link |
那上週講到哪裡呢?上週講到WGAN,
link |
然後我們還說實際上呢,如果你要實作WGAN的話,
link |
那今天看起來呢,效果最好的其實是Spectral Normalization,
link |
很多人會縮寫成這個SNGAN,SN就是Spectral Normalization的意思。
link |
但是雖然說已經有WGAN,但其實並不代表說GAN就一定特別好勸,
link |
GAN仍然是以很難把它勸起來而聞名的。
link |
那為什麼GAN很難被勸起來呢?它有一個本質上困難的地方。
link |
我們來想想看Discriminator跟Generator他們各自在做的事情是什麼。
link |
Discriminator做的事情是要分辨真的圖片跟產生出來的,
link |
也就是假的圖片的差異。這是Discriminator在做的事情。
link |
而Generator在做的事情,它是要去產生假的圖片騙過Discriminator。
link |
而事實上這兩個Network,這個Generator跟Discriminator,
link |
另外一個人就會跟著停下訓練,就會跟著變差跟著慘掉。
link |
所以今天假設你在勸Discriminator的時候,
link |
一下子沒有勸好,你的Discriminator沒有辦法分辨
link |
那Generator他就失去了可以進步的目標,
link |
Generator就沒有辦法再進步了。
link |
Generator沒有辦法再進步了,Discriminator也會跟著停下來了。
link |
如果Generator沒有辦法再進步,
link |
那Discriminator就沒有辦法再跟著進步了。
link |
所以Discriminator跟Generator他們在訓練的時候,
link |
只要其中一者不再進步,另外一個人就會跟著停下來。
link |
但是到目前為止,大家已經勸過了很多次的Network,
link |
你有辦法保證說你勸下去,他的Loss就一定會下降嗎?
link |
不一定對不對?你要讓Network trend起來,往往你需要調一下Hyperparameter,
link |
那今天這個Discriminator跟Generator他們互動的過程是自動的,
link |
一旦在某一個步驟,因為我們不會在中間每一次Trend Discriminator的時候
link |
你都換Hyperparameter,所以只能祈禱說每一次Trend Discriminator的時候
link |
那如果有一次沒有下降,那整個Trend很有可能就會慘掉,
link |
整個Discriminator跟Generator彼此砥礪的這個過程就可能會停下來。
link |
所以今天Generator跟Discriminator在Trend的時候,他們必須要棋逢敵手,
link |
任何一個人放棄了這場比賽,另外一個人也就玩不下去了。
link |
所以Game本質上他的Trending仍然不是一件容易的事情。
link |
當然他是一個非常重要的技術,所以雖然他是一個前瞻的技術,
link |
有人可能會覺得說你不要把這種你自己都不見得Trend起來的Navigate放到那個作業裡面啦,
link |
但是我覺得說這是一個重要而前瞻的技術,
link |
所以我們還是應該要讓大家有機會接觸這種最前瞻的技術,
link |
你至少可以知道說Trend Game不是一件那麼容易的事情。
link |
當然其實從另外一個角度而言,因為很多人都在做類似的研究,
link |
所以在網路上你可以找到滿坑滿谷相關的程式,
link |
所以其實從這個角度而言,他其實也沒有你想像的那麼困難。
link |
不過Trend Game仍然不是一件容易的事就是了。
link |
你可以在網路上找到滿坑滿谷的Game的Tips,
link |
就是把一些相關的跟Trend Game的訣竅有關的文獻,還有連結,
link |
Trend Game最難的其實是要拿Game來生成文字。
link |
如果你要拿Game生成一段文字,這個會是最困難的。
link |
為什麼用Game生成一段文字會是最困難的呢?
link |
那你可能會有一個Sequence to Sequence的Model,
link |
你有一個Decoder,那這個Decoder會產生一段文字。
link |
那我們現在這個Sequence to Sequence的Model就是我們的Generator。
link |
就是在過去在講Transformer的時候,這是一個Decoder,
link |
那它現在在Game裡面,它就扮演了Generator的角色,
link |
負責產生我們要它產生的東西,比如說一段文字。
link |
那你說這個會跟原來的Game,在影像上的Game有什麼不同呢?
link |
就最High Level來看,就演算法來看,可能沒有太大的不同,
link |
因為接下來你就訓練一個Discriminator,
link |
Discriminator把這段文字讀進去,
link |
去判斷說這段文字是真正的文字,還是機器產生出來的文字。
link |
而Decoder就是想辦法去騙過Discriminator,
link |
Generator就是想辦法去騙過Discriminator,
link |
你去調整你的Generator的參數,
link |
想辦法讓Discriminator覺得Generator產生出來的東西是真正的。
link |
這邊的難點在於,你如果要用Gradient Descent去train你的Decoder,
link |
去讓Discriminator output的分數越大越好,
link |
所謂的Gradient,所謂的微分,
link |
其實就是某一個參數,它有變化的時候,
link |
我們現在來想想看,假設我們改變了Decoder的參數,
link |
我們這個Generator,也就是Decoder的參數,
link |
到底對Discriminator的輸出有什麼樣的影響?
link |
Decoder的參數如果有一點小小的變化,
link |
那它現在輸出的這個distribution也會有小小的變化。
link |
所以它不會影響最大的那個token是什麼東西。
link |
我知道說token可能對各位同學來說,
link |
token就是你現在在處理這個問題,
link |
處理產生這個sequence的單位。
link |
所以假設我們今天在產生一個中文的句子的時候,
link |
我們是每次產生一個character,一個方塊字,
link |
所以token的定義是你自己決定的,
link |
看你要拿什麼樣的東西當作你產生一個句子的單位。
link |
那今天這個distribution只有小小的變化,
link |
在找分數最大的那個token的時候,
link |
你會發現分數最大的那個token是沒有改變的。
link |
因為distribution只有小小的變化,
link |
所以分數最大的那個token是同一個,
link |
那對discriminator來說,
link |
它輸出的分數,它輸出是一模一樣的啊,
link |
當decoder的參數有一點變化的時候,
link |
discriminator的輸出是沒有改變的,
link |
你根本就沒有辦法做gradient descent。
link |
這邊不是max,是因為max造成不能做gradient descent嗎?
link |
那CNN裡面不是有max pooling嗎?
link |
那怎麼還可以做gradient descent?
link |
為什麼在這個地方有max,不能做gradient descent,
link |
而在CNN有max pooling,卻可以做gradient descent。
link |
但是就算是不能做gradient descent,
link |
遇到不能用gradient descent train的問題,
link |
就當作reinforcement learning的問題,
link |
所以你確實可以用reinforcement learning來train你的generator,
link |
在你要產生一個sequence的時候,
link |
你可以用reinforcement learning來train你的generator,
link |
reinforcement learning是以難train而聞名,
link |
讓人train不起來,非常非常的難訓練。
link |
沒有人可以成功地把generator訓練起來,
link |
沒有人成功地可以訓練一個generator,
link |
用GAN的方式訓練一個generator產生文字。
link |
那pre-train這件事情其實我們等一下馬上就會提到,
link |
如果你現在還不知道pre-train是什麼的話,
link |
直到有一篇paper叫做ScratchGAN,
link |
它的title就開宗明義跟你炫耀說,
link |
它可以train languageGAN from scratch,
link |
from scratch就是不用pre-train的意思。
link |
所以它可以直接從隨機的初始化參數開始,
link |
然後讓generator可以產生文字。
link |
最關鍵的就是爆條hyperparameter,
link |
那你可以想像這就是Google的paper,
link |
然後再加上了這邊就講了很多的tips,
link |
一開始要有一個叫做sequence GAN step的技術,
link |
然後接下來要有一個很大的batch size,
link |
discriminator加regularization,
link |
embedding要pre-train,
link |
改一下reinforcement learning algorithm,
link |
就可以從真的把GANtrain起來,
link |
那其實有關generative的model,
link |
比如說flow-based model,
link |
那我在這邊也列了兩個影片的連結給大家參考。
link |
因為機器學習可以講的東西實在太多了,
link |
上課講的內容是self-contained,
link |
就假設你想要train一個generator,
link |
可以用flow-based model,
link |
如果有人叫你train一個generator model,
link |
你可以再研究VAE跟flow-based model。
link |
GAN的performance是比較好的,
link |
通常VAE或flow-based model,
link |
VAE或flow會不會比較好train?
link |
如果你真的有實作VAE或flow的話,
link |
然後像flow-based model,
link |
他們有一個很明確的objective。
link |
他們也沒有那麼容易成功的被訓練起來。
link |
他們的objective裡面有很多項,
link |
生成式的generative的model。
link |
輸入一個Gaussian的random variable,
link |
從Gaussian的這個random variable,
link |
supervised learning的方法來做呢?
link |
從Gaussian distribution,
link |
接下來就當作supervised learning的方法,
link |
你可能根本連train都train不起來。
link |
Gradient Original Network,
link |
我們現在產生出來的generator,
link |
那要評估一個generator的好壞,
link |
你要知道今天這個generator,
link |
尤其是人們剛開始研究generative,
link |
很長一段時間沒有好的measure,
link |
那時候要評估generator的好壞,
link |
這應該是state of the art,
link |
來想辦法量一個generator的好壞呢?
link |
那顯然九百個人臉的那一個generator,
link |
我隨便訓練了一個generator,
link |
我們這邊叫它P of C given Y,
link |
P of C given Y是一個機率的分布。
link |
那就代表說你的game產生出來的圖片,
link |
你會被一個叫做這個Evaluation的方法,
link |
Mole Collapse的問題騙過去。
link |
什麼叫Mole Collapse呢?
link |
你的Generative Model它的分布。
link |
Generative Model它輸出來的圖片,
link |
那以下是一個Mole Collapse的例子。
link |
我就train了一個Generator,
link |
那train著train著train到最後,
link |
這就是一種Mole Collapse的現象。
link |
那為什麼會有Mole Collapse這種現象發生呢?
link |
這個地方就是Discriminator的一個盲點,
link |
當Generator學會產生這種圖片以後,
link |
它就永遠都可以騙過Discriminator。
link |
Discriminator沒辦法看出說,
link |
那這是一個Discriminator的盲點,
link |
Generator抓到這個盲點就硬打一發,
link |
就發生Mole Collapse的狀況。
link |
那可是到底要怎麼避免Mole Collapse的狀況呢?
link |
我認為今天其實還沒有一個非常好的解答。
link |
我們在上週給大家看到了Big Game的結果,
link |
它發現最終它仍然沒有辦法真的避免Mole Collapse的狀況。
link |
Big Game train到最後還是Mole Collapse。
link |
那Big Game怎麼解決這個問題呢?
link |
Model在Generator在訓練的時候,
link |
一路上都會把那個checkpoint存下來,
link |
在Mole Collapse之前把training停下來,
link |
就train到Mole Collapse了,
link |
把以前的Model拿出來用就結束了。
link |
所以就算是強如Google暴收參數,
link |
現在還是沒有辦法徹底解決Mole Collapse的問題。
link |
不過Mole Collapse這種問題,
link |
你的Generator總是產生這張臉的時候,
link |
你不會說你的Generator是個好的Generator,
link |
你的Generator不是特別的好。
link |
跟Mole還有點像,但是更難被偵測到的問題,
link |
Mole Dropping的意思是說,
link |
你的真實的資料的分布可能是這個樣子。
link |
有一個同學他train了人臉生成的Gap。
link |
他的Generator產生出這些人臉。
link |
這個是第七個Iteration的時候的Generator。
link |
但如果你再看下一個Iteration,
link |
你沒弄好,人家都覺得你的Generator有種族歧視啊。
link |
所以這種Model Dropping的問題
link |
今天這些非常好的Game,Big Game啊,
link |
Progressive Game啊,
link |
可以產生非常真實的人臉這些Game,
link |
到底有沒有Model Dropping的問題?
link |
如果你看多了Game產生出來的人臉,
link |
所以今天也許Model Dropping的問題
link |
現在我們的Generator它產生出來的圖片
link |
一樣是藉助我們的Image Classifier,
link |
就讓你的Generator產生一千張圖片,
link |
把這一千張圖片都丟到Image Classifier裡面,
link |
每一張圖片都會給我們一個Distribution。
link |
你把所有的Distribution平均起來,
link |
接下來看看平均的Distribution長什麼樣子。
link |
如果平均的Distribution非常集中,
link |
你的影像分類系統都說是看到Class 2,
link |
看到裡面有Class 2這樣的東西,
link |
不同張你的Generator產生出來的圖片,
link |
丟到Image Classifier的時候,
link |
它產生出來的輸出的分布都非常的不同,
link |
當我們用這個Image Classifier來做評估的時候,
link |
Diversity跟Quality好像是有點互斥的。
link |
因為我們剛才在講Quality的時候,
link |
我們說越集中代表Quality越高,
link |
越分布越平均代表Diversity越大。
link |
不過我要強調一下這個Quality跟Diversity,
link |
一張圖片丟到Classifier的時候,
link |
而Diversity看的是一堆圖片它分布的平均,
link |
一堆圖片你的Image Classifier輸出的平均。
link |
那就代表如果輸出的這個平均越平均的話,
link |
就代表說現在Diversity越大。
link |
叫做Inception Score,
link |
所謂Inception Score,
link |
是用一個叫做Inception來做的,
link |
所以叫Inception Score。
link |
那這個Inception Score是怎麼定出來的呢?
link |
用Inception Level量一下Quality。
link |
如果Quality高,Diversity又大,
link |
那Inception Score就會比較大。
link |
我們並不會用Inception Score。
link |
為什麼我們不用Inception Score呢?
link |
丟到Inception Net裡面,
link |
但是對Inception Level來說,
link |
所以你可能算出來Diversity其實是小的。
link |
所以Inception Score在我們這個作業中,
link |
會採取另外一個Evaluation Measure,
link |
叫Fetched Inception Distance。
link |
丟到Inception Net裡面。
link |
那如果你把這個二次元人物一路丟到最後,
link |
讓那個Inception Level輸出它的類別,
link |
我們拿進入Softmax之前的Hidden Layer的輸出。
link |
你的Network不是會產生一個向量嗎?
link |
只取這個Inception Level中間的,
link |
其實是最後一層的Hidden Layer的輸出,
link |
你把真正的圖片丟到Inception Level以後
link |
你自己的Generator產生出來的圖片,
link |
它丟到Inception Level以後,
link |
它們都是Gaussian的Distribution,
link |
然後去計算這兩個Gaussian Distribution之間的
link |
Fragile Distance就結束了。
link |
那至於Fragile Distance是什麼,
link |
我們的Judge System會幫大家算好。
link |
好,但是這邊因為它是一個Distance,
link |
當作Gaussian Distribution沒問題嗎?
link |
這個應該不是Gaussian Distribution吧?
link |
如果你要準確的得到你的Network的分布,
link |
那你可能需要產生大量的Sample才能做到,
link |
那這個也是要做FID不可避免的問題。
link |
你假設你的輸出的分布一定是Gaussian,
link |
所以我們是同時看FID跟動畫人物人臉的
link |
那這樣可以得到比較合理而精確的結果。
link |
那FID算是今天比較常用的一種Measure,
link |
Against Created Equally Large Scale Study,
link |
你可以想見說這個也是Google做的啦,
link |
那個時候它就列舉了好多不同的各式各樣的Gap,
link |
每個Gap當然它訓練的Loss有點不太一樣,
link |
每一種Gap它都用不同的Random Z
link |
就是在四個不同的資料庫上面得到的結果。
link |
我記得改一下,這個不是FIT,這個是FID,
link |
因為你要用不同的Random Z去跑嘛,
link |
如果比較這些Gain的方法跟VAE的方法,
link |
不同的Random Z看起來差距還是比較小的,
link |
那Gain的方法不同Random Z差距是很大的。
link |
VAE跟Gain它的這個好的程度啊,
link |
Gain可以產生遠比VAE更好的結果。
link |
Gain Created Equally,
link |
所以那些跟Gain有關的研究都是白忙一場。
link |
所有這些不同的Gain用的Network架構,
link |
它只是報收了Random Z跟Random Rate而已。
link |
會不會在不同的Network架構上,
link |
它胡亂兜個什麼100層的Generator,
link |
沒有必要弄個100層的Generator,
link |
所以也許WGain是在不同的Network架構的時候,
link |
其實剛才那些Measurement,
link |
因為還有什麼樣Evaluation的問題呢?
link |
所以如果你不知道真實資料長什麼樣子,
link |
你光看這個Generator的輸出,
link |
都跟資料庫裡面的訓練資料的一模一樣,
link |
直接從訓練資料裡面Sample一些Image出來不是更好?
link |
幹嘛要Train Generator?
link |
我們Train Generator其實是希望它產生新的圖片啊,
link |
有時候你的Gain產生出來的結果很好,
link |
也許你在作業裡面FID算出來也很低,
link |
就不是我們作業的Manager可以偵測的,
link |
那我們就把我們Generator產生出來的圖片跟真實資料比個相似度嘛,
link |
Generator只是把訓練資料背起來而已,
link |
假設你的Generator學到的是,
link |
把所有訓練資料裡面的圖片都左右翻轉了,
link |
把訓練資料裡面所有的圖片都左右翻轉,
link |
所以,Gain的Evaluation是非常的困難的,
link |
還是光要如何評估一個Generator做得好不好這件事情,
link |
裡面就列舉了20幾種Gain Generator的評估的方式,
link |
我們要講Conditional的Generation,
link |
那也許我們講完Conditional的Generation以後再下課,
link |
然後接下來就是讓助教來講一下Gain的作業。
link |
好,那什麼是Conditional的Generation呢?
link |
剛才我們講的那個Generator,
link |
到目前為止我們講的Generator,
link |
我們可以操控Generator的輸出,
link |
我們給它一個Condition X,
link |
那這樣的Conditional Generation有什麼樣的應用呢?
link |
它其實是一個Supervised Learning的問題,
link |
才能夠訓練這種Conditional的Generator。
link |
所以在Text to Image這樣的任務裡面,
link |
一段文字怎麼輸入給Generator呢?
link |
今天也許你可以把它丟到一個Transformer的Encoder裡面去,
link |
把Encoder Output的這些向量統統平均起來,
link |
只要能夠讓Generator讀一段文字就行。
link |
這個就是Text to Image想要做的事情。
link |
就產生各式各樣藍頭髮、紅眼睛的角色。
link |
那要怎麼做Conditional的Game呢?
link |
我們現在的Generator有兩個輸入,
link |
一個是從Normal Distribution Sample出來的Z,
link |
那我們的Generator會產生一張圖片Y。
link |
那我們需要一個Discriminator,
link |
那怎麼訓練這個Discriminator呢?
link |
你就可以訓練Discriminator,
link |
那Discriminator跟Generator反覆訓練,
link |
也許你就可以把Generator訓練出來。
link |
沒辦法真的解Conditional Game的問題。
link |
因為如果我們只有Train這個Discriminator,
link |
這個Discriminator只會看Y當作輸入的話,
link |
他會產生可以騙過Discriminator的
link |
他只要產生清晰的圖片就可以騙過Discriminator了,
link |
他何必要去管Input的文字敘述是什麼呢?
link |
你的Discriminator又不看文字的敘述,
link |
可以騙過Discriminator就結束了。
link |
所以在Conditional Game裡面,
link |
你的Discriminator不是只吃圖片Y,
link |
所以你的Discriminator,
link |
光圖片好Discriminator還是不會給高分。
link |
什麼樣的情況下Discriminator才會給高分呢?
link |
必須要是相配的Discriminator才會給高分。
link |
那怎麼樣訓練這樣的Discriminator呢?
link |
所以Conditional Game一般的訓練,
link |
那你就告訴你的Discriminator說,
link |
反正我這邊本來就是沒有要放什麼特別的東西,
link |
Red Eyes跟機器產生出來的圖片,
link |
就可以做到Conditional Game。
link |
拿這樣子的Positive Example,
link |
還有Negative Example,
link |
來訓練這樣的Discriminator,
link |
光是告訴Discriminator說,
link |
然後告訴你的Discriminator說,
link |
你才有辦法把Discriminator訓練好,
link |
然後Generator跟Discriminator反覆的訓練,
link |
這個就是Conditional Game。
link |
那Conditional Game的應用,
link |
然後讓你的Generator直接把房屋產生出來。
link |
所以Conditional Game除了輸入文字產生影像以外,
link |
叫做Image Translation,
link |
同樣要產生這樣的Generator,
link |
你當然可以用Supervised Learning的方法。
link |
如果你用Supervised Learning的方法,
link |
通常你用Supervised Learning的方法,
link |
訓練一個圖片生圖片的Generator,
link |
那這個是你Generator的輸出。
link |
就好像我們在講Game剛開場的時候,
link |
那對於Image to Image的Case,
link |
你需要加一個Discriminator,
link |
Discriminator它是輸入一張圖片,
link |
它會同時看這個圖片跟這個Condition,
link |
加了一個不知道是煙囪還是窗戶的東西。
link |
往往就是Game跟Supervised Learning同時使用,
link |
一方面它要去騙過Discriminator,
link |
但同時它又想要產生一張圖片跟標準答案,
link |
Conditional Game還有很多應用,
link |
那我剛才講說Conditional Game
link |
你就可以Train一個Conditional Game,
link |
你會發現這個溪流裡面的水花就越來越多,
link |
很多時候generator產生出來的東西
link |
conditional game的應用,
link |
是有人用conditional game
link |
Samsung就做了一個類似的應用,
link |
這個是conditional game的