1,概述
關於任務型對話的簡介看任務型對話(一)—— NLU(意識識別和槽值填充)。
首先我們來看下對話狀態和DST的定義。
對話狀態:在$t$時刻,結合當前的對話歷史和當前的用戶輸入來給出當前每個slot的取值的概率分布情況,作為DPL的輸入,此時的對話狀態表示為$S_t$。
DST(對話狀態追蹤):就是根據所有對話歷史信息推斷當前對話狀態$S_t$和用戶目標。
由於在ASR和NLU這兩個環節會存在誤差,因此輸入到DST中的內容是N-best列表(對於ASR,不是輸入一條句子,而是N條句子,每條句子都帶一個置信度。對於SLU,不是輸入一條意圖(槽值對),而是N個意圖(槽值對),每個意圖(槽值對)都帶一個置信度)。所以DST往往也是輸出各個狀態的概率分布,這樣的表示也方便在多輪對話中對狀態進行修改。具體的情況如下圖所示:

2,DST的常用方法
DST的常用方法主要有三種:基於規則的方法,生成式模型,判別式模型,目前來看判別式模型的表現最好,也是當前研究的最多的方向。
1)基於規則的方法
基於規則的方法一般是用1-best的結果作為輸入,而且輸出的狀態也是確定型,基於規則的方法需要大量的人工和專家知識,因此在較復雜的場景適用性不強。當然基於規則的方法也有它的優點,基於規則的方法不依賴於對話數據,因此在沒有對話數據的情況下很適合冷啟動。基於規則的方法用N-best的結果作為輸入也有研究,但總的來說實現起來很復雜。
2)生成式模型
生成式模型主要是利用貝葉斯網絡推斷來學得整個狀態的概率分布,其通用表達式如下:

上面式子中$b(s)$代表上一時刻狀態的概率分布,$b'(s')$代表當前時刻的狀態分布,$u'$代表當前時刻的用戶輸入,$\tilde{u}'$代表當前用戶輸入的觀測輸出,$s'$代表當前時刻的狀態,$s$代表上一時刻的狀態,$a$代表上一時刻的動作,$\eta$是一個常數。
可以看出上面的公式還是比較復雜的,因此實現起來也比較復雜,傳統的生成式方法還要列出所有可能的狀態,以及狀態概率轉移矩陣等。
3)判別式模型
判別模型用一個最簡單的公式建模,可以表示成:
$b'(s') = P(s' | f')$
其中$b'(s')$表示當前狀態的概率分布,而$f'$表示對ASR/NLU的輸入的特征表示,早期的判別模型會利用SVM,最大熵模型,CRF等來建模。隨着神經網絡的興起,DNN,RNN等模型也越來越多的占領了這個領域。
3,DSTC數據集
DSTC全稱為Dialogu State Tracing Challenge(對話狀態最終挑戰)。在閱讀接下來的論文的時候需要對這些數據集有所了解,以DSTC2為例,一個餐館預定的數據集,數據集中提供了N-best ASR的結果,N-best SLU的結果。還提供了槽以及對應的值的信息。具體的可以去這里下載。
4,判別式模型在DST上的相關工作
接下來我們將按照,DNN,RNN,NBT,遷移學習等模型的順序來介紹一些相關的論文。
論文一:Deep Neural Network Approach for the Dialog State Tracking Challenge
在判別模型中是把DST當作一個分類問題,並且對ASR/NLU提取相關的特征作為模型的輸入,這篇論文提出了一種特征工程來提取N-best NLU的一系列特征,然后用一個前向的DNN來作為分類器,具體的模型結構如下:

接下來看下整個輸入輸出流程:
在$t$論對話中給定一個槽$s$,$S_{t, s}$表示在這$t$論對話中每一輪NLU的N-best列表中關於槽$s$所對應的值$v$,為了應對未知的值,還額外給定了一個Unknow來表示未知的值,我們將這$|S_{t, s}| + 1$個值作為模型的輸入,那么問題來了我們該怎么去提取這些槽值的特征呢?如上圖所示,$f_1, f_2, ......, f_M$就是表示不同的特征,論文中給出了12中特征,為了保證閱讀感(主要翻譯的不到位),就直接截圖了:

