本文來自李紀爲博士的論文 Deep Reinforcement Learning for Dialogue Generation。html
1,概述算法
當前在閒聊機器人中的主要技術框架都是seq2seq模型。但傳統的seq2seq存在不少問題。本文就提出了兩個問題:安全
1)傳統的seq2seq模型傾向於生成安全,普適的回答,例如「I don’t know what you are talking about」。爲了解決這個問題,做者在更早的一篇文章中提出了用互信息做爲模型的目標函數。具體見A Diversity-Promoting Objective Function for Neural Conversation Models論文閱讀。網絡
2)傳統的seq2seq模型的目標函數都是MLE函數,用MLE做爲目標函數容易引發對話的死循環。具體的看下錶:框架
面對這種挑戰,咱們的模型框架須要具有下面兩種能力:函數
1)整合開發者自定義的回報函數,更好地模仿聊天機器人開發的真正目標。post
2)生成一個reply以後,能夠定量地描述這個reply對後續階段的影響。學習
因此,本文提出用基於互信息目標函數的seq2seq + 強化學習的思路來解決這個問題。優化
2,強化學習在開放域對話系統中的應用編碼
學習系統由兩個agent組成,將第一個agent生成的句子定義爲$p$,第二個agent生成的句子定義爲$q$。兩個agent互相對話來進行模型學習。在這裏agent生成的句子會做爲下一輪的輸入,所以能夠獲得一個生成的對話序列:
$p_1, q_1, p_2, q_2, ......, p_n, q_n$
咱們能夠將生成的句子看做動做,所以這裏的動做空間是連續且無限的。能夠將seq2seq模型看做是策略函數。經過最大化指望獎勵來優化模型的參數(注:在強化學習中的目標函數一般都是和獎勵相關的,通常都是最大化長期獎勵)。
咱們接下來介紹強化學習中四個重要元素:動做,狀態,策略和獎勵。
1)動做
在這裏動做是生成的句子,所以動做空間是無限的(通常對於無限的動做空間,採用策略梯度會比Q網絡更合適),能夠生成任意長度的序列
2)狀態
在這裏的狀態是上一輪對話中的句子對$[p_i, q_i]$,$p_i$和$q_i$會轉換成向量表示,而後拼接輸入到LSTM的encoder中。
3)策略
在策略梯度算法中,一般是用一個函數表示策略的,在這裏就是使用seq2seq模型(LSTM的encoder-decoder模型)來做爲策略函數的,在這裏採用隨機性的策略(也便是給定狀態的動做的機率分佈,相應的肯定性策略就是每一個狀態對應一個動做,知道狀態,則動做就是肯定的)。
4)獎勵
在這裏獎勵能夠說是本文的亮點,做者定義了三種獎勵,並最終對這三種獎勵進行加權平均。
一、Ease of Answering
這個獎勵指標主要是說生成的回覆必定是容易被回答的。本文用下面的公式來計算容易的程度:
其實就是給定這個回覆以後,生成的下一個回覆是dull的回覆的機率大小。(這裏的dull的回覆是指好比「I don’t know what you are talking about」這一類的回覆。做者手動給出了這樣的一個dull列表。)在上面式子中最左邊的$N_S$是指dull列表的大小,也就是自定義的dull回覆的個數,中間的$N_s$是指dull回覆$s$的序列長度。
二、Information Flow
這個獎勵主要是控制生成的回覆儘可能和以前的不要重複,增長回覆的多樣性。
這裏的$h$是bot的回覆的encoder編碼後的向量表示,$i$和$i+1$表示該bot的先後兩輪。用cos來表示兩個句子的語義類似度,兩個句子越類似,則獎勵越小。
三、Semantic Coherence
這個指標是用來衡量生成的回覆是否grammatical和coherent。若是隻有前兩個指標,頗有可能會獲得更高的獎勵,可是生成的句子並不連貫或者說不成一個天然句子。
這裏採用互信息來確保生成的回覆有語法連貫性。
最終的獎勵是上面三個獎勵的加權平均,具體的表達式以下:
在這裏的加權係數是固定的,${\lambda}_1 = 0.25, {\lambda}_2 = 0.25, {\lambda}_3 = 0.5$。
3,仿真
咱們的方法背後的核心思想是模擬兩個虛擬的agent輪流相互交談的過程,這樣咱們就能夠去探索狀態空間,並學習策略$p_{RL } (p_{i+1}|p_i, q_i)$以獲得最大獎勵。
1)監督學習
採用監督學習的方法在含8000萬條數據的OpenSubtitles數據集上訓練一個seq2seq + Attention的網絡,將這個網絡的參數做爲以後的初始化參數。模型具體的輸入上一輪的句子對,拼接在一塊兒輸入,輸出是下一輪的回覆。
2)互信息
以前的文章中提到過,直接用傳統的seq2seq(即目標函數沒MLE)會生成dull的回覆,採用互信息能夠有效的改善這種現象,在本文中做者將生成最大互信息回覆的問題看成一個強化學習的問題來解決,並使用策略梯度來優化。當一條序列徹底生成後就能夠得到該序列的互信息。
首先使用與訓練的seq2seq模型來初始化策略模型$p_{RL}$,給定一個輸入$[p_i, q_i]$,咱們能夠獲得一序列的回覆$A = {a' | a' ~ p_{RL}}$,對於生成的每一個$a'$,咱們均可以得到其對應的互信息$m(a', [p_i, q_i])$,這個互信息值將會做爲獎勵,並反向傳播到模型中,將互信息看做獎勵,則能夠獲得:
上面的函數能夠看做是目標函數,則梯度能夠表示爲:
而實際的計算中,設定一個$L$值,小於$L$的序列中的tokens(即經過$L$值將一個生成的序列分紅左右兩半),其損失計算時按照MLE來計算,大於$L$的tokens按照強化學習的方法,也就是互信息來計算,$L$值會在訓練的過程當中衰減至0。
3)兩個agent之間的對話建模
咱們模擬兩個虛擬的agent之間的對話,讓他們互相交談。模擬過程以下:
1,首先從訓練集中選擇一條句子給第一個agent,agent會對該句子編碼成一個向量,而且基於該編碼的向量生成一個新的句子。
2,第二個agent會將第一個agent生成的句子和從訓練集中選擇的句子組成一個句子對來更新當前的狀態,將該狀態編碼成向量,而後基於該編碼的向量進行解碼生成一個新的句子。
3,將第二個agent生成的句子反饋給第一個agent,依次重複該過程。
具體的以下圖所示:
優化過程:
首先用互信息模型來初始化$p_{RL}$,而後使用策略梯度去找到得到最大獎勵指望的參數,最大話將來的獎勵,其目標函數以下:
上面式子中的$R(a_i, [p_i, q_i])$表示的時動做$a_i$對應的獎勵,梯度計算以下:
用上面的梯度去進行梯度上升,來更新模型的參數。