熟悉搜索引擎的朋友會發(fā)現(xiàn)這個架構(gòu)跟搜索引擎的很類似。單輪問答一般來說就是FAQ問答,是基于業(yè)務(wù)問答對組成的問答庫進(jìn)行檢索匹配。其中FAQ問題集包含多個相似問法供用戶問題去匹配。預(yù)處理階段一般會進(jìn)行文本糾錯,標(biāo)準(zhǔn)化和底層NLP特征提??;召回階段會在倒排索引中召回若干個候選問題(粗排),而最后的匹配階段會基于各種模型進(jìn)行匹配打分并返回得分最高的結(jié)果(精排)。匹配階段還會引入其他模塊,如知識圖譜和拒識模型,目的是輔助提升匹配的最終準(zhǔn)確率。
retrieval中的匹配可以看做是naive solution,詞袋+VSM, 篩選候選夠用了,但是精排需要更精致的策略,第一,要利用監(jiān)督信息做擬合,我們構(gòu)建基于問題對的訓(xùn)練語料,擬合是否匹配這個二分類目標(biāo)。第二,特征上拋棄稀疏的詞袋模型,而是構(gòu)造各種相似度來做base scorer,然后利用非線性的抗噪能力強(qiáng)的xgboost來做融合,比如我們用到詞bigram, 字bigram, 核心詞,名詞等特征集合的相似度。這種方法的優(yōu)缺點是一體的,由于模型只學(xué)習(xí)字面相似的特征,因此不受領(lǐng)域影響,通用性強(qiáng),適合用在冷啟動階段;但也因為只考慮字面相似,無法處理更深層的語義匹配。
那如何度量語義的相似呢。詞向量技術(shù)的興起是語義匹配的前提,所謂詞向量,是將孤立的傳統(tǒng)的token表示映射到相互關(guān)聯(lián)的向量空間中,這種關(guān)聯(lián)性,或者說是相似性,是通過詞語的上下文的來描述的。也就是說,上下文越相似的詞語,他們的語義就越相似,詞向量的歐式距離就越近。這是很容易理解的,更妙的是,通過對向量進(jìn)行簡單加減運算,能夠呈現(xiàn)出概念的關(guān)系,比如king-man+woman的結(jié)果非常接近于queen, 因此說明詞向量能夠一定程度刻畫語義。那對句子如何做向量表示呢?一個簡單的想法是直接求和平均,WMD是另一個比較有意思且有效的做法,他將計算句子到句子的相似度建模成一個運輸?shù)膯栴},把句子p的各個詞,運輸?shù)絨的各個詞上,也可以說是變換;運輸成本是詞向量的cosine相似度,而要運輸?shù)氖歉鱾€詞在句子中的權(quán)重,用線性規(guī)劃求解一個最優(yōu)解,即為p到q的距離。另外還有個有效的方法是SIF,思路是做詞向量加權(quán)求和,但是突顯出句子中非通用的部分,即權(quán)重用詞頻倒數(shù)來計算權(quán)重,實驗效果也很不錯。
上面的方法有一個問題就是沒有利用有監(jiān)督信息,所以效果有明顯的天花板。下面介紹這個工作是基于深層網(wǎng)絡(luò)做有監(jiān)督學(xué)習(xí)的匹配的,做法也比較簡單,首先把句子文本用one-hot編碼,假如詞典大小是500K,那編碼完長度就是500K維,其實等于是詞袋模型,然后輸入到一個多層的神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí),最終得到一個128維的向量作為句子的語義表示,然后用cosine計算兩個句子與文檔的相似度作為模型輸出。這個方法其實是將高維稀疏的token特征映射到低維語義空間,跟詞向量的思路很類似,只不過訓(xùn)練目標(biāo)不同,并且這里使用了深層網(wǎng)絡(luò)結(jié)構(gòu)。
上面工作的問題是對句子的輸入進(jìn)行建模時還是詞袋模型的思路,沒有考慮詞的位置和順序信息,因此我們需要考慮引入特征提取能力更強(qiáng)的網(wǎng)絡(luò)單元。先介紹左邊這位大名鼎鼎CNN, 卷積神經(jīng)網(wǎng)絡(luò),原來是圖像領(lǐng)域上的關(guān)鍵技術(shù),通過不同的卷積核用來處理鄰近區(qū)塊信息提取。就好比一個人透過各種不同的過濾鏡片逐塊逐塊地觀察一副圖片,所謂橫看成嶺側(cè)成峰,關(guān)注到不同的影像然后記憶下來,再用這些不同的影像來對原始圖片做表達(dá),有點類似把信息分出了多個層次,顯然魯棒性更好。移植至到NLP上,CNN可以用來捕捉局部上下文的信息,如左邊這個例子,CNN觀察范圍為3,不同的卷積核關(guān)注不同的詞語組合,然后再通過最大池化選出關(guān)注度最高的部分,完成一次特征抽取過程。
但是CNN對上下文的處理能力依賴于窗口大小,遠(yuǎn)距離就沒辦法處理了,因此要考慮另一種網(wǎng)絡(luò)單元RNN,這種單元是專門為時序模型量身打造的,簡單來說,每一時刻t上的隱藏狀態(tài),或者說第t個詞上的語義編碼,都由兩個輸入共同決定,即上一時刻的隱藏狀態(tài)和當(dāng)前時刻的原始輸入,而為了解決遠(yuǎn)距離傳遞導(dǎo)致的梯度消失和梯度爆炸等問題,RNN有一些變種結(jié)構(gòu)來應(yīng)對,比如 LSTM和GRU等。
CNN和RNN都是對原始輸入進(jìn)行語義編碼的基本單元,編碼后的向量就可以接入多層感知機(jī)進(jìn)行相似度計算,如果是直接計算cosine相似度,那就是dssm的升級版,而更常見的做法是把兩個句子的編碼向量拼接在一起,再經(jīng)過一個多層感知機(jī)計算相似度,而這種方法統(tǒng)稱為表達(dá)式建模;
另一種方案考慮到兩個句子之間的交互信息對學(xué)習(xí)他們是否匹配顯然更為重要,這一類方案被稱為交互式建模,右邊是一個典型的例子,他最大的不同是首先對兩個句子的所有窗口組合進(jìn)行拼接和卷積,得到交互信息。然后再進(jìn)行多次卷積和池化得到表示。其他的交互方式還包括編碼之后,進(jìn)行交互操作,如作差,點乘等,還有計算attention表示,也是常見的交互方式。
下面介紹我們的方案,跟上面介紹的模型相比,我們的方案主要做了兩處改動,一個是使用了稠密連接的網(wǎng)絡(luò)結(jié)構(gòu),讓rnn層的輸入和輸出拼接在一起做為下一層的輸入,第二個是混合注意力機(jī)制,即在計算attention向量進(jìn)行交互式建模的基礎(chǔ)上,增加self-attention向量計算,然后把兩個attention向量經(jīng)過門機(jī)制進(jìn)行融合,這樣做一方面引入了問句間的交互信息,同時又增強(qiáng)了對自身的表達(dá)建模。
上面的模型是比較復(fù)雜的模型,參數(shù)量有5.8M。在實際中應(yīng)用中訓(xùn)練語料會嚴(yán)重不足,為了解決這個問題,我們引入了遷移學(xué)習(xí)的策略。首先第一種是多任務(wù)聯(lián)合學(xué)習(xí),比如在擬合兩個問句是否匹配的同時,也對問句進(jìn)行分類預(yù)測;另外還可以同時對匹配的問題對做seq2seq的翻譯模型訓(xùn)練。這兩個策略都證明能有效提升準(zhǔn)確率。
而另一個思路更加直觀,即引入其他領(lǐng)域的語料,所謂多語料遷移。Fine-tune即參數(shù)微調(diào)是其中一種做法,即先用通用語料訓(xùn)練網(wǎng)絡(luò),固定底層表達(dá)層的參數(shù),然后再使用領(lǐng)域語料調(diào)整上層參數(shù);另一種思路參考了對抗學(xué)習(xí)的思想,即引入一個新的任務(wù)“混淆分類器”去判別當(dāng)前樣本是來自源語料還是目標(biāo)語料,通過在損失函數(shù)中增加反向的混淆分類損失項,讓混淆分類器盡可能地?zé)o法區(qū)分樣本的來源,從而保證共享了參數(shù)的表達(dá)網(wǎng)絡(luò)能夠?qū)W習(xí)到兩部分語料中共性的部分。
以上的介紹都是為了完成一個基本的單輪對話機(jī)器人,而實際應(yīng)用中,往往存在需要需要交互的場景,比如查詢社保余額,就需要用戶提供指定信息,如姓名,身份證號,手機(jī)號等。這種是所謂任務(wù)導(dǎo)向型機(jī)器人,而另一種,基于知識圖譜的機(jī)器人也往往會涉及到多輪交互。這里簡單介紹一下多輪對話機(jī)器人的架構(gòu),整體上是一個對話管理系統(tǒng),總的來說是管理會話狀態(tài),包含4個模塊,分別是輸入部分:自然語言理解模塊NLU,負(fù)責(zé)意圖識別和抽取槽位實體,比如這里匹配到了意圖是查詢社保余額,抽取到了社保號1234。得到的意圖和槽位值會送入到對話狀態(tài)追蹤模塊,DST,他負(fù)責(zé)會話狀態(tài)的更新,形式化來說是一個函數(shù),輸入是當(dāng)前狀態(tài)s和當(dāng)前的query經(jīng)過NLU處理過得到的意圖和槽位值q, 輸出新的狀態(tài)s‘,下一步是把s’送入DPL,對話策略模塊,這個模塊是根據(jù)新的狀態(tài)s‘輸出行動a,通常這個決策選擇會依賴于一個外部數(shù)據(jù)庫或知識圖譜,最后,由輸出部分,自然語言生成模塊NLG負(fù)責(zé)將行動轉(zhuǎn)換為自然語言文本,返回給用戶。
以上是多輪對話的原理框架,可以用不同的方式實現(xiàn),近年來研究的熱點是所謂end-to-end的神經(jīng)網(wǎng)絡(luò)模型,希望可以利用神經(jīng)網(wǎng)絡(luò)的語義編碼能力和深層網(wǎng)絡(luò)的堆疊實現(xiàn)端到端學(xué)習(xí),減少各個模塊的擬合bias導(dǎo)致的損失。但實用中我們并不會真正實現(xiàn)輸入到輸出的end-to-end學(xué)習(xí),主要是因為模型深度過深不且多輪對話的語料非常欠缺,模型不好訓(xùn)練。實際中是分開各自的模塊進(jìn)行訓(xùn)練的,比如NLU中的槽位抽取就可以用基于神經(jīng)網(wǎng)絡(luò)的序列標(biāo)注模型來建模,意圖識別則可以通過之前的語義匹配模型或者分類模型來做都可以,NLG則是用seq2seq的翻譯模型來訓(xùn)練,這樣做比較靈活。而在多輪對話中比較受關(guān)注的是對話狀態(tài)和策略的建模,做法有多種,比如對上一次的agent輸出,本次的用戶輸入,當(dāng)前的狀態(tài)下可用的數(shù)據(jù)集合一起進(jìn)行編碼,然后輸入到一個神經(jīng)網(wǎng)絡(luò)中學(xué)習(xí)action的選擇,即policy learning,這里除了使用有監(jiān)督學(xué)習(xí),還可以進(jìn)一步使用強(qiáng)化學(xué)習(xí)的技術(shù),即構(gòu)造一個用戶模擬器,讓agent跟他不斷交互,根據(jù)交互是否完成任務(wù)和交互輪數(shù)來給agent不同的獎勵和懲罰,從而最終學(xué)習(xí)出高成功率的對話策略。這部分的內(nèi)容也特別有意思,希望以后可以單獨展開來說。
前面提到的單輪FAQ機(jī)器人,有一個問題是問答準(zhǔn)確率依賴于問答庫的質(zhì)量,而問答庫的構(gòu)建耗時費力,所以針對數(shù)據(jù)較大的非結(jié)構(gòu)化文檔,如果可以直接從中抽取答案,是非常理想的做法。比如斯坦佛大學(xué)開源的drQA,就是基于wikipedia的語料做的一個開放域上的問答機(jī)器人,我們來看看這種閱讀理解機(jī)器人的架構(gòu)示意,他也是基于檢索重排的思路,首先把可能的文段從語料庫中摘取出來,然后送入閱讀理解模型進(jìn)行答案定位,打分,排序和選擇得分最高的答案。閱讀理解模型與匹配模型是類似的,需要先對問題和候選文段進(jìn)行編碼表示,不同之處在于最終預(yù)測的目標(biāo)是答案的起始和結(jié)束位置。我所在的團(tuán)隊在去年,在閱讀理解的權(quán)威公開測評Squad v1中取得過第一的成績,同時參加這個測評的包括了google, facebook, 微軟,阿里idst, 科大訊飛等國內(nèi)外同行。說明業(yè)界對這種技術(shù)還是非??粗氐摹?/p>
下面分享小知在把以上技術(shù)落地產(chǎn)品化的經(jīng)驗。首先我們來看看小知的整體架構(gòu)圖,核心引擎有兩部分,一塊是上面重點闡述的深度語義匹配模型,另一塊是本次分享沒有展開的知識圖譜引擎,在此之上,我們構(gòu)建了FAQ機(jī)器人,多輪會話機(jī)器人(任務(wù)機(jī)器人),閑聊機(jī)器人等。以下是我們單輪和多輪機(jī)器人的示例。
在我們實際的落地項目中,得益于深度遷移模型的語義匹配能力和行業(yè)知識圖譜的的精準(zhǔn)匹配和輔助追問,小知機(jī)器人能夠做到95%左右的問答準(zhǔn)確率,并且節(jié)省了50%以上的服務(wù)人力,切實為政府和企業(yè)提升效率和降低成本。
在智能客服的基礎(chǔ)上,我們又打造了基于語音的電話機(jī)器人,力主融合智能客服,人工在線客服,工單系統(tǒng)和電話機(jī)器人,為客戶打造從售前售中售后的整體解決方案。
以下是電話機(jī)器人的整體架構(gòu)圖,核心是自然語言理解NLU模塊,負(fù)責(zé)識別用戶提問意圖
提取相關(guān)實體。根據(jù)NLU輸出的結(jié)果,內(nèi)置的對話管理引擎會進(jìn)行流程狀態(tài)流轉(zhuǎn)和跟蹤。
另外,ASR語音識別和TTS語音合成是不可或缺的重要服務(wù),這三個模塊相互協(xié)作,共同完成與用戶的交互。
最后對智能問答的未來發(fā)展提幾點我的看法。目前學(xué)術(shù)界比較公認(rèn)的一個方向是,需要更有機(jī)地結(jié)合模型和規(guī)則,而在問答領(lǐng)域,規(guī)則的一大組成部分就是知識圖譜,包括開放領(lǐng)域的知識圖譜和專業(yè)領(lǐng)域知識圖譜。而更進(jìn)一步地,我們需要研究帶有推理性質(zhì)的事理型知識圖譜去描述領(lǐng)域內(nèi)的規(guī)則和知識,讓機(jī)器人能夠處理帶有復(fù)雜條件的問題,提供更智能的回復(fù)。在我看來,智能問答的一個突破口就在于解決以上三個問題。以上就是今天分享的內(nèi)容,謝謝大家。
主講人介紹:
陳松堅,騰訊數(shù)據(jù)平臺部算法高級研究員,有著8 年的 NLP 研發(fā)經(jīng)驗,2017 年加入騰訊 TEG 數(shù)據(jù)平臺部,負(fù)責(zé)智能客服產(chǎn)品騰訊小知的算法規(guī)劃和落地。負(fù)責(zé)過多個智能客服項目,對封閉領(lǐng)域的智能問答有豐富的實戰(zhàn)經(jīng)驗。