1. 程式人生 > >GAN筆記_李弘毅教程(一)

GAN筆記_李弘毅教程(一)

因為本文課題需要用到GAN,因此學習下GAN,筆記內容均為本人看李弘毅老師視訊時記下的要點。 以下為正文: 李弘毅老師教程視訊來自blibli。

簡介

在人工智慧研究領域,Yann LeCun、Geoffrey Hinton 和 Yoshua Bengio一直被公認為深度學習三巨頭。 since sliced bread (由此以來 ) GAN動物園有歷年來的GAN技術。

現在通常用conditional generation來控制生成的內容

輸入向量的每一值都表示一種特徵,上圖可以理解為:輸入向量的第一行代表頭髮長度,倒數第二行代表髮色接近藍色的程度,最後一行代表嘴的大小。 訓練generator的同時訓練discriminator,discriminator輸入是圖片,輸出是數值,數值越大,生成圖片就越真實。

接下來老師講了個枯葉蝶的故事,有一種鳥專門吃枯葉蝶,因此枯葉蝶的祖先從普通蝴蝶的顏色變為棕色,鳥隨之用紋理識別的方法來判斷是否是枯葉蝶(當時枯葉蝶還沒進化出枯葉般的紋理),枯葉蝶也隨之進化出了枯葉的紋理,兩者還在不斷進化……互相拮抗。在這個故事裡,枯葉蝶是generator,鳥就是discriminator。

老師喜歡用二次元來描述,在上圖中,v1的generator首先生成模糊的無色彩的二次元圖,然後v1的discriminator輸入真實圖片,和v1的G生成的圖片做對比,第一代假設是主要能區分是否有色彩;然後v1的generator想要騙過第一代D,便生成了有色彩的圖片,這就是v2的G,這時v1的D就被v2的G騙過了,但隨之也有了v2的D,假設它能區分圖片人物是否有嘴;為了騙過v2的D,G也進化出了v3版……這種adversarial的過程可以用於不同地方。 用比較和平的方式,也可以把這個關係比作師生。如下圖:

演算法

在step1中,D要能區分真實樣本和生成的圖片,真實樣本能被D標為1,生成的虛假樣本能被D標為0。 在step2中,將G和D的神經網路連起來,成為一個large network, 用來update G。這個large network的輸入是一個vector,輸出是一個scalar。G和D之間有一個很大維數的一層,是G生成的圖片維數,可以作為一個hidden layer。目標是為了D生出的值越大越好,所以用Gradient Ascent。

完整演算法如下: 先sigmod ,使其在0~1之間; distribution不是很重要; G和D輸入的z可以是不一樣的; D和G的訓練過程反覆進行。

實際上維數會很多

Structured Learning

挑戰性:

one-hot/Zero-shot Learning(有些東西machine在訓練時從未見過,所以在測試時需要創造出新的東西,而這需要intelligence): 如何解決?(雖然machine生成的東西是一部分一部分出來的,但部分與部分之間有dependency,整體是global的):

兩種方法

botton up:容易失去大局觀 (相當於generator) top down:很難做generator (相當於discriminator) 兩者聯合起來,即為GAN:

Can Generator learn by itself

給原本的image編上相應向量。然後隨即一個向量輸入進G,如果輸入的向量在原本的圖片中有,那麼G輸出的圖片和原本的圖片越接近越好。這個過程相當於是NN分類模型的反過程: 但向量如何產生? 根據特徵:如數字本身(1,2,3……);傾斜程度(向左斜、向右斜) 首先輸入圖片,經過NN encoder,將image特徵用向量表示。 | | | 下圖上半部分其實就是自動編碼器VAE的簡約版,它的後半部分就是G: ||| 隨機輸入一個二維向量,[1.5,0]代表0,[-1.5,0]代表1,那麼-1.5到1.5之間如下圖: 但是又有如下問題: 所以用VAE,使上圖中的a和b無論加上什麼噪聲,都能成為一張圖片。σ\sigma越接近1越好: 如果G能完全複製原圖那麼這個效能將是很不錯的,但G總會犯些錯誤,而這些錯誤往往很複雜,每個部分之間使不能相互影響的,除非神經網路的深度加深: 在下圖中,藍色的點為輸出,綠色的點為輸入,儘量要讓藍色的點和綠色的點分佈相同。從圖中看,的確使綠色的點有被覆蓋一些,但一個綠色點團與另一個綠色點團之間也有些藍色的分佈,G是無法影響這些藍色點的。

Can Discriminator generate?

Discriminator:輸入一張圖片,輸出一個數值: D通過自上而下的評估是比較容易捕捉部分之間的關係: 窮盡所有的x,放進D中,找出最大的x: 判斷真實的圖片為1,判斷虛假的圖片為0。我們手裡往往只有正確的樣本,而D需要一些錯誤的例子。 在訓練的過程中,錯誤的例子很關鍵,需要偏向真實的錯誤例子:

  • 首先給出一些正確的樣本,隨機生成錯誤的樣本
  • 在每一個迭代中 1.學習出一個能判別正確樣本和錯誤樣本的D 2.通過D生成錯誤的樣本

訓練出新的D: 在訓練過程中,在真實樣本範圍內輸出的值要提高,其他範圍內的值降低。但實際上,樣本空間巨大,所以不能把所有非正確樣本都降低: 所以實際上, 第一次:D會只對生成樣本設定為低分,對真實樣本設定為高分,其他忽略; 第二次:用v1的D產生樣本(找出分值高的輸入),這時產生樣本對應的分值是高的,我們需要對產生樣本的分值降低。 最後結果就是,只有真實樣本範圍內的分值很高: 用D來做生成的:

Generator與Discriminator對比

以下為G和D的優缺點

Generator:

  • 優點:容易生成
  • 缺點: 只學到了目標的表象,學不到精神 很難學習到部分之間的關係,學不到大局

Discriminator:

  • 優點:能考慮到大局
  • 缺點:生成和錯誤樣本方面有點難

所以要將G和D結合起來 用G來解arg max(.)

GAN 優點

解決了錯誤樣本的缺失; 能使其更大局觀 結果(紅點為生成樣本,藍點為原樣本): 人臉(VAE的模糊些):

VAE和GAN不同: VAE比較穩,但最好結果沒有GAN好。 FID Score 越小,越真實