生成式對抗網路GAN有哪些最新的發展,可以實際應用到哪些場景中?

我特別關注的是:如何將GAN應用到目標檢測(如行人,車輛)及分割等常規任務中,目前GAN好像還沒有與之結合。

本題已收錄至知乎圓桌:人工智慧 · 機器感知,更多「人工智慧」相關話題歡迎關注討論


剛做完實驗,來答一答自然語言處理方面GAN的應用。

直接把GAN應用到NLP領域(主要是生成序列),有兩方面的問題:

1. GAN最開始是設計用於生成連續數據,但是自然語言處理中我們要用來生成離散tokens的序列。因為生成器(Generator,簡稱G)需要利用從判別器(Discriminator,簡稱D)得到的梯度進行訓練,而G和D都需要完全可微,碰到有離散變數的時候就會有問題,只用BP不能為G提供訓練的梯度。在GAN中我們通過對G的參數進行微小的改變,令其生成的數據更加「逼真」。若生成的數據是基於離散的tokens,D給出的信息很多時候都沒有意義,因為和圖像不同。圖像是連續的,微小的改變可以在像素點上面反應出來,但是你對tokens做微小的改變,在對應的dictionary space裡面可能根本就沒有相應的tokens.

2.GAN只可以對已經生成的完整序列進行打分,而對一部分生成的序列,如何判斷它現在生成的一部分的質量和之後生成整個序列的質量也是一個問題。

近幾篇重要的工作:

1. 為了解決這兩個問題,比較早的工作是上交的這篇發表在AAAI 2017的文章:SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient, 16年9月就放上了Arxiv上面了,而且也公布了源代碼。

利用了強化學習的東西來解決以上問題。如圖,針對第一個問題,首先是將D的輸出作為Reward,然後用Policy Gradient Method來訓練G。針對第二個問題,通過蒙特卡羅搜索,針對部分生成的序列,用一個Roll-Out Policy(也是一個LSTM)來Sampling完整的序列,再交給D打分,最後對得到的Reward求平均值。

完整演算法如圖:

原文鏈接:https://arxiv.org/pdf/1609.05473v5.pdf

Github鏈接:LantaoYu/SeqGAN


2. 第二篇是C.Manning組大神Li Jiwei的文章:Adversarial Learning for Neural Dialogue Generation,用GAN和強化學習來做對話系統,如果我沒有記錯,這篇paper是最早引用SeqGAN的,有同學還說這篇是最早將RL用到GAN上的,主要是Jiwei大神名氣太大,一放上Arxiv就引起無數關注。

如圖,文章也是用了Policy Gradient Method來對GAN進行訓練,和SeqGAN的方法並沒有很大的區別,主要是用在了Dialogue Generation這樣困難的任務上面。還有兩點就是:第一點是除了用蒙特卡羅搜索來解決部分生成序列的問題之外,因為MC Search比較耗費時間,還可以訓練一個特殊的D去給部分生成的序列進行打分。但是從實驗效果來看,MC Search的表現要更好一點。

第二點是在訓練G的時候同時還用了Teacher-Forcing(MLE)的方法,這點和後面的MaliGAN有異曲同工之處。

為什麼要這樣做的原因是在對抗性訓練的時候,G不會直接接觸到真實的目標序列(gold-standard target sequence),當G生成了質量很差的序列的時候(生成質量很好的序列其實相當困難),而D又訓練得很好,G就會通過得到的Reward知道自己生成的序列很糟糕,但卻又不知道怎麼令自己生成更好的序列, 這樣就會導致訓練崩潰。所以通過對抗性訓練更新G的參數之後,還通過傳統的MLE就是用真實的序列來更新G的參數。類似於有一個「老師」來糾正G訓練過程中出現的偏差,類似於一個regularizer。

原文鏈接:https://arxiv.org/pdf/1701.06547.pdf

Github鏈接:jiweil/Neural-Dialogue-Generation


3. Yoshua Bengio組在二月底連續放了三篇和GAN有關的paper,其中我們最關心的是大神Tong Che和Li yanran的這篇:Maximum-Likelihood Augmented Discrete Generative Adversarial Networks(MaliGAN),簡稱讀起來怪怪的。。。

這篇文章的工作主要是兩個方面:

1.為G構造一個全新的目標函數,用到了Importance Sampling,將其與D的output結合起來,令訓練過程更加穩定同時梯度的方差更低。儘管這個目標函數和RL的方法類似,但是相比之下更能狗降低estimator的方差(強烈建議看原文的3.2 Analysis,分析了當D最優以及D經過訓練但並沒有到最優兩種情況下,這個新的目標函數仍然能發揮作用)

2.生成較長序列的時候需要用到多次random sampling,所以文章還提出了兩個降低方差的技巧:第一個是蒙特卡羅樹搜索,這個大家都比較熟悉; 第二個文章稱之為Mixed MLE-Mali Training,就是從真實數據中進行抽樣,若序列長度大於N,則固定住前N個詞,然後基於前N個詞去freely run G產生M個樣本,一直run到序列結束。

基於前N個詞生成後面的詞的原因在於條件分布Pd比完整分布要簡單,同時能夠從真實的樣本中得到較強的訓練信號。然後逐漸減少N(在實驗三中N=30, K=5, K為步長值,訓練的時候每次迭代N-K)

Mixed MLE訓練的MaliGAN完整演算法如下:

在12,梯度更新的時候,第二項(highlight的部分)貌似應該是logP	heta(我最崇拜的學長發郵件去問過一作) 。至於第一部分為什麼梯度是近似於這種形式,可以參考Bengio組的另一篇文章:Boundary-Seeking Generative Adversarial Networks

