生成型神經網路

最簡單的X->Y映射

讀書時代課本上的函數其實就是我們最早接觸關於「映射」的概念,f(x)以「某種邏輯」將橫坐標軸上的值映射到縱坐標軸。後來學習編程之後接觸了函數(或者叫方法)的概念,它以「某種邏輯」將函數輸入映射成輸出,映射邏輯就是函數本身的實現過程。映射就是將若干輸入以某種邏輯轉換成若干輸出,課本上的函數是這樣,編程中的函數是這樣,深度學習中神經網路同樣是這樣。

圖1 映射關係 

最簡單的映射邏輯是線性映射,類似f(x)=w*x + b這樣,它的函數影像是一條直線,其中w和b是映射過程用到的參數。高中數學中的拋物線f(x)=a*x*x + b*x +c 是一種比線性映射更複雜的映射關係,同樣a、b、c是該映射過程要用到的參數。 這裡不管是w還是abc這樣的參數,同樣存在於神經網路這種高複雜度的映射過程之中,事實上,我們完全可以將神經網路類比為我們更為熟悉的直線、拋物線結構。

與我們讀書學習直線、拋物線不同的是,書本中直線、拋物線函數的參數大部分時候都是已知的,而神經網路中的參數是未知的,或者說不是最優的,我們需要使用已知的樣本(輸入/輸出)去擬合網路,從而得出最優的參數值,然後將擬合(學習)到的參數應用到新數據中(只有輸入),擬合的這個過程叫做「訓練模型」或者「學習」。

圖2 線性映射與神經網路類比

 

神經網路的輸入輸出

前面說到映射過程有輸入和輸出,同樣神經網路也有輸入和輸出。就電腦視覺領域相關任務來講,有影像分類網路,有目標檢測、分割等網路,也有專門用於影像特徵提取的網路,這些網路的輸入基本都是圖片,輸出要麼是分類概率值,要麼是跟目標有關的像素坐標值,或者是高維特徵向量值,這些輸出有一個共同的特點,都屬於數字類輸出,就像我們剛接觸機器學習時預測房價的案例,演算法輸出是房價,也是數字類型。

 

圖3 普通網路的輸入輸出

那麼神經網路是否還有更複雜的輸出格式呢?答案是有,神經網路可以輸出更高維的數據結構,比如圖片。雖然嚴格來講,圖片也是由數字組成,但是為了與前面提到的簡單輸出類型區分,我們可以將輸出圖片的這類神經網路稱為「生成型網路」。顧名思義,生成型網路的特點是可以生成類似圖片這種直觀結果(或者類似網路輸入那種更高維數據)。

 

圖4 生成型網路的輸入輸出(舉例)

生成型網路的訓練方式一般比較特別,大部分都是無監督學習,也就是事先無需對樣本做人工標註。事實上,了解生成型網路是我們熟悉無監督學習的一種非常好的途徑。

生成型網路的實現方式常見有兩種,一個是AutoEncoder,翻譯成中文叫「自編碼器」,基本原理就是將輸入圖片先編碼,生成一個特徵表達,然後再基於該特徵重新解碼生成原來的輸入圖片,編碼和解碼是兩個獨立的環節,訓練的時候合併、使用的時候拆開再交叉組合。前幾年非常火的AI換臉就是基於AutoEncoder實現的,程式碼非常簡單,之前的一篇文章對它有非常詳細的介紹。另一個是GAN,全稱Generative Adversarial Networks,翻譯成中文是「生成對抗型網路」,它也是由兩部分組成,一個負責生成一張圖片,一個負責對圖片進行分類(判斷真假),訓練的時候一起訓練,使用的時候只用前面的生成網路。GAN也是本篇文章後面介紹的重點內容。  

 

GAN生成對抗型網路工作原理

首先要明確地是,最原始的GAN是2014年提出來的,它可以基於一個無任何標註的圖片樣本集,生成類似風格的全新圖片,就像一個畫家,看了一些示例後,可以畫出類似風格的畫。2014年提出來的GAN結構相對簡單,也存在一些缺陷,比如生成的圖片解析度太低、網路訓練很難收斂。後面有人陸陸續續提出了各種改進版本的GAN(變種),雖然各方面都有所調整,但是整體思想仍然沿用第一版,這裡也是介紹最原始GAN網路的工作原理。

GAN網路主要由兩子網路組成,一個學名叫Generative Network(顧名思義,生成網路),輸入隨機數,輸出一張固定尺寸的圖片(比如64*64大小),另一個學名叫Discriminative Network(顧名思義,辨別網路),輸入前一個網路生成的圖片以及訓練樣本集中的圖片,輸出真和假(生成的為假、樣本集中的為真)。如果單獨分開來看,這兩沒什麼特別的,一個負責生成圖片、一個負責判別真假。但是,GAN高妙之處就在於這兩在訓練過程中並不是獨立的。我們先來看下GAN的結構:

 

圖5 GAN網路結構

上面顯示的GAN網路結構其實非常簡單,但是只看這張圖的人可能會有一個疑問?訓練樣本集只作為辨別網路(Discriminative network,簡稱D)的輸入並參與訓練,它是怎樣對生成網路(Generative network,簡稱G)起到作用的?答案在GAN的訓練過程中,GAN的訓練方式主要可以歸納成3個要點:

1、將G的輸出作為D的輸入,並以False標籤來訓練D網路,更新D網路的參數,讓D知道什麼是假的;

2、將訓練樣本集輸入D,並以True標籤來訓練D網路,更新D網路的參數,讓D知道什麼是真的;

3、將D的參數凍結,再將D和G兩個網路串起來,G的輸出還是作為D的輸入,但是這次以True標籤來訓練整個組合網路。由於D的參數已經凍結,所以整個訓練過程只會更新前面G網路的參數,讓G知道如何生成看起來像「真的」圖片。

上面的過程1和過程2讓D越來越聰明,知道什麼是真的、什麼是假的。過程3讓G也越來越聰明,知道如何調整自己的參數,才能讓生成的圖片更能欺騙D。隨著上面的過程不斷反覆,G不斷的更新自己的參數,雖然輸入的一直是隨機數,但是輸出的圖片卻越來越像訓練樣本集中的圖片,到此完成了對G的訓練。下面用圖來說明上面的過程:

 

GAN(變種網路)可以解決哪些任務?

基於GAN思想的生成型網路有很多應用,比如素材生成,當你已經有一定數量的圖片樣本後,你可以利用GAN生成更多類似但完全不同的圖片,提升樣本庫的豐富性。目前比較成熟的風格遷移(style transfer)也用到了GAN思想,可以將一張手機拍攝的自然風景圖片轉換成山水畫、卡通畫風格。下面是利用Pro-GAN網路生成的圖公路像素材,剛開始生成的影像模糊,隨著訓練時間增加,生成的影像越來越清晰、並且能夠保持與已有樣本集一致的風格。