Unsupervised Learning: Deep Generation

by wenwu
0 comment

Unsupervised Learning: Deep Generation

今日的課程來自於: Unsupervised Learning - Deep Generative Model (Part I)
ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)

Introduction

What I cannot create, I do not understand — Richard Reynman
Richard Reynman說”我無法創造出我無法理解的東西”。就像機器無法劃出一隻貓或是狗,因為他們無法真正理解他。 今天將介紹三種generative models。


Generative Models:

  • Pixal RNN
  • Variational Antoencoder(VAE)
  • Generative Adversarial Network

PixelRNN

RNN可以處理長度不同的input,他的主要概念是根據過去的狀態來推測下一個狀態。
PixelRNN的基本思想是每次只畫一個pixel,這個pixel是由過去所有已產生的Pixel共同決定的

training PixelRNN 是很簡單的,這是完全的unsupervised。你可以會想說這麼簡單的方法怎麼會有用但是在不同generate image的方法裡pixelRNN是最清晰的

PixelRNN 還可以用在聲音跟影像的生成,給定前面的音訊,在predict 下一個sample 結果,再丟到model 中,一直硬train 下去


ex: pokemon creation

我們可以不用抓寶可夢,我們直接用 pixelRNN 創造寶可夢
Don’t catch them! create them!

使用PixelRNN生成寶可夢,有幾個tips:

  • 為了減少運算量,將40*40的圖像減少成20*20
  • 如果將每個Pixel都以[R,G,B]的vector表示的話
    • 生成的圖像都是灰的,因為比較亮的顏色,通常RGB的差異會很大
    • 如果用sigmoid function ,最終生成的RGB都是0.5左右,所以色彩不鮮艷
    • 解決方法:將所有的色彩集合成一個1-of-N encoder,由於色彩種類比較多,因此先對類似的顏色做clustering ,最後獲得167個色彩向量

使用PixelRNN訓練好的模型之後,給它看沒有被放在training data的三個圖像的一部分,分別遮住原圖的50%或75%,得到原圖的預測結果的對比如下:

其實效果還不錯,提供比較多圖案的效果當然比較好
我們也可以不提供圖片,只是需要設定不同的機率,不然跑出來的圖都一樣


VAE

VAE, Variantional Autoencoder,可變自動編碼器
上一篇已經介紹過Autoencoder 的基本思想,我們拿出其中的decoder,給它隨機輸入數據,就可以生成對應的圖像
但是普通的Decoder生成的效果並不好,VAE可以得到更好的效果

在VAE中,很像encoder,但是加了小trick。code不再直接等於encoder的輸出,這裡假設目標降維空間為三維,那我們使Encoder分別輸出m1、m2、m3σ1σ2、σ3 ,此外我們從常態分布中隨機挑選出三個點 e1 e2 e3 ,最後的結果如下:

ci = eσi  ⋅ ei + mi

此時,我們訓練目標不僅是要最小化input和output之間的差距,同時還要最小化下面的式子:

與pixelRNN不同的是,VAE畫出的圖一班都是不太清晰的,但是在某種程度上我們可以控制生成的圖像


write poetry

VAE還可以用來寫詩,只需要某兩句話對應的code,然後在降維後的空間中得到這兩個code所在點的連線,從中取樣,並輸入給Decoder,就可以得到類似下圖中的效果

上圖可以看到,我們只給了第一句和最後一句,中間的過程,就是training的結果


Why VAE ?

為什麼要使用VAE呢? VAE與傳統的Autoencoder相比,有甚麼優勢嗎?
實際上,VAE就是加了noise的Autoencoder,它的抗干擾能力更強,過度生成能力也更強

對原先的Autoencoder來說,假設我們得到了滿月和弦月的code,從兩者連線中隨機獲
取一個點並映射回原來的空間,得到的圖像很可能是完全不一樣的東西

