1,概述
任務型對話系統越來越多的被應用到實際的場景中,例如siri,阿里小密這類的產品。通常任務型對話系統都是基於pipline的方式實現的,具體的流程圖如下:
整個pipline由五個模塊組成:語音識別;自然語言理解;對話管理;自然語言生成;語音合成。現在越來越多的產品還融入了知識庫,主要是在對話管理模塊引入。在這里除了語音識別和語音合成模塊不屬於自然語言處理范疇且屬於可選項之外,其他的三個模塊都是必要的。
自然語言理解(NLU):主要作用是對用戶輸入的句子或者語音識別的結果進行處理,提取用戶的對話意圖以及用戶所傳遞的信息。
對話管理(DM):對話管理分為兩個子模塊,對話狀態追蹤(DST)和對話策略學習(DPL),其主要作用是根據NLU的結果來更新系統的狀態,並生成相應的系統動作。
自然語言生成(NLG):將DM輸出的系統動作文本化,用文本的形式將系統的動作表達出來。
我們接下來將會詳細討論這四個模塊(NLU,DST,DPL,NLG)。
2 意圖識別和槽值填充
舉一個簡單的例子,以一個詢問天氣的任務型對話為例,根據專家知識,我們會預先定義該任務的意圖和相應的槽,這句話該怎么理解呢?
比如用戶輸入:“今天深圳的天氣怎么樣?”,此時用戶所表達的是查詢天氣,在這里我們可以認為查詢天氣就是一種意圖,那具體查詢哪里的天氣,哪一天的天氣?在這里用戶也傳遞出了這些信息,(地點=深圳,日期=今天),而在這里地點和日期就是信息槽。
在一個任務型對話系統中會含有多種意圖和槽值,對於意圖識別來說本質上就是一個文本分類的任務,而對於槽值填充來說本質上是一個序列標注的任務(采用BIO的形式來標注)。
還是以“今天深圳的天氣怎么樣?”為例,在意圖識別時用文本分類的方法將其分類到“詢問天氣”這個意圖,而在做槽值填充時采用序列標注的方法可以將其標注為:
今 天 深 圳 的 天 氣 怎 么 樣
B_DATE I_DATA B_LOCATION I_LOCATION O O O O O O
除了上述兩個主要的內容,NLU中還會涉及到領域識別,語義消歧等。
3、DST對話狀態跟蹤
首先我們來看下對話狀態和DST的定義。
對話狀態:在tt時刻,結合當前的對話歷史和當前的用戶輸入來給出當前每個slot的取值的概率分布情況,作為DPL的輸入,此時的對話狀態表示為StSt。
DST(對話狀態追蹤):就是根據所有對話歷史信息推斷當前對話狀態StSt和用戶目標。
由於在ASR和NLU這兩個環節會存在誤差,因此輸入到DST中的內容是N-best列表(對於ASR,不是輸入一條句子,而是N條句子,每條句子都帶一個置信度。對於SLU,不是輸入一條意圖(槽值對),而是N個意圖(槽值對),每個意圖(槽值對)都帶一個置信度)。所以DST往往也是輸出各個狀態的概率分布,這樣的表示也方便在多輪對話中對狀態進行修改。具體的情況如下圖所示:
4,DST的常用方法
DST的常用方法主要有三種:基於規則的方法,生成式模型,判別式模型,目前來看判別式模型的表現最好,也是當前研究的最多的方向。
1)基於規則的方法
基於規則的方法一般是用1-best的結果作為輸入,而且輸出的狀態也是確定型,基於規則的方法需要大量的人工和專家知識,因此在較復雜的場景適用性不強。當然基於規則的方法也有它的優點,基於規則的方法不依賴於對話數據,因此在沒有對話數據的情況下很適合冷啟動。基於規則的方法用N-best的結果作為輸入也有研究,但總的來說實現起來很復雜。
2)生成式模型
生成式模型主要是利用貝葉斯網絡推斷來學得整個狀態的概率分布,其通用表達式如下:
上面式子中b(s)b(s)代表上一時刻狀態的概率分布,b′(s′)b′(s′)代表當前時刻的狀態分布,u′u′代表當前時刻的用戶輸入,u~′u~′代表當前用戶輸入的觀測輸出,s′s′代表當前時刻的狀態,ss代表上一時刻的狀態,aa代表上一時刻的動作,ηη是一個常數。
可以看出上面的公式還是比較復雜的,因此實現起來也比較復雜,傳統的生成式方法還要列出所有可能的狀態,以及狀態概率轉移矩陣等。
3)判別式模型
判別模型用一個最簡單的公式建模,可以表示成:
b′(s′)=P(s′|f′)b′(s′)=P(s′|f′)
其中b′(s′)b′(s′)表示當前狀態的概率分布,而f′f′表示對ASR/NLU的輸入的特征表示,早期的判別模型會利用SVM,最大熵模型,CRF等來建模。隨着神經網絡的興起,DNN,RNN等模型也越來越多的占領了這個領域。
5、對話系統中的對話策略學習(DPL)
前面也說了DST+DPL組成了任務型對話中至關重要的DM,在開始介紹DPL前,先來看下DST和DPL的關系,以便於從整體上把握整個對話系統。
這里說下dialogue act,按我的理解act包括兩類:用戶的act和系統的act。
針對用戶時,主要是識別用戶act,dialogue act對應於SLU,包括意圖和領域識別(一般是分類)+ 槽填充(一般是序列標注)。
針對系統時,主要是識別系統act,dialogue act對應於DPL,表明在限制條件(之前的累積目標、對話歷史等)下系統要執行的動作(接下來的策略),這個動作可能不是追求當前收益最大化,而是未來收益最大化。
至於dialogue act是個什么任務,我感覺分類、序列標注、結構預測都OK。其對應的輸入輸出應該就是SLU的輸入輸出、DPL的輸入輸出。
DPL建模和實例說明
這里再重新回顧一下DST的建模,然后再對DPL建模。
何謂對話狀態?其實狀態St是一種包含0時刻到t時刻的對話歷史、用戶目標、意圖和槽值對的數據結構,這種數據結構可以供DPL階段學習策略(比如定機票時,是詢問出發地還是確定訂單?)並完成NLG階段的回復。