但是論文的輸入並不是對前$t$輪同樣的方式處理,而是有區分的處理,從$t$往前數前$T$輪直接用上面12中特征來表示,但是對於$t-T$輪之前的全部相加作為一個整體。那么問題來了,如果$t < T$怎么辦,對於$t - T < 0$的情況下,$f_i(t', v) = 0$。
對一個slot的不同的值,模型的參數是共享的,而對於不同的slot之間參數是不共享的,也就是說每個slot都有一個屬於它自己的分類器。
最后的輸出結果如下:

上面的式子其實類似於softmax,唯一不同的是對於不屬於$s$的槽統一用一個參數$B$來處理,而對於屬於槽$s$中的值$v$輸出是$E(t, v)$。
論文二:Word-Based Dialog State Tracking with Recurrent Neural Networks
上面的論文是用NLU的結果作為輸入,但從這篇文章開始的后幾篇文章都直接用ASR(語音識別)的結果作為輸入,那這樣做的結果有什么好處呢?主要有兩個優點:
1)NLU單獨作為一個子模塊的時候,也會產生誤差,這樣ASR+NLU的誤差傳遞會導致在進入到DST的時候就已經存在較大誤差了,因此合並NLU和DST可以減少這種誤差傳遞的影響。
2)在對任務型對話系統做評測時,無法判斷真個系統產生的錯誤時來源於哪個子模塊的,也就無法有效的定位錯誤的來源,因此減少子模塊可以提高錯誤定位的准確率。
這篇論文時基於詞級的對話狀態追蹤,因為它的輸入時N-best ASR的結果,使用RNN模型來序列建模,采用n-grams來提取ASR的特征。同樣本篇論文也是對每個slot單獨建模,每個模型都是一個多分類器,類別的個數和該slot下對應的value的個數相等。
1)特征表示
首先來看下是如何利用n-grams來表征輸入的,具體的見下圖所示:

模型的輸入除了當前輪的ASR,還有上一輪的對話動作(對話動作表示為act-type (slot = value)),對這兩者分別取1-gram,2-gram,3-gram。
從上圖可以看出,主要包含$f,f_s,f_v$這三種特征,$f$是直接對ASR的結果和對話動作取n-grams的結果,$f_s$和$f_v$都是對$f$中的詞進行$tag$(對slot用<slot>替換,對value用<value>)替換得到的模板泛化特征,其中$f_s$是對槽提取的特征,適用於該槽下對應的所有的值,而$f_v$對每個value都進行提取,屬於每個值的特有特征,這樣做有助於模型泛化。
然后$f,f_s,f_v$都是有ASR和對話動作兩部分連接而成。ASR是N-best列表,分別提取分別取1-gram,2-gram,3-gram,然后對於重合的n-gram就按照置信度相加;對話動作也是同樣,不過概率置1;具體可以參考上圖,其實本質上就是對ASR和對話動作提取n-gram,進行各種組合,目的是通過這種低階的多維組合,可以在高層重構出各種特征組合的可能性,來模擬甚至超越人工提取的各種特征。那么每個n-gram怎么用向量表示的呢,我猜應該是類似於one-hot,以$f$為例,將整個訓練集提取相應的n-grams,然后將$f$組成一個大的n-gram詞匯表$M$,先初始化一個長度為$|M|$的0向量,然后對於當前的輸入提去n-gram,再用相應的n-gram的分數去填充那個0向量(以上一段個人猜測,主要是論文中沒有提到,不過論文中提到了$f$的維度是高維,達到3500,再加上在計算的過程中一系列的向量拼接操作,所以這也符合這種情況)。
2)模型結構
輸入的表征確定好之后就要看看模型的結構了,模型的結構如下圖所示:

上圖中的$m$是一個記憶向量,$p$是某個slot下對應的value的概率分布,用一個$h$向量來表示特征$f$的低維表示$f, p, m$中的操作符是拼接的意思。
![]()
然后為了利用$f_s, f_v$的特征,提出了下面的表達式:

$g$向量保證了模型的泛化性能,更新$m, p$。
![]()
![]()
論文三:Neural Belief Tracker: Data-Driven Dialogue State Tracking
這篇論文提出了NBT這個模型,本論文也是合並了NLU和DST,直接用ASR的結果作為輸入,並且引入了詞向量來進行表征,整體上理解較上面兩篇論文要簡單。
話不多說,先上一張模型結構圖:

上圖中的最上一層是輸入,可以看到總共有三個輸入,分別是當前用戶的輸入$r$,當前的槽值對候選集$c$,上一時刻系統的對話動作$t$。首先我們來看下用戶的輸入怎么表征:
1)用戶的輸入表征
本文對用戶的輸入$r$分別提出了兩種表征方法:NBT-DNN,NBT-CNN。
NBT-DNN的結構圖如下:

具體的表達式如下:

上面式子中$u_i$表示句子中第$i$個詞的詞向量,$V_i^n$表示從第$i$個位置開始取的n個詞的向量拼接的結果。其實就是n-gram的方式取詞。