這個BGAN的Intuition就是:令G去學習如何生成在D決策邊界的樣本,所以才叫做boundary-seeking。作者有一個特別的技巧:如圖,當D達到最優的時候,滿足如下條件,Pdata是真實的分布,Pg是G生成的分布。

我們對它進行一點微小的變換:這個形式厲害之處在於,儘管我們沒有完美的G,但是仍然可以通過對Pg賦予權重來得到真實的分布,這個比例就是如圖所示,基於該G的最優D和(1-D)之比。當然我們很難得到最優的D,但我們訓練的D越接近最優D,bias越低。而訓練D(標準二分類器)要比G簡單得多,因為G的目標函數是一個會隨著D變動而變動的目標。

文章後面給出了如何求梯度的數學公式,這裡就不貼了。

回到MaliGAN,作者給出了實驗數據,比SeqGAN的效果要更好,看BLEU score.

原文鏈接:https://arxiv.org/pdf/1702.07983v1.pdf


4. 用SeqGAN做機器翻譯,中科院自動化所在三月中旬放出了這篇文章:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets,這篇文章主要的貢獻就是第一次將GAN應用到了NLP的傳統任務上面,而且BLEU有2的提升。

這個模型他們稱之為CSGAN-NMT,G用的是傳統的attention-based NMT模型,而D有兩種方案,一種是CNN based,另一種是RNN based,通過實驗比較發現CNN的效果更好。推測的原因是RNN的分類模型在訓練早期能夠有極高的分類準確率,導致總能識別出G生成的數據和真實的數據,G難以訓練(因為總是negative signal),

這篇文章的重點我想是4.訓練策略,GAN極難訓練,他們首先是用MLE來pretrain G,然後再用G生成的樣本和真實樣本來pretrain D,當D達到某一個準確率的時候,進入對抗性訓練的環節,GAN的部分基本和SeqGAN一樣,用policy gradient method+MC search,上面已經講過了不再重複。但是由於在對抗性訓練的時候,G沒有直接接觸到golden target sentence,所以每用policy gradient更新一次G都跑一次professor forcing。這裡我比較困惑,我覺得是不是像Jiwei那篇文章,是用D給出的Reward來更新G參數之後,又用MLE來更新一次G的參數(保證G能接觸到真實的樣本,這裡就是目標語言的序列),但這個方法是teacher-forcing不是professor forcing。

最後就是訓練Trick茫茫,這篇文章試了很多超參數,比如D要pretrain到f=0.82的時候效果最好,還有pretrain要用Adam,而對抗性訓練要用RMSProp,同時還要和WGAN一樣將每次更新D的權重固定在一個範圍之內。

原文鏈接:https://arxiv.org/pdf/1703.04887.pdf


5.最後3月31號放到Arxiv上的文章:Improved Training of Wasserstein GANs, WGAN發布之後就引起轟動,比如Ian在Reddit上就點評了這篇文章,NYU的又祭出了這篇,令WGAN在NLP上也能發揮威力。

在WGAN中,他們給出的改進方案是:

  • 判別器最後一層去掉sigmoid
  • 生成器和判別器的loss不取log
  • 每次更新判別器的參數之後把它們的絕對值截斷到不超過一個固定常數c
  • 不要用基於動量的優化演算法(包括momentum和Adam),推薦RMSProp,SGD也行

這裡引用自知乎專欄:令人拍案叫絕的Wasserstein GAN - 知乎專欄

文章寫得深入淺出,強烈推薦。

其中第三項就是機器翻譯文章中也用到的weight clipping,在本文中,他們發現通過weight clipping來對D實施Lipschitz限制(為了逼近難以直接計算的Wasserstein距離),是導致訓練不穩定,以及難以捕捉複雜概率分布的元兇。所以文章提出通過梯度懲罰來對Critic(也就是D,WGAN系列都將D稱之為Critic)試試Lipschitz限制。

如圖:損失函數有原來的部分+梯度懲罰,現在不需要weight clipping以及基於動量的優化演算法都可以使用了,他們在這裡就用了Adam。同時可以拿掉Batch Normalization。

如圖所示,實驗結果很驚人,這種WGAN—GP的結構,訓練更加穩定,收斂更快,同時能夠生成更高質量的樣本,而且可以用於訓練不同的GAN架構,甚至是101層的深度殘差網路。

同時也能用於NLP中的生成任務,而且是character-level 的language model,而MaliGAN的實驗是在Sentence-Level上面的。而且前面幾篇提到的文章2,3,4在對抗性訓練的時候或多或少都用到了MLE,令G更夠接觸到Ground Truth,但是WGAN-GP是完全不需要MLE的部分。

原文鏈接:https://arxiv.org/pdf/1704.00028.pdf

github地址:https://github.com/igul222/improved_wgan_training

代碼一起放出簡直業界良心。

6.3月31號還谷歌還放出了一篇BEGAN: Boundary Equilibrium Generative

Adversarial Networks,同時代碼也有了是carpedm20用pytorch寫的,他復現的速度真心快。。。

最後GAN這一塊進展很多,同時以上提到的幾篇重要工作的一二作,貌似都在知乎上,對他們致以崇高的敬意。

以上。


Wasserstein GAN最新進展:從weight clipping到gradient penalty,更加先進的Lipschitz限制手法

