GAN 研究方法綜述

作爲一種生成式的模型,GAN 在衆多領域大放異彩。如何訓練 GAN?下面由 Boolan 首席 AI 諮詢師,方林老師爲大家揭祕。

圖片

方林  Boolan 首席 AI 諮詢師

長期從事深度學習、貝葉斯網絡、進化學習、類腦學習、脈衝神經網絡和謂詞邏輯的研究和技術諮詢,涉及自動駕駛、人臉識別、自然語言處理等多項前沿 AI 行業應用,曾主導研發了人工智能博弈軟件框架、通用問題求解框架、Prolog 邏輯語言編譯器和運行環境等。在加入 Boolan 之前,方林博士擔任深蘭科技 AI 資深研究員、首席科學家、深蘭大學校長。南京大學計算機軟件博士畢業。

GAN 的科研成果層出不窮,有些研究報告之間還可能相互矛盾。我今天分享的只是我所瞭解到的,全球範圍內這個領域,一些較爲先進的科研成果,但不代表受到公認,不代表百分百正確,只是幫助大家打開思路。

真實樣本和生成樣本(由隨機向量 Z 經過生成器生成)作爲輸入,經過判別器後,輸出一個判別係數,通常來說,係數趨近於 1,判別爲真實樣本;係數趨近於 0,判別爲生成樣本。如果你不瞭解什麼是生成式對抗網絡,可以把生成器和判別器看成是函數。從結構上講,它由兩個 CNN 組成,而且現在的趨勢是進一步細化,把判別器做成 Encoder-Decoder 模式。

**第一步,用真實樣本訓練判別器,令它判別出 1。**大家思考一下,如果我們不考慮第二步和第三步,只考慮第一步,實際上這個結構是有很大問題的。因爲不管輸入的樣本是什麼,想讓它輸出是 1,這樣單種類的分類,沒有任何意義。一般意義上的分類器,起碼分兩類。如果不管判別器的輸入層、隱藏層、中間層是什麼樣,只要最後一層保證輸出是標量 1,這個很容易做到。所以這個模型,只在我們接下來的所有步驟中有意義,單獨看沒有意義,這個大家要能看出來。

 

**第二步,由隨機向量經過生成器,輸出生成樣本。**然後把生成樣本輸入到判別器,令它能輸出 0。與第一步聯繫,就會有兩個分類,一個是 1,一個是 0。有了兩個分類,判別器就可以得到優化。這是我們設計這個網絡模型的結構時一定要注意的地方。在第二步,我們期望結果是 0,但可能不是,就會產生誤差,從而產生梯度,產生梯度後我們沿着箭頭的反方向走,這就是反向傳播。在反向傳播過程中,可以把遇到的任何一個參數進行優化。優化過程中,有一個小技巧,在生成器的地方,把梯度截斷,不優化生成器。因爲對生成器優化,最終的結果不過是輸出一個 0,這不是生成器的目標。生成器的目標是生成一個很像真實樣本的假樣本。所以需要在這裏截斷梯度。第二步所進行的優化,是對判別器進行的優化。結合第一步,兩步可以合成一步。 

**第三步,輸入隨機向量,經過生成器輸出生成樣本,再經過判別器,輸出判別係數,這時我們期望輸出是 1。**前面輸出 0,我們希望用梯度優化判別器,現在用一個不同的期望輸出,來優化生成器。梯度在跑的過程中,雖然的確先經過判別器,但是因爲判別器前面只對輸出樣本,期望輸出是 0,現在期望輸出是 1,所以梯度會路過判別器,只對生成器進行優化。所以最優化的結果,就是判別器對真實樣本總是彙報 1,對生成的假樣本總是彙報 0,同時我們生成器輸出的生成樣本,總是能通過判別器的判別。

但是這裏有一個矛盾的地方,生成樣本經過判別器,如果判別結果是 1,會被當成真實樣本,這意味判別器的判別是錯誤的;如果判別結果趨近於 0,說明判別器的判別是正確的,但是這又意味着生成器生成的結果是不理想的。這個矛盾的對抗結果,使得整個 GAN 的訓練非常麻煩。

對判別器的訓練:

data 指真實樣本,D 指判別器,G 指生成器

對生成器的訓練:

這裏 D(G(z)) 與上面相反,我們期望輸出結果是 1。

GAN 的問題,曾在 Wasserstein 的一篇論文中得到充分表達,當真實樣本和生成樣本的交集不可度量時,就會出現問題。

其實真實樣本和生成樣本不能說絕對沒有交集,而是它們的交集要麼是空集要麼是不可度量,因爲它是一個低微的流形。

舉例:在一個三維的立體空間中,有一個二維平面和另一個二維平面,它們的相交是一條直線,這條直線在三維空間中是沒有體積的。現在假設是 10000 維的高維空間,我們剛纔講的圖片屬於低微流形,也就是 10000 維空間中一個低維的超平面而已。與隨機向量產生的生成樣本之間,是兩個超平面,就算有交集,交集的體積也是 0(這個體積是多維體積,而不是真實體積)。

