本文來自李紀為博士的論文 Deep Reinforcement Learning for Dialogue Generation。
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)整合開發者自定義的回報函數,更好地模仿聊天機器人開發的真正目標。
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)獎勵
在這里獎勵可以說是本文的亮點,作者定義了三種獎勵,並最終對這三種獎勵進行加權平均。
1、Ease of Answering
這個獎勵指標主要是說生成的回復一定是容易被回答的。本文用下面的公式來計算容易的程度:
其實就是給定這個回復之后,生成的下一個回復是dull的回復的概率大小。(這里的dull的回復是指比如“I don’t know what you are talking about”這一類的回復。作者手動給出了這樣的一個dull列表。)在上面式子中最左邊的$N_S$是指dull列表的大小,也就是自定義的dull回復的個數,中間的$N_s$是指dull回復$s$的序列長度。
2、Information Flow
這個獎勵主要是控制生成的回復盡量和之前的不要重復,增加回復的多樣性。
這里的$h$是bot的回復的encoder編碼后的向量表示,$i$和$i+1$表示該bot的前后兩輪。用cos來表示兩個句子的語義相似度,兩個句子越相似,則獎勵越小。
3、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$對應的獎勵,梯度計算如下:
用上面的梯度去進行梯度上升,來更新模型的參數。