前段時間,Wasserstein GAN以其精巧的理論分析、簡單至極的演算法實現、出色的實驗效果,在GAN研究圈內掀起了一陣熱潮(對WGAN不熟悉的讀者,可以參考我之前寫的介紹文章:令人拍案叫絕的Wasserstein GAN - 知乎專欄)。但是很多人(包括我們實驗室的同學)到了上手跑實驗的時候,卻發現WGAN實際上沒那麼完美,反而存在著訓練困難、收斂速度慢等問題。其實,WGAN的作者Martin Arjovsky不久後就在reddit上表示他也意識到了這個問題,認為關鍵在於原設計中Lipschitz限制的施加方式不對,並在新論文中提出了相應的改進方案:

  • 論文:[1704.00028] Improved Training of Wasserstein GANs
  • Tensorflow實現:igul222/improved_wgan_training

首先回顧一下WGAN的關鍵部分——Lipschitz限制是什麼。WGAN中,判別器D和生成器G的loss函數分別是:

L(D) = -mathbb{E}_{xsim P_r}[D(x)] + mathbb{E}_{xsim P_g}[D(x)] (公式1)

L(G) = - mathbb{E}_{xsim P_g}[D(x)] (公式2)

公式1表示判別器希望儘可能拉高真樣本的分數,拉低假樣本的分數,公式2表示生成器希望儘可能拉高假樣本的分數。

Lipschitz限制則體現為,在整個樣本空間 mathcal{X} 上,要求判別器函數D(x)梯度的Lp-norm不大於一個有限的常數K:

|| 
abla _x D(x) ||_p leq K 	ext{, } forall x in mathcal{X} (公式3)

直觀上解釋,就是當輸入的樣本稍微變化後,判別器給出的分數不能發生太過劇烈的變化。在原來的論文中,這個限制具體是通過weight clipping的方式實現的:每當更新完一次判別器的參數之後,就檢查判別器的所有參數的絕對值有沒有超過一個閾值,比如0.01,有的話就把這些參數clip回 [-0.01, 0.01] 範圍內。通過在訓練過程中保證判別器的所有參數有界,就保證了判別器不能對兩個略微不同的樣本給出天差地別的分數值,從而間接實現了Lipschitz限制。

然而weight clipping的實現方式存在兩個嚴重問題:

第一,如公式1所言,判別器loss希望儘可能拉大真假樣本的分數差,然而weight clipping獨立地限制每一個網路參數的取值範圍,在這種情況下我們可以想像,最優的策略就是儘可能讓所有參數走極端,要麼取最大值(如0.01)要麼取最小值(如-0.01)!為了驗證這一點,作者統計了經過充分訓練的判別器中所有網路參數的數值分布,發現真的集中在最大和最小兩個極端上:

這樣帶來的結果就是,判別器會非常傾向於學習一個簡單的映射函數(想想看,幾乎所有參數都是正負0.01,都已經可以直接視為一個二值神經網路了,太簡單了)。而作為一個深層神經網路來說,這實在是對自身強大擬合能力的巨大浪費!判別器沒能充分利用自身的模型能力,經過它回傳給生成器的梯度也會跟著變差。

在正式介紹gradient penalty之前,我們可以先看看在它的指導下,同樣充分訓練判別器之後,參數的數值分布就合理得多了,判別器也能夠充分利用自身模型的擬合能力:

第二個問題,weight clipping會導致很容易一不小心就梯度消失或者梯度爆炸。原因是判別器是一個多層網路,如果我們把clipping threshold設得稍微小了一點,每經過一層網路,梯度就變小一點點,多層之後就會指數衰減;反之,如果設得稍微大了一點,每經過一層網路,梯度變大一點點,多層之後就會指數爆炸。只有設得不大不小,才能讓生成器獲得恰到好處的回傳梯度,然而在實際應用中這個平衡區域可能很狹窄,就會給調參工作帶來麻煩。相比之下,gradient penalty就可以讓梯度在後向傳播的過程中保持平穩。論文通過下圖體現了這一點,其中橫軸代表判別器從低到高第幾層,縱軸代表梯度回傳到這一層之後的尺度大小(注意縱軸是對數刻度),c是clipping threshold:

說了這麼多,gradient penalty到底是什麼?

前面提到,Lipschitz限制是要求判別器的梯度不超過K,那我們何不直接設置一個額外的loss項來體現這一點呢?比如說:

ReLU[ || 
abla_x D(x) ||_p - K ] (公式4)

不過,既然判別器希望儘可能拉大真假樣本的分數差距,那自然是希望梯度越大越好,變化幅度越大越好,所以判別器在充分訓練之後,其梯度norm其實就會是在K附近。知道了這一點,我們可以把上面的loss改成要求梯度norm離K越近越好,效果是類似的:

 [ || 
abla_x D(x) ||_p - K ]^2 (公式5)

究竟是公式4好還是公式5好,我看不出來,可能需要實驗驗證,反正論文作者選的是公式5。接著我們簡單地把K定為1,再跟WGAN原來的判別器loss加權合併,就得到新的判別器loss:

L(D) = -mathbb{E}_{xsim P_r}[D(x)] + mathbb{E}_{xsim P_g}[D(x)] + lambda mathbb{E}_{x sim mathcal{X}} [ || 
abla_x D(x) ||_p - 1 ]^2 (公式6)

這就是所謂的gradient penalty了嗎?還沒完。公式6有兩個問題,首先是loss函數中存在梯度項,那麼優化這個loss豈不是要算梯度的梯度?一些讀者可能對此存在疑惑,不過這屬於實現上的問題,放到後面說。

其次,3個loss項都是期望的形式,落到實現上肯定得變成採樣的形式。前面兩個期望的採樣我們都熟悉,第一個期望是從真樣本集裡面采,第二個期望是從生成器的雜訊輸入分布採樣後,再由生成器映射到樣本空間。可是第三個分布要求我們在整個樣本空間 mathcal{X} 上採樣,這完全不科學!由於所謂的維度災難問題,如果要通過採樣的方式在圖片或自然語言這樣的高維樣本空間中估計期望值,所需樣本量是指數級的,實際上沒法做到。

