2024-05-15|閱讀時間 ‧ 約 27 分鐘

生成式對抗網路GAN

到目前為止,我們主要討論的目標都是找到一個可以預測答案的方程式,而不是生成獨一無二的東西。那生成式對抗網路的創造,就是為了這個目標而生。

Generator不同的點在於,輸入會額外加入一個機率分布simple Distribution Z,以產生一個隨機的輸出。

  1. 這組Distribution Z必須夠簡單,像是高斯、uniform這類的機率分佈都是可以的。
  2. 在每次有input時,都會搭配一個Z作為輸入。

為什麼需要輸出一個generator?

我們可以先從一個例子來了解,EX: 小精靈遊戲

假設要輸出一個小精靈遊戲的video prediction,如果我們的輸入同時有小精靈向左轉和向右轉的遊戲內容,那就有可能會發生到轉角處,小精靈分裂成兩隻的狀況,因為機器想兩面討好,但這樣的答案我們不能用 , 所以要加入一個Z的機率分佈,讓向左轉向右轉呈現出機率分佈,只產生一組答案。

假設z為random variable → 這樣向左轉或向右轉各1/2的機率

當我們的任務需要一點創造力時,需要每次的答案都不同時,就可以利用generator。



Unconditional generation 

Unconditional具體來說就是將input X拿掉的generator。

我們實際以生成一張二次元圖片為目標作為一個例子。

假設我們的simple distribution Z為normal distribution,那我們的目標就是要透過generator生成複雜的distribution與高維的向量(像是64x64x3的向量)。

*Low-dim vector與 high-dim vector指的就是低維與高維的向量


Distriminator

那在GAN裡頭,除了generator之外,我們還要另外訓練Distriminator作為generator的監視者。負責判別從generator生成的二次元圖片是不是真的二次元圖片。

此時,generator與discriminator彼此就會互相砥礪。

generator的目標就是讓Discriminator判別不出來,Discriminator就是要想辦法判別那些是generator創造的。最後就能得到最好的Generator。


具體流程:

  1. 初始化generator與discriminator。
  2. 固定目前的Generator,丟入一堆隨機產生的向量,產生一堆圖片輸出。
  3. 另外找一些真實的二次元圖片,將二次元圖片與generator產生的圖片輸出都丟進Discriminator判斷。
  4. 訓練Discriminator判斷哪些是真實圖片,那些是generator的輸出。可以想像成訓練分類問題,或是當作Regression訓練。
  5. 訓練完Discriminator後,改訓練generator,更新generator的參數,想辦法騙過Discriminator。
  6. 反覆以上流程,就能得到最好的二次元圖片。

*generator訓練的過程與一般network無異,都是採用gradient Decent。

*在訓練的過程不一定只有一組generator或是discriminator,也有可能有好幾層的Generator與Discriminator。


那要如何判別我們training出來的Generator的好壞呢?

  1. 我們直接透過眼睛判別
  2. 從Generator產生的圖片,丟進image classification,如果分類集中度越高,就代表分類器分類得出來,就代表Generator越好。 → 但這種方法會被Mode collapse騙過去。

*Mode collapse是一種generator走偏門的現象,當generator發現discriminator的某個盲點,從此只產生固定的那幾張圖,藉此騙過discriminator的現象,就被稱為mode collapse。除此之外,還有另外一種現象稱為Mode dropping,指的是Generator在產出的圖片中,某些特徵都使用相同的,只為了讓Discriminator能夠判別過,像是人臉都一樣,這樣多樣性就很小。

最後在了解了unconditional Generation之後,我們就可以加入input X,變成conditional Generation。Input X就會變成我們生成圖片的條件,結合我們設定的簡單機率分布,生成圖片。

那目前大多使用的訓練方式,就是將GAN結合supervised learning的方式訓練,除了生成圖片外,也希望與我們的條件X越接近越好。



但在訓練過程中,如果有其中一方停下來,就會無法繼續訓練,這也導致GAN本身是非常難訓練的model。

除此之外,我們回過頭看,之前篇章聊到的Transformer中的Decoder其實也是一種Generator,可以算是GAN在sequence上的訓練。但同樣的,如果在訓練的過程中發現,Decoder輸出的distribution與實際圖片之間的差距很小,就很難使用gradient decent改善參數,那就會很難Train GAN。

為了解決這問題,就有人提出Pre-train的概念。這一部分就牽扯到的BERT與GPT的部分,等到下一篇,我們再來好好討論~


Cycle GAN

那前面我們訓練GAN的方式都是supervised learning,也就是有參考答案來比較。但如果我們完全沒有參考的output Y(unsupervised learning)的話呢?在這樣的情況下,Generator有可能只確保在Discriminator上拿到高分就好,那就可能導致Generator都只產生一樣的圖,或是用偏門的方式過關,這樣就達不到訓練的效果。

那解決的方式就是可以使用cycle GAN的方式training。

Cycle GAN 的原理就是除了原有的Generator1以外,我們還額外增加一個Generator2,用來將Generator1輸出的vector還原成原有的圖片Y。

接著我們將還原的圖片Y與原有的圖片X比較,目標是越接近越好。

額外增加的Generator2作為條件,就能限制Generator1往正確的訓練過程。

*不同的learning方式整理:

supervised: 一般來說我們需要有成對的X與Y,我們才能訓練Network。

semi-supervised: 我們有一堆X與一堆Y,有一些成對,有一些沒有成對。

unsupervised: 完全沒有成對的資料。


那以上就是GAN的知識整理,我們下一篇見~




分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.