0
本文作者: 亞萌 | 2017-04-16 13:41 |
雷鋒網(wǎng)按:本文作者莫驚蟄,原文載于知乎,雷鋒網(wǎng)獲授權(quán)轉(zhuǎn)載。
剛做完實驗,來答一答自然語言處理方面GAN的應(yīng)用。
直接把GAN應(yīng)用到NLP領(lǐng)域(主要是生成序列),有兩方面的問題:
1. GAN最開始是設(shè)計用于生成連續(xù)數(shù)據(jù),但是自然語言處理中我們要用來生成離散tokens的序列。因為生成器(Generator,簡稱G)需要利用從判別器(Discriminator,簡稱D)得到的梯度進行訓(xùn)練,而G和D都需要完全可微,碰到有離散變量的時候就會有問題,只用BP不能為G提供訓(xùn)練的梯度。在GAN中我們通過對G的參數(shù)進行微小的改變,令其生成的數(shù)據(jù)更加“逼真”。若生成的數(shù)據(jù)是基于離散的tokens,D給出的信息很多時候都沒有意義,因為和圖像不同。圖像是連續(xù)的,微小的改變可以在像素點上面反應(yīng)出來,但是你對tokens做微小的改變,在對應(yīng)的dictionary space里面可能根本就沒有相應(yīng)的tokens.
2.GAN只可以對已經(jīng)生成的完整序列進行打分,而對一部分生成的序列,如何判斷它現(xiàn)在生成的一部分的質(zhì)量和之后生成整個序列的質(zhì)量也是一個問題。
1. 為了解決這兩個問題,比較早的工作是上交的這篇發(fā)表在AAAI 2017的文章:SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient, 16年9月就放上了Arxiv上面了,而且也公布了源代碼。
利用了強化學習的東西來解決以上問題。如圖,針對第一個問題,首先是將D的輸出作為Reward,然后用Policy Gradient Method來訓(xùn)練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和強化學習來做對話系統(tǒng),如果我沒有記錯,這篇paper是最早引用SeqGAN的,有同學還說這篇是最早將RL用到GAN上的,主要是Jiwei大神名氣太大,一放上Arxiv就引起無數(shù)關(guān)注。
如圖,文章也是用了Policy Gradient Method來對GAN進行訓(xùn)練,和SeqGAN的方法并沒有很大的區(qū)別,主要是用在了Dialogue Generation這樣困難的任務(wù)上面。還有兩點就是:第一點是除了用蒙特卡羅搜索來解決部分生成序列的問題之外,因為MC Search比較耗費時間,還可以訓(xùn)練一個特殊的D去給部分生成的序列進行打分。但是從實驗效果來看,MC Search的表現(xiàn)要更好一點。
第二點是在訓(xùn)練G的時候同時還用了Teacher-Forcing(MLE)的方法,這點和后面的MaliGAN有異曲同工之處。
為什么要這樣做的原因是在對抗性訓(xùn)練的時候,G不會直接接觸到真實的目標序列(gold-standard target sequence),當G生成了質(zhì)量很差的序列的時候(生成質(zhì)量很好的序列其實相當困難),而D又訓(xùn)練得很好,G就會通過得到的Reward知道自己生成的序列很糟糕,但卻又不知道怎么令自己生成更好的序列, 這樣就會導(dǎo)致訓(xùn)練崩潰。所以通過對抗性訓(xùn)練更新G的參數(shù)之后,還通過傳統(tǒng)的MLE就是用真實的序列來更新G的參數(shù)。類似于有一個“老師”來糾正G訓(xùn)練過程中出現(xiàn)的偏差,類似于一個regularizer。
原文鏈接:https://arxiv.org/pdf/1701.06547.pdf
Github鏈接:jiweil/Neural-Dialogue-Generation
3. Yoshua Bengio組在二月底連續(xù)放了三篇和GAN有關(guān)的paper,其中我們最關(guān)心的是大神Tong Che和Li yanran的這篇:Maximum-Likelihood Augmented Discrete Generative Adversarial Networks(MaliGAN),簡稱讀起來怪怪的。。。
這篇文章的工作主要是兩個方面:
1.為G構(gòu)造一個全新的目標函數(shù),用到了Importance Sampling,將其與D的output結(jié)合起來,令訓(xùn)練過程更加穩(wěn)定同時梯度的方差更低。盡管這個目標函數(shù)和RL的方法類似,但是相比之下更能狗降低estimator的方差(強烈建議看原文的3.2 Analysis,分析了當D最優(yōu)以及D經(jīng)過訓(xùn)練但并沒有到最優(yōu)兩種情況下,這個新的目標函數(shù)仍然能發(fā)揮作用)
2.生成較長序列的時候需要用到多次random sampling,所以文章還提出了兩個降低方差的技巧:第一個是蒙特卡羅樹搜索,這個大家都比較熟悉; 第二個文章稱之為Mixed MLE-Mali Training,就是從真實數(shù)據(jù)中進行抽樣,若序列長度大于N,則固定住前N個詞,然后基于前N個詞去freely run G產(chǎn)生M個樣本,一直run到序列結(jié)束。
基于前N個詞生成后面的詞的原因在于條件分布Pd比完整分布要簡單,同時能夠從真實的樣本中得到較強的訓(xùn)練信號。然后逐漸減少N(在實驗三中N=30, K=5, K為步長值,訓(xùn)練的時候每次迭代N-K)
Mixed MLE訓(xùn)練的MaliGAN完整算法如下:
在12,梯度更新的時候,第二項(highlight的部分)貌似應(yīng)該是logP(我最崇拜的學長發(fā)郵件去問過一作) 。至于第一部分為什么梯度是近似于這種形式,可以參考Bengio組的另一篇文章:Boundary-Seeking Generative Adversarial Networks
這個BGAN的Intuition就是:令G去學習如何生成在D決策邊界的樣本,所以才叫做boundary-seeking。作者有一個特別的技巧:如圖,當D達到最優(yōu)的時候,滿足如下條件,Pdata是真實的分布,Pg是G生成的分布。
我們對它進行一點微小的變換:這個形式厲害之處在于,盡管我們沒有完美的G,但是仍然可以通過對Pg賦予權(quán)重來得到真實的分布,這個比例就是如圖所示,基于該G的最優(yōu)D和(1-D)之比。當然我們很難得到最優(yōu)的D,但我們訓(xùn)練的D越接近最優(yōu)D,bias越低。而訓(xùn)練D(標準二分類器)要比G簡單得多,因為G的目標函數(shù)是一個會隨著D變動而變動的目標。
文章后面給出了如何求梯度的數(shù)學公式,這里就不貼了。
回到MaliGAN,作者給出了實驗數(shù)據(jù),比SeqGAN的效果要更好,看BLEU score.
原文鏈接:https://arxiv.org/pdf/1702.07983v1.pdf
4. 用SeqGAN做機器翻譯,中科院自動化所在三月中旬放出了這篇文章:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets,這篇文章主要的貢獻就是第一次將GAN應(yīng)用到了NLP的傳統(tǒng)任務(wù)上面,而且BLEU有2的提升。
這個模型他們稱之為CSGAN-NMT,G用的是傳統(tǒng)的attention-based NMT模型,而D有兩種方案,一種是CNN based,另一種是RNN based,通過實驗比較發(fā)現(xiàn)CNN的效果更好。推測的原因是RNN的分類模型在訓(xùn)練早期能夠有極高的分類準確率,導(dǎo)致總能識別出G生成的數(shù)據(jù)和真實的數(shù)據(jù),G難以訓(xùn)練(因為總是negative signal),
這篇文章的重點我想是4.訓(xùn)練策略,GAN極難訓(xùn)練,他們首先是用MLE來pretrain G,然后再用G生成的樣本和真實樣本來pretrain D,當D達到某一個準確率的時候,進入對抗性訓(xùn)練的環(huán)節(jié),GAN的部分基本和SeqGAN一樣,用policy gradient method+MC search,上面已經(jīng)講過了不再重復(fù)。但是由于在對抗性訓(xùn)練的時候,G沒有直接接觸到golden target sentence,所以每用policy gradient更新一次G都跑一次professor forcing。這里我比較困惑,我覺得是不是像Jiwei那篇文章,是用D給出的Reward來更新G參數(shù)之后,又用MLE來更新一次G的參數(shù)(保證G能接觸到真實的樣本,這里就是目標語言的序列),但這個方法是teacher-forcing不是professor forcing。
最后就是訓(xùn)練Trick茫茫,這篇文章試了很多超參數(shù),比如D要pretrain到f=0.82的時候效果最好,還有pretrain要用Adam,而對抗性訓(xùn)練要用RMSProp,同時還要和WGAN一樣將每次更新D的權(quán)重固定在一個范圍之內(nèi)。
原文鏈接:https://arxiv.org/pdf/1703.04887.pdf
5.最后3月31號放到Arxiv上的文章:Improved Training of Wasserstein GANs, WGAN發(fā)布之后就引起轟動,比如Ian在Reddit上就點評了這篇文章,NYU的又祭出了這篇,令WGAN在NLP上也能發(fā)揮威力。
在WGAN中,他們給出的改進方案是:
判別器最后一層去掉sigmoid
生成器和判別器的loss不取log
每次更新判別器的參數(shù)之后把它們的絕對值截斷到不超過一個固定常數(shù)c
不要用基于動量的優(yōu)化算法(包括momentum和Adam),推薦RMSProp,SGD也行
這里引用自知乎專欄:令人拍案叫絕的Wasserstein GAN - 知乎專欄
文章寫得深入淺出,強烈推薦。
其中第三項就是機器翻譯文章中也用到的weight clipping,在本文中,他們發(fā)現(xiàn)通過weight clipping來對D實施Lipschitz限制(為了逼近難以直接計算的Wasserstein距離),是導(dǎo)致訓(xùn)練不穩(wěn)定,以及難以捕捉復(fù)雜概率分布的元兇。所以文章提出通過梯度懲罰來對Critic(也就是D,WGAN系列都將D稱之為Critic)試試Lipschitz限制。
如圖:損失函數(shù)有原來的部分+梯度懲罰,現(xiàn)在不需要weight clipping以及基于動量的優(yōu)化算法都可以使用了,他們在這里就用了Adam。同時可以拿掉Batch Normalization。
如圖所示,實驗結(jié)果很驚人,這種WGAN—GP的結(jié)構(gòu),訓(xùn)練更加穩(wěn)定,收斂更快,同時能夠生成更高質(zhì)量的樣本,而且可以用于訓(xùn)練不同的GAN架構(gòu),甚至是101層的深度殘差網(wǎng)絡(luò)。
同時也能用于NLP中的生成任務(wù),而且是character-level 的language model,而MaliGAN的實驗是在Sentence-Level上面的。而且前面幾篇提到的文章2,3,4在對抗性訓(xùn)練的時候或多或少都用到了MLE,令G更夠接觸到Ground Truth,但是WGAN-GP是完全不需要MLE的部分。
原文鏈接:https://arxiv.org/pdf/1704.00028.pdf
github地址:https://github.com/igul222/improved_wgan_training
代碼一起放出簡直業(yè)界良心。
6. 3月31號還谷歌還放出了一篇BEGAN: Boundary Equilibrium Generative Adversarial Networks,同時代碼也有了是carpedm20用pytorch寫的,他復(fù)現(xiàn)的速度真心快。。。
最后GAN這一塊進展很多,同時以上提到的幾篇重要工作的一二作,貌似都在知乎上,對他們致以崇高的敬意。
更多雷鋒網(wǎng)文章:
蒙特利爾大學研究者改進Wasserstein GAN,極大提高GAN訓(xùn)練穩(wěn)定性
到 200 行代碼,教你如何用 Keras 搭建生成對抗網(wǎng)絡(luò)(GAN)
AI慕課學院近期推出了《NLP工程師入門實踐班:基于深度學習的自然語言處理》課程!
三大模塊,五大應(yīng)用,海外博士講師手把手教你入門NLP,更有豐富項目經(jīng)驗相授;算法+實踐,搭配典型行業(yè)應(yīng)用;隨到隨學,專業(yè)社群,講師在線答疑!
課程地址:http://www.mooc.ai/course/427
加入AI慕課學院人工智能學習交流QQ群:624413030,與AI同行一起交流成長
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。