所以,論文作者就非常機智地提出,我們其實沒必要在整個樣本空間上施加Lipschitz限制,只要重點抓住生成樣本集中區域、真實樣本集中區域以及夾在它們中間的區域就行了。具體來說,我們先隨機采一對真假樣本,還有一個0-1的隨機數:

x_r sim P_r, x_g sim P_g, epsilon sim Uniform[0, 1] (公式7)

然後在 x_rx_g 的連線上隨機插值採樣:

hat x = epsilon x_r + (1 - epsilon) x_g (公式8)

把按照上述流程採樣得到的 hat x 所滿足的分布記為 P_{hat x} ,就得到最終版本的判別器loss:

L(D) = -mathbb{E}_{xsim P_r}[D(x)] + mathbb{E}_{xsim P_g}[D(x)] + lambda mathbb{E}_{x sim mathcal{P_{hat x}}} [ || 
abla_x D(x) ||_p - 1 ]^2 (公式9)

這就是新論文所採用的gradient penalty方法,相應的新WGAN模型簡稱為WGAN-GP。我們可以做一個對比:

  • weight clipping是對樣本空間全局生效,但因為是間接限制判別器的梯度norm,會導致一不小心就梯度消失或者梯度爆炸;
  • gradient penalty只對真假樣本集中區域、及其中間的過渡地帶生效,但因為是直接把判別器的梯度norm限制在1附近,所以梯度可控性非常強,容易調整到合適的尺度大小。

論文還講了一些使用gradient penalty時需要注意的配套事項,這裡只提一點:由於我們是對每個樣本獨立地施加梯度懲罰,所以判別器的模型架構中不能使用Batch Normalization,因為它會引入同個batch中不同樣本的相互依賴關係。如果需要的話,可以選擇其他normalization方法,如Layer Normalization、Weight Normalization和Instance Normalization,這些方法就不會引入樣本之間的依賴。論文推薦的是Layer Normalization。

實驗表明,gradient penalty能夠顯著提高訓練速度,解決了原始WGAN收斂緩慢的問題:

雖然還是比不過DCGAN,但是因為WGAN不存在平衡判別器與生成器的問題,所以會比DCGAN更穩定,還是很有優勢的。不過,作者憑什麼能這麼說?因為下面的實驗體現出,在各種不同的網路架構下,其他GAN變種能不能訓練好,可以說是一件相當看人品的事情,但是WGAN-GP全都能夠訓練好,尤其是最下面一行所對應的101層殘差神經網路:

剩下的實驗結果中,比較厲害的是第一次成功做到了「純粹的」的文本GAN訓練!我們知道在圖像上訓練GAN是不需要額外的有監督信息的,但是之前就沒有人能夠像訓練圖像GAN一樣訓練好一個文本GAN,要麼依賴於預訓練一個語言模型,要麼就是利用已有的有監督ground truth提供指導信息。而現在WGAN-GP終於在無需任何有監督信息的情況下,生成出下圖所示的英文字元序列:

它是怎麼做到的呢?我認為關鍵之處是對樣本形式的更改。以前我們一般會把文本這樣的離散序列樣本表示為sequence of index,但是它把文本表示成sequence of probability vector。對於生成樣本來說,我們可以取網路softmax層輸出的詞典概率分布向量,作為序列中每一個位置的內容;而對於真實樣本來說,每個probability vector實際上就蛻化為我們熟悉的onehot vector。

但是如果按照傳統GAN的思路來分析,這不是作死嗎?一邊是hard onehot vector,另一邊是soft probability vector,判別器一下子就能夠區分它們,生成器還怎麼學習?沒關係,對於WGAN來說,真假樣本好不好區分並不是問題,WGAN只是拉近兩個分布之間的Wasserstein距離,就算是一邊是hard onehot另一邊是soft probability也可以拉近,在訓練過程中,概率向量中的有些項可能會慢慢變成0.8、0.9到接近1,整個向量也會接近onehot,最後我們要真正輸出sequence of index形式的樣本時,只需要對這些概率向量取argmax得到最大概率的index就行了。

新的樣本表示形式+WGAN的分布拉近能力是一個「黃金組合」,但除此之外,還有其他因素幫助論文作者跑出上圖的效果,包括:

  • 文本粒度為英文字元,而非英文單詞,所以字典大小才二三十,大大減小了搜索空間
  • 文本長度也才32
  • 生成器用的不是常見的LSTM架構,而是多層反卷積網路,輸入一個高斯雜訊向量,直接一次性轉換出所有32個字元

上面第三點非常有趣,因為它讓我聯想到前段時間挺火的語言學科幻電影《降臨》:

裡面的外星人「七肢怪」所使用的語言跟人類不同,人類使用的是線性的、串列的語言,而「七肢怪」使用的是非線性的、並行的語言。「七肢怪」在跟主角交流的時候,都是一次性同時給出所有的語義單元的,所以說它們其實是一些多層反卷積網路進化出來的人工智慧生命嗎?

開完腦洞,我們回過頭看,不得不承認這個實驗的setup實在過於簡化了,能否擴展到更加實際的複雜場景,也會是一個問題。但是不管怎樣,生成出來的結果仍然是突破性的。

最後說回gradient penalty的實現問題。loss中本身包含梯度,優化loss就需要求梯度的梯度,這個功能並不是現在所有深度學習框架的標配功能,不過好在Tensorflow就有提供這個介面——tf.gradients。開頭鏈接的GitHub源碼中就是這麼寫的:

# interpolates就是隨機插值採樣得到的圖像,gradients就是loss中的梯度懲罰項
gradients = tf.gradients(Discriminator(interpolates), [interpolates])[0]

對於我這樣的PyTorch黨就非常不幸了,高階梯度的功能還在開發,感興趣的PyTorch黨可以訂閱這個GitHub的pull request:Autograd refactor,如果它被merged了話就可以在最新版中使用高階梯度的功能實現gradient penalty了。

但是除了等待我們就沒有別的辦法了嗎?其實可能是有的,我想到了一種近似方法來實現gradient penalty,只需要把微分換成差分:

L(D) = -mathbb{E}_{xsim P_r}[D(x)] + mathbb{E}_{xsim P_g}[D(x)] + lambda mathbb{E}_{x_1 sim mathcal{P_{hat x}},  x_2 sim mathcal{P_{hat x}}} [ frac{|D(x_1) -D(x_2)|}{ || x_1 - x_2 ||_p } - 1]^2 (公式10)

也就是說,我們仍然是在分布 P_{hat x} 上隨機採樣,但是一次采兩個,然後要求它們的連線斜率要接近1,這樣理論上也可以起到跟公式9一樣的效果,我自己在MNIST+MLP上簡單驗證過有作用,PyTorch黨甚至Tensorflow黨都可以嘗試用一下。


最近做了一個從傳統GAN到improved WGAN的報告,把PPT貼上來吧,有需要的小夥伴可以參考一下。

論文主要涉及到17年的三篇文章:

Arjovsky M, Bottou L. Towards Principled Methods for Training Generative Adversarial Networks[J]. 2017.

Arjovsky M, Chintala S, Bottou L. Wasserstein GAN[J]. 2017.

Gulrajani I, Ahmed F, Arjovsky M, et al. Improved Training of Wasserstein GANs[J]. 2017.

在做報告的過程中,有參考網上的一些博客,特別是中山大學的鄭華濱的博文給了很大的幫助。


GAN最近的發展挺快的,可以去看ICLR 2017 Conference Track,可以參考最近的博文:

  1. GAN論文整理
  2. ICLR 2017 | GAN Missing Modes 和 GAN

這幾天NIPS2016,Goodfellow做了GAN《(NIPS 2016 tutorial)Generative Adversarial Networks (GANs)》http://t.cn/RfgelkJ,非常適合入門。

還有Goodfellow在NIPS16配套的Tutorial,pdf文件57頁,推薦!

Generative Adversarial Networks ,如下圖。

整體上說,GAN有以下發展方向:

  1. GAN Theory
  2. GAN in Semi-supervised
  3. Muti-GAN
  4. GAN with other Generative model
  5. GAN with RNN
  6. GAN in Application

GAN的大體發展:

圖片來源https://twitter.com/ch402/status/793535193835417601,也可參考論文[2]。

你問GAN可以用到什麼場景,有很多:比如goodfellow用GAN隱私保護[1],Odena做GAN圖像合成[2],ICML2016 有用GAN做文字生成圖片的[3],如下圖。

參考文獻:

[1] Abadi, M., Andersen, D. G. (2016). Learning to Protect Communications with Adversarial Neural Cryptography. arXiv preprint arXiv:1610.06918.

[2] Odena, Augustus, Christopher Olah, and Jonathon Shlens. "Conditional Image Synthesis With Auxiliary Classifier GANs." arXiv preprint arXiv:1610.09585 (2016).

[3] Reed, S., Akata, Z., Yan, X., Logeswaran, L., Schiele, B., Lee, H. (2016). Generative adversarial text to image synthesis. arXiv preprint arXiv:1605.05396.


上面的回答都挺多了,我補充一些圖像處理方面的應用:除了從文本生成圖像或者從雜訊生成圖像,一些圖像到圖像之間的轉換也是普遍存在的應用。先給幾個效果圖:

1, 從標籤圖像得到場景圖像。

2, 從衛星照片得到地圖。

3, 從黑白圖像得到彩色圖像。

4, 從素描圖像得到模擬照片。

5, 色調變換:從白天的場景得到夜晚的場景,或者不同季節的風景變換。

6, 從場景圖像得到標籤圖像(圖像分割)。

7,從低解析度圖像得到高解析度圖像(super resolution)。

這幾種應用都是給定一個輸入圖像,得到一個輸出圖像的問題,因此可以用一個通用的模型來表示這類問題。 《Image-to-Image Translation with Conditional Adversarial Networks》這篇文章里提出了這樣一個general的框架。實際上是一種條件GAN,即在給定的輸入圖像的條件下,要生成相應的輸出圖像,其示意圖如下:

與一般的GAN不同之處在於把generator換成一個image to image的網路,比如Encoder-decoder和U-Net。

圖像分割方面,一個比較新的例子是用GAN來做域適應(domain adaptation):利用一個有標記的數據集A來完成另一個沒有標記的數據集B的分割工作。這兩個數據集雖然包含相同集合的一些物體,但是它們的來源是不同的,例如不同國家的街景圖像,不同季節的風景照,遊戲場景中的街景和真實的街景等。A和B之間存在域偏移(domain shift),即來自不同的分布,因此不能把一個在A上訓練好的模型直接用到B上。《FCNs in the Wild: Pixel-level Adversarial and Constraint-based Adaptation》提出了一個使用GAN來解決這個問題的方法。

