教 Chatbot 生成更有营养的对话
Sequence to Backward and Forward Sequences: A Content-Introducing Approach to Generative Short-Text Conversation
https://arxiv.org/pdf/1607.00970.pdf
用一般的 seq2seq 框架來直接生成對話,經常會有類似“哈哈”、“我不知道”的話產生,雖然很連貫,但信息量太少,沒有實際意義。那么,如何根據上文來生成相關的、有信息量的、甚至包括某個關鍵詞的對話?本文或許會給出一些啟發。
閱讀筆記精選
xwzhong
paper 依舊是想就生成式對話中解決通用性回復的問題,思路比較簡單,在 decoder 時,預選確定一個有意義的“詞”,在一定出現該詞的情況下進行擴充從而得到完整的回復,關鍵部分如下:?
1. train:對于一個完整的 post-resp 對,將“resp”隨機選取一個 word 分割,前后部分設為 head 和 tail,對 head 部分 reverse,得到 post-rehead,post-tail 對,用兩個不同的 seq2seq 模型進行訓練;?
2. test/eval:使用 petrain 得到的 PMI 信息,計算出當前 post 出現情況下,最“適合”出現的 word(“詞”級別),再依次使用反向和正向 seq2seq 模型得到完整的回復;?
3. paper 提出的 idea 降低通用性回復,主要因為預先使用 PMI 挑出了相對“有意義”的詞;?
4. 如果只是想進行實驗,復現模型相對簡單,可以直接套用 seq2seq 的 translate 代碼,再額外寫一個 PMI 相關計算;?
5. 就此模型而言,效果的好壞主要應該在于 keywords 詞表以及 test/eval 部分 keyword 的選取;?
6. 在 train 部分,不知道在選取 word 進行 split 部分,使用 test/eval 一樣的選取方式效果會不會更好?
Miao
本文提出的模型有三部分(看 Figure 1): a. keyword prediction, b. backward seq2seq model c. forward seq2seq model 關于 a 大家討論了不少了;b 和 c 是兩個 seq2seq model,本文使用的是將 encoder 得到的內容通過 hidden state 傳遞給 decoder 的 seq2seq 模型,沒有使用 attention 機制,屬于比較簡單的模型;c 是一個標準的 seq2seq 模型,在訓練過程中都不需要考慮 keyword 的問題,比較簡單;我感覺本文最大的關注點和亮點在 b,有幾點思考:?
1. 傳統 seq2seq 模型中 decoder 產生的第一個詞對于整個句子的生成是比較重要的,會影響內容的質量,也會影響多樣性;而 backward seq2seq 可以使得 reply 的第一個詞的多樣性提升,從而提升 reply 的多樣性;從 table 2 中的例子可以看到,傳統的 seq2seq 模型的回答大部分是“我怎么怎么”,這種回答看上去質量也比較差,更像 general reply,而本文模型的回答第一個詞多樣性大,顯得質量較高,我感覺這個非常有趣;?
2. 因此,backward seq2seq 的好壞對于 reply 的生成是非常關鍵的;?
3. 而 backward seq2seq 需要的能力是比較強大的:需要給定一個 post,以及 reply 任意一個位置的詞,然后向前生成 reply,這個能力和傳統的 seq2seq model 需要的能力是有一些微妙的區別的。我感覺這個能力用本文這樣的 seq2seq model 來實現有些別扭,如果能有更好的 backward seq2seq model,會不會能顯著的提升 reply 的質量。
weijinfeng
本文所解決的問題跟上周的論文基本是一致的,都是通過引入先驗知識到生成過程中,所不同的是,本文只是引入一個詞,并且限定是名詞,而且還將應用場景定位為短句對話。 模型本身相對比較簡單,就只對前面這幾個限定說一下個人的理解。?
首先是,1)為什么選取一個詞,這應該是基于短句概念提取的一個假設,就是一個短句是以一個詞(應該包括復合詞)為核心,輔以描述或限定性成分以及其他成分組成。當核心概念詞提取出來后,又因為open domain對話的內容開放性的特點(比如,只要回復說的是這個事,至于說什么不重要),再擴展出其他成分來就可以了。
其次是,2)為什么是名詞,有同學的批注也提到了這個問題,看到沒有人回復,說下自己的看法。根據1,一個短句需要映射到唯一的詞作為整句的概念抽象或者核心表達詞,那么詞的詞性就需要斟酌一下了。用排除法來做,很顯然除了主謂賓的其他成分在一個句子中起核心作用的時候相對是比較少的。有同學也提到了核心詞選取的重要性,所以一旦選了非主要成分作為核心詞,后面再生成好回復的概率也比較小了。另外,從語法結構上來說,主語一般是名詞或者代詞,謂語一般是動詞,賓語一般是名詞或者代詞。從概率角度來講也是選名詞覆蓋范圍更大一些。?
最后,3)為什么從一開始就定位為短對話生成,我覺得主要原因是因為reply的產生是由用PMI方式選出來的key word為中心擴展出來的,這種擴展雖然可以無限延長,但是隨著跟key word距離的增加,關聯性也會逐漸降低,難免會出現句子不通暢的情況,所以定位為短句的回復更為有效一些。
?Q&A 精選
Miopas
Specifically, our seq2BF model works as follows.seq2BF model 分成兩個部分:?
1. 先把 query 作為 input,經過第一個 seq2seq 的模型得到一個 output sequence,作為前半句 reply;?
2. 然后把 query 和前半句的 reply 作為 input,輸入第二個 seq2seq 模型,得到后半句 reply;
3. 最終的 reply = 前半句 reply + keyword + 后半句 reply。 有個疑問,這個應該是一個 infer 的過程,train 的過程是需要切分訓練集里的 reply 的吧,怎么切分 reply 的?
Miopas:?在 2.4 里寫了,是隨機 sample 了一個 word 作為 split word,看漏了。這樣的話實際上 seq2BF 的模型在 train 的時候并沒有用到 keyword noun 的信息?
wumark:?不是先生成前半句再生成后半句的。他這個生成方式比較麻煩,固定 r_k 生成 r_k+1 再前向生成 r_k-1,再后向 r_k+2(利用 rk 和 rk+1),之后再 rk-2(利用 rk-1,rk 和 rk+1),時間復雜度很高。?這個模型最開始并不是生成對話的,是生成詩歌的,百度用了同樣的模型生成了詩歌,也發表在 coling2016。
Miopas:?重新讀了一下,感覺你說的是對的。之前這個地方的 Equation 5 沒怎么明白,對照一下應該是你說的那樣。不過有個問題,這里下一段寫"the forward generator is aware of the backward half sequence"看上去是在說生成后半句的時候,已經得到完整的前半句了,這里是什么意思呢?
wumark:?我也細致地看了一下,我說的是有問題。按照他的表述他應該是后向生成到頭,然后再拿前向的重新再讀一遍,再把前面的生成了。不是每個字交替一下,是一次生成完了,之前理解錯了
mike
Because we have far more Chinese terms than English words, our seq2BF is trained in the character level out of efficiency concerns.PMI keyword 統計模型是基于詞粒度的,而 seq2BF 中的 RNN encoder 和 decoder 都是基于字粒度的。這里給出使用字粒度的理由是漢語詞太多,隱含的意思是詞粒度容易出現 OOV 問題,所以使用字粒度? 有沒有同學對比過詞粒度的 seq2seq 和字粒度的 seq2seq 生成結果的區別呢??
另外,從 Table 1(a) 中看到,seq2BF 生成的 reply 的長度平均在 5.6 個字,而 Groundtruth 也就是實際 reply 的長度也就在 9.19,因此數據集中的回復是偏短的,會不會也因為數據集是比較短的 post-reply 才考慮選擇的字粒度呢?
xwzhong:?1.?文中直接說明是出于“efficiency concerns”所以用了 char-level,當然,你提到的使用 word-level 確實是會出現 OOV 情況。2. 個人做過相關實驗,同個 post,使用 seq2seq 得到的 response 其平均長度比對應訓練集中 groundtruth 小 4 左右(實驗進行了變量控制,post 出現次數、response 不同長度)
xwzhong:?word-level 和 char-level 各有好處,可以從效率、顯存占用、語義表達角度去考慮(涉及到的東西比較多),但是從使用 seq2seq 模型來做生成式對話系統,僅僅對比 word 和 char-level 的區別很小。
Miaosen
PMI prefers a word that is most “mutually informative” with the query這樣選擇的 keyword,會不會在 language model 中也比較少見,導致很難生成流利的回答?(比如 keyword 是某款汽車型號)。其實很多 keyword 雖然不一樣,但是其實是類似的意思。在生成 response 的時候,是不是可以選擇用 embedding 來做?
mev:?這樣就有點像主題信息而不是關鍵詞信息了,可以嘗試用主題詞來替換關鍵詞,但這樣做的話會不會影響生成的回復的多樣性呢?
cuixiankun:?限定關鍵詞在本身上就限定了生成的多樣性吧。
來源:paperweekly
原文鏈接
總結
以上是生活随笔為你收集整理的教 Chatbot 生成更有营养的对话的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从道的角度来论述大数据对企业价值
- 下一篇: c语言中数组名a和a详细介绍