天天看點

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

1、基礎:文本生成模型的标準架構

文本生成(Text Generation)通過 機器學習 + 自然語言處理 技術嘗試使AI具有人類水準的語言表達能力,從一定程度上能夠反應現今自然語言處理的發展水準。

下面用極簡的描述介紹一下文本生成技術的大體架構,具體可以參閱各種網絡文獻(比如:CSDN經典Blog“好玩的文本生成”[1]),論文等。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

文本生成按任務來說,比較流行的有:機器翻譯、句子生成、對話生成等,本文着重讨論後面兩種。

基于深度學習的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 程序。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

這便是衆所周知的“Seq2Seq”架構的基礎形态,為了提高基礎Seq2Seq模型的效果,直接從解碼器的角度有諸如 Beam-SearchDecoder[2]、Attention mechanism Decoder[3](配置注意力機制的解碼器)等改進,而從神經網絡的結構入手,也有諸如Pyramidal RNN[4](金字塔型RNN)、Hierarchical RNN Encoder[5](分層循環網絡編碼器)等改進。

改進不計其數,不一一詳舉,但不管如何,預測結果的輸出始終都是一個次元為詞庫大小的機率分布,需要再甄選出最大值的Index,到詞庫Vocab中檢索得出對應的單詞(or 字元)。

2、問題:GAN為何不能直接用于文本生成

2.1GAN基礎知識

GAN對于大家而言想必已經脍炙人口了,這裡做一些簡單的複習。

GAN從結構上來講巧妙而簡單(盡管有與其他經典工作Idea相似的争議[6~7]),也非常易于了解,整個模型隻有兩個部件:1.生成器G;2.判别器D。

生成模型其實由來已久,是以生成器也并不新鮮,生成器G的目标是生成出最接近于真實樣本的假樣本分布,在以前沒有判别器D的時候,生成器的訓練依靠每輪疊代傳回目前生成樣本與真實樣本的差異(把這個差異轉化成loss)來進行參數優化,而判别器D的出現改變了這一點,判别器D的目标是盡可能準确地辨識生成樣本和真實樣本,而這時生成器G的訓練目标就由最小化“生成-真實樣本差異”變為了盡量弱化判别器D的辨識能力(這時候訓練的目标函數中包含了判别器D的輸出)。

GAN模型的大體架構如下圖所示:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

我們再來簡單複習一下GAN當中的一些重要公式,這一步對後文的闡述非常重要。

不管生成器G是什麼形狀、多麼深的一個神經網絡,我們暫且把它看成一個函數 G(\cdot) ,由它生成的樣本記作: p_g(x) ,相對地,真實樣本記作: p_{data}(x) 。

同樣,不管判别器D作為一個分類神經網絡,我們也可将其視為一個函數 D(\cdot) ,而這個函數的輸出即為一個标量,用于描述生成樣本 p_g(x) 與真實樣本 p_{data}(x) 之間的差距。

而GAN模型的整體優化目标函數是:

\arg\min_{G}\max_{D}=V(G,D)

其中函數 V(G,D) 如下:

V=\mathbb{E}_{x \sim p_{data}}[\log D(x)] + \mathbb{E}_{x \sim p_g}[\log (1-D(x))]

根據連續函數的期望計算方法,上式變形為:

V=\int_{x}\left[ p_{data}(x) \log D(x) + p_g(x) log(1-D(x))\right]

先求外層的 \arg\max_{D}V(G,D) 的話,對積分符号内的多項式求導取極值得到目标D:

D^*(x)=\frac{p_{data}(x)}{p_{data}(x) + p_g(x)}

代回原式:

\begin{aligned} V(G,D^*) &= \int_x p_{data}(x)\log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} + \int_x p_g \log \frac{p_g(x)}{p_{data}(x) + p_g(x)}\\ &= -\log 4+ KL\left( p_{data}(x) \Arrowvert \frac{p_{data}(x) + p_g(x)}{2} \right) + KL\left( p_g(x) \Arrowvert \frac{p_{data}(x) + p_g(x)}{2} \right)\\ &= -\log 4 + 2\cdot JSD(p_{data}(x) \Arrowvert p_g(x)) \end{aligned}

是以,當生成器G能生成出與真實樣本一樣分布的樣本,那麼ok,就達到最好的結果,然後大家注意一點,這裡生成樣本的loss衡量方法是JS散度。

2.2GAN面對離散型資料時的困境(啥是離散型資料?)

GAN的作者早在原版論文[8]時就提及,GAN隻适用于連續型資料的生成,對于離散型資料效果不佳(使得一時風頭無兩的GAN在NLP領域一直無法超越生成模型的另一大佬VAE[9])。

文本資料就是最典型的一種離散型資料,這裡所謂的離散,并不是指:文本由一個詞一個詞組成,或是說當今最流行的文本生成架構,諸如Seq2Seq,也都是逐詞(或者逐個Character)生成的。

因為哪怕利用非循環網路進行一次成型的Sentences生成,也無法避免“資料離散”帶來的後果,抱歉都怪我年輕時的無知,離散型資料的真正含義,我們要從連續性資料說起。 

圖像資料就是典型的連續性資料,故而GAN能夠直接生成出逼真的畫面來。我們首先來看看圖像資料的形狀:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