超解析度圖像的生成,主要是產生更多的圖像細節,讓圖像看起來更真實。Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network (arxiv, 21 Nov, 2016)這篇文章將對抗學慣用於基於單幅圖像的高分辨重建。深度對抗學習在圖像分割和超解析度中的應用 - 知乎專欄 這篇博客里也介紹了更多的例子。


最近剛好整理過這個方面問題,貼出來大家分享一下吧。

先奉上一套生成對抗網路學習視頻: 鏈接: http://pan.baidu.com/s/1eRBcFiq
掃描頭像二維碼或微信搜索公眾號「深度學習與NLP」,關注公眾號,從往期內容即可查看密碼,下面進入正題。

今天主要介紹2016年深度學習最火的模型生成對抗網路(Generative Adversarial Net)-GAN。GAN是由現任谷歌大腦科學家的Ian Goodfellow於2014年提出來的一種基於對抗訓練(Adversarial training)過程來訓練生成模型(Generative Model)的一種新的深度學習框架。GAN是由兩個模型組成:一個生成模型G,用於獲得輸入樣本x的分布(表示學習representation learning觀點認為,深度學習對輸入樣本對(x,y)關係擬合過程,其實就是在學習輸入樣本x的分布),一個判別模型(Discriminative Model)D,用於估計一個樣本是真實的樣本而不是由G生成的樣本的概率。

先簡單介紹下傳統深度學習模型的分類。深度學習產生之初被分為生成模型和判別模型兩大類。生成模型典型網路有深度信念網路(Deep Belief Network,DBN)、堆疊自動編碼器(Stacked Auto-Encoder,SAE)和深度玻爾茲曼機(Deep Boltzmann Machine,DBM),生成模型認為模型的輸出樣本y是由模型的輸入樣本x生成的,一定存在一個最優的輸入樣本x*使得輸出的y的值最大化,通過生成模型可以學習到輸入樣本x的表示representation。它的最大優勢就是直接從輸入樣本x中進行無監督或半監督的學習,減少了對帶標註樣本的需求。判別模型認為模型的輸入樣本x是由輸出樣本y決定的,典型的網路如卷積神經網路(Convolution Neural Network,CNN)。個人認為,GAN的產生將二者結合起來,生成模型G根據輸入x產生輸出y』,並傳遞給判別模型D判斷是否是真實得數據。

GAN:Generative Adversarial Nets.Ian J. Goodfellow, Jean Pouget-Abadie.2014.06.10

NIPS 2016 Tutorial:Generative Adversarial Networks.Ian Goodfellow.2017.01.09

GAN的訓練:GAN的訓練分為兩個部分:G的訓練目標是最大化D做出錯誤識別的概率,就是儘可能讓D判別出錯;D的訓練目標則是儘可能把G生成的樣本找出來。極限情況下,當G能夠完全恢復輸入樣本X的分布的時候,D已經把G生成的樣本識別出來,所以G的輸出概率處處為1/2。與傳統的生成模型,如DBN相比,通過這種方式來訓練生成模型,不需要計算複雜的馬爾科夫鏈或者像CD-K演算法那樣進行展開的近似推理過程。

目標函數的構造,基於帶有雜訊的輸入變數p(z)定義了一個先驗得到輸入z,然後用G(z,Q)把輸入z映射到生成器輸出y』,G是處處可導的且採用一個多層神經網路來表示,用它的參數Q來擬合輸入樣本x的分布。再用一個多層網路來表示D,輸出一個標量,表示來源於x而不是p(z)的概率。對於G來說等價於最小化log(1-D(G(z)))期望;對於D來說,等價於最大logD(x)的期望,類似於一個minimax的遊戲。由此可以得到GAN的目標函數V(G,D):

https://pic3.zhimg.com/v2-ee3b73fc300dc7fedbf855e8538ce296_b.png

訓練D,非常耗時,而且一直在一個訓練集上訓練容易造成過擬合。因此,在實際GAN訓練過程中,D訓練K次之後再訓練G,這樣做的目的是使D保持在一個optimum的狀態,讓G逐步慢慢變化。得到訓練演算法:

https://pic2.zhimg.com/v2-9c9531b29d3a0970db26e1a68014a4fd_b.png

Ian GoodFellow所提出的生成對抗網路或對抗訓練的理論是一個通用的框架,基於GAN也產生了很多變體,適用於各種場景中解決實際問題,展示了GAN家族的強大威力,下面簡要介紹其中比較有代表一些模型。

CGAN:Conditional generative adversarial nets for convolutional face generation.Jon Gauthier.2015.03

Conditional Generative Adversarial Nets.Mehdi Mirza.2014.11.06

解決什麼問題:圖像標註、圖像分類和圖像生成過程中,存在兩類問題:其一、輸出圖像的label比較多,成千上萬類別;其二、對於一個輸入x,對應合適輸出y(label)的類別multi-modal(多個),怎麼樣選擇一個合適類別是個問題。CGAN嘗試在生成器G和判別器端加入額外的條件信息(additional information)來指導GAN兩個模型的訓練。

怎麼做:條件化(conditional)GAN做法就是直接把額外的信息(y)直接添加到生成器G和判別器D的的目標函數中,與輸入Z和X中構成條件概率,如下圖所示:

https://pic1.zhimg.com/v2-4b15ac7d449e346416173059a1f87058_b.png

用於指導G和D訓練的額外信息可以是各種類型(multi-modal)的數據,已圖像分類為例,可以是label標籤,也可以是關於圖像類別或其他信息的text文本描述。

DCGAN:UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS.Alec Radford Luke Metz.2016.01.07