而對VAE來說,它要保證在降維後的空間中,加了noise的一段範圍內的所有點都能夠映
射到目標圖像,如下圖所示,當某個點既被要求映射到滿月、又被要求映射到弦月,則它
最終映射出來的結果就很有可能是兩者之間的過渡圖像

再回頭看VAE的結構:

  • mi其實就代表原本的code
  • ci則代表加了noise以後的code
  • σi則代表了noise的variance,描述了noise的大小,這是由NN學習到的參數
  • ei 是常態分佈中隨機採樣的點

注意:如果loss function 只讓input和output的差距最小是不夠的,因為variance是由機器決定的。
如果不加以約束,機器就會讓variance=0,這樣就跟普通的autoencoder沒有差別了

用下面的塗寫是函數的意思:

下圖中,藍線代表eσi ,紅線代表1+σi ,兩者相減得到綠線
綠線的最低σi=0,則variance eσi=1,此時loss 最低
而(mi )2 項則是對code的L2 ,讓他比較sparse,不容易過擬合

problems of VAE

VAE有一個缺點,它只是在努力做到讓生成的圖像與數據集裡的圖像盡可能相似,卻從來
沒有想過怎麼樣真的產生一張新的圖像,因此由VAE生成的圖像大多是數據集中圖像的線
性變化,而很難自主生成全新的圖像

VAE產生的image,都是data裡的image的linear combination,因為它從來沒有學過產生image

VAE做到的只是模仿,而不是創造,GAN的誕生,就是為了創造


GAN

GAN的概念,有點像擬態的演化
枯葉蝶是怎麼變得更菇業一模一樣呢? 假設原本枯葉蝶原本是彩色的,但是他的天敵: 波波鳥會吃這個蝴蝶。那枯葉蝶就近畫成為棕色的,接下來他的天敵也進化了,波坡變成比比鳥,比比鳥知道,蝴蝶是沒有葉脈的,所以他會吃沒有葉脈的東西。最後枯葉蝶跟天敵都會一再的演化

GAN 的概念是這個樣子。首先,有一個第一代的 Generator,第一代的 Generator 它很廢,它可能根本就是 random 的,它會 generate 一大堆奇怪的東西,看起來不像是真正的 image。假如我們現在叫它 Generate 4 個 digit,那接下來有一個的第一代 Discriminator,他就是那個天敵,Discriminator 做的事情是,他會根據real 的 image跟 Generator 所產生的 image去調整它裡面的參數,去評斷說,一張 image 是真正的 image,還是 Generator 所產生的 image。

接下來呢,這個 Generator 根據這個 Discriminator調整了他的參數,所以,第二代的 Generator產生的 digit 就可能就更像真的。接下來,Discriminator 會再根據第二代的Generator的image去 update 他的參數。接下來,有了第二代的Discriminator,就會再產生第三代的 Generator,第三代 Generator 產生的數字又更像真正的這個數字。第三代 Generator 他產生的這些數字,可以騙過第二代的 Discriminator,第二代產生的這些數字,可以騙過第一代的 Generator。

要注意的是: Generator 從來沒有看過真正的 image長什麼樣子,Discriminator 有看過真正的 image 長什麼樣子,它會比較真正的 image 跟 Generator 的 output 的不同


GAN – Generator & Discriminator

GAN 組要由Ganerator 和 Discriminator組成:

  • 對Discriminator的訓練: 把Generator產生的圖像標記為0,真實圖像標記為1
  • 對Generator的訓練: 調整生成器的參數,使產生的圖像能夠騙過Discriminator
  • Discriminator和Generator 結合,其實就是一個很大的neural network
  • 只是我們只要選Generator的參數,而Discriminator的參數要鎖定,不然就不能運作了

GAN的問題: 他們有一個清楚的訓練目標,你不知道discriminator標記的答案是否正確,也沒有辦法使用loss function來判斷,所以必須在訓練時,同時查看訓練的狀況

Related Articles

發表迴響