强化学习在生成对抗网络文本生成中扮演的角色
強化學習在生成對抗網絡文本生成中扮演的角色(Role of RL in Text Generation by GAN)(下)
??AI研習社1.基礎:文本生成模型的標準框架
文本生成(Text Generation)通過?機器學習 + 自然語言處理?技術嘗試使AI具有人類水平的語言表達能力,從一定程度上能夠反應現今自然語言處理的發展水平。
下面用極簡的描述介紹一下文本生成技術的大體框架,具體可以參閱各種網絡文獻(比如:CSDN經典Blog“好玩的文本生成”[1]),論文等。
文本生成按任務來說,比較流行的有:機器翻譯、句子生成、對話生成等,本文著重討論后面兩種。基于深度學習的Text Generator 通常使用循環神經網絡(Basic RNN,LSTM,GRU等)進行語義建模。在句子生成任務中,一種常見的應用:“Char-RNN”(這里“Char”是廣義上的稱謂,可以泛指一個字符、單詞或其他文本粒度單位),雖然簡單基礎但可以清晰反應句子生成的運行流程,首先需要建立一個詞庫Vocab包含可能出現的所有字符或是詞匯,每次模型將預測得到句子中下一個將出現的詞匯,要知道softmax輸出的只是一個概率分布,其維度為詞庫 Vocab 的size,需再通過函數將輸出概率分布轉化為 One-hot vector,從詞庫 Vocab 中檢索得出對應的詞項;在“Char-RNN”模型訓練時,使用窗口在語料上滑動,窗口之內的上下文及其后緊跟的字符配合分別為一組訓練樣本和標簽,每次以按照固定的步長滑動窗口以得出全部“樣本-標簽”對。
與句子生成任務類似,對話生成以每組Dialogue作為“樣本-標簽”對,循環神經網絡RNN_1對Dialogue上文進行編碼,再用另一個循環神經網絡RNN_2對其進行逐詞解碼,并以上一個解碼神經元的輸出作為下一個解碼神經元的輸入,生成Dialogue下文,需要注意的是:在解碼前需配置“開始”標記 _,用于指示解碼器Decoder開啟Dialogue下文首詞(or 字)的生成,并配置“結束”標記 _,用于指示解碼器結束當前的 Text Generation 進程。
這便是眾所周知的“Seq2Seq”框架的基礎形態,為了提高基礎Seq2Seq模型的效果,直接從解碼器的角度有諸如 Beam-Search Decoder[2]、Attention mechanism Decoder[3](配置注意力機制的解碼器)等改進,而從神經網絡的結構入手,也有諸如Pyramidal RNN[4](金字塔型RNN)、Hierarchical RNN Encoder[5](分層循環網絡編碼器)等改進。改進不計其數,不一一詳舉,但不管如何,預測結果的輸出始終都是一個維度為詞庫大小的概率分布,需要再甄選出最大值的Index,到詞庫Vocab中檢索得出對應的單詞(or 字符)。
2.問題:GAN為何不能直接用于文本生成
2.1. GAN基礎知識
GAN對于大家而言想必已經膾炙人口了,這里做一些簡單的復習。GAN從結構上來講巧妙而簡單(盡管有與其他經典工作Idea相似的爭議[6~7]),也非常易于理解,整個模型只有兩個部件:1.生成器G;2.判別器D。生成模型其實由來已久,所以生成器也并不新鮮,生成器G的目標是生成出最接近于真實樣本的假樣本分布,在以前沒有判別器D的時候,生成器的訓練依靠每輪迭代返回當前生成樣本與真實樣本的差異(把這個差異轉化成loss)來進行參數優化,而判別器D的出現改變了這一點,判別器D的目標是盡可能準確地辨別生成樣本和真實樣本,而這時生成器G的訓練目標就由最小化“生成-真實樣本差異”變為了盡量弱化判別器D的辨別能力(這時候訓練的目標函數中包含了判別器D的輸出)。GAN模型的大體框架如下圖所示:
我們再來簡單復習一下GAN當中的一些重要公式,這一步對后文的闡述非常重要。不管生成器G是什么形狀、多么深的一個神經網絡,我們暫且把它看成一個函數??,由它生成的樣本記作:??,相對地,真實樣本記作:??。同樣,不管判別器D作為一個分類神經網絡,我們也可將其視為一個函數??,而這個函數的輸出即為一個標量,用于描述生成樣本??與真實樣本??之間的差距。
而GAN模型的整體優化目標函數是:
其中函數??如下:
根據連續函數的期望計算方法,上式變形為:
先求外層的??的話,對積分符號內的多項式求導取極值得到目標D:
代回原式:
所以,當生成器G能生成出與真實樣本一樣分布的樣本,那么ok,就達到最好的結果,然后大家注意一點,這里生成樣本的loss衡量方法是JS散度。
2.2. GAN面對離散型數據時的困境(啥是離散型數據?)
GAN的作者早在原版論文[8]時就提及,GAN只適用于連續型數據的生成,對于離散型數據效果不佳(使得一時風頭無兩的GAN在NLP領域一直無法超越生成模型的另一大佬VAE[9])。文本數據就是最典型的一種離散型數據,這里所謂的離散,并不是指:文本由一個詞一個詞組成,或是說當今最流行的文本生成框架,諸如Seq2Seq,也都是逐詞(或者逐個Character)生成的。因為哪怕利用非循環網絡進行一次成型的Sentences生成,也無法避免“數據離散”帶來的后果,抱歉都怪我年輕時的無知,離散型數據的真正含義,我們要從連續性數據說起。 圖像數據就是典型的連續性數據,故而GAN能夠直接生成出逼真的畫面來。我們首先來看看圖像數據的形狀:
圖像數據在計算機中均被表示為矩陣,若是黑白圖像矩陣中元素的值即為像素值或者灰度值(抱歉外行了,我不是做圖像的),就算是彩色圖像,圖像張量即被多加了一階用于表示RGB通道,圖像矩陣中的元素是可微分的,其數值直接反映出圖像本身的明暗,色彩等因素,很多這樣的像素點組合在一起,就形成了圖像,也就是說,從圖像矩陣到圖像,不需要“采樣”(Sampling),有一個更形象的例子:畫圖軟件中的調色板,如下圖,你在調色板上隨便滑動一下,大致感受一下圖像數據可微分的特性。
文本數據可就不一樣了,做文本的同學都知道,假設我們的詞庫(Vocabulary)大小為1000,那么每當我們預測下一個出現的詞時,理應得到的是一個One-hot的Vector,這個Vector中有999項是0,只有一項是1,而這一項就代表詞庫中的某個詞。然而,真正的隔閡在于,我們每次用無論什么分類器或者神經網絡得到的直接結果,都是一個1000維的概率分布,而非正正好好是一個One-hot的Vector,即便是使用softmax作為輸出,頂多也只能得到某一維上特別大,其余維上特別小的情況,而將這種輸出結果過渡到One-hot vector 然后再從詞庫中查詢出對應index的詞,這樣的操作被稱為“Sampling”,通常,我們找出值最大的那一項設其為1,其余為0。
當前神經網絡的優化方法大多數都是基于梯度的(Gradient based),很多文獻這么說:GAN在面對離散型數據時,判別網絡無法將梯度Back propagation(BP)給生成網絡。這句話當時讓我等聽的云里霧里,不妨換一個角度理解,我們知道,基于梯度的優化方法大致意思是這樣的,微調網絡中的參數(weight),看看最終輸出的結果有沒有變得好一點,有沒有達到最好的情形。
但是判別器D得到的是Sampling之后的結果,也就是說,我們經過參數微調之后,即便softmax的輸出優化了一點點,比如上圖的例子中,正確結果本應是第三項,其output的倒數第二項從??變為了??,第三項從??變為了??,但是經過Sampling之后,生成器G輸出的結果還是跟以前一模一樣,并再次將相同的答案重復輸入給判別器D,這樣判別器D給出的評價就會毫無意義,生成器G的訓練也會失去方向。
有人說,與其這樣不如每次給判別器D直接吃Sampling之前的結果,也就是softamx輸出的那個distribution,同樣,這么做也有很大的問題。我們回到GAN的基本原理,判別器D的初衷,它經歷訓練就是為了準確辨別生成樣本和真實樣本的,那么生成樣本是一個充滿了float小數的分布,而真實樣本是一個One-hot Vector,判別器D很容易“作弊”,它根本不用去判斷生成分布是否與真實分布更加接近,它只需要識別出給到的分布是不是除了一項是??,其余都是??就可以了。所以無論Sampling之前的分布無論多么接近于真實的One-hot Vector,只要它依然是一個概率分布,都可以被判別器D輕易地檢測出來。
上面所說的原因當然也有數學上的解釋,還記得在2.1節的時候,請大家注意生成樣本的loss衡量標準是什么嗎?沒錯,就是JS散度,??在應用上其實是有弱點的(參考文獻[10]),它只能被正常地應用于互有重疊(Overlap)的兩個分布,當面對互不重疊的兩個分布??和??,其JS散度:
大家再想想,除非softmax能output出與真實樣本 exactly 相同的獨熱分布(One-hot Vector)(當然這是不可能的),還有什么能讓生成樣本的分布與真實樣本的分布發生重疊呢?于是,生成器無論怎么做基于Gradient 的優化,輸出分布與真實分布的??始終是??,生成器G的訓練于是失去了意義。
3. 過渡方案:對于GAN的直接改進用于文本生成
為了解決GAN在面對離散數據時的困境,最直接的想法是對GAN內部的一些計算方式進行微調,這種對于GAN內部計算方式的直接改進也顯示出了一定的效果,為后面將GAN直接、流暢地應用于文本等離散型數據的生成帶來了希望。 接下來簡單介紹相關的兩篇工作[11~12]。
3.1. Wasserstein-divergence,額外的禮物
Wasserstein GAN[13](簡稱WGAN),其影響力似乎達到了原版GAN的高度,在國內也有一篇與其影響力相當的博文——“令人拍案叫絕的Wasserstein GAN”[10],不過在看這篇論文之前,還要推薦另外一篇論文“f-GAN”[14],這篇論文利用芬切爾共軛(Fenchel Conjugate)的性質證明了任何??都可以作為原先GAN中??(或者說??)的替代方案。 f-GAN 的定義如下:
公式中的??被稱為 f函數,它必須滿足以下要求:
不難看出,??也是??的一種,f-GAN 原文提供了數十種各式各樣的??,為GAN接下來沿此方向上的改進帶來了無限可能。
Wasserstein GAN 對GAN的改進也是從替換??這個角度對GAN進行改進,其詳細的妙處大可參看文獻[10,13],總的來說,WGAN采用了一種奇特的 Divergence—— “推土機-Divergence”,??將兩個分布看作兩堆土,Divergence 計算的就是為了將兩個土堆推成一樣的形狀所需要泥土搬運總距離。如下圖:
使用??訓練的GAN相比原版的GAN有更加明顯的“演化”過程,換句話說就是,WGAN的訓練相比與GAN更加能突顯從“不好”到“不錯”的循序漸經的過程。從上面的2.2節,我們知道JS散度在面對兩個分布不相重疊的情況時,將發生“異常”,計算結果均為??,GAN的訓練過程也是這樣,也許在很長一段訓練的過程中,JS散度的返回值都是??,只有到達某個臨界點時,才會突然優化為接近最優值的結果,而Wasserstein散度的返回值則要平滑很多。
既然Wasserstein散度能夠克服JS散度的上述弱點,那么使用Wasserstein GAN直接吸收生成器G softmax層output的Distribution Vector 與真實樣本的 One-hot Vector,用判別器D 進行鑒定,即便判別器D不會傻到真的被“以假亂真”,但生成器output每次更加接近于真實樣本的“進步”總算還是能被傳回,這樣就保證了對于離散數據的對抗訓練能夠繼續下去。不過Wasserstein GAN的原著放眼于對于GAN更加遠大的改進意義,并沒有著重給出關于文本生成等離散數據處理的實驗,反倒是后來的一篇“Improved Training of Wasserstein GANs”[11]專門給出了文本生成的實驗,從結果上可以看出,WGAN生成的文本雖然遠不及當下最牛X的文本生成效果,但好歹能以character為單位生成出一些看上去稍微正常一點的結果了,對比之下,GAN關于文本生成的生成結果顯然是崩塌的。
3.2. Gumbel-softmax,模擬Sampling的softmax
另外一篇來自華威大學+劍橋大學的工作把改進GAN用于離散數據生成的重心放在了修改softmax的output這方面。如2.2節所述,Sampling 操作中的??函數將連續的softmax輸出抽取成離散的成型輸出,從而導致Sampling的最終output是不可微的,形成GAN對于離散數據生成的最大攔路虎,既然不用Sampling的時候,output與真實分布不重疊,導致JS散度停留于固定值??,如果用了Sampling的話,離散數據的正常輸出又造成了梯度 Back-Propagation 上天然的隔閡。
既然如此,論文的作者尋找了一種可以高仿出Sampling效果的特殊softmax,使得softmax的直接輸出既可以保證與真實分布的重疊,又能避免Sampling操作對于其可微特征的破壞。它就是“耿貝爾-softmax”(Gumbel-Softmax),Gumbel-Softmax早先已經被應用于離散標簽的再分布化[15](Categorical Reparameterization),在原先的Sampling操作中,??函數將普通softmax的輸出轉化成One-hot Vector:
而Gumbel-Softmax略去了??+??這一步,能夠直接給出近似Sampling操作的輸出:
精髓在于這其中的“逆溫參數”??,當??時,上式所輸出的分布等同于??+??給出的 Sampling 分布,而當??時,上式的輸出就接近于均勻分布,而??則作為這個特殊softmax中的一個超參數,給予一個較大的初始值,通過訓練學習逐漸變小,向??逼近,這一部分詳細內容可以閱讀文獻[15]。
論文的實驗僅僅嘗試使用配合Gumbel-Softmax的GAN進行長度固定為12的 Context-free grammar 序列生成,可見GAN的訓練并沒有崩塌,在少數樣例上也得到了還算逼真的效果。
所以,對于GAN進行直接改進用于文本生成,雖說是取得了一定的成效,但距離理想的狀態仍然道阻且長,有沒有更好的辦法呢?當然!
4. RL在GAN文本生成中所扮演的作用
4.1. 關于Reinforcement Learning的閑聊閑扯
強化學習(Reinforcement Learning,RL)由于其前衛的學習方式,本不如監督學習那么方便被全自動化地實現,并且在很多現實應用中學習周期太長,一直沒有成為萬眾矚目的焦點,直到圍棋狗的出現,才吸引了眾多人的眼球。
RL通常是一個馬爾科夫決策過程,在各個狀態??下執行某個動作??都將獲得獎勵(或者是"負獎勵"——懲罰)??,而將從頭到尾所有的動作連在一起就稱為一個“策略”或“策略路徑”??,強化學習的目標就是找出能夠獲得最多獎勵的最優策略:
為了達到這個目標,強化學習機可以在各個狀態嘗試各種可能的動作,并通過環境(大多數是人類)反饋的獎勵或者懲罰,評估并找出能夠最大化期望獎勵?的策略。
其實也有人將RL應用于對話生成的訓練當中[16],因為對話生成任務本身非常符合強化學習的運行機理(讓人類滿意,拿獎勵)。設,根據輸入句子??,返回的回答??從人類得到的獎勵記為??,而Encoder-Decoder對話模型服從的參數被統一記為??,則基于RL的目標函數說白了就是最大化生成對話的期望獎勵,其中??表示在參數??下,一組對話??出現的概率。
既然是一個最優化的問題,很直接地便想到使用基于梯度(Gradient)的優化方法解決。當然,在強化學習中,我們要得到的是最優策略??,此過程便在強化學習領域常聽到的 Policy Gradient。我們把等式右邊??中的項單獨記為??,它表示對話模型找到最優參數時所得到的獎勵期望。在實做時,設某句話的應答有$N$種可能性,則每組對話??出現的概率可視為服從均勻分布,故還可以進行如下變形:
在優化過程中,對話模型的權重??更新如下,??為所獲獎勵的變化梯度,
借助復合函數的求導法則,繼續推導獎勵的變化梯度,
這樣一來,梯度優化的重心就轉化到了生成對話的概率上來,也就是說,通過對參數??進行更新,獎勵會使模型趨于將優質對話的出現概率提高,而懲罰則會讓模型趨于將劣質對話的出現概率降低。
自AlphaGo使得強化學習猛然進入大眾視野以來,大部分對于強化學習的理論研究都將游戲作為主要實驗平臺,這一點不無道理,強化學習理論上的推導看似邏輯通順,但其最大的弱點在于,基于人工評判的獎勵??的獲得,讓實驗人員守在電腦前對模型吐出來的結果不停地打分看來是不現實的,游戲系統恰恰能會給出正確客觀的打分(輸/贏 或 游戲Score)。基于RL的對話生成同樣會面對這個問題,研究人員采用了類似AlphaGo的實現方式(AI棋手對弈)——同時運行兩個機器人,讓它們自己互相對話,同時,使用預訓練(pre-trained)好的“打分器”給出每組對話的獎勵得分??,關于這個預訓練的“打分器”??,可以根據實際的應用和需求自己DIY。?
稍微感受一下RL ChatBot的效果:
4.2. SeqGAN 和 Conditional SeqGAN
前面說了這么多,終于迎來到了高潮部分:RL + GAN for Text Generation,SeqGAN[17]站在前人RL Text Generation的肩膀上,可以說是GAN for Text Generation中的代表作。上面雖然花了大量篇幅講述RL ChatBot的種種機理,其實都是為了它來做鋪墊。試想我們使用GAN中的判別器D作為強化學習中獎勵??的來源,假設需要生成長度為T的文本序列,則對于生成文本的獎勵值??計算可以轉化為如下形式:
這里要說明幾點,假設需要生成的序列總長度為??,??是指先前已經生成的部分序列(在RL中可視為當前的狀態),通過蒙特卡洛搜索得到??種后續的序列,盡管文本生成依舊是逐詞尋找期望獎勵最大的Action(下一個詞),判別器D還是以整句為單位對生成的序列給出得分??。
在新一代的判別器??訓練之前,生成器??根據當前判別器??返回的得分不斷優化自己:
直到生成器G生成的文本足以亂真的時候,就是更新訓練新判別器的時候了。一般來說,判別器D對生成序列打出的得分既是其判斷該序列為真實樣本的概率值,按照原版GAN的理論,判別器D對于 real/fake 樣本給出的鑒定結果均為??時,說明生成器G所生成的樣本足以亂真,那么倘若在上面的任務中,判別器屢屢對生成樣本打出接近甚至高出??的得分時,即說明判別器D需要再訓練了。在實做中為了方便,一般等待多輪生成器的訓練后,進行一次判別器的訓練。
SeqGAN的提出為GAN用于對話生成(Chatbot)完成了重要的鋪墊,同樣起到鋪墊作用的還有另外一個GAN在圖像生成領域的神奇應用——Conditional GAN[18~19],有條件的GAN,顧名思義就是根據一定的條件生成一定的東西,該工作根據輸入的文字描述作為條件,生成對應的圖像,比如:
對話生成可以理解為同樣的模式,上一句對話作為條件,下一句應答則為要生成的數據,唯一的不同是需要生成離散的文本數據,而這個問題,SeqGAN已經幫忙解決了。綜上,我自己給它起名:Conditional SeqGAN[20]。根據4.1節以及本節的推導,Conditional SeqGAN中的優化梯度可寫成:
不難看出,此式子與4.1節中的變化梯度僅一字之差,只是把“打分器”給出的獎勵得分??換成了鑒別器認為生成對話來自真人的概率得分??。看似差別很很小,實際上 RL + GAN 的文本生成技術與單純基于RL的文本生成技術有著本質的區別:在原本的強化學習對話生成中,雖然采用了AI互相對話,并設定了 jugle 進行打分,但這個 jugle 是預訓練好的,在對話模型的訓練過程當中將不再發生變化;RL + GAN 的文本生成乃至對話模型則不同,鑒別器D與生成器G的訓練更新將交替進行,此消彼長,故而給出獎勵得分的鑒別器D在這里是動態的(dynamic)。
RL+ GAN 利用強化學習中的??機制以及 Policy Gradient 等技術,巧妙地避開了GAN面對離散數據時梯度無法BP的難題,在使用強化學習的方法訓練生成器G的間隙,又采用對抗學習的原版方法訓練判別器D。 在Conditional SeqGAN對話模型的一些精選結果中,RL+ GAN 訓練得到的生成器時常能返回一些類似真人的逼真回答(我真有那么一絲絲接近“恐怖谷”的感受)。
??5. 一些細節 + 一些延伸
上文所述的,只是 RL + GAN 進行文本生成的基本原理,大家知道,GAN 在實際運行過程中任然存在諸多不確定因素,為了盡可能優化 GAN 文本生成的效果,而后發掘更多 GAN 在 NLP 領域的潛力,還有一些值得一提的細節。
5.1. Reward Baseline:獎勵值上的 Bias
在 4.2 節中提到,我們采用鑒別器 D 給予生成樣本的概率得分(屬于真實樣本的概率)作為獎勵 Reward,既然是概率值,應該意識到這些概率得分都是非負的,如此一來即便生成出再差的結果,鑒別器 D 也不會給出負 Reward 進行懲罰。從理論上來講,生成器的訓練會趨向于降低較小獎勵值樣本??出現的概率而提高較大獎勵值樣本??出現的概率,然而在實做時,由于采樣不全等不可控因素的存在,這樣不夠分明的獎懲區別將有可能使得生成器 G 的訓練變得偏頗。
實際上,在強化學習的對話生成模型當中,就已經出現了此類問題。解決的方法很簡單,我們設置一個獎勵值 Reward?的基準值 Baseline,每次計算獎勵值的時候,在后面減去這個基準值作為最終的 獎勵 or 懲罰 值,使得生成器 G 的生成結果每次得到的獎懲有正有負,顯得更加分明。記獎懲基準值為 b,則 4.1 節中優化梯度的計算公式修改為:
對應地,在 RL + GAN 的文本生成任務中,同樣在鑒別器 D 對各個生成樣本打出的概率得分上減去獎懲基準值 b,則 4.2 節中 SeqGAN 與 Conditional SeqGAN 期望獎勵值的優化梯度計算公式也分別修改為如下:
5.2. REGS:一人犯錯一人當
細心的讀者可以發現,在 SeqGAN 的獎勵優化梯度計算公式的推導中,由鑒別器 D 給予的生成樣本獎勵得分其實是順應序列文本的生成過程,逐詞產生的,可以看到之前的推導公式中顯示了對于 Partly 文本序列的階段性獎勵值求和再求平均。然而在起初的實驗中,根據最終推導的獎勵值優化梯度計算公式,鑒別器 D 被訓練為用于對整句生成結果進行評估打分,這樣的話,鑒別器 D 的打分對于生成序列中的每一個 token 都是同等的存在,要獎勵就一起獎勵(獎勵值可視為相同),要懲罰就一起懲罰,這種做法會導致一個后果,看下面的例子。
比如有這樣一個對話組(包含真實回答和生成回答):
question = ['你', '叫', '什么', '名字', '?']
real_answer = ['我', '叫', '張三', '。']
fake_answer = ['我', '不', '知道', '。']
很顯然,鑒別器 D 能夠輕易辨識后者回答是假的,必然會給出極低的獎勵值得分,但是仔細對比真 / 假兩個回答可以發現,第一個詞 “我” 其實和真實樣本的第一個詞是一樣的,而最后一個字符 “。” 其實也并無大礙,它們其實并沒有錯,真正錯誤的是 “不 ” 和 “知道 ” 這兩個詞,但很不幸,鑒別器判定 fake_answer 的整體回答是假的,原本無辜的詞項 “我 ” 和 “。” 也要跟著一起接受低分判定的懲罰。
讓我們回到 GAN + RL 對文本生成模型的優化原理,假設??是面對輸入上文??時生成對話下文??的概率,我們將它拆分成逐個單詞拼接的形式,每一個出現的詞匯都將收到之前 context 的影響。
在 4.1,4.2 節中提到,如果生成樣本??被鑒別器 D 打出低分(受到懲罰),生成器 G 將被訓練于降低產出此結果的概率。結合上面這條公式,倘若單獨將生成序列中的一部分前綴??拿出來與真實樣本中完全相同,豈不是也要接受整體低分而帶來的懲罰?
解決這一缺陷的直接方法就是把獎懲的判定粒度進一步細化到 word 或 character 級別,在文本逐詞生成的過程中對 partly 的生成結果進行打分。這種處理其實在 SeqGAN 的論文中 [17] 就已經實施了,拓展到 Conditional SeqGAN 中,優化梯度的計算公式應改寫為如下:
公式中,??是計算的關鍵,它代表鑒別器 D 在文本逐詞生成過程中獲得部分文本的情況下對于最終 reward 的估計,簡而言之就是每得到一個新的生成詞,就結合此前生成的前序文本估計最終 reward,并作為該生成詞單獨的 reward,SeqGAN 的論文中使用蒙特卡洛搜索 [21](Monte Carlo Search,MC search)的方法計算部分生成序列對于整體 reward 的估計值。而在 Conditional SeqGAN 的論文中,賦予了這種處理一個名字 —— Reward for Every Generation Step(REGS)。
5.3. MC Search & Discriminator for Partially Decoded Sequences:準度與速度的抉擇
上一節說到 SeqGAN 中使用 MC search 進行部分序列獎勵估計值??的計算,作為 REGS 操作的關鍵計算,其難處在于,我們并不能預知部分生成序列能給我們帶來的最終結果,就好像一場籃球比賽,可能半場結束比分領先,卻也不能妄言最終的比賽結果一樣。
既然如此,在只得到部分序列的情況下,?只得估計獲得,Monte Carlo Search[21] 就是其中一種估計方法,Monte Carlo Search 的思想極其簡單,假設我們已經擁有了部分生成的前綴??,我們使用當前的 Generator,強制固定這個前綴,并重復生成出 $M$ 個完整的序列(有點采樣實驗的意思),分別交給鑒別器 D 進行打分,這 M?個模擬樣本的平均獎勵得分即為部分序列??的獎勵估計值??。
當然,使用 MC search 的缺點也很明顯:每生成一個詞,就要進行 M?次生成采樣,非常耗時;還有一小點,每當我們計算較為后期的一些部分序列獎勵估計值的時候,總是會無法避免地再一次計算前面早期生成的項,這樣計算出來的??可能導致對于較前子序列(比如第一個詞)的過擬合。
另外一種方法提出于 Conditional SeqGAN 的論文,干脆訓練一個可以對部分已生成前綴進行打分的 new 鑒別器 D。將某真實樣本的??的全部前綴子序列(必須從第一個詞開始)集合記作??,同樣將某生成樣本 $X^-$ 的全部前綴子序列集合記作?,我們每次從這兩者中隨機挑選一個或若干個標定為 + 或 -?(與原序列相同),與原序列一同加入鑒別器 D 的訓練中,這樣訓練得到的 Discriminator 便增添了給前綴子序列打分的能力,直接使用這樣的 Discriminator 給前綴子序列打分即可獲得。這種方法的耗時比起使用 MC search 要少很多,但得損失一定的準度。
一句話總結兩種??的計算方法:一種是利用部分序列 YY 出完整序列來給鑒別器打分,而另一種則直接將部分序列加入鑒別器的訓練過程,得到可以為部分序列打分的鑒別器,一個較慢,另一個快卻損失準度,如何選擇就看大家了。
5.4. Teacher Forcing:給 Generator 一個榜樣
在開始講解 SeqGAN 中的 Teacher Forcing 之前,先幫助大家簡單了結一下 RNN 運行的兩種 mode:(1). Free-running mode;(2). Teacher-Forcing mode[22]。前者就是正常的 RNN 運行方式:上一個 state 的輸出就做為下一個 state 的輸入,這樣做時有風險的,因為在 RNN 訓練的早期,靠前的 state 中如果出現了極差的結果,那么后面的全部 state 都會受牽連,以至于最終結果非常不好也很難溯源到發生錯誤的源頭,而后者 Teacher-Forcing mode 的做法就是,每次不使用上一個 state 的輸出作為下一個 state 的輸入,而是直接使用 ground truth 的對應上一項作為下一個 state 的輸入。
就拿 Seq2Seq 模型來舉例,我們假設正輸出到第三項,準備生成第四項:
input = ['a', 'b', 'c', 'e', 'f', 'g', 'h']
output = ['o', 'p', 's', ...]
label = ['o', 'p', 'q', 'r', 's', 't', 'u']
Free-running mode 下的 decoder 會將第三項錯誤的輸出 output[2] = 's'(下標從 0 開始)作為下一個 state 的輸入,而在 Teacher-forcing mode 下,decoder 則會將正確樣本的第三項 ?label[2] = 'q' 作為下一個 state 的輸入。 當然這么做也有它的缺點,因為依賴標簽數據,在 training 的時候會有較好的效果,但是在 testing 的時候就不能得到 ground truth 的支持了。最好的結果是將 Free-running mode 的 behavior 訓練得盡可能接近于 Teacher-forcing mode,Professor Forcing[23] 使用 GAN 嘗試實現了這一目標。
當然,這些都是題外話,我們要回到 Teacher-Forcing mode 最初的 motivation:訓練(迭代)早期的 RNN 非常弱,幾乎不能給出好的生成結果(以至于破灌破摔,產生垃圾的 output 影響后面的 state),必須依靠 ground truth 強行扶著走,才能慢慢進入正軌。
SeqGAN 也存在這樣的問題,一開始的生成器 G 非常弱,即便是經過一定量的預訓練,也幾乎生成不出好的 Result,然后這些 bad result 給到鑒別器 D 必然只能返回很低的 Reward?(懲罰),生成器 G 的訓練只能根據鑒別器的打分來優化而無法得到 good example 的指導,永遠不知道什么是好的結果,結果必然是惡性循環。于是,有必要在 SeqGAN 訓練中給到生成器 G 真實樣本的指導,也就是告訴生成器:“什么樣的樣本才配得到高分 Reward??”
4.2 節中提到,生成器 G 和 判別器 D 的訓練時交替進行的,由于鑒別器返回的打分是判定輸入樣本為真的概率,我們可以隨機取出一部分真實的樣本對話組??
,然后直接設置他們的鑒別器獎勵值為 1?(或者其他任意定義的最高分),將它們加入生成器 G 的訓練過程中,這樣生成器就能知道何種樣本能得到最高的獎勵,從而一定程度上避免了 SeqGAN 的訓練過程由于一方的弱勢而發生崩塌。
或者也可以這樣:用訓練好的鑒別器 D 也為隨機抽樣的真實樣本打分,然后加入到生成器 G 的訓練過程中,不過,一定要確保鑒別器 D 已經得到充分訓練,至少給予任意真實樣本??的打分要高于 baseline 才行(獎勵值經過偏置處理后也必須為正)。
5.5. Actor-Critic:更廣義上的 GAN?
在 DeepMind 的一篇半綜述式的文章 [24] 中,談到了強化學習中的另一個特殊的模型——Actor-Critic,并分析了這個模型與 GAN 之間的聯系。
首先我們回顧一下 GAN 中鑒別器 D 和生成器 G 優化時的目標函數:
再說說強化學習,在基于策略迭代的強化學習中,通過嘗試當前策略的 action,從環境獲得 Reward,然后更新策略。這種操作在游戲實驗環境中非常有效,因為游戲系統有封閉且清晰的環境,能夠穩定地根據各種接收到的 action 客觀地給出對應 Reward?,而在現實生活中,很多時候并沒有封閉清晰的環境,給定 action 應該得到什么樣的 Reward?本身也不準確,只能通過設定 DIY 的打分器來實現,顯然這么做很難完美 model 真實世界千變萬化的情況。
那么,能不能先學習出一個能夠準確評估出獎勵值的值函數??,盡可能地描述環境,對各種 action 返回較為公正的預期獎勵呢?也就是說 Reward?的估計模型本身也是被學習的,這就是 Actor-Critic,Actor 部分采用傳統的 Policy Gradient 優化策略 π?,Critic 部分借助 “Q-Learning” 學習出最優的 action-value 值函數,聽起來有沒有點像 GAN 的模式?來看看它的目標函數,其中??指任意一中 Divergence,值域非負當且僅當兩個分布相同時取值為零即可(比如,KL-divergence, JS-divergence 等等):
文中將 GANs 模型比作一種特殊形式的 Actor-Critic,并比較了兩者各自的特點以及后續的改進技術在兩者上的適配情況。試想一下,既然強化學習技術幫助 GAN 解決了在離散型數據上的梯度傳播問題,那么同為強化學習的 Actor-Critic 也為對抗式文本生成提供了另外一種可能。
5.6. IRGAN:兩個檢索模型的對抗
IRGAN[25] 這篇工作發表于 2017 年的 SIGIR,從作者的陣容來看就注定不是一篇平凡的作品,其中就包含 SeqGAN 的原班人馬,作者將生成對抗網絡的思想應用于信息檢索領域,卻又不拘泥于傳統 GAN 的經典 Framework,而是利用了 IR 領域原本就存在的兩種不同路數的 model:生成式 IR 模型 和 判別式 IR 模型。
生成式 IR 模型目標是產生一個 query →?document 的關聯度分布,利用這個分布對每個輸入的 query 返回相關的檢索結果;而判別式 IR 模型看上去更像是一個二類分類器,它的目標是盡可能地區分有關聯查詢對和無關聯查詢對,對于給定的查詢對,判別式 IR 模型給出該查詢對中的兩項的關聯程度。
光從兩個模型簡單的介紹來看就能絲絲感覺到它們之間特殊的聯系,兩種風格迥異的 IR 模型在 GAN 的思想中 “有緣地” 走到了對立面,我們將生成式 IR 模型記作:??,將判別式 IR 模型記作:??,于是整個 IRGAN 的目標函數為:
在 IRGAN 中,鑒別器 D 定義為判別式 IR 模型的邏輯回歸:
于是鑒別器 D 的目標函數進一步寫為:
相對地,生成器 G 就直接輸出以 query 為 condition 答案池中所有 document 與該 query 的關聯分布,不幸地,我們必須將通過這個關聯分布,過濾出當前認為最相關的 document 答案,才能作為鑒別器 D 的輸入來判定此時此刻檢索結果的質量,原本連續型的分布經過這一步的折騰又變成離散型的數據了,還好, 我們有強化學習,設??,則生成器 G 的目標函數被寫成:
也就是最大化鑒別器 D 給出的獎勵,而這個獎勵值主要來源于檢索結果形成的查詢對??在判別式 IR 模型中被認為確實有關聯的概率之和。將求和符號內的項記作:??,按照 Policy Gradient 的方式進行梯度優化,并使用 4.1 節中的推導方法描述??的優化梯度,在實做時為了方便,采樣 k 個當前生成式 IR 模型給出的查詢結果求近似。
當然,也不能忘了我們的 baseline—— b?,文中設置 baseline 為當前查詢結果的平均期望 Reward?。
上述是針對 Pointwise 情形的 IR 任務,不同于 Pointwise 情形著重于得到直接的檢索結果,Pairwise 情形的 IR 把更多精力放在了 ranking 上,其返回結果??中全是非對稱二元對,其中??比??與當前的查詢項關聯性更高。IRGAN 也可以擴展到 Pairwise 的情形,原則是:“一切從減”。 鑒別器函數將改寫為:
而假設生成器 G 是一個 softmax 函數,則 Pairwise 情形下的變形和簡化推導如下:
IRGAN 在 Pairwise 情形下的總目標函數如下,其中, o?表示真實的非對稱二元組,而 o'?則表示生成式 IR 模型生成的二元組:
IRGAN 的一大特點是,對抗 model 中的兩個組件各自都是一種 IR 模型,所以經過對抗訓練之后,不管拿出來哪個,都有希望突破原先的瓶頸。作者還關于 IRGAN 的訓練目標是否符合納什均衡做了一些討論,盡管在真實檢索的應用中很難獲得所謂的真實關聯分布,但作者認為不管是觀察到的關聯樣本還是未觀察到的關聯樣本,判別 IR 模型的輸出總是和生成 IR 模型的對應輸出存在著正相關的作用力,于是也孕育而生了文中那個關于浮力和拖拽重物最終達到漂浮平衡狀態的略顯晦澀的比喻。
??結語
這一領域的發展之迅速,也許在我完成這篇 Blog 的時候,又有一批工作爭先恐后的冒出來了,但最終的結局肯定不止于此,我也不怎么擅長結尾,也許要等待 GAN 來為我,為我們帶來一個奇妙的結局。
總結
以上是生活随笔為你收集整理的强化学习在生成对抗网络文本生成中扮演的角色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【期外】 (一)关于LSH :局部敏感哈
- 下一篇: Base理论介绍