1. 程式人生 > >通俗瞭解對抗生成網路(GAN)核心思想

通俗瞭解對抗生成網路(GAN)核心思想

GAN已經作為一種思想來滲透在ML的其餘領域,做出了很多很Amazing的東西。被Yann LeCun評價為近十年最有趣的idea,所以相關研究方向的同學gan成了一個必須要學的思想和方法。

Basic Idea of GAN (Generator)

GAN中包括兩個最基本的元件,其中一個就是Generator,對於Image Generation過程來說,你給它一個向量,它輸出一個圖片(image)。

input: vector

output: image

如下所示:

對於Sentence Generation來說,你給它一個向量,它輸出一個句子(sentence)。

input: vector

output: sentence

如下所示:

其中我們以image generation過程來仔細說明一下其中過程原理!

實際上Generator就是一個NN網路,輸入是一個vector,它的輸出是一個高維的向量,比如image是16*16,那麼它的輸出就是256維的向量。

如圖所示:

其中,輸入向量的每一個維度都可以代表輸出image的某些特徵,比如說第一維度的值,代表著image人物的頭髮長短。

那麼我們在調大input vector的第一維的值的時候,我們可以看到生成的image的頭髮變長,如下圖所示:

比如說,input vector某一個維度的值大小代表生成image的頭髮顏色藍色深淺,調大後,生成的image頭髮變得更藍一些:

或者說,input vector某一個維度的值大小代表生成image的口張開的大小,調大後,生成的image人物中口張的更大一些:

總而言之,GAN中的Generator就是一個神經網路,丟給它一個輸入向量,輸出也是一個向量。

在不同的任務中,生成的東西不同,輸入向量的每一個維度都代表著輸出image的特定特徵。

Basic Idea of GAN(Discriminator) 

講完了Generator之後,我們來看GAN的另一個元件,Discriminator。Discriminator也是一個NN網路,它的輸入是Generator的輸出或者是真實的image...,輸出是一個標量,代表接受的輸入的quality有多好,數值越大,代表越好,數值越小,代表越差。

如下圖:

比如給它輸入是真實的image,那麼經過Discriminator之後應該是輸出的標量值很大,代表送入給它的image的質量很高。

比如給它輸入是差的image,那麼經過Discriminator之後應該是輸出的標量值很小,代表送入給它的image的質量很低。

Algorithm of GAN

下面我們來介紹一下最基本的gan的訓練演算法,不夠嚴謹,但是容易接受。

首先,跟任何網路訓練一樣,我們需要初始化生成器G,和判別器D的引數

形式化公式就是如下:

1、然後在每一輪中,首先固定住G,訓練D,具體怎麼訓練呢?

我們任意選取一些向量,送給G,同時從database中挑選出一些資料,使得判別器學會從database挑選出真實的圖片打分高,任意選取向量從G中生成的圖片,打分低。這樣就是在訓練判別器:

形式化公式如下:

稍微解釋一下圖片中的公式,訓練判別器就是希望它對於真實的圖片打分高,生成的圖片打分低。而公式中是最大化那個式子,分解來看完全對應文字的解釋:

對應真正的圖片打分高,也就是最大化如下公式,公式如下:

2、第二步是固定判別器D,訓練生成器G,我們還是任意給定一些向量,這些向量送給G,生成一些圖片,然後喂進判別器進行判別。

首先我們的目的是使得生成器能夠生成非常真實的圖片,對於真正真實的圖片來說,判別器的打分是高的,那麼也就是說,我們需要訓練生成器,使得通過生成器生成出來的圖片讓判別器打分高,儘可能的迷惑判別器,這樣通過生成器生成出來的圖片就是接近“真實的”,土話說就是跟真的好像啊。

形式化公式如下:

公式解釋為:最大化使得判別器對於生成器生成的圖片打分。

這裡需要注意的是訓練生成器的時候,一定要固定判別器的引數,因為在實際實現中,生成器和判別器會構成一個大網路,如果不固定判別器的引數去訓練生成器的話。

因為目標是使得最後的得分高,網路這個時候僅僅更新最後一層的引數就能讓最後的輸出標量非常大,很顯然這不是我們希望的,如果固定了判別器後面幾個layer,訓練前面生成器的引數就能正常學習。

例項

最後李巨集毅老師給出了他自己用gan生成二次元頭像的例項,下面分別給出訓練了不同輪次的生成結果,給大家一個直觀的感覺:

GAN的魅力

可能不少人會有疑問,就是生成一些牛逼的影象有什麼用,模型再厲害,我拿一個照相機照出來的難度會比你差,這裡解釋一下,如果僅僅只能生成見過的圖片,確實沒有什麼厲害的地方,但是如果可以“合理”的生成沒有見過的影象,是不是就很有意思呢?如下圖,中間的圖片就是訓練集中重來沒有出現:

它居然自己學到了,在中間引數的時候,頭像的轉向等等特質,非常的amazing