Skip to content

GAN 影片筆記系列一

開場

Yann LeCun 認為GAN技術與其變體非常有趣

而GAN截止2018年已有高達300多種的變體

GAN的論文數在近幾年也暴增

基本概念

Generation

目的在生成東西 (比如圖像、句子、詩文)

如上圖所示,給定random的向量輸入,輸出不同圖片、句子。

目標就是訓練出NN Generator,並且還希望Generatro是有條件式的生成,輸入有意義、可控制的輸入,得到想要的輸出。

Generator 是甚麼

Generator本質上就是一個Neural network
而輸入vecotr會與輸出的高維度向量(目標物)有某種程度的關聯,如下圖

Discriminator

本質上也是一個NN
輸入是一個生成的目標物(比如圖片)
輸出是一個scalar,該值越大表示NN判斷生成物越接近真實

Discriminator 與 Generator就像是生物演化中掠食者與獵物的關係

訓練流程

概念

  1. 準備一組Real dataset
  2. 讓Generator NN 生成一組結果
  3. 讓Discriminator 判斷來自哪裡(Real or Fake)
  4. 更新兩個NN

這就是Adversarial(對抗)的命名概念
下圖是一個例子

訓練流程演算法 (概念)

Random initialize G and D
for i in iter :
	fix G , update D (讓)
	fix D , update G

如何更新D?

當作二分類問題處理

首先讓G生成目標物
讓D判斷來自哪裡 (二分類問題) 就可以運用分類/回歸問題的loss function更新方法update D

如何更新G?

** 將G和上一步更新好的D視作一個大NN網路調整**
some fact:

  • 若G、D各有五層,則這個大網路會有十層
  • 中間有一層hidden layer輸出剛好是目標物
  • 必須要固定D的layer,否則網路單純的調D最後一層就好

訓練流程演算法 (虛擬碼)

GAN是一種structed learning

Machine learning 目標在找到一個function
Regression 是輸出一個scalar
Classification是輸出一個class
Structed learning/prediction 是輸出一個序列、矩陣、圖、樹…
如下圖

structed learning 挑戰:

  1. 某個角度是one-shot learning 因為每個training data不太可能會重複(詩文、圖片不太會重複)
    因此可能機器會無法真正"創造"新東西

  2. 機器必須學會規劃(planning),意即體會到元件之間的關系

    上圖是一個例子,一個點、第一句話都只是一個元件,結果如何取決於元件間的關係

GAN可以說是一個解決方案,他賦予機器大局觀

為甚麼Generator不自己學習?

第一層: 單純訓練

首先這一定是可以做到的,如下圖

問題是輸入怎麼來,如果隨機生成可能造成混亂
比如兩個1的vector長的很不一樣,與我們預期相反

小結: 輸入的隨機性會破壞vector數值的意義

第二層: auto-encoder

更進一步,輸入可以用encoder來解決

訓練encoder時就是需要一個decoder(Auto-encoder),這時decoder就類似Generator的角色,encoder就類似Discriminator的角色。

但是auto-encoder並不是線性的,比如頭朝左右,我們會預期0是左,1是右,0.5可能是朝中間這種概念,auto-encoder無法做到

小結: 非線性會讓Vector數值的內插沒有意義

第三層 variational auto-encoder (VAE)


這種作法可以讓加入位移也會生成有意義的東西

Some Fact:

  • 增加維度可能會使效能更好,但當維度與data維度一樣,encoder就會學會照抄 (encoder有點像壓縮維度)
  • Minimize會追求變異數為0,但我們會阻止便異數太小

但是 ,單純追求loss的縮小(與目標越像越好),會在主觀方面出問題 如下圖

再以下圖舉例

基本上VAE只會學到答案中間的值,並且不會了解到中間某些值可能是不好的。

小結: 單純追求loss減小,會忽略元件之間的關係

總結: 只使用G,會容易變成單純模仿、而忽略大局觀

Discriminator不自己生成?

第一層 直接生成

也是可以實作
窮舉所有x,並找出最大的D(x) (argmax D(x))

問題: 成本過大、並且Discriminator都只接受過高分的例子

第二層 產生好的negative example

可以用隨機的方式
然後類似GAN的方式更新D自己


如上圖,這是把高維資料mapping到一維
D(X)紅線是D的判斷給分函數


給分=> 窮舉最高點 => 壓低D(X)對fake的地方 …

最終D(x)會與Real data重疊

總結

單純使用 D

  1. 生成的成本很高(argmax) 甚至非線性解不了
  2. negative example生成問題

G 正好可以克服這兩個問題(也可以把G當成argmax的解法)

因此GAN是既具有大局觀,又克服生成成本與negative example的方法!


如上圖,GAN不會單純的認為內插值也一定是好的!

參考資料

https://www.youtube.com/watch?v=DQNNMiAP5lw&list=PLJV_el3uVTsMq6JEFPW35BCiOQTsoqwNw&ab_channel=Hung-yiLee