解決什麼問題:把有監督學習的CNN與無監督學習的GAN整合到一起提出了Deep Convolutional Generative Adversarial Networks - DCGANs,是生成器和判別器分別學到對輸入圖像層次化的表示。

本文的最大貢獻:1、將CNN與GAN結合在一起提出了DCGANs,使用DCGANs從大量的無標記數據(圖像、語音)學習到有用的特徵,相當於利用無標記數據初始化DCGANs的生成器和判別器的參數,在用於有監督場景,比如,圖像分類。2、表示學習representation learning的工作:嘗試理解和可視化GAN是如何工作的,多層的GAN的中間表示intermediate representation 是什麼。3、給出了一些穩定訓練DCGANs的guidelines。

DCGAN的網路結構:

生成器構G的造:

https://pic2.zhimg.com/v2-4c6a5497e611abffd8e001f26ff8af51_b.png

四個堆疊的卷積操作來構成生成器G,沒有採用全連接層。

InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets.Xi Chen, Yan Duan, Rein Houthooft, John Schulman.2016.06.12

解決什麼問題:無監督學習或表示學習(representation learning)可以看做是從大量無標記數據中抽取有價值的特徵、或學習一種重要的隱特徵(semantic features)表示(representation)的問題。但無監督學習又是ill-posed,因為很多與無監督學習相關的下游的任務在訓練時是未知的,而務監督學習也是一種分離/拆解 表示(disentangled representation),有助於下游相關但未知任務的學習,因為disentangled representation可以學習到輸入樣本的salient attribute。無監督學習中最重要的的模型就是生成模型Generative model,比如,生成對抗網路GAN和變分自動編碼器()VAE。本文從disentangled representation角度出發,把信息理論(Information-theoretic)與GAN相結合提出InfoGAN,採用無監督的方式學習到輸入樣本X的可解釋且有意義的表示(representation)。

怎麼做:通過最大化隱變數(latent variable)的一個子集與observation之間的互信息

SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient.Lantao Yuy, Weinan Zhangy, Jun Wangz, Yong Yuy.2016.12.09

解決什麼問題:GAN:用一個判別模型D去指導生成模型G的訓練,在generating real-valued打他取得巨大成功,但處理的都是連續可導的數據,比如圖像,鮮有涉及離散數據,如文本。原因有兩個:其一,梯度從判別器D沒有辦法反向傳遞會生成器G,G離散不可導;其二,判別器D可以評測一個完整序列的score,但沒法評測只生成了一部分的partially sequence現在和未來的score。因此,本文提出SeqGAN解決這兩個問題。

怎麼做:借鑒了強化學習中的reward的思想,在判別器D端,通過一個完整的sequence序列構造一個reward反饋會生成器G來指導生成器G的訓練,通過RL中的策略梯度演算法(policy gradient method)來優化G的參數,繞過了上面兩個問題。

SeqGAN的結構:

https://pic2.zhimg.com/v2-38912eb38acb2c25ab56cb5ad039264d_b.png

StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks.Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang.2016.12.10

解決什麼問題:根據text description生成圖像有很多應用場景,比如圖片輔助裁剪、計算機輔助設計等。但最大的問題是符合text描述的場景有很多(multi-modle),如何從中選擇最佳的場景,生成高清晰的圖片是個問題。本文基於GAN來做這個問題,原來方法只能生成64X64的low resolution圖片,本文使用Stack GAN生成了256X256的高清晰度圖片,並且在CUB和Oxford-102數據集取得了比現有方法分別高28.47%和20.30%的improvement,這真的很厲害,也展示了GAN的強大功能。

怎麼做:提出了一個堆疊的GAN模型用於「text-to-image」中生成高解析度的圖像,stack-1 GAN生成一張包含text文本所描述物體的初級形狀和基本顏色的,像素為64X64的低解析度圖片,stack-2 GAN 根據GAN-1輸出的低解析度圖片做為輸入,加上text文本描述,進一步rectify defects和添加一些細節信息,進行refinement過程後生成一張256X256的高解析度圖片。

Stack GAN的網路結構:

https://pic2.zhimg.com/v2-4e11bfece19180152f6d99236d46e365_b.png

關鍵點在於Stack-GAN的兩個GAN做么構建,怎麼訓練

WGAN:Wasserstein GAN.Martin Arjovsky, Soumith Chintala, and Lon Bottou.2017.03.09

Improved Training of Wasserstein GANs.Ishaan Gulrajani1, Faruk Ahmed1, Martin Arjovsky2.2017.03.31

解決什麼問題:GAN在訓練很麻煩,需要精心設計生成器G和判別器D的網路結構,調整很多的超參數,經常不收斂。為了解決這個問題,讓GAN訓練起來更容易,本文提出了Wasserstein GAN(WGAN)。

怎麼做:深入分析由GAN所優化的值函數(value function)的收斂特性,指出傳統GAN不穩定是因為其基於Jensen-Shannon 差異(divergence)構造的值函數在某一地方不可導,導致生成器G訓練不穩定。因此,提出了Earth-Mover距離,又稱Wasserstein-1 距離W(q,p),基於Wasserstein distance來構造值函數,代替傳統GAN中基於Jensen-Shannon 差異(divergence)的值函數。Wasserstein distance具有更好的特性,Jensen-Shannon divergence可能不連續,在不連續的地方不能提供穩定的梯度用於生成器G的參數優化;相比之下,Earth-Mover距離處處連續,處處可導。

Jensen-Shannon距離與Wassertein距離對比:

https://pic2.zhimg.com/v2-0e07bcbae35daf36a14ba7797072a7c1_b.png

WGAN的訓練演算法:

https://pic3.zhimg.com/v2-bfeb2d03b2ae3a51456cee528f203f72_b.png


