當前位置:
首頁 > 最新 > Rasa Core源碼之Policy訓練

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。

原創文章轉載註明出處


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 TheBeetle 的精彩文章:

TAG:TheBeetle |