圖像資料在計算機中均被表示為矩陣,若是黑白圖像矩陣中元素的值即為像素值或者灰階值(抱歉外行了,我不是做圖像的),就算是彩色圖像,圖像張量即被多加了一階用于表示RGB通道,圖像矩陣中的元素是可微分的,其數值直接反映出圖像本身的明暗,色彩等因素,很多這樣的像素點組合在一起,就形成了圖像,也就是說,從圖像矩陣到圖像,不需要“采樣”(Sampling),

有一個更形象的例子:畫圖軟體中的調色闆,如下圖,你在調色闆上随便滑動一下,大緻感受一下圖像資料可微分的特性。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

文本資料可就不一樣了,做文本的同學都知道,假設我們的詞庫(Vocabulary)大小為1000,那麼每當我們預測下一個出現的詞時,理應得到的是一個One-hot的Vector,這個Vector中有999項是0,隻有一項是1,而這一項就代表詞庫中的某個詞。然而,真正的隔閡在于,我們每次用無論什麼分類器或者神經網絡得到的直接結果,都是一個1000維的機率分布,而非正正好好是一個One-hot的Vector,即便是使用softmax作為輸出,頂多也隻能得到某一維上特别大,其餘維上特别小的情況,而将這種輸出結果過渡到One-hot vector 然後再從詞庫中查詢出對應index的詞,這樣的操作被稱為“Sampling”,通常,我們找出值最大的那一項設其為1,其餘為0。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

目前神經網絡的優化方法大多數都是基于梯度的(Gradient based),很多文獻這麼說:GAN在面對離散型資料時,判别網絡無法将梯度Back propagation(BP)給生成網絡。這句話當時讓我等聽的雲裡霧裡,不妨換一個角度了解,我們知道,基于梯度的優化方法大緻意思是這樣的,微調網絡中的參數(weight),看看最終輸出的結果有沒有變得好一點,有沒有達到最好的情形。

但是判别器D得到的是Sampling之後的結果,也就是說,我們經過參數微調之後,即便softmax的輸出優化了一點點,比如上圖的例子中,正确結果本應是第三項,其output的倒數第二項從 0.85 變為了 0.65 ,第三項從 0.12 變為了 0.32 ,但是經過Sampling之後,生成器G輸出的結果還是跟以前一模一樣,并再次将相同的答案重複輸入給判别器D,這樣判别器D給出的評價就會毫無意義,生成器G的訓練也會失去方向。

有人說,與其這樣不如每次給判别器D直接吃Sampling之前的結果,也就是softamx輸出的那個distribution,同樣,這麼做也有很大的問題。我們回到GAN的基本原理,判别器D的初衷,它經曆訓練就是為了準确辨識生成樣本和真實樣本的,那麼生成樣本是一個充滿了float小數的分布,而真實樣本是一個One-hot Vector,判别器D很容易“作弊”,它根本不用去判斷生成分布是否與真實分布更加接近,它隻需要識别出給到的分布是不是除了一項是 1 ,其餘都是 0 就可以了。是以無論Sampling之前的分布無論多麼接近于真實的One-hot Vector,隻要它依然是一個機率分布,都可以被判别器D輕易地檢測出來。

上面所說的原因當然也有數學上的解釋,還記得在2.1節的時候,請大家注意生成樣本的loss衡量标準是什麼嗎?沒錯,就是JS散度, JS-divergence 在應用上其實是有弱點的(參考文獻[10]),它隻能被正常地應用于互有重疊(Overlap)的兩個分布,當面對互不重疊的兩個分布 P 和 Q ,其JS散度:

JSD(P \Arrowvert Q) \equiv \log{2}

大家再想想,除非softmax能output出與真實樣本 exactly 相同的獨熱分布(One-hot Vector)(當然這是不可能的),還有什麼能讓生成樣本的分布與真實樣本的分布發生重疊呢?于是,生成器無論怎麼做基于Gradient 的優化,輸出分布與真實分布的 JSD(p_{data} \Arrowvert p_g) 始終是 \log{2} ,生成器G的訓練于是失去了意義。

3、過渡方案:對于GAN的直接改進用于文本生成

為了解決GAN在面對離散資料時的困境,最直接的想法是對GAN内部的一些計算方式進行微調,這種對于GAN内部計算方式的直接改進也顯示出了一定的效果,為後面将GAN直接、流暢地應用于文本等離散型資料的生成帶來了希望。 接下來簡單介紹相關的兩篇工作[11~12]。

3.1Wasserstein-divergence,額外的禮物

Wasserstein GAN[13](簡稱WGAN),其影響力似乎達到了原版GAN的高度,在國内也有一篇與其影響力相當的博文——“令人拍案叫絕的Wasserstein GAN”[10],不過在看這篇論文之前,還要推薦另外一篇論文“f-GAN”[14],這篇論文利用芬切爾共轭(Fenchel Conjugate)的性質證明了任何 f-Divergence 都可以作為原先GAN中 KL-Divergence (或者說 JS-Divergence )的替代方案。 f-GAN 的定義如下:

D_f(P \Arrowvert Q) = \int_{x} q(x) f\left( \frac{p(x)}{q(x)} \right) dx

公式中的 f(\cdot) 被稱為 f函數,它必須滿足以下要求:

\left\{ \begin{aligned} & f \ is \ convex \quad (凸函數) \\ & f(1) = 0 \end{aligned} \right.

不難看出, KL-Divergence 也是 f-Divergence 的一種,f-GAN 原文提供了數十種各式各樣的 f-Divergence ,為GAN接下來沿此方向上的改進帶來了無限可能。

Wasserstein GAN 對GAN的改進也是從替換 KL-Divergence 這個角度對GAN進行改進,其詳細的妙處大可參看文獻[10,13],總的來說,WGAN采用了一種奇特的 Divergence—— “推土機-Divergence”, Wasserstein-Divergence 将兩個分布看作兩堆土,Divergence 計算的就是為了将兩個土堆推成一樣的形狀所需要泥土搬運總距離。如下圖:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

使用 Wasserstein-Divergence 訓練的GAN相比原版的GAN有更加明顯的“演化”過程,換句話說就是,WGAN的訓練相比與GAN更加能突顯從“不好”到“不錯”的循序漸經的過程。

從上面的2.2節,我們知道JS散度在面對兩個分布不相重疊的情況時,将發生“異常”,計算結果均為 \log{2} ,GAN的訓練過程也是這樣,也許在很長一段訓練的過程中,JS散度的傳回值都是 \log{2} ,隻有到達某個臨界點時,才會突然優化為接近最優值的結果,而Wasserstein散度的傳回值則要平滑很多。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

既然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關于文本生成的生成結果顯然是崩塌的。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

3.2Gumbel-softmax,模拟Sampling的softmax

另外一篇來自華威大學+劍橋大學的工作把改進GAN用于離散資料生成的重心放在了修改softmax的output這方面。如2.2節所述,Sampling 操作中的 \arg\max(\cdot) 函數将連續的softmax輸出抽取成離散的成型輸出,進而導緻Sampling的最終output是不可微的,形成GAN對于離散資料生成的最大攔路虎,既然不用Sampling的時候,output與真實分布不重疊,導緻JS散度停留于固定值 \log{2} ,如果用了Sampling的話,離散資料的正常輸出又造成了梯度 Back-Propagation 上天然的隔閡。

既然如此,論文的作者尋找了一種可以高仿出Sampling效果的特殊softmax,使得softmax的直接輸出既可以保證與真實分布的重疊,又能避免Sampling操作對于其可微特征的破壞。它就是“耿貝爾-softmax”(Gumbel-Softmax),Gumbel-Softmax早先已經被應用于離散标簽的再分布化[15](Categorical Reparameterization),在原先的Sampling操作中, \arg\max(\cdot) 函數将普通softmax的輸出轉化成One-hot Vector:

\mathrm{y} = one\_hot\left( \arg\max \left( softmax(\mathrm{h}) \right) \right)

而Gumbel-Softmax略去了 one\_hot(\cdot) + \arg\max(\cdot) 這一步,能夠直接給出近似Sampling操作的輸出:

\mathrm{y} = softmax \left( 1 / \tau (\mathrm{h} + \mathrm{g}) \right)

精髓在于這其中的“逆溫參數” \tau ,當 \tau \longrightarrow 0 時,上式所輸出的分布等同于 one\_hot(\cdot) + \arg\max(\cdot) 給出的 Sampling 分布,而當 \tau \longrightarrow \infty 時,上式的輸出就接近于均勻分布,而 \tau 則作為這個特殊softmax中的一個超參數,給予一個較大的初始值,通過訓練學習逐漸變小,向 0 逼近,這一部分詳細内容可以閱讀文獻[15]。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

論文的實驗僅僅嘗試使用配合Gumbel-Softmax的GAN進行長度固定為12的 Context-free grammar 序列生成,可見GAN的訓練并沒有崩塌,在少數樣例上也得到了還算逼真的效果。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

是以,對于GAN進行直接改進用于文本生成,雖說是取得了一定的成效,但距離理想的狀态仍然道阻且長,有沒有更好的辦法呢?當然!

4、RL在GAN文本生成中所扮演的作用

4.1關于Reinforcement Learning的閑聊閑扯

強化學習(Reinforcement Learning,RL)由于其前衛的學習方式,本不如監督學習那麼友善被全自動化地實作,并且在很多現實應用中學習周期太長,一直沒有成為萬衆矚目的焦點,直到圍棋狗的出現,才吸引了衆多人的眼球。

RL通常是一個馬爾科夫決策過程,在各個狀态 s_i 下執行某個動作 x_i 都将獲得獎勵(或者是"負獎勵"——懲罰) Reward(s_i, x_i) ,而将從頭到尾所有的動作連在一起就稱為一個“政策”或“政策路徑” \theta^\pi ,強化學習的目标就是找出能夠獲得最多獎勵的最優政策:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

為了達到這個目标,強化學習機可以在各個狀态嘗試各種可能的動作,并通過環境(大多數是人類)回報的獎勵或者懲罰,評估并找出能夠最大化 期望獎勵

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

的政策。

其實也有人将RL應用于對話生成的訓練當中[16],因為對話生成任務本身非常符合強化學習的運作機理(讓人類滿意,拿獎勵)。設,根據輸入句子 a ,傳回的回答 x 從人類得到的獎勵記為 R(a,x) ,而Encoder-Decoder對話模型服從的參數被統一記為 \theta ,則基于RL的目标函數說白了就是最大化生成對話的期望獎勵,其中 P_{\theta}\left( a, x \right) 表示在參數 \theta 下,一組對話 (a, x) 出現的機率。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力
引入秘密武器強化學習,發掘GAN在NLP領域的潛力

既然是一個最優化的問題,很直接地便想到使用基于梯度(Gradient)的優化方法解決。當然,在強化學習中,我們要得到的是最優政策 \theta_{best} ,此過程便在強化學習領域常聽到的 Policy Gradient。我們把等式右邊 \arg \max \limits_{\theta}(\cdot) 中的項單獨記為 \tilde{R_{\theta}} ,它表示對話模型找到最優參數時所得到的獎勵期望。在實做時,設某句話的應答有$N$種可能性,則每組對話 (a^i, x^i) 出現的機率可視為服從均勻分布,故還可以進行如下變形:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

在優化過程中,對話模型的權重 \theta 更新如下, \nabla \tilde{R_{\theta}} 為所獲獎勵的變化梯度,

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

借助複合函數的求導法則,繼續推導獎勵的變化梯度,

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

這樣一來,梯度優化的重心就轉化到了生成對話的機率上來,也就是說,通過對參數 \theta 進行更新,獎勵會使模型趨于将優質對話的出現機率提高,而懲罰則會讓模型趨于将劣質對話的出現機率降低。

自AlphaGo使得強化學習猛然進入大衆視野以來,大部分對于強化學習的理論研究都将遊戲作為主要實驗平台,這一點不無道理,強化學習理論上的推導看似邏輯通順,但其最大的弱點在于,基于人工評判的獎勵 Reward 的獲得,讓實驗人員守在電腦前對模型吐出來的結果不停地打分看來是不現實的,遊戲系統恰恰能會給出正确客觀的打分(輸/赢 或 遊戲Score)。基于RL的對話生成同樣會面對這個問題,研究人員采用了類似AlphaGo的實作方式(AI棋手對弈)——同時運作兩個機器人,讓它們自己互相對話,同時,使用預訓練(pre-trained)好的“打分器”給出每組對話的獎勵得分 R(a^i, x^i) ,關于這個預訓練的“打分器” R ,可以根據實際的應用和需求自己DIY。 R(a^i, x^i) = \lambda_1 R(是否通順) + \lambda_2 R(是否辭不達意) + \dots + \lambda_n R(是否總說重複的廢話)

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

稍微感受一下RL ChatBot的效果:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

4.2SeqGAN 和 Conditional SeqGAN

前面說了這麼多,終于迎來到了高潮部分:RL + GAN for Text Generation,SeqGAN[17]站在前人RL Text Generation的肩膀上,可以說是GAN for Text Generation中的代表作。上面雖然花了大量篇幅講述RL ChatBot的種種機理,其實都是為了它來做鋪墊。試想我們使用GAN中的判别器D作為強化學習中獎勵 Reward 的來源,假設需要生成長度為T的文本序列,則對于生成文本的獎勵值 \tilde{R_{\theta}} 計算可以轉化為如下形式:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

這裡要說明幾點,假設需要生成的序列總長度為 T , s_{1:t-1} 是指先前已經生成的部分序列(在RL中可視為目前的狀态),通過蒙特卡洛搜尋得到 N 種後續的序列,盡管文本生成依舊是逐詞尋找期望獎勵最大的Action(下一個詞),判别器D還是以整句為機關對生成的序列給出得分 Reward 。

在新一代的判别器 D_{next} 訓練之前,生成器 G 根據目前判别器 D 傳回的得分不斷優化自己:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

直到生成器G生成的文本足以亂真的時候,就是更新訓練新判别器的時候了。一般來說,判别器D對生成序列打出的得分既是其判斷該序列為真實樣本的機率值,按照原版GAN的理論,判别器D對于 real/fake 樣本給出的鑒定結果均為 0.5 時,說明生成器G所生成的樣本足以亂真,那麼倘若在上面的任務中,判别器屢屢對生成樣本打出接近甚至高出 0.5 的得分時,即說明判别器D需要再訓練了。在實做中為了友善,一般等待多輪生成器的訓練後,進行一次判别器的訓練。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

SeqGAN的提出為GAN用于對話生成(Chatbot)完成了重要的鋪墊,同樣起到鋪墊作用的還有另外一個GAN在圖像生成領域的神奇應用——Conditional GAN[18~19],有條件的GAN,顧名思義就是根據一定的條件生成一定的東西,該工作根據輸入的文字描述作為條件,生成對應的圖像,比如:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

對話生成可以了解為同樣的模式,上一句對話作為條件,下一句應答則為要生成的資料,唯一的不同是需要生成離散的文本資料,而這個問題,SeqGAN已經幫忙解決了。綜上,我自己給它起名:Conditional SeqGAN[20]。根據4.1節以及本節的推導,Conditional SeqGAN中的優化梯度可寫成:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

不難看出,此式子與4.1節中的變化梯度僅一字之差,隻是把“打分器”給出的獎勵得分 R(a^i, x^i) 換成了鑒别器認為生成對話來自真人的機率得分 D\left(a^i, x^i \right) 。看似差别很很小,實際上 RL + GAN 的文本生成技術與單純基于RL的文本生成技術有着本質的差別:在原本的強化學習對話生成中,雖然采用了AI互相對話,并設定了 jugle 進行打分,但這個 jugle 是預訓練好的,在對話模型的訓練過程當中将不再發生變化;RL + GAN 的文本生成乃至對話模型則不同,鑒别器D與生成器G的訓練更新将交替進行,此消彼長,故而給出獎勵得分的鑒别器D在這裡是動态的(dynamic)。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

RL+ GAN 利用強化學習中的 Reward 機制以及 Policy Gradient 等技術,巧妙地避開了GAN面對離散資料時梯度無法BP的難題,在使用強化學習的方法訓練生成器G的間隙,又采用對抗學習的原版方法訓練判别器D。 在Conditional SeqGAN對話模型的一些精選結果中,RL+ GAN 訓練得到的生成器時常能傳回一些類似真人的逼真回答(我真有那麼一絲絲接近“恐怖谷”的感受)。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

5、一些細節 + 一些延伸

上文所述的,隻是 RL + GAN 進行文本生成的基本原理,大家知道,GAN在實際運作過程中任然存在諸多不确定因素,為了盡可能優化 GAN 文本生成的效果,而後發掘更多GAN在NLP領域的潛力,還有一些值得一提的細節。

5.1Reward Baseline:獎勵值上的 Bias

在4.2節中提到,我們采用鑒别器D給予生成樣本 x^i 的機率得分( x^i 屬于真實樣本的機率)作為獎勵 Reward ,既然是機率值,應該意識到這些機率得分都是非負的,如此一來即便生成出再差的結果,鑒别器D也不會給出負 Reward 進行懲罰。從理論上來講,生成器的訓練會趨向于降低較小獎勵值樣本 x^{low} 出現的機率而提高較大獎勵值樣本 x^{high} 出現的機率,然而在實做時,由于采樣不全等不可控因素的存在,這樣不夠分明的獎懲差別将有可能使得生成器G的訓練變得偏頗。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

實際上,在強化學習的對話生成模型當中,就已經出現了此類問題。解決的方法很簡單,我們設定一個獎勵值 Reward 的基準值Baseline,每次計算獎勵值的時候,在後面減去這個基準值作為最終的 獎勵 or 懲罰 值,使得生成器G的生成結果每次得到的獎懲有正有負,顯得更加分明。記獎懲基準值為 b ,則4.1節中優化梯度的計算公式修改為:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

對應地,在 RL + GAN 的文本生成任務中,同樣在鑒别器D對各個生成樣本打出的機率得分上減去獎懲基準值 b ,則4.2節中 SeqGAN 與 Conditional SeqGAN 期望獎勵值的優化梯度計算公式也分别修改為如下:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

5.2REGS:一人犯錯一人當

細心的讀者可以發現,在SeqGAN的獎勵優化梯度計算公式的推導中,由鑒别器D給予的生成樣本獎勵得分其實是順應序列文本的生成過程,逐詞産生的,可以看到之前的推導公式中顯示了對于Partly文本序列的階段性獎勵值求和再求平均。然而在起初的實驗中,根據最終推導的獎勵值優化梯度計算公式,鑒别器D被訓練為用于對整句生成結果進行評估打分,這樣的話,鑒别器D的打分對于生成序列中的每一個token都是同等的存在,要獎勵就一起獎勵(獎勵值可視為相同),要懲罰就一起懲罰,這種做法會導緻一個後果,看下面的例子。

比如有這樣一個對話組(包含真實回答和生成回答):

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

很顯然,鑒别器D能夠輕易辨識後者回答是假的,必然會給出極低的獎勵值得分,但是仔細對比真/假兩個回答可以發現,第一個詞 “我 ” 其實和真實樣本的第一個詞是一樣的,而最後一個字元 “。”其實也并無大礙,它們其實并沒有錯,真正錯誤的是 “不 ” 和 “知道 ” 這兩個詞,但很不幸,鑒别器判定 fake_answer 的整體回答是假的,原本無辜的詞項 “我 ” 和 “。” 也要跟着一起接受低分判定的懲罰。

讓我們回到 GAN + RL 對文本生成模型的優化原理,假設 P_{\theta}\left(x^i \mid a^i \right) 是面對輸入上文 a^i 時生成對話下文 x^i 的機率,我們将它拆分成逐個單詞拼接的形式,每一個出現的詞彙都将收到之前context的影響。

P_{\theta}\left(x^i \mid a^i \right) = P_{\theta}\left( x^i[1] \bracevert a^i \right) + P_{\theta}\left( x^i[2] \bracevert a^i, x^i[1] \right) + \dots + P_{\theta}\left( x^i[T] \bracevert a^i, x^i[1:T-1] \right)

在4.1,4.2節中提到,如果生成樣本 x^i 被鑒别器D打出低分(受到懲罰),生成器G将被訓練于降低産出此結果的機率。結合上面這條公式,倘若單獨将生成序列中的一部分字首 x^i[1:t] 拿出來與真實樣本中完全相同,豈不是也要接受整體低分而帶來的懲罰?

解決這一缺陷的直接方法就是把獎懲的判定粒度進一步細化到 word 或 character 級别,在文本逐詞生成的過程中對partly的生成結果進行打分。這種處理其實在SeqGAN的論文中[17]就已經實施了,拓展到Conditional SeqGAN中,優化梯度的計算公式應改寫為如下:

\nabla\tilde{R_{\theta}} = \frac{1}{N} \sum\limits_{i=1}^{N} \sum\limits_{t=1}^{T} \left(D_e\left(a^i, x^i[1:t] \right) - b\right) \nabla\log P_{\theta}\left(x^i[t] \mid a^i, x^i[1:t-1] \right)

公式中, D_e\left(a^i, x^i[1:t] \right) 是計算的關鍵,它代表鑒别器D在文本逐詞生成過程中獲得部分文本的情況下對于最終reward的估計,簡而言之就是每得到一個新的生成詞,就結合此前生成的前序文本估計最終reward,并作為該生成詞單獨的reward,SeqGAN的論文中使用蒙特卡洛搜尋[21](Monte Carlo Search,MC search)的方法計算部分生成序列對于整體reward的估計值。而在Conditional SeqGAN的論文中,賦予了這種處理一個名字 —— Reward for Every Generation Step(REGS)。

5.3MC Search & Discriminator for Partially Decoded Sequences:準度與速度的抉擇

上一節說到SeqGAN中使用MC search進行部分序列獎勵估計值 D_e\left(a^i, x^i[1:t] \right) 的計算,作為REGS操作的關鍵計算,其難處在于,我們并不能預知部分生成序列能給我們帶來的最終結果,就好像一場籃球比賽,可能半場結束比分領先,卻也不能妄言最終的比賽結果一樣。

既然如此,在隻得到部分序列的情況下, D_e\left(a^i, x^i[1:t] \right) 隻得估計獲得,Monte Carlo Search[21]就是其中一種估計方法,Monte Carlo Search的思想極其簡單,假設我們已經擁有了部分生成的字首 x^i[1:t] ,我們使用目前的Generator,強制固定這個字首,并重複生成出$M$個完整的序列(有點采樣實驗的意思),分别交給鑒别器D進行打分,這 M 個模拟樣本的平均獎勵得分即為部分序列 x^i[1:t] 的獎勵估計值 D_e\left(a^i, x^i[1:t] \right) 。

D_e\left(a^i, x^i[1:t] \right) = \frac{1}{M} \sum\limits_{p=1}^{M}\left(D\left(a^i, x^i[1:t] + x_r^p[t+1:T] \right) \right)

當然,使用MC search的缺點也很明顯:每生成一個詞,就要進行 M 次生成采樣,非常耗時;還有一小點,每當我們計算較為後期的一些部分序列獎勵估計值的時候,總是會無法避免地再一次計算前面早期生成的項,這樣計算出來的 D_e\left(a^i, x^i[1:t] \right) 可能導緻對于較前子序列(比如第一個詞)的過拟合。

另外一種方法提出于Conditional SeqGAN的論文,幹脆訓練一個可以對部分已生成字首進行打分的new鑒别器D。将某真實樣本的 X^+ 的全部字首子序列(必須從第一個詞開始)集合記作 \left\{x^+[1:t] \right\}_{t=1}^{T_{X^+}} ,同樣将某生成樣本$X^-$的全部字首子序列集合記作 \left\{x^-[1:t] \right\}_{t=1}^{T_{X^-}} ,我們每次從這兩者中随機挑選一個或若幹個标定為 + 或 - (與原序列相同),與原序列一同加入鑒别器D的訓練中,這樣訓練得到的Discriminator便增添了給字首子序列打分的能力,直接使用這樣的Discriminator給字首子序列打分即可獲得 D_e\left(a^i, x^i[1:t] \right) 。這種方法的耗時比起使用MC search要少很多,但得損失一定的準度。

一句話總結兩種 D_e\left(a^i, x^i[1:t] \right) 的計算方法:一種是利用部分序列YY出完整序列來給鑒别器打分,而另一種則直接将部分序列加入鑒别器的訓練過程,得到可以為部分序列打分的鑒别器,一個較慢,另一個快卻損失準度,如何選擇就看大家了。

5.4Teacher 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的輸入。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

就拿Seq2Seq模型來舉例,我們假設正輸出到第三項,準備生成第四項:

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

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的訓練時交替進行的,由于鑒别器傳回的打分是判定輸入樣本為真的機率,我們可以随機取出一部分真實的樣本對話組 \mathrm{Real} = \left\{ \left(a_r^0, x_r^0 \right), \left(a_r^1, x_r^1 \right), \cdots, \left(a_r^n, x_r^n \right) \right\} ,然後直接設定他們的鑒别器獎勵值為 1 (或者其他任意定義的最高分),将它們加入生成器G的訓練過程中,這樣生成器就能知道何種樣本能得到最高的獎勵,進而一定程度上避免了SeqGAN的訓練過程由于一方的弱勢而發生崩塌。

D\left(a_r^i, x_r^i\right) = 1, \qquad \left(\left(a_r^i, x_r^i\right) \in \mathrm{Real} \right)

或者也可以這樣:用訓練好的鑒别器D也為随機抽樣的真實樣本打分,然後加入到生成器G的訓練過程中,不過,一定要確定鑒别器D已經得到充分訓練,至少給予任意真實樣本 \left(a_r^i, x_r^i \right) 的打分要高于baseline才行(獎勵值經過偏置處理後也必須為正)。

D\left(a_r^i, x_r^i\right) > b, \qquad \left(\left(a_r^i, x_r^i\right) \in \mathrm{Real} \right)

5.5Actor-Critic:更廣義上的GAN?

在DeepMind的一篇半綜述式的文章[24]中,談到了強化學習中的另一個特殊的模型——Actor-Critic,并分析了這個模型與GAN之間的聯系。

首先我們回顧一下GAN中鑒别器D和生成器G優化時的目标函數:

D^* = \arg\min_D -\mathbb{E}_{x \sim p_{data}}[\log D(x)] - \mathbb{E}_{z \sim \mathcal{N}\left(0, I\right)}[\log (1-D(G(z)))]

G^* = \arg\min_G \mathbb{E}_{z \sim \mathcal{N}\left(0, I\right)}[\log (1-D(G(z)))] = \arg\min_G -\mathbb{E}_{z \sim \mathcal{N}\left(0, I\right)}[\log (D(G(z)))]

再說說強化學習,在基于政策疊代的強化學習中,通過嘗試目前政策的action,從環境獲得 Reward ,然後更新政策。這種操作在遊戲實驗環境中非常有效,因為遊戲系統有封閉且清晰的環境,能夠穩定地根據各種接收到的action客觀地給出對應 Reward ,而在現實生活中,很多時候并沒有封閉清晰的環境,給定action應該得到什麼樣的 Reward 本身也不準确,隻能通過設定DIY的打分器來實作,顯然這麼做很難完美model真實世界千變萬化的情況。

那麼,能不能先學習出一個能夠準确評估出獎勵值的值函數 Q^{\pi}(s,a) ,盡可能地描述環境,對各種action傳回較為公正的預期獎勵呢?也就是說 Reward 的估計模型本身也是被學習的,這就是Actor-Critic,Actor部分采用傳統的Policy Gradient優化政策 \pi ,Critic部分借助“Q-Learning”學習出最優的action-value值函數,聽起來有沒有點像GAN的模式?來看看它的目标函數,其中 \mathcal{D}\left(\cdot \Arrowvert \cdot\right) 指任意一中Divergence,值域非負當且僅當兩個分布相同時取值為零即可(比如,KL-divergence, JS-divergence 等等):

Q^{\pi} = \arg\min_Q \mathbb{E}_{s_t, a_t \sim \pi}\left[\mathcal{D}\left(\mathbb{E}_{s_{t+1}, r_t, a_{t+1}} \left[r_t + \gamma Q\left(s_{t+1}, a_{t+1} \right) \right] \Arrowvert Q(s_t, a_t) \right) \right]

{\pi}^{\ast} = \arg\max_{\pi} \mathbb{E}_{s_0 \sim p_0, a_0 \sim \pi}\left[Q^{\pi}\left(s_0, a_0 \right) \right] = \arg\min_{\pi} -\mathbb{E}_{s_0 \sim p_0, a_0 \sim \pi}\left[Q^{\pi}\left(s_0, a_0 \right) \right]

文中将GANs模型比作一種特殊形式的Actor-Critic,并比較了兩者各自的特點以及後續的改進技術在兩者上的适配情況。試想一下,既然強化學習技術幫助GAN解決了在離散型資料上的梯度傳播問題,那麼同為強化學習的Actor-Critic也為對抗式文本生成提供了另外一種可能。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

5.6IRGAN:兩個檢索模型的對抗

IRGAN[25]這篇工作發表于2017年的SIGIR,從作者的陣容來看就注定不是一篇平凡的作品,其中就包含SeqGAN的原班人馬,作者将生成對抗網絡的思想應用于資訊檢索領域,卻又不拘泥于傳統GAN的經典Framework,而是利用了IR領域原本就存在的兩種不同路數的model:生成式IR模型 和 判别式IR模型。

生成式IR模型目标是産生一個query \rightarrow document的關聯度分布,利用這個分布對每個輸入的query傳回相關的檢索結果;而判别式IR模型看上去更像是一個二類分類器,它的目标是盡可能地區分有關聯查詢對<query_r, document_r>和無關聯查詢對<query_f, document_f>,對于給定的查詢對<query, document>,判别式IR模型給出該查詢對中的兩項的關聯程度。

光從兩個模型簡單的介紹來看就能絲絲感覺到它們之間特殊的聯系,兩種風格迥異的IR模型在GAN的思想中“有緣地”走到了對立面,我們将生成式IR模型記作: p_\theta \left(d \mid q,r \right) ,将判别式IR模型記作: f_\phi \left(q,d \right) ,于是整個IRGAN的目标函數為:

J^{G^\ast, D^\ast} = \min_{\theta} \max_{\phi} \sum\limits_{n=1}^N \left(\mathbb{E}_{d \sim p_{real}\left(d \mid q_n,r \right)}\left[\log D\left(d \mid q_n \right) \right] + \mathbb{E}_{d \sim p_{\theta}\left(d \mid q_n,r \right)}\left[\log \left(1 - D\left(d \mid q_n \right) \right)\right] \right)

在IRGAN中,鑒别器D定義為判别式IR模型的邏輯回歸:

D\left(d \mid q \right) = \sigma \left(f_\phi \left(d,q \right) \right) = \frac{\exp \left(f_\phi \left(d,q \right) \right)}{1 + \exp \left(f_\phi \left(d,q \right) \right)}

于是鑒别器D的目标函數進一步寫為:

\phi^\ast = \arg\max_{\phi} \sum\limits_{n=1}^N \left(\mathbb{E}_{d \sim p_{real}\left(d \mid q_n,r \right)}\left[\log \left(\sigma\left(f_\phi\left(d, q_n \right)\right)\right) \right] + \mathbb{E}_{d \sim p_{\theta}\left(d \mid q_n,r \right)}\left[\log \left(1 - \sigma\left(f_\phi\left(d, q_n \right)\right) \right)\right] \right)

相對地,生成器G就直接輸出以query為condition答案池中所有document與該query的關聯分布,不幸地,我們必須将通過這個關聯分布,過濾出目前認為最相關的document答案,才能作為鑒别器D的輸入來判定此時此刻檢索結果的品質,原本連續型的分布經過這一步的折騰又變成離散型的資料了,還好,我們有強化學習,設 Reward \left(\cdot \right)= \log\left(1 + \exp\left(f_\phi \left(\cdot \right) \right) \right) ,則生成器G的目标函數被寫成:

\theta^\ast = \arg\min_{\theta} \sum\limits_{n=1}^{N} \mathbb{E}_{d \sim p_{\theta}\left(d \mid q_n, r \right)}\left[\log\left(1 + \exp\left(f_\phi \left(d, q_n \right) \right) \right) \right]

也就是最大化鑒别器D給出的獎勵,而這個獎勵值主要來源于檢索結果形成的查詢對 \left(d, q_n \right) 在判别式IR模型中被認為确實有關聯的機率之和。将求和符号内的項記作: J^G \left(q_n \right) ,按照Policy Gradient的方式進行梯度優化,并使用4.1節中的推導方法描述 J^G \left(q_n \right) 的優化梯度,在實做時為了友善,采樣 k 個目前生成式IR模型給出的查詢結果求近似。

\begin{aligned} \nabla_\theta J^G \left(q_n \right) &= \nabla_\theta \mathbb{E}_{d \sim p_\theta \left(d \mid q_n, r \right)} \left[\log\left(1 + \exp\left(f_\phi \left(d, q_n \right) \right) \right) - b \right] \\ &= \sum\limits_{i=1}^{M} \nabla_\theta p_\theta \left(d_i \mid q_n, r \right) \left[\log\left(1 + \exp\left(f_\phi \left(d_i, q_n \right) \right) \right) - b \right] \\ &= \sum\limits_{i=1}^{M} p_\theta \left(d_i \mid q_n, r \right) \nabla_\theta \log p_\theta \left(d_i \mid q_n, r \right) \left[\log\left(1 + \exp\left(f_\phi \left(d_i, q_n \right) \right) \right) - b \right] \\ &\simeq \frac{1}{K} \sum\limits_{k=1}^{K} \nabla_\theta \log p_\theta \left(d_k \mid q_n, r \right) \left[\log\left(1 + \exp\left(f_\phi \left(d_k, q_n \right) \right) \right) - b \right] \end{aligned}

當然,也不能忘了我們的baseline—— b ,文中設定baseline為目前查詢結果的平均期望 Reward 。

b = \mathbb{E}_{d \sim p_\theta \left(d \mid q_n, r \right)} \left[\log\left(1 + \exp\left(f_\phi \left(d, q_n \right) \right) \right) \right]

上述是針對Pointwise情形的IR任務,不同于Pointwise情形着重于得到直接的檢索結果,Pairwise情形的IR把更多精力放在了ranking上,其傳回結果 R_n = \left\{\langle d_i, d_j\rangle \mid d_i \succ d_j \right\} 中全是非對稱二進制對,其中 d_i 比 d_j 與目前的查詢項關聯性更高。IRGAN也可以擴充到Pairwise的情形,原則是:“一切從減”。 鑒别器函數将改寫為:

D\left(\langle d_i, d_j\rangle \mid q \right) = \sigma \left(f_\phi \left(d_i, q \right) - f_\phi \left(d_j, q \right)\right) = \frac{\exp \left(f_\phi \left(d_i, q \right) - f_\phi \left(d_j, q \right)\right)}{1 + \exp \left(f_\phi \left(d_i, q \right) - f_\phi \left(d_j, q \right)\right)}

而假設生成器G是一個softmax函數,則Pairwise情形下的變形和簡化推導如下:

p_\theta \left(d_k \mid q, r\right) = \frac{\exp \left(g_\theta \left(d_k, q \right)\right)}{\sum_d\exp \left(g_\theta \left(d_k, q \right)\right)}

G\left(\langle d_k, d_j\rangle \mid q \right) = \frac{\exp \left(g_\theta \left(d_k, q \right) - g_\theta \left(d_j, q \right)\right)}{\sum_d\exp \left(g_\theta \left(d_k, q \right) - g_\theta \left(d_j, q \right) \right)} = \frac{\exp \left(g_\theta \left(d_k, q \right)\right)}{\sum_d\exp \left(g_\theta \left(d_k, q \right)\right)} = p_\theta \left(d_k \mid q, r\right)

IRGAN在Pairwise情形下的總目标函數如下,其中, o 表示真實的非對稱二進制組,而 o\prime 則表示生成式IR模型生成的二進制組:

J^{G^\ast, D^\ast} = \min_{\theta} \max_{\phi} \sum\limits_{n=1}^N \left(\mathbb{E}_{o \sim p_{real}\left(o \mid q_n,r \right)}\left[\log D\left(o \mid q_n \right) \right] + \mathbb{E}_{o\prime \sim p_{\theta}\left(o\prime \mid q_n,r \right)}\left[\log \left(1 - D\left(o\prime \mid q_n \right) \right)\right] \right)

IRGAN的一大特點是,對抗model中的兩個元件各自都是一種IR模型,是以經過對抗訓練之後,不管拿出來哪個,都有希望突破原先的瓶頸。作者還關于IRGAN的訓練目标是否符合納什均衡做了一些讨論,盡管在真實檢索的應用中很難獲得所謂的真實關聯分布,但作者認為不管是觀察到的關聯樣本還是未觀察到的關聯樣本,判别IR模型的輸出總是和生成IR模型的對應輸出存在着正相關的作用力,于是也孕育而生了文中那個關于浮力和拖拽重物最終達到漂浮平衡狀态的略顯晦澀的比喻。

引入秘密武器強化學習,發掘GAN在NLP領域的潛力

結語

這一領域的發展之迅速,也許在我完成這篇Blog的時候,又有一批工作争先恐後的冒出來了,但最終的結局肯定不止于此,我也不怎麼擅長結尾,也許要等待GAN來為我,為我們帶來一個奇妙的結局。

原文釋出時間為:2017-10-06

本文作者:胡楊

本文來自雲栖社群合作夥伴“ 大資料文摘”,了解相關資訊可以關注“ 大資料文摘”微信公衆号

繼續閱讀