《rasa聊天機器人框架學習》
https://www.bilibili.com/video/BV1c7411D75q
Rasa NLU:
Rasa Core:
對話狀態跟蹤
通過ML實現對話流程的管理不是第一家,但是是和工業界結合最好的一家
NLG:Rasa 裡面用的是模板...
seq2seq 啥的不成熟
Rasa X:
ML訓練:該故事下,所有對話歷史狀態;
spaCy是用於高階自然語言處理的開源軟體庫,以Python和Cython程式語言編寫
意圖識別:sklearn
實體識別:封裝的 C++ CRF 寫的sklearn-crfsuite
sklearn-crfsuite是基於CRFsuite庫的一款輕量級的CRF庫。該庫相容sklearn的演算法,因此可以結合sklearn庫的演算法設計實體識別系統。sklearn-crfsuite不僅提供了條件隨機場的訓練和預測方法還提供了評測方法。這裡再簡單說明一下CRFsuite。CRFsuite使用C/C++實現了條件隨機場模型。作者為東京大學的Naoaki Okazaki,從他的個人資訊頁來看,他應該從事文字處理研究十多年了。從Github原始碼來看,作者將具體的實現演算法全部封裝成了動態庫,這樣可能不利於我們瞭解條件隨機場內部原理。。從Github原始碼來看,作者將具體的實現演算法全部封裝成了動態庫,這樣可能不利於我們瞭解條件隨機場內部原理。在眾多實現條件隨機場的軟體中,CRFsuite具有下邊的特徵:
用開源實現(沒有用學術前沿的一些東西),實現一個工業可用的系統;
------------------------------------------------------------------------------------------
embedding
LTR:選擇系統行為時 —— 學習當前對話狀態 與哪些 系統行為 更接近;並且設定一個閾值,可以做到一個對話狀態可以選擇多個系統行為
LSTM
------------------------------------------------------------------------------------------
NLU識別的主要輸出結果:意圖 & 實體
tracker:記錄會話狀態,
tracker 要把當前的使用者狀態輸出到policy (狀態決策)
tracker 給決策層的時候,已經是 embedding 向量了
意圖和 系統行為 之間可能有關係,不是簡單粗暴到詞這個級別
把 intent 類別進行分詞:mood unhappy
utter cheer up ...
--> 這塊可以深入挖掘
至少先判斷 sentiment
反例:儘量不要把 使用者意圖 和 系統行為 的詞寫得一樣。。。這樣效果會變差
tracker輸出的 embedding 都 輸入到 LSTM裡面
《Few-Shot Generalization Across Dialogue Tasks》論文筆記
Posted on2019年3月18日論文地址。
在一個具體的task對話系統中,為了完成整個對話系統,通常而言需要收集一些該task需要具備的資訊——即slot,一旦所有預設的slot資訊收集完畢,便可以根據這些資訊完成該task。而這個資訊的收集過程是通過對話的形式展開的,論文中為此定義兩種對話形式:
- Cooperative Dialogue: 系統只需要針對預設slots進行遍歷,當所有slots資訊都具備的時候便可以完成一次task,而這個過程使用者是比較配合的;
- Uncooperative Dialogue: 與Cooperative Dialogue相反,使用者可能比較隨性,往往答非所問,並且跳出當前的話題,即可簡單理解為不配合的。如下圖中所示情況,論文作者主要考察了四種情況的
uncooperative
:正常task對話中插入Chitchat,對已有slot進行Correction,Broad context和Narrow context(這兩種沒怎麼看明白,直接看下圖中的例子吧)
論文中將dialogue management建模成這樣一個問題:從一個封閉域的候選list中選擇一個正確的action,而這個action型別可能包含:傳送一個message給使用者、發起一個API請求或者查詢資料庫的一個SQL操作。並且NLG並未使用生成模型而是使用模板的方法,
這裡使用LSTM作為HCN的前置網路,而HCN實際上是監督學習和強化學習的綜合,監督學習的資料來自於兩部分:前期提供的監督資料和後期上線後收集的線上實時反饋資料,並且通過HCN網路並不會使用分類的方法,而是使用embedding之間的相似度匹配方法。
本文提出的框架叫做Recurrent Embedding Dialogue Policy (REDP),這個框架主要目的便是計算dialogue states和system actions的表徵,因此在inference階段,將當前dialogue states的表徵和所有候選system actions的表徵計算相似度,並選擇最高的actions作為輸出,並根據action的不同進行下一步動作。
REDP的整體框架如下,可以分為四個模組。
Featurization
將使用者輸入、系統actions和槽位進行特徵化:
- 對於使用者輸入主要是通過NLU模組得到意圖和實體等資訊;
- 對於系統actions則將action名字中的詞作為特徵(比如action_search_restaurant = {action, search, restaurant}),這些特徵因為都是詞,所以各自都使用bag-of-words的方法進行表徵;
- slot資訊將使用一個binary vector進行表徵,各個維度上代表的slot資訊出現了就是1否則為0. -- 得有個例子輔助理解;
Embedding layers
整個框架中存在四個embedding layer,這是一個dense layer,並且針對這四個的引數各自不同。
Attention
這裡要解決的問題是隻能針對當前對話輪中已發生過的user input 和 system actions進行attention,而不能針對未來對話輪中的資訊,因此這裡修改了Neural Turing Machine,最終通過這個修改版的NTM,只針對已發生過的對話輪中的資料進行attention,並最終得到這個與對話上下文歷史資料互動之後的表徵。
針對user memory和system memory上的attention,分別使用了兩個不同的模組。
RNN
使用LSTM結構做對話狀態追蹤。
- 輸入: user memory attention之後的結果與embedded user input相加,爾後再將embedded slots vector拼接成一個向量作為LSTM當前輪的輸入向量;
- 輸出:LSTM的輸出向量(隱層接一個dense layer)與system memory attention的結果進行相加,這個作為當前輪的dialogue state embedding
得到當前輪的state embedding後,會存入LSTM state中,並且會將所有前面輪數的相應state embedding與system memory attention中的二值化的attention權值進行相乘,從而可以實現在維護的所有歷史state中進行跳轉的目的(即跳轉到歷史的任意一輪的對話state中)。
Similarity
利用dialogue level embedding和某個候選system action之間計算相似度,並使用了一個margin loss的方法進行訓練。
總結:本文中實現不同意圖之間的切換非常新穎,並且後面還做了很多比較詳細的實驗,發在了NIPS 2018上,在遇到需要實現上下文中不同意圖間頻繁複雜切換的問題時候,可以好好參考下這篇論文。