1. Basic idea
基本任務:要得到一個generator,能夠模擬想要的數據分布。(一個低維向量到一個高維向量的映射)
discriminator就像是一個score function。

如果想讓generator生成想要的目標數據,就把這些真實數據作為discriminator的輸入,discriminator的另一部分輸入就是generator生成的數據。
1. 初始化generator和discriminator。
2. 迭代:
固定generator的參數,更新discriminator的參數,maximize f
固定discriminator的參數,更新generator的參數,minimize f

noise的先驗分布對結果的影響不大
2. GAN as structured learning
Structured Learning/Prediction: 輸出一個序列、矩陣、圖、樹... Output is composed of components with dependency
重要的是各個components之間的關系。
做 structured learning 的兩種思路
Bottom up:從component的層面生成object
Top down :整體評價 object,尋找一個最佳的
從這個角度理解 GAN:
3. Can Generator learn by itself?
其實是可以的。把 <code, object> 的 pair 作為訓練數據對,據此訓練一個NN來擬合code和object之間的映射關系即可。
但問題是:不知道如何把code和object對應起來。(或者說,能反映object中某些特征的code要怎么產生?如何收集這些訓練數據對中的code?)
做法:自監督。訓練一個ae的encoder,就能把code和object對應起來,獲得code。
那么思考到這里,其實
decoder就是generator!給定一個code,就能輸出對應的object。
既然如此,還要GAN做什么?(或者說,Autoencoder存在什么問題)
因為作為訓練數據的object是有限的,導致decoder實際上只能把訓練過程中見過的code給還原成對應的object。如果隨機給一些code,它不會生成訓練集中沒有見過的object。
如何解決?
但不管怎么樣,訓練AE的時候要去最小化的loss,都是定義在 component 層面的,比如 L1 norm distance,L2 norm distance,而神經網絡的輸出的各個 component 之間盡管是相關的,但是不能互相影響(除非把網絡變得很深)。所以單純讓輸出和目標在component 層面上越接近越好是不夠的。
4. Can Discriminator generate?
輸入一個 object 輸出一個scalar 表示輸入有多好。discriminator 比較容易通過整體去判斷生成的結果怎么樣,但是無法通過這個方式去做生成(如果非要做,可以窮舉所有可能的輸入,取 argmax D(x) 的 x )。
問題是,訓練 discriminator 的時候要有正類和負類,正類容易搞定因為本來就容易收集,負類就有問題了,negative examples 如果選取的不好(比如就直接用隨機噪聲),就很難訓練好的 discriminator 能夠分辨 x。
總結一下兩者的優缺點:
5. GAN
綜合 generator(用來取代窮舉 x 解 argmax D(x) 的問題) 和 discriminator ,迭代地對抗性的訓練兩部分,一部分做生成一部分做判別。
實際做的話訓練discriminator:
如果落在高維空間中 real examples 所在的區域就給高分,落在生成數據的區域就給低分,但是生成數據的區域肯定比真正的數據 real example 之外的區域要小(但 real examples 的區域未必是分數最高的)。因為 real examples 是有限的,所以訓練 generator 是讓 discriminator 無效的話,就是說讓生成的數據的區域跟之前有不同,再去讓 discriminator 學的更好。整個迭代地學習過程如下圖所示。但這種情況下,也許比較容易出現 overfitting ,所以 real 數據越多越好。
GAN 的優勢,從 generator 和 discriminator 兩部分來看,一個是生成容易、一個是判別的整體性

6. Conditional generation
典型任務:text-to-image,輸入一段文字,輸出一個對應的圖片。
問題是,如果只用一般的監督方法去訓練的話,產生的結果是多張圖片的平均(比如火車有正面、側面,但都是火車)。
在做conditional GAN 的時候,Generator 的輸入是 z 和 condition,但是 Discriminator 不能只看 Generator 的輸出(如果那樣的話Generator 只會學着去產生真實的圖片,而無視條件),而是要同時看 Generator 的輸入。D 要看 condition 和 G(z) 以及 x,輸出一個scalar 判斷輸入,是不是真實的圖片+和條件是不是匹配。
訓練 D 的時候,負類是有多種情況的。一種是不對的圖片+對的條件,一種是對的圖片+不對的條件。
拓撲結構上的話,下面的那種 Discriminator 結構可能更合理一點,把到底是條件和數據不匹配、還是生成數據不夠好分開來判別。不過比較多的是第一種,把 c 和 x 做 embedding 或別的處理后,直接給到一個network,綜合起來判別。
在此基礎上,Stack GAN 是把 embedding 后的 vector 分成幾部分訓練。
image-to-image,可以在Conditional GAN 的基礎上,再加上生成圖片和真實圖片之間的 L1/L2 norm loss。
7. Unsupervised conditional generation
能不能無監督的做條件生成?比如風格轉換之類的,要實現從一個 domain 的數據轉到另外一個 domain 的數據。
問題是,怎么建立 c 和 x 之間的聯系,手里只是有這兩種數據而已。
方法一. 直接轉換
D的輸入是帶風格的圖片和生成的數據,訓練去能夠判斷輸入圖片是不是屬於目標的輸出domain;G就是輸入原始圖片,訓練去讓D無效,並且要讓 G 的輸入和輸出還是保持一定的聯系(不能光轉風格就行了,還得能看的出是原來那個圖片)。用這種方法的話,輸入輸出之間還是不能差太多(風格轉換之類的任務)。
1. 直接忽視 generator 生成數據和輸入的聯系,硬做就好。但前提是 generator 不要太深(generator 不會把輸入變得太多)。

2. 拿一個 pre-trained 的模型出來,對 generator 的輸入和輸出都做 embedding。訓練 generator 的時候,不僅要騙過 discriminator 讓生成圖片和目標圖片越像越好,同時也要讓兩個 embedding 后的向量不要差太多。

3. Cycle GAN,一個 generator 負責從 domain x 轉到 domain y,另一個 generator 負責轉回來。所以 generator 不僅要騙過 discriminator,還要使得轉回來之后越像越好。Cycle GAN 也可以做雙向的。

4. Star GAN,多個 domain 之間互相轉。
方法二. 投到共同的空間里面再去做
如果輸入和輸出差距很大(比如真人轉換為動漫圖像),用 encoder 投到 common space (latent space)上去做
1. VAEGAN,兩部分損失,ae的重構損失,和gan的對抗損失。但由於是分開訓練兩個ae,所以有同樣屬性的圖片經過兩個 encoder 之后得到的 code 在 latent space 可能沒法映射到同樣的位置。解決辦法是可以讓 domain x 和 domain y 各自的 encoder 最后幾層共享參數,decoder的前幾層共享參數。

2. 再加一個 domain discriminator,來判別 latent space 的向量是來自 domain x 和 domain y。ENx 和 ENy 就是要騙過這個disriminator,強制不同 domain 的具有同屬性的輸入經過 encoder 之后都投到一個 latent space 里面並且 code 在空間中的位置越接近越好。

3. cycle consistency

4. semantic consistency