這里取了1-gram,2-gram,3-gram的結果,最后相加得到用戶輸入的向量表示$r$。
NBT-CNN的模型結構圖:

其表達式如下:

其實這里用卷積替代了n-gram,上面式子中的$n$表示卷積核的大小,$n = 1, 2, 3$,然后用最大赤化獲得最終的向量表示:



這樣就得到了最終的用戶輸入的向量表示。
2)語義解碼
從第一幅圖可以看到,用戶的輸入$r$和候選的槽值對是有相互作用的,這個相互作用該怎么表示呢?

上面$c_s$是槽$s$的詞向量,$c_v$是對應的值的詞向量,$r$ 和$c$之間是element-wise相乘的。
3)上下文建模
也是第一幅圖中描述的,用戶的輸入$r$和系統對話動作$t$之間的關系。
作者在這里定義了兩種系統的動作:一是系統請求用戶告知某個槽的值,如“what proce range would you like”,這種請款系統會提到一個槽的信息,用$t_q$表示;二是系統向用戶確認槽值對是否正確,如“how about Turkish food ”,在這種請款下用戶會提到一對槽值的信息,其中槽用$t_s$表示,值用$t_v$表示。

在上面如$(c_s . t_q)$是計算點積得到一個相似度可以作為門控機制用來控制對$r$的選擇,這種做法在系統問“how about Turkish food”,用戶回答“yes”的時候特別有用,因為此時用戶並沒有傳遞任何槽值的信息進來。這樣就可以利用上一個系統對話動作的信息。
因為候選槽值對每次只選一個,因此最后做一個二分類的決策:

其中$\phi_dim = \sigma(Wx + b)$, $dim$表示輸出的維度。
4)信念狀態更新機制
上面只是對某個槽值對做了二分類,那該怎么更新整個狀態概率呢?本文定義了一個基於規則的信念狀態更新機制。
在$t$輪對話時,用$h^t$表示ASR的N-best集合,$h^n_i$表示第$i$條句子,$p^n_i$表示第$i$個句子的置信度,$sys^{t-1}$表示系統在上一時刻的動作。則對於槽$s$更新其所有的值的概率分布:

結合之前所有的對話歷史,可以表示為:

之后取概率大於0.5的槽值對出來更新當前的狀態值,沒有的話就依然保留上一時刻的值。這句話怎么理解呢?也就是下面的式子成立了才執行上面的式子,否則就不對上一時刻的信念狀態做修改。

論文:Fully Statistical Neural Belief Tracking
這篇論文是在上一篇論文的基礎上做了改進的,在上篇論文中提出了一個基於規則的信念狀態更新機制,對於這種基於規則定義的機制遷移到新的任務時需要大量的修改,因此本文提出了新的信念狀態更新機制。
同樣先上模型結構圖:

首先定義一下問題:在一個給定的$s \in V_s$,讓$b_s^{t -1 }$ 表示$t-1$時刻的信念狀態(一個長度為$|V_s| + 2$的向量,這里的2是指還包含兩個值:None和“dont care”)。在上一篇文章中更新信念狀態的機制如下:


作者認為這種機制並沒有學到$b_{s, v}^{t-1}$的內容,只是簡答的相加而已,而且還要在$b_{s,v}^t ≥ 0.5$的時候才執行更新。因此這種方法並不好。作者也就提出了兩種新的方法:
1)One-Step Markovian Update
其表達式如下,直接用softmax生成概率分布:

上面式子中給出的兩個矩陣的每一行都是對一個槽值對的操作。因此這種方式有一個問題,訓練樣本的稀疏性,每個對話中可能只包含一個槽值對,在訓練的時候無法更新$W_{curr}$和$W_{past}$,因此作者提出了第二種方法。
2)Constrained Markovian Update
在這里作者構造了一種不同的矩陣,其表達式如下:

讓對角線的元素相同,其余的元素相同,這樣就可以起到訓練的時候能更新到所有的參數。結果也表明這種方法的性能更好。
論文:INCREMENTAL LSTM-BASED DIALOG STATE TRACKER
這篇文章提出了一個簡單的方法,直接用LSTM來表示ASR的1-best的輸入,然后對每個slot做多分類,整體來說效果也還行。
模型結構圖如下:

其表達式如下:

上面式子中$a$為ASR的輸出,$r$為對應的置信度。利用一個網絡來進行表征,然后倒入到LSTM中,並softmax多分類。


最終在DSTC2上的結果對比:

在做了一些小處理之后的結果還行,不過這篇文章是15年的,但是實現起來簡單。
參考文獻:
MACHINE LEARNING FOR DIALOG STATE TRACKING: A REVIEW
The Dialog State Tracking Challenge Series: A Review