CycleGAN

[Paper] [PyTorch]

使用非成對數據進行轉換學習,如冬夏轉換。

大家能看出哪兩張是真的,哪兩張是生成的嗎?


SeqGAN

[Paper] [Tensorflow]

GAN應用於時序離散數據生成。


NIPS 對抗網路之父 Good fellow 的 關於對抗網路的 ppt.正在膜拜

http://www.iangoodfellow.com/slides/2016-12-04-NIPS.pdf

Video Prediction


1.Deep multi-scale video prediction beyond mean square error(Yann LeCun"s paper)

[paper][1511.05440] Deep multi-scale video prediction beyond mean square error

[code]dyelax/Adversarial_Video_Generation


2.Unsupervised Learning for Physical Interaction through Video Prediction(Ian Goodfellow)

[paper][1605.07157] Unsupervised Learning for Physical Interaction through Video Prediction


最近還有一個跟模仿學習imtation learning有關的GAN. Generative Adversarial Imitation Learning. 地址 https://arxiv.org/abs/1606.03476


所謂 換湯不換藥。新的煉丹模型出來了也一般還是歸於原來的幾大煉丹門派。

GAN在我的理解里還是生成類模型(不知道翻譯對不對啊,generative model)。那麼他的最佳應用場景和CNN之前的Boltzmann Machine,Deep Boltzmann Machine,PGM的一堆理論等的應用場景會很像。


利用GAN(AAE)做新藥物分子研發 - 知乎專欄

昨天剛更的一個文章,我個人覺得還是比較有價值的。


推薦一篇博客,OpenAI的生成模型的博客,寫的非常好。Generative Models
博客以鏈接的形式給出了很多知名論文的介紹,方便你去外鏈到其他論文。
MIT最近發出的論文(Generating Videos with Scene Dynamics),根據場景生成視頻,挺炫酷的,但是生成的場景仍舊不是太理想,所以GAN還是很有發展潛力的。如果有一天,GAN生成的圖片或者視頻能夠達到人類的創作水平的話,那AI就真實厲害了。


謝邀;

高票答案總結的很好了,我估計總結不了那麼多。

# 實際應用

首先貼上GItXiv關於生成模型的鏈接(http://www.gitxiv.com/?cat%5B0%5D=generative),雖然我不做GAN,但下半年看到的鋪天蓋地的GAN,GAN是一種生成模型,那麼就可以做以前生成模型可以做的事情,以前生成模型是RBM,DBN,DBM等模型,他們應用場景就我涉及領域:多模特徵融合(唇動語音融合做speech recognition)、圖像生成描述(給定圖像生成對圖像內容的描述)、圖像復原、圖像超解析度、協同過濾等。

不過就最近來看,GAN在圖像應用較多,包括但不限於以下幾塊:

1.圖像風格化有點火:如藝術風格化,人臉合成;

2.文本生成圖片;

3.圖像超解析度;

4.圖像復原;

5.圖像生成描述;

當然,既然是無監督或弱監督,GAN可以用於各類數據,可以整個語音合成唇動,多模異構特徵融合,類似RBM的方法,也可以CNN後面接GAN做一些工作後面的是我瞎想的,不過我覺得DeepLearning的以後會很多設計MultiModal。


-------補充----

發現有人點贊^_^,那就把最近看到的補充進去吧。

#理論進展

最近一篇arXiv論文[1701.07875] Wasserstein GAN 可以成為是最新的理論進展,針對以往GAN所出現的訓練不穩定刨根問底,提出解決方案,文章可以達到使用MLP輕鬆得到生產樣本的效果,預感這是今後GAN的常用訓練手法。中文解析可以參看知乎專欄@鄭華濱。

剩下的參看知乎專欄 @魏秀參,ICLR2017較多GAN文章,想必可以了解到一些最新進展和發展趨勢。


個人認為這個總結的不錯zhangqianhui/AdversarialNetsPapers
另外可以加上其他回答中提到的MIT出的NIPS2016的文章Generating Videos with Scene Dynamics ,以及另外一篇最近剛放出來的用GAN生成視頻用於自動駕駛的文章[1608.01230] Learning a Driving Simulator ,源碼和演示視頻都有comma.ai research,雖然還有很多問題,但是也是一個非常好的發展方向。


GAN可用於照片級的特定身份正面人臉合成的工作,可用於識別。Beyond Face Rotation: Global and Local Perception GAN for Photorealistic and Identity Preserving Frontal View Synthesis
論文在arxiv上可以獲得,歡迎關注!
------除重行-----不知道為何有人要舉報我…-------


來推一下我剛開始的一個小項目:dongb5/GAN-Timeline

這是一個GAN的大事記(時間線),按時間介紹了GAN發展歷程的重要papers,並把文章分為理論(Theory),機器視覺(CV App)和其他三個方面,題主有興趣的話可以去看看,你所說的這幾個方面的paper都有。


谷歌最新發在arXiv上的文章:BEGAN: Boundary Equilibrium Generative Adversarial Networks Code應該算最新進展了。源碼都已經公布:carpedm20/BEGAN-tensorflow and carpedm20/BEGAN-pytorch。文章里漸變圖像的生成效果已經接近圖形學領域Image Morphing演算法的效果,確實牛。


A-Fast-RCNN https://arxiv.org/pdf/1704.03414.pdf


GAN(Generative Adversarial Nets)的發展


對於宅男來說,拿本子圖做訓練集,日後可以通過輸入描述性語言生成本子。。


推薦閱讀:

TAG:深度學習(Deep Learning) | 生成對抗網路(GAN) |