您的DST大礼包请查收
本文轉載自劉沖大佬(知乎id:嗚嗚哈)的知乎文章,鏈接:
https://zhuanlan.zhihu.com/p/40988001
除本文外,作者還寫了很多對話相關的良心好文!做對話的小伙伴千萬不要錯過這位良心答主噢( ̄? ̄)
很認真的前言
還不了解對話狀態追蹤(DST)在整個對話系統中的角色的小伙伴可以看小夕前不久的吐血科普文《對話系統的設計藝術》。
另外,還是要把小福利送給愛學習的小伙伴們鴨,訂閱號后臺回復「對話狀態追蹤」可領取小夕打包的本文papers噢~
推動DST問題前進的一個特別極其非常重要的競賽兼數據集就是DST Chanllege(DSTC)。因此本文主要會圍繞DSTC競賽進行介紹,模型也多是在該競賽的基礎上,使用相關數據集提出的方法。本文主要會從下面幾個方向進行介紹:
DST基礎
對話狀態定義
DST定義
DST實例
DST常用方法
Rule-based DST
Generative Models for DST
Discriminative Models for DST(分類+序列建模)
Web Rank for DST
基于深度學習的DST模型
DNN for DSTC1
Word-based RNN for DSTC2
Delexicalised RNN for DSTC3
Neural Belief Tracking(NBT)for DSTC2
Fully NBT
DSTC簡介
DSTC1
DSTC2
DSTC3
DST基礎
對話狀態定義:對話狀態St是一種將到t時刻為止的對話歷史簡化為可供系統選擇下一時刻action信息的數據結構,往往可以理解為每個slot的取值分布情況。
DST(Dialog State Tracking)就是根據所有對話歷史信息推斷當前對話狀態St和用戶目標。往往是pipeline對話系統中至關重要的一個模塊,上接NLU,下接Policy。如下圖所示:
如果把DST當做是一個黑盒的話,那么就可以簡化為如下“輸入→輸出”的形式,
輸入往往包含:
ASR、SLU 的輸出結果N-best,系統采取的action,外部知識等等;
輸出:
對化狀態St,用于選擇下一步動作;
由于ASR、SLU等組件的識別結果往往會出錯,所以常常會輸出N-best列表(帶置信度概率),這就要求DST擁有比較強的魯棒性。所以DST往往輸出各個狀態的概率分布,這樣可以在多輪對話中進行修改,并且方便bot向用戶發起澄清query。DST的例子見下圖:
DST常用方法
這里參考“The Dialog State Tracking Challenge Series: A Review”“MACHINE LEARNING FOR DIALOG STATE TRACKING: A REVIEW”這兩篇論文進行總結。主要介紹當前DST的一些主流方法,其實主要就是人工規則、生成式模型、判別式模型、Web Rank四大類。就目前來講,判別式模型效果更好,因為他通過特征提取的方法對對話狀態進行精準建模,而且可以方便的結合深度學習等方法進行自動提取特征。此外,RNN、CRF等模型可以將對話當做序列數據進行建模,學習對話輪次之間的狀態變化,較傳統的分類方法效果更好。
1,Hand-Crafted Rules for DST
一般只使用概率最高的SLU結果結合人工編寫的更新規則進行狀態更新:F(s,u’)=s’。例如,只有置信度高于0.8的slot和value才會被更新到對話狀態中。
優點:不需要訓練數據,很適合冷啟動,而且很容易將領域的先驗知識編碼到規則中。
缺點:無法利用ASR和SLU解析出的N-Best列表,也沒有辦法同時追蹤多種狀態。一般使用的規則都很簡單,沒有辦法定制復雜狀態的更新機制;缺乏靈活性。
===》有些方法直接編寫N-Best列表進行狀態更新。但是缺點是相關參數需要人工編寫制定,沒有辦法根據數據分布進行學習
2,Generative Models for DST
生成式模型主要是對數據集中存在的模式進行挖掘,學習出對話狀態的條件概率分布。常見的方法包括貝葉斯網絡和POMDP。通過構建對話狀態之間的轉義關系圖,建模各變量之間的依賴關系和概率分布計算公式。下面以貝葉斯網絡為例進行說明:
使用貝葉斯網絡對狀態分布進行預測,輸入是系統動作a+用戶動作u+(ASR+SLU結果u~)。
上面公式中b(s)代表上一時刻對話狀態的分布,b’(s’)表示預測的下一時刻狀態分布,u’表示用戶當前時刻的輸入query。所以用戶輸入u依賴于當前的對話狀態s和系統動作a,s’依賴于s和a’。
生成模型在效果上好于規則式方法,但是仍然無法完全利用所有有用的信息,原因就是其需要對所有特征之間的依賴關系進行精確建模,這是不現實的。而往往的做法是進行不必要的假設或者忽略對話歷史中一些有用的信息。所以效果仍然無法滿足需求。
3,Discriminative Models for DST
判別式模型的想法是先對觀察結果提取有用特征,然后進行建模:b’(s’) = P(s’|f’)。通過對當前輪次對話提取特征來表示,往往在一定程度上可以反映出對話的狀態,常見的特征見下面4.1節所使用的特征。常見的方法有兩大類:
一種是將特征用于訓練分類器,預測接下來的狀態s’是哪一個,需要將所有歷史信息抽象成一個固定維的特征向量。
(ME、NN、web_ranking等方法);
另外一種是將特征用于序列建模,比如馬爾科夫鏈、CRF、RNN等模型。
判別式方法的主要環節就是特征提取+模型。特征提取主要包括人工體特征和模型自己學(RNN的word-based方法等),而模型就是上面提到的分類和序列建模兩種。這也是我們接下來要介紹的主要方案。
缺點:判別式方法需要大量的標注數據用于訓練?multi_domain learning + 遷移學習 + 無監督自適應方法。
在上述的方法中,模型直接從大量數據中學習用戶行為(改變目標等),因此可以引入一些先驗知識改善狀態追蹤效果,比如對一些置信度高的SLU結果設計一些特定規則以表示狀態的轉換等。
深度學習模型DST
從這里開始將要介紹具體的模型,會針對DSTC競賽選擇幾個典型的DNN模型來介紹,具體的DSTC數據集會放在下一節進行介紹,因為主要是一些數據描述和競賽結果等內容,放在前面會比較占篇幅。根據上面DST的定義,我們知道DST的輸入是ASR+NLU的N-best列表,再加上bot上一時刻的動作等信息,而輸出是對話狀態和用戶目標的表征。但是在具體建模中,我們直接會把對話狀態細化為每個slot取值的概率分布。所以一般會對每個slot分別構建一個模型用于學習其概率分布,這樣做的好處是將問題簡化,方便實用深度學習的模型進行建模。
1、DNN for DSTC1
本文提出的模型把DST當做是一個分類問題,輸入是時間窗口T內的對話輪次提取出的特征,輸出是每個slot取值概率分布。該模型的優點是不需要知道slot取值的確定個數(參見DSTC1數據集特點,某些slot的取值范圍不確定),而且模型對特定域的過擬合很弱,可以很容易的遷移到其他相似domain上。模型結構如下圖所示:
對所有出現過的slot-value都進行下面的流程,再額外訓練一個unknown值,這也是不需要知道所有value取值的原因,因為他把每個slot都拆分成很多個二分類,而不是一個多分類問題:
其中1…M表示模型提取的M種特征(見下表)。
t…t-T+1表示T時間窗口內的對話輪,對于最近的T個輪次,每輪都提取響應特征;
0…t-T表示在此之前的所有輪,對于這些輪對話直接對其特征求和作為一維特征輸入。
所以最后留下T*M個特征。
接下來經過三個全連接層,得到最終的編碼向量E(t,v)(這里會對所有在t輪之前出現過的v都計算一次)。
計算各個slot的value 。
對于出現過的v,直接使用E(t,v)計算即可;
對于沒有出現過的slot,為每個slot訓練一個參數B。
然后進行歸一化,如下圖所示:
接下來看一下特征如何選取,為了達到更好的效果,本文選擇了如下12個特征:
2、Word-based RNN For DSTC2
本文提出模型的特點:
直接使用ASR輸出的結果,不用SLU(避免了SLU模塊的誤差),而且將DST當做是一個序列建模問題,直接使用RNN處理;
傳統判別式方法需要人工提取特征,而本文直接使用n-gram特征以重構那些人工特征;
構造一個與slot無關的RNN組件(見下面模型結構圖中g|v部分),以解決判別式模型過擬合的現象,從而追蹤未見過的系統狀態
同樣對每個slot訓練一個RNN,其輸入為上一輪用戶query和系統動作,輸出為本時刻的狀態概率分布,并更新內部記憶向量。直接輸出所有value的概率分布,對每個slot訓練一個多分類器。
接下來先來看看特征提取的辦法:
從上圖可以看出,主要包含f,fs,fv三種特征,f是對原始query提取的,fs和fv都是對query中的詞進行tag替換得到的模板泛化特征,其中fv對每個value都進行提取,這樣做有助于模型泛化。最終模型的輸入特征會達到3500維左右;
然后f,fs,fv都是有ASR和machine act兩部分連接而成。ASR是query的N-best列表,分別提取其一元二元三元組n-gram,概率就是n-best置信度相加;machine act(acttype(slot=value)結構)也是同樣,不過概率置1;具體可以參考上圖,其實就是對query和machine act提取n-gram,進行各種組合,目的是通過這種低階的多維組合,可以在高層重構出各種特征組合的可能性,來模擬甚至超越人工提取的各種特征。
然后接下來看一下模型的結構:
對每個slot訓練一個模型,輸出的是其所有value的可能取值+不存在的概率分布。模型也包含兩部分:h+g;
其中h是對f進行建模(h=NNet(f+p+m)),但是其泛化效果較差;
g是對每個v都有一個模型(g=NNet(f+fs+fv+{P|N,P|v}+m)),主要是一些標簽式的特征,其泛化效果較好
然后分別使用softmax和sigmoid對p和m進行更新。
3、Delexicalised RNN for DSTC3
仍然延續上述模型,只不過增加了無監督自適應學習過程,而且為了將模型泛化到一個新的domain,這里將上述模型中的h省去,易于泛化。模型結構圖如下所示:
論文主要是為了DSTC3中的新domain知識的學習。這里不再贅述,想要了解的同學可以看原論文和DSTC3。
4、Neural Belief Tracker(NBT)
目前的對話系統很難擴展:NLU要求大量訓練數據+模板用于捕捉用戶差異輸入。前面提到的幾個模型也都并不像傳統的深度學習那樣,使用的還是n-gram特征作為輸入。而且像Delexicalised這種方法需要大量的語義詞典、模板等人工構造的信息才能夠學習出相似、相關詞進行替換,整個模型的復雜度仍然很高。為了解決這些問題,NBT模型就首次引入了word2vec來學習和表征語義相似度信息。
?NBT模型使用表示學習的方法克服上述問題。首先使用word2vec將用戶輸入編碼成語義向量。然后使用context modeling + semantic decoding兩個子模塊對分別實現上下文建模和單輪NLU的功能。
第一部分:先來看一下使用word2vec進行表示學習的模型,這里提出兩種架構NBT-DNN + NBT+CNN,模型結構圖如下所示:
NBT-DNN模型流程:
先對輸入按照滑動窗口進行contactate得到向量vi(滑動窗口的長度分為1,2,3);
然后DNN模型對contactate之后的向量vi進行累加求和得到r1,r2,r3(分別代表n-gram的累加結果);
接下來通過一層神經網絡將向量映射到同一維度得到r1‘,r2’,r3‘;
最后箱量相加求sum,得到用戶輸入utterance的向量表示r
NBT-CNN模型流程:
先對輸入按照滑動窗口進行contactate得到向量vi(滑動窗口的長度分為1,2,3);
然后分別去窗口長度為1,2,3,寬度為1300,2300,3*300的卷積核對v進行卷積;
接下來對卷積結果使用Relu和max_pooling取出其最大值得到窗口1,2,3的編碼向量r1’,r2‘,r3’;
對向量進行求和得到最終用戶輸入utterance的表示向量r
第二部分:接下來看看整個系統的結構圖,里面包含了semantic decoding和context modelling兩部分:
semantic decoding:
判斷一個slot-value對是否出現在當前query中
candidate pair表示方法:
cs+cv直接使用詞向量表示即可:
c=tanh(W(cs+cv)+b)
語義表示向量:
d=r*c
context modeling:
對上一輪系統act結果進行解析,system request(tq)+system confirm(ts+tv)。
系統詢問(system request):
主要詢問某個slot的取值,用tq表示,mr=(cs·tq)r
系統確認(system confirm):
確認某個slot取值value,用ts和tv表示,用戶返回正向or負向信息。
mc=(cs·ts)(cv·tv)r
第三部分:Binary Decision Maker:進行二元決策,判定當前輪次中slot-value對的狀態;
狀態更新機制:
本文采用簡單的基于規則的狀態更新機制。
對每個ASR的輸出query按照上述方法求解其對應的每個slot-value對的概率值;
按照ASR的置信度對所有結果進行加權求和,得到slot-value的最終概率;
對歷史結果進行更新(按照置信度lamba,常取0.55,在歷史和當前值之間trade off);
最終,對于約束slot而言,取概率最高的value進行查詢,對request slot而言,直接返回結果,因為request類不需要多輪。
5、Fully NBT
這是ACL 2018的最新文章,其在NBT的基礎上,將原始的規則式狀態更新模型,融合到模型中進行聯合訓練,期末性框架圖如下所示:
本文提出了兩種更新機制:
One-Step Markovian Update
使用兩個矩陣來學習當前狀態和前一時刻狀態之間的更新關系和系數。
矩陣每一行學習一個特定value的概率。
?無法處理沒見過的value;
Constrained Markovian Update
只用4個參數來構建上述矩陣(對角線和非對角線)。
對角線用于學習當前值和過去值之間的關系,非對角線用于學習不同value之間如何相互影響;
可以看出Fully NBT已經可以實現全部的端到端學習,而且該文作者開源了本論文的可訓練
https://github.com/nmrksic/neural-belief-tracker
DSTC簡介
整體的三個數據集的數據情況如下圖所示:
DSTC1:公交線路查詢,目標固定不變。共5個slot(路線,出發點,重點,日期,時間),有些slot(時間和日期)的取值數量不固定。而且DSTC1的用戶目標在對話過程中不會發生變化。從下圖可以看出DSTC1競賽結果最好的是team6 entry4,用的是判別+生成+無監督自適應。而DNN方法效果還很一般,還不如人工規則的方案。
DSTC2:餐館預訂,用戶查詢滿足特定條件下的餐館的某些信息(電話、地址等),用戶目標會在對話過程中發生變化;我們可以從比賽結果中發現,已經大很多支隊伍開始嘗試NN的方法來解決DST問題,而且大都嘗試序列建模(CRF、馬爾科夫等),此外需要注意的是web ranking方法效果也比較好。而且很對隊伍都是直接使用ASR結果,不再用SLU組件。
DSTC3:在DSTC2的基礎上,增加一些新的slot,而且添加了新的域(旅游信息查詢)(只有很少的訓練數據)
最后還是要給愛學習的小伙伴送出小福利鴨,訂閱號后臺回復「對話狀態追蹤」領取本文papers噢~
總結
以上是生活随笔為你收集整理的您的DST大礼包请查收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ICLR2020满分论文 | 为什么梯度
- 下一篇: 薅羊毛 Colab使用外部数据的7种方法