這會使得我們的運算出問題,回顧上面的公式:有真實樣本和生成樣本的分佈,它們之間的交集體積爲 0,那麼 X 和 G(Z) 幾乎沒有可度量的重合部分,這樣的數對真實樣本來說,它的分佈爲 0,對生成樣本的分佈來說,概率爲 0,兩個必有一個爲 0。我們知道對數里面取 0,就會是一個負無窮,這個時候就會產生問題,使得訓練進行不下去。

這裏,可以看成是 log 對真實樣本分佈和生成樣本分佈的求積分。計算過程中我們可以發現,這兩個分佈是沒有交集的。對於特定 X 來說,要麼分子爲 0,要麼分母爲 0,最後計算都無法進行。

JS 距離是基於 KL 距離的,使用的是兩個分佈 ÷2 的公式。因爲兩個分佈很有可能其中一個值爲 0,所以取平均數。計算發現,無論真實樣本還是生成樣本,兩個值一個是 1,另一個就是 0,結果使得 JS 距離爲一個常數。做深度學習和神經元網絡模型訓練,我們最不希望遇到一個不變的常量,因爲如果遇到,意味着它要麼是一個無用的參數,要麼它就是最後我們計算出來的損的值,如果這個值是一個常量保持不變,也就意味着我們的梯度沒有了。最後模型的訓練就會出問題。

WGAN 給我們帶來的啓示

①不要使用基於 KL 距離或者 JS 距離的梯度。

②讓生成樣本集合和真實樣本集合之間有可度量的重疊,比如:給真實樣本加噪音。這個噪音可以是高斯分佈,也可以是平均分佈。加噪音的原因是隻有這樣的樣本,才和隨機生成的樣本之間有可度量的交集,才能產生梯度,有了梯度,就可以訓練生成器和辨別器。

G 指生成器,z 代表隨機向量,x 代表真實樣本。中間矩形框出的是辨別器,辨別器由 Encoder 和 Decoder 兩部分組成。

這個模型輸入的不管是真實樣本還是假樣本,都是圖片,輸出也是圖片,比較兩張圖片是否一致。大家可能覺得奇怪,這不就是複製嗎?是的,但在複製過程,先編碼生成一維向量,然後一維向量經過解碼,恢復圖片,再與原始圖片比較,如果是真實圖片,我們希望兩張圖片完全一樣;如果是生成圖片,我們希望兩張圖片的差別越大越好。這改變了在最早 GAN 模型中用 0 和 1 區分真實樣本與生成樣本的做法,也避免了上面 WGAN 中發現的梯度爲 0 的情況發生。

Encoder-Decoder 中間會生成一個語義向量,這個語義向量圖上沒有畫出來,但是非常重要。這個向量可以看成是輸入向量的一個語義,因爲照片之間進行圖像操作非常困難,但是向量之間是可以加減乘除的,這樣使得我們操作一個人臉改變他的表情,甚至變成另一張人臉的過程是平滑自然的。這就是這個語義向量做的事,如果沒有 Encoder-Decoder,這個事情就做不成。

EBGAN 定義了一個 D(X) 函數:X 經過 Encoder 編碼,再經過 Decoder 解碼後,得到一個 X 的預測值,我們希望這個預測值跟 X 是無差別的。

在這個過程,我們希望真實樣本的輸入與輸出之間的誤差 D(x) 越小越好,生成樣本的輸入與輸出之間的誤差 D(G(z)) 越大越好,整個公式就是判別器的損失函數 Lost。m-D(G(z)) 指裏面的數如果小於 0,整個值就取 0;如果大於 0 數,則這個數是幾就取幾。這麼做的原因是,如果不加 m- 函數的限制,D(G(z)) 可以變成無窮大,前加負號就變成無窮小,Lost 函數本來就希望無窮小,最後就會沒有最小值。用梯度下降法對這個 Lost 求梯度是沒有意義的,用這樣的所謂梯度去優化模型,肯定沒有結果。所以大家在做模型時,一定要注意:可以對函數求極值,條件是這個極值能達到,而且這個極值不是正無窮也不是負無窮。

另外,把 - 的誤差改成 + 的誤差,就是對生成器的優化。

BEGAN 模型,D 函數就是之前的 D 函數,t 指的是計算過程中第幾輪訓練,不斷進行優化。

對 GAN 的研究分爲兩個方向,一個是試圖使 GAN 的精度提高,使生成的圖片越像照片;第二個是令它的功能更強大。上面主要講的是第一個方向,這裏再強調一下,GAN 在質量提高這條線上的模型,遠不止上文介紹的三個。下面我們講第二個方向,GAN 的應用很強,從功能上,我們有哪些模型可以考慮。

這個模型的樣本是帶有標籤的,比如輸入一個樣本,同時需要帶上性別標籤,表示要求生成一張男人 / 女人的照片。這個模型是對原始 GAN 的一個擴展。

