Rasa Core源碼之Policy訓練
上下文的聯繫與理解是對話系統中重要的一塊,直接影響與機器人對話的體驗。最近接觸了RASA系列,包括自然語言理解的rasa nlu和對話管理的rasa core。簡單方便的實現一個任務對話系統的同時,也好奇其內部實現使用的技術。花時間讀了Rasa Core關於上下文理解部分的源碼,後面有機會再把rasa對話系統的其他模塊的實現也做一個源碼的分析。文章分為以下幾部分:
Rasa Core的主要模塊概念
訓練數據準備
對話Policy模型訓練和實現方法
主要概念
與對話系統的主要模塊對應,如圖 Rasa Core的實現也有相應的幾個模塊。從接受用戶消息到機器人做出決策的流程大致如下:
接受用戶消息,送入Interpreter模塊,識別並生成包含消息文本(text)、用戶意圖(intent)、和實體(entities)的字典。這裡Interpreter對意圖和實體的識別由上面提到的Rasa NLU實現,不是文章的主題,只要知道其功能即可。
Tracker 是對對話狀態進行追蹤(state tracker)的對象,它接受並記錄Interpreter識別的新消息。
Policy接受當前的對話狀態,選擇響應哪一個Action。
被選擇的Action別記錄在Tracker中,並返迴響應給用戶。
上述流程是在Interpreter和Policy模型訓練好的基礎上對話系統的運行流程,下面主要針對Policy選擇Action的模型訓練部分的源碼進行分析。該部分模型需要考慮歷史對話對下一步響應進行決策,是整個對話系統的核心。
訓練數據
訓練Policy之前需要準備兩個數據文件:
domain.yml : 包括對話系統所適用的領域,其中包括intents(意圖集合)、slots(實體槽集合)、actions (機器人相應方式的集合)。
story.md:訓練數據集合,這裡的訓練數據比不是原始的對話數據,而是原始的對話在domain中的映射。 以官方的訂餐館的數據集為例:
restaurant_domain.yml:
babi_stories.md:
story中對樣例對話進行了簡單的注釋。
模型訓練
準備好訓練數據,下面是模型訓練。拿官方的一個經典的KerasPolicy模型為例,該模型用Keras實現了一個簡單的LSTM作為Policy模型:
模型通過歷史對話記錄作為輸入訓練數據,下一個決策Action作為label,進行模型訓練。三個參數:
maxhistorylen: 記錄的最大歷史長度。
num_features: 每個記錄的特徵維度(intent、slot、action等的數目),包括了該記錄的狀態。
num_actions:候選響應數。
模型本質上是num_actions個類別的多分類。下面詳細分析對story.md的編碼,生成可以直接輸入到模型的訓練數據(X,y)。
狀態追蹤(state track)
在搞清楚模型輸入的訓練數據是什麼之前需要了解Rasa Core是如何實現狀態追蹤。訓練階段,rasa core讀入Story,用track記錄:在設置最大長度上下文為2時,一條訓練數據的會有如下字典的表示:
該部分狀態對應上面訓練數據的
狀態編碼
track列表中第一個字典表示utteronit後的狀態,此時slotlocation、slotpeople、slotprice等的均已收集到在之前的對話中,對應value為1。第二個字典表示在utteraskcuisine後的狀態,此時並沒有獲取到新的信息,而只是記錄上一個機器響應prevutteraskcuisine的value為1,表示該階段狀態;第三個字典表示當前狀態,在獲取新的cuisine信息後對應key的value置為1,同時上一個action為prevactionlisten表示監聽。
相應的,根據訓練數據下一個機器應該採取的action為:
如此得到一條訓練數據(x,y), x經過編碼,單條記錄為一個二值向量,如果特徵出現為1,否則為0,對應上面的第三個字典:
而對於最大歷史信息記錄為2的對應單條訓練數據:
對應的y為5(utterackdosearch的編號)。相同方法從Story中讀取所有可能的數據對,去重和數據增強(打亂拼接),最終生成訓練數據X,y。
X的維度為:(numstates, maxhistory, num_features)
y的維度為:num_states
模型訓練
在準備好訓練數據之後就可以對LSTM進行訓練:
和一般LSTM網路的訓練方法一樣,這裡先對y進行one hot編碼,shuffle訓練集,之後進行訓練。對於單個訓練數據,對比文本的訓練,一個狀態相當於一個詞,而最大上下文長度為2的單條訓練數據可類比為2個詞的句子。
而在模型實用的預測階段,一開始流程也有涉及,顯然只要Tracker記錄之前的聊天記錄,每次拿當前決策的前兩個消息作為模型輸入,輸出即為每個action的概率值,選擇最大的響應即可。
小結
到此分析了Rasa Core的Policy訓練方式,雖然Rasa Core的代碼量並不算大,但這裡並沒有根據源碼細節來看,而只是理清其訓練方法。通過一個不錯的對話系統的源碼閱讀,可以對對話管理的幾個關鍵技術有進一步的理解,比如狀態追蹤、上下文理解以及沒有講的意圖識別和實體識別。相比於高大上的論文的解決方案(如端到端、Memory Network進行上下文理解),Rasa Core顯得更加簡單可用,同樣Rasa Core支持online learning還有點增強學習的意思,感興趣的可以關注其github。
原創文章轉載註明出處
TAG:TheBeetle |