1. 程式人生 > >洞見 | 生成對抗網路GAN最近在NLP領域有哪些應用

洞見 | 生成對抗網路GAN最近在NLP領域有哪些應用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

剛做完實驗,來答一答自然語言處理方面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(我最崇拜的學長髮郵件去問過一作) 。至於第一部分為什麼梯度是近似於這種形式,可以參考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這一塊進展很多,同時以上提到的幾篇重要工作的一二作,貌似都在知乎上,對他們致以崇高的敬意。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述