對判別器的訓練:真實樣本和標籤,同時輸入到判別器,輸出要麼是 0 要麼是 1。

對生成器的訓練:隨機向量和標籤,同時輸入生成器,然後標籤和生成樣本同時輸入判別器。從輸入的結構角度看出,真實樣本的輸入由真實樣本和標籤組成,而假樣本的輸入也是由假樣本與標籤組成,這個訓練 GAN 模型的提高是一個比較大的進步。

這個模型同時也是一個應用,它的功能是手畫一個鞋子或者包的線條,可以變成一個真實的鞋或者包的圖片。這個模型的輸入過程與上文 CGAN 一樣,唯一區別是不需要隨機向量,只需要把簡筆畫作爲生成器的輸入。

但是 Pix2Pix 在訓練時,需要簡筆畫與真實樣本,必須是成對的。比如簡筆畫是鞋子的線條,照片就需要是那張鞋子的照片,成對輸入。然而樣本的收集非常難,現在 95% 以上的時間、精力和費用都在樣本的收集上,所以要簡筆畫與真實照片配對,非常不容易。這是 Pix2Pix 模型的一個重大缺陷。爲解決這個缺陷,提出了 CycleGAN 的概念。

以上文簡筆畫爲例,CycleGAN 只需要兩類,一類是簡筆畫,一類是照片,不需要一一配對,其它功能與 Pix2Pix 完全一致。但是取消了配對的限制,使得對樣本收集的負擔大大減輕。CycleGAN 模型的結構,它有兩個判別器,兩個生成器。其中,B 判別器和 B 生成器是爲 B 圖片做一個 GAN 模型,A 判別器和 A 生成器是爲 A 圖片做一個 GAN 模型。

第一步,用 A 的真實樣本訓練 A 判別器,用 B 的真實樣本訓練 B 判別器,使得判別器對兩類不同真實樣本,分別都判別爲 1,這是從最早普通 GAN 模型擴展出來的。

第二步,B 真實樣本輸入 A 生成器,輸出假的 A 樣本 A’,然後通過 A 判別器,輸出爲 0;第二條路徑是 A 真實樣本輸入 B 生成器,輸出假的 B 樣本 B’,再通過 B 判別器,輸出爲 0。

第三步,B 真實樣本經過 A 生成器,生成假的 A 樣本 A’,再經過 B 生成器,生成假的 B 樣本 B’,目的是使假的 B 樣本與 B 真實樣本誤差最小。注意:B’與 B 之間的誤差,所產生的梯度應該去訓練 A 生成器,而不是 B 生成器,因爲 B 生成器輸入的是 A 樣本,與這條路徑沒有關係,所以梯度不應該影響 B 生成器,而應該優化 A 生成器。

第四步,對 A 樣本重複第三步驟,期望 A’與 A 一致。如果不一致,產生的梯度用來訓練 B 生成器,與 A 生成器無關。這是很巧妙的一個結構。

GAN 的根本問題

現在的判別器一般都分爲 Encoder-Decoder,每個 Encoder-Decoder 就是一個大型的 CNN,每個卷積神經網絡都有十幾層,所以梯度產生後,跋山涉水到達生成器,會消失。爲什麼呢?

在對判別器的優化過程中,判別器的輸入絕不只是一個 x 或者 g,還有它自己的參數,因爲它的參數也是它的輸入。通過計算發現,每一次產生梯度後,梯度都會對這個模型的參數進行優化,產生,再施加到,所以的優化是累積的。但是不管是 x 還是 g,真實樣本永遠不變,所以優化最後的效果,就是梯度越來越傾向於在最後的輸入層被浪費掉,產生的偏差越來越傾向於被用來優化,而越來越不傾向於優化。所以梯度往生成器傳的時候,就變得很微小,從而使得生成器的優化,變成問題。

x 表示真實樣本,g 表示假樣本,表示判別器的參數

①GAN 並不希望判別器的準確率達到 1,而是 0.5;如果我們把判別器的準確率優化到接近 1 時,再把它拉回 0.5 就變得十分困難。

②我們對 GAN 的改進都是基於最優化目標的,數學上講,把目標優化到 “一半好”,這個說法是有矛盾的。如果我們設定一個目標,從數學上講,就是把它優化爲達到那個目標。而我們的梯度下降法是基於求偏導數等於 0,求偏導數等於 0 的目的是讓我們的目標達到最優,而不是達到一半優。

解決辦法

**優化判別器時,一旦發現它對某個種類樣本(指真實樣本和生成樣本兩種)的判別,辨別準確率達到 0.5 時,就應該停下來。**這是一種很奇怪的做法,我相信大家很少能在不參考其他程序文本代碼的情況下,自己主動做這一步。因爲一般我們希望辨別率達到 99% 都不夠,而達到 50% 就要停下來,這需要你有極大的毅力相信自己的判斷。雖然不容易做到,但確實要這樣去做。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Z4ymFj6B3ZwuQRV3aU_89g