小夕從7月份開始收到第一場面試邀請,到9月初基本結束了校招(面夠了面夠了T_T),深深的意識到今年的對話系統/chatbot方向是真的超級火呀。從微軟主打情感計算的小冰,到百度主打智能家庭(與車聯網?)的DuerOS和UNIT,到滲透在阿里許多產品的全能型智能客服小蜜,以及騰訊的小微和搜狗的汪仔,更沒必要說那些大佬坐鎮的獨角獸公司了,小夕深感以對話爲主戰場的NLP之風在工業界愈演愈烈,嚇得小夕趕忙碼了這篇文章。php
對話的概念很大,從輸入形式上分爲文本和語音,本文固然只考慮文本。從對話目的上分爲任務型對話與非任務型/閒聊型對話。顧名思義,任務型對話就是爲了解決任務而進行的對話,好比你讓Siri幫你定鬧鐘、發短信等,而閒聊型對話固然就是human-to-human的正常聊天啦。本文就不討論任務型對話了,有興趣的同窗能夠戳這裏掃掃盲,本文聚焦在非任務型對話的多輪對話問題上。html
要完成對話的建模,目前主要分爲檢索式、生成式以及檢索與生成融合的方式。顧名思義,檢索式就是經過檢索與匹配的方式從已有的大量candidate responses中找出最合適的那個做爲response;生成式則是事先經過訓練來把對話知識塞進模型中,推理的時候首先模型的encoder部分去讀歷史對話,而後模型中的decoder/語言模型部分直接生成相應的回覆;檢索與生成相結合的方法則玩法不少了,好比用生成模型來作檢索模型的reranker,用生成模型來做改寫,用生成模型生成的response來做爲檢索模型的一條response等。限於篇幅,本文只講純檢索式的,其餘的之後再說(maybe不會過久╮( ̄▽ ̄"")╭)。python
檢索式對話的通常套路是首先構建一個由大量query-response pair構成的知識庫(好比從豆瓣、貼吧等地方抽取),而後將對話中最後一次的回覆做爲query,經過經典的信息檢索方式(倒排索引+TFIDF/BM25)做q-q匹配來召回若干相關的candidate responses。注意,這一步實在太粗糙了,徹底沒有考慮語義,因此直接使用檢索分數來挑選最優response顯然是太過簡單粗暴不靠譜。因此咱們還須要使用考慮語義的深度文本匹配模型來將歷史對話與這些檢索出來的candidate responses進行matching/reranking,從而挑選出一個更加合適的response。git
那麼怎麼進行文本的深度匹配呢?github
一個很簡單的作法是直接把複述識別/天然語言推理/檢索式問答這些相關領域的文本匹配模型直接拿來用,可是顯然這樣僅僅建模的是單輪對話,因而聊天機器人就變成了只有7秒記憶的金魚╮(╯▽╰)╭,所以,建模多輪對話是很是有必要的。web
不過了解一下文本匹配模型是頗有幫助的。這方面今年COLING有一篇文章[6]總結的不錯,把基於表示與基於交互的SOTA匹配模型都給詳細總結對比了。面試
深度學習模型復現難?看看這篇句子對模型的復現論文這是 PaperDaily 的第82篇文章算法 本期推薦的論文筆記來自 PaperWeekly 社區用戶@zhkun。本文是 COLING 2018 的 Best Reproduction Paper,文章對 sentence pair modeling 進行了比較全面的介紹,針對目前表現最好的幾個模型進行了重現和對比,而且基本上實現了原文章中聲明的效果,很是值得參考。express 關於做者:張琨,中國科學技術大學博士生,研究方向爲天然語言處理。json ■ 論文 | Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering ■ 連接 | https://www.paperweekly.site/papers/2042 ■ 做者 |Wuwei Lan / Wei Xu 論文介紹 這篇文章是 COLING 2018 的 Best Reproduction Paper,文章主要對現有的作句子對任務的最好的幾個模型進行了重現,而且做者實現出來的效果和原文章聲稱的效果相差很少,這點仍是很厲害的,並且做者對語義理解的集中任務也作了相關梳理,文章簡單易讀,仍是很值得一看的。 任務 句子對建模是 NLP,NLU 中比較基礎,並扮演着重要角色的任務,主要集中在語義理解,語義交互上,這也是我本身的一個研究方向,大體有這幾類任務: 1. Semantic Textual Similarity (STS):判斷兩個句子的語義類似程度(measureing the degree of equivalence in the underlying semantics of paired snippets of text); 2. Natural Language Inference (NLI) :也叫 Recognizing Textual Entailment (RTE),判斷兩個句子在語義上是否存在推斷關係,相對任務一更復雜一些,不只僅是考慮類似,並且也考慮了推理; 3. Paraphrase Identification (PI):判斷兩個句子是否表達一樣的意思(identifing whether two sentences express the same meaning); 4. Question Answering (QA):主要是指選擇出來最符合問題的答案,是在給定的答案中進行選擇,而不是生成; 5. Machine Comprehension (MC):判斷一個句子和一個段落之間的關係,從大段落中找出存在答案的小段落,對比的兩個內容更加複雜一些。 論文模型 有了任務,做者選取了集中目前狀況下最好的模型,由於原文中每一個模型可能只針對了某些任務進行了不少優化,那這些模型是否真的有效呢,做者考慮這些模型在全部的任務上進行比較,在介紹模型以前,做者首先介紹了句子對建模的通常框架: 通常框架 1. 輸入層:適用預訓練或者參與訓練的詞向量對輸入中的每一個詞進行向量表示,比較有名的 Word2Vec,GloVe,也能夠使用子序列的方法,例如 character-level embedding; 2. 情境編碼層:將句子所處的情境信息編碼表示,從而更好的理解目標句子的語義,經常使用的例如 CNN,HighWay Network 等,若是是句子語義表示的方法,通常到這裏就結束了,接下來會根據具體的任務直接使用這一層獲得語義表示; 3. 交互和注意力層:該層是可選的,句子語義表示有時候也會用到,但更多的是詞匹配方法用到的,經過注意力機制建模兩個句子在詞層面的匹配對齊關係,從而在更細粒度上進行句子對建模,我的認爲句子語義表示也會用到這些,只是句子語義表示最後會獲得一個語義表示的向量,而詞匹配的方法不必定獲得句子語義的向量; 4. 輸出分類層:根據不一樣的任務,使用 CNN,LSTM,MLP 等進行分類判斷。 下圖展現了一些句子語義表示的模型的基本框架:
![]() 有了這個通常的框架,接下來做者選取了集中目前最好的模型進行重現。 模型選擇 1. InferSent[1]:BiLSTM+max-pooling; 2. SSE[2]:如圖 1,和 InferSent 比較相似; 3. DecAtt[3]:詞匹配模型的表明,利用注意力機制獲得句子 1 中的每一個詞和句子 2 中的全部詞的緊密程度,而後用句子 2 中的全部詞的隱層狀態,作加權和表示句子 1 中的每一個詞; 4. ESIM[4]:考慮了一些詞自己的特徵信息,和 DecAtt 比較相似; 5. PWIM[5]:在獲得每一個詞的隱層狀態以後,經過不一樣的類似度計算方法獲得詞對之間類似關係,最後利用 CNN 進行分類。 數據 爲了更好的展現每一個數據的狀況,在這裏直接用下圖展現做者使用到的數據集:
![]() 結果 直接上結果,上圖是原文章中的結果,下圖是做者重現的結果:
![]() ![]() 從結果上看,做者實現的效果仍是很厲害的,基本上跟原文章聲明的不相上下,固然因爲不是針對特定任務進行特別優化,全部效果仍是有一點點差的,但基本上能夠認爲是實現了原來的效果,並且做者也發現了一些有意思的現象,例如:表現最好的就是 ESIM,我的感受這裏面加入了不少次自己的一些信息,例如近義詞,反義詞,上下位信息等,這些信息其實對句子語義理解十分重要。 以上就是這篇文章的總體介紹,做者完整實現了這些方法,並在不一樣的數據集上進行驗證,工做量仍是很大的,並且對句子對建模進行了比較完整的介紹,仍是頗有意思的。 引用 [1]. A. Conneau, D. Kiela, H. Schwenk, L. Barrault, A. Bordes, Supervised Learning of Universal Sentence Representations from Natural Language Inference Data [2]. Shortcut-Stacked Sentence Encoders for Multi-Domain Inference, Yixin Nie and Mohit Bansal. [3]. A Decomposable Attention Model for Natural Language Inference, AnkurP.Parikh, Oscar Täckstöm, Dipanjan Das, Jakob Uszkoreit [4]. Enhanced LSTM for Natural Language Inference, Qian Chen, Xiaodan Zhu, Zhenhua Ling, Si Wei, Hui Jiang, Diana Inkpen [5]. Hua He and Jimmy Lin. Pairwise Word Interaction Modeling with Deep Neural Networks for Semantic Similarity Measurement
同媒體快訊
相關快訊
|
|
NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用)
高級詞向量三部曲:一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用) 1、理論簡述一、word2vecword2vec:與通常的共現計數不一樣,word2vec主要來預測單詞周邊的單詞,在嵌入空間裏類似度的維度能夠用向量的減法來進行類別測試。 弊端:
二、GloVe
GloVe綜合了LSA、CBOW的優勢,訓練更快、對於大規模語料算法的擴展性也很好、在小語料或者小向量上性能表現也很好。 2、測評
. 一、詞向量測評方法一直以來,如何測評詞向量仍是一件比較頭疼的事情。
類比數據來源:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt
如下語法和語義例子來源於:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt
詞向量類比:如下語法和語義例子來源於:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt
二、測評結果
類比評測和超參數: 相關性評測結果:
命名實體識別(NER):找到人名,地名和機構名 . 三、利用詞向量解決歧義問題也許你寄但願於一個詞向量能捕獲全部的語義信息(例如run便是動車也是名詞),可是什麼樣的詞向量都不能很好地進行凸顯。 . 3、Glove實現&R&python一、Glove訓練參數
. 二、用R&python實現python:python-glove(參考博客:glove入門實戰) R:text2vec(參考博客:重磅︱R+NLP:text2vec包——New 文本分析生態系統 No.1(一,簡介)) . 4、相關應用一、glove+LSTM:命名實體識別用(Keras)實現,glove詞向量來源: http://nlp.stanford.edu/data/glove.6B.zip 一開始輸入的是7類golve詞向量。The model is an LSTM over a convolutional layer which itself trains over a sequence of seven glove embedding vectors (three previous words, word for the current label, three following words). CV categorical accuracy and weighted F1 is about 98.2%. To assess the test set performance we are ensembling the model outputs from each CV fold and average over the predictions. 來源於github:https://github.com/thomasjungblut/ner-sequencelearning 二、PAPER:詞向量的擦除進行情感分類、錯誤稽查Understanding Neural Networks Through Representation Erasure(arXiv: 1612.08220) 提出了一種通用的方法分析和解釋了神經網絡模型的決策——這種方法經過擦除輸入表示的某些部分,好比將輸入詞向量的某些維、隱藏層的一些神經元或者輸入的一些詞。咱們提出了幾種方法來分析這種擦除的影響,好比比較擦除先後模型的評估結果的差別,以及使用強化學習來選擇要刪除的最小輸入詞集合,使用於分類的神經網絡模型的分類結果發生改變。 **分析揭示了 Word2Vec 和 Glove 產生的詞向量之間存在一些明顯的差別,同時也代表訓練語料中的詞頻對產生的詞的表達有很大的影響;
|
NLP︱高級詞向量表達(二)——FastText(簡述、學習筆記)
. 高級詞向量三部曲:一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用) 如何在python 很是簡單訓練FastText,可見筆者博客:極簡使用︱Gemsim-FastText 詞向量訓練以及OOV(out-of-word)問題有效解決 1、FastText架構
. 一、fastText 架構原理
fastText 模型輸入一個詞的序列(一段文本或者一句話),輸出這個詞序列屬於不一樣類別的機率。 |
|
VDCNN
論文連接:Very Deep Convolutional Networks for Text Classification 代碼:https://github.com/zonetrooper32/VDCNN
深度學習在NLP領域的應用基本被RNN/LSTM壟斷,並且基本都是淺層網絡(1層或2層),你們廣泛認爲加深網絡深度並無太大意義。而在圖像和語音領域則正趨向於使用更深層次的卷積神經網絡。本文做者試圖探究深層的卷積網絡在NLP領域的效果。做者認爲卷積網絡之因此能在圖像領域取得較好的效果是由於卷積操做擅長提取圖像像素之間的結構關係,而文本信息也有相似的結構關係:上下詞語、短語、句子之間,難點在於如何有效的學習句子的深層表示。 本文提出了一種新的架構-VDCNN, 它基於字符級別(character level),只利用小尺度的卷積核池化操做,包含了29個卷積層,在文本分類任務中的多個數據集上取得了state of art 的效果。
總體架構如Figure1所示,句子長度爲
論文說這樣能夠減小內存佔用,還沒想明白是爲何。—— ??
三次池化操做,每次池化特徵圖的大小都會減半,因此濾波器的數量也會相應double。如Figure1所示,濾波器的數量有三個量級,分別是128,256,512。最終Convolutional Block的輸出tensor大小爲 Convolutional Block的輸出會通過一個k-max pooling變成固定維度爲 這裏的池化操做使用的 k-max pooling,通常的最大池化層是在提取的特徵中只取最大的值做爲保留值,其餘值所有拋棄。CNN中採用Max Pooling操做有幾個好處:首先,這個操做能夠保證特徵的位置與旋轉不變性,由於不論這個強特徵在哪一個位置出現,都會不考慮其出現位置而能把它提出來。對於圖像處理來講這種位置與旋轉不變性是很好的特性,可是對於NLP來講,這個特性其實並不必定是好事,由於在不少NLP的應用場合,特徵的出現位置信息是很重要的,好比主語出現位置通常在句子頭,賓語通常出如今句子尾等等,而有些強特徵又會屢次出現這些位置,這些信息其實有時候對於分類任務來講仍是很重要的,可是Max Pooling 基本把這些信息拋掉了。其次,位置信息在這一步徹底丟失。 而 k-max pooling 的意思是:原先的Max Pooling Over Time從Convolution層一系列特徵值中只取最強的那個值,那麼咱們思路能夠擴展一下,k-max pooling能夠取全部特徵值中得分在Top –K的值,並保留這些特徵值原始的前後順序,就是說經過多保留一些特徵信息供後續階段使用。很明顯,k-max pooling能夠表達同一類特徵出現屢次的情形,便可以表達某類特徵的強度;另外,由於這些Top k特徵值的相對順序得以保留,因此應該說其保留了部分位置信息。
Convolutional Block的結構如Figure2所示,每一個Convolutional Block由兩個卷積層構成,每一個卷積層後接了一個Temporal Batch Normalization,以及一個ReLU激活層。濾波器的大小固定爲3,數量則遵循上文提到的兩個原則。加深網絡深度就是經過添加Convolutional Block的方式達到的。 Temporal Batch Normalization的原理和Batch Normalization是同樣的,都是作了歸一化處理,好處是下降了網絡對學習率的敏感度,能夠使用大學習率,而且有泛化的能力,不用替代了dropout。Temporal Batch Normalization和Batch Normalization的不一樣在於:Batch Normalization是在空間位置上作歸一化(對應特徵圖的每個像素),Temporal Batch Normalization是在時序位置上作歸一化(對應特徵圖的每個時刻向量)。
做者在深度爲9,17,29,49的狀況下作了實驗。實驗結果如Table5所示。
|
NLP︱高級詞向量表達(三)——WordRank(簡述)
查詢king關鍵詞,WordRank 、 word2vec、fastText三者效果對比: . 一、wordRank,與 word2vec、fastText三者對比來源博客:《WordRank embedding: 「crowned」 is most similar to 「king」, not word2vec’s 「Canute」》 二、wordRank,與 word2vec、GloVe三者對比來源paper:WordRank: Learning Word Embeddings via Robust Ranking
左圖使用數據:WS-353 word similarity benchmark
結論:
綜上,WordRank更適合語義類比,FastText更適合不一樣語料庫下全部詞頻的語法類比。 . 高級詞向量三部曲:一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用) |
|
文本分類相關的知識,因此在此作一個總結。 介紹 定義
應用
方法
傳統方法分類流程
![]()
文本預處理英文
中文
文本表示將文本轉換成計算機可理解的方式。一篇文檔表示成向量,整個語料庫表示成矩陣
特徵權重計算
TF:詞頻率 TF*IDF: 詞頻率乘以逆文本頻率
特徵選擇特徵選擇是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其他的特徵項,從而達到降維的目的
![]() 分類器
深度學習方法利用詞向量表示文本,將沒歌詞表達爲nn維稠密,連續的實數向量。
![]() 原理是把句子中全部的詞進行lookup獲得詞向量以後,對向量進行平均(某種意義上能夠理解爲只有一個avg pooling特殊CNN),而後直接接 softmax 層預測label。在label比較多的時候,爲了下降計算量,論文最後一層採用了層次softmax的方法,既根據label的頻次創建哈夫曼樹,每一個label對應一個哈夫曼編碼,每一個哈夫曼樹節點具備一個向量做爲參數進行更新,預測的時候隱層輸出與每一個哈夫曼樹節點向量作點乘,根據結果決定向左右哪一個方向移動,最終落到某個label對應的節點上。
![]() 詳細原理以下: ![]() 首先,對句子作padding或者截斷,保證句子長度爲固定值
![]()
![]()
![]() 利用前向和後向RNN獲得每一個詞的前向和後向上下文的表示:
編輯於 2018-07-20
|
|
基礎比較差的同窗能夠看這篇文章,從2013年的DSSM[9]開始入手,慢慢補。篇幅所限,加上這方面研究相對很充分了,小夕就不展開講啦。因此話說回來,將多輪對話與候選回覆進行匹配的正確方式是什麼呢?
一切還要從兩年前的秋天提及,曾經,有一個少年。。。
算了算了,仍是正經點吧,要否則無法寫了╮( ̄▽ ̄"")╭總之,小夕從衆多魚龍混雜的檢索式多輪對話的論文裏精選出以下4篇進行串燒(按時間順序,從經典到state-of-art),包括:
不過不要怕,小夕的論文分享老是淺顯易懂還帶點萌( ̄∇ ̄)
想一下,怎麼才能從單輪q-r的匹配擴展到多輪呢?一個最最最簡單的想法就是直接把多輪對話首尾鏈接變成一個長長的單輪╮( ̄▽ ̄"")╭好比這種:
如上圖,首先將各輪的對話鏈接起來(這裏在鏈接處插入一個"__SOS__"的token),而後這裏用RNN系網絡取最後時刻隱態的方法分別獲得query和response的向量表示,進而將這倆向量經過 的方法獲得匹配分值(M爲網絡參數),進而經過
獲得匹配機率(p爲參數)。固然,其實這裏本質上就是一個基於表示的文本匹配模型,因此徹底能夠用更復雜的表示方法和匹配函數(如SSE模型[8])來完成這個過程。
聰明的童鞋確定能夠想到,顯然這種將長長的word embedding sequence直接塞進網絡獲得整個多輪對話的表示(context embedding)的作法未免太看得起神經網絡對文本的表示能力了,所以做者提出,不只要在這個word-level上進行匹配,並且還要在一個更高的level上進行匹配,這個level稱爲utterance-level(即把對話中的每條文本(utterance)看做word)。
如上圖的綠色->黃色->紅色的部分,首先獲得對話的每條文本(utterance)的向量表示(這裏用的14年Kim提出的那個經典CNN),這樣歷史的多輪對話就變成了一個utterance embedding sequence。以後再經過一層Gated RNN(GRU、LSTM等)把無用的utterances中的噪聲濾掉,進而取最後一個時刻的隱狀態獲得整個多輪對話(context)的context embedding啦。
拿到context embedding後,就能夠跟以前word-level中的作法同樣,獲得對話與candidate response的匹配機率啦。最後,將word-level獲得的匹配機率與utterance-level獲得的匹配機率加起來就是最終的結果。
實驗結果以下
能夠看到utterance-level確實是明顯比word-level work的,並且集成一下提高效果更顯著。所以從這篇論文後的大部分論文也follow了這種對每條utterance分別進行處理(表示或交互),然後對utterance embedding sequence用Gated RNN進行過濾和獲得context embedding的思路。
而到了2017年,文本匹配的研究明顯變得更加成(花)熟(哨),各類花式attention帶來了匹配效果的大幅度提高,這也標誌着檢索式多輪對話這方面的玩法也將變得豐(麻)富(煩)。
若是說Multi-view模型在檢索式多輪對話領域開了個好頭,那麼SMN則是將這個大框架往前推動了一大步。雖然表面上看Multi-view模型與SMN模型相去甚遠,可是熟悉文本匹配的小夥伴應該有注意到,16年左右,基於交互的匹配模型開始代替基於表示的匹配模型成爲主流[6],所以在Multi-view中內嵌的匹配模型是基於表示的,而到了17年的這個SMN模型則使用了前沿的基於交互的匹配方法。另外除了改變文本匹配的「派系」以外,SMN還有一個比較亮的操做是在作文本匹配的時候考慮了文本的不一樣粒度 (granularity) 之間的匹配,這個操做也成爲了後續一些paper的follow的點。
對文本匹配比較熟悉的同窗應該在AAAI2016看過這麼一篇paper:
Text Matching as Image Recognition (參考文獻[5])
如圖,基本思想就是,使用傳統的attention來計算出兩個文本的word-level對齊矩陣/類似度矩陣後,將該矩陣當作一個圖像,而後使用圖像分類模型(如CNN)來獲得更高level的類似度特徵表示(好比phrase level, segment level等),進而最終獲得全局的類似度匹配特徵。這也是最先的幾個交互式文本匹配模型之一。
SMN這篇paper就是採用了這個思想。給定一個candidate response,在生成word-level的每一個utterance的向量表示的時候,首先計算出歷史上每一個utterance跟該response的對齊矩陣,而後對每一個對齊矩陣,均使用上面這種圖像分類的思想生成high-level表徵文本對類似度的特徵向量做爲該utterance的向量表示(utterance embedding)。
以後就是使用前面Multi-view中的作法,從這個utterance embedding sequence中獲得整個對話的context embedding,最後將該context embedding和以前的word-level下獲得的context embedding與response的向量去計算類似度了。
不過做者這裏在計算對齊矩陣和獲得context embedding的時候,用了更復雜一些的方法。如圖
在計算對齊矩陣的時候,做者不只用了原始的word embedding,並且同時用了RNN系模型對文本encoding以後的隱狀態(即編碼過上下文信息的word embedding,能夠看做phrase-level的"word embedding"了),這樣就生成了兩份對齊矩陣,而後這樣將兩份對齊矩陣做爲兩個channel丟進「圖像分類模型」,從而保證了即便圖像分類模型很淺,也能抽取出比較high-level的特徵,獲得高質量的utterance embedding。
另外,做者這裏在獲得最終的context embedding的時候,除了使用RNN最後一個隱狀態的傳統作法(記爲 )外,做者還額外實驗了對頂層各個time step的隱狀態進行加權求和(權重可訓練)的方式(
)以及更復雜的集成utterance自身表示的信息並使用self-attention的方式(
),實驗結果代表,總的來看
的方式稍好一些(不過考慮到額外引入的計算和存儲開銷,通常不值得這樣作)。有興趣的同窗能夠去看原paper,這裏就不展開講啦。
從實驗效果來看,SMN相比較以前的Multi-view有很大的提高,這也說明了:
雖然看似SMN已經考慮很周到了,可是若是細想一下,其實SMN的建模方式仍是跟現實中人們的聊天習慣存在不小的gap的。其中一個方面就是,Multi-view和SMN都沒有重視utterances之間的語義關係,僅僅是經過一層Gated RNN進行了軟過濾和簡單encoding。然而其實不少時候建模utterances之間的關係是頗有必要的,甚至對於過濾來講也是很重要的信息,這也是DUA的motivation。咱們知道,其實聊天中不多從頭至尾都是一個主題,好比下面的對話:
case1:
u1-> 路人甲:小夕,中秋節你去哪裏玩兒啦?
u2-> 小夕:固然是去買買買呀~
u3-> 路人甲:你以前不是想去爬百望山嘛?沒去嘛?
u4-> 小夕:想去呀,然鵝她們去玩兒都不帶我(。 ́︿ ̀。)
u5-> 路人甲:你稍等下啊,我下樓取個快遞
u6-> 小夕:去吧去吧,順便幫我買個辣條!
u7-> 路人甲:好呀,要啥口味的?雞肉味?
u8-> 小夕:這特喵的還分口味?
u9-> 路人甲:回來啦,對了,要否則下週我帶你去吧?
u10-> 小夕:好呀好呀,喵喵喵~
這裏若是把小夕看做是檢索式chatbot,假如對話進行到第6步(u6),這時候最後一個utterance是u5,也就是「你稍等下啊,我下樓去取個快遞」。顯然,這時候其實至關於對話的話題發生了劇烈偏移,若是這時候小夕去跟一堆candidate responses作匹配的時候還去考慮u1-u4這些登山相關的utterances的話,顯然就容易召回跟u5很不相關的回覆。一樣的道理,若是對話進行到u8,其實這時候真正有用的historical utterances是u6-u7;對話進行到u10的時候,有用的utterances又變成了u1-u4。
除此以外,對話中還容易夾雜一些相似於停用詞的噪聲,好比
case2:
u1-> 路人乙:小夕,明天約約約?
u2-> 小夕:。。。
u3-> 路人甲:哈哈
u4-> 小夕:應該木有時間
這裏的u2和u3就是相似於停用詞的「停用utterance」,因此對於這一類utterance,最好的辦法就是忽略掉而不是讓它們參與匹配。
怎麼解決上述這兩類問題呢?那就直接上這個讓人看着灰常懵逼的DUA的模型圖吧:
如圖,這個圖乍一看有點亂(其實畫的確實不怎麼樣(做者應該不會看個人文章吧2333))
啊啊啊做者居然真的看我文章了QAQ論文做者在評論區出現的那一刻個人心情是複雜的!
論文裏的公式標記也用的亂亂的(尤爲第3.3節憑空冒出來的n弄得我懵逼了很久,究竟是不是3.1節的n,是的話這裏貌似就不對了,若是不是,這裏又表明啥);一些細節也沒交代清楚(好比3.1的S究竟是個矩陣仍是向量,若是是向量,那麼怎麼獲得的這個向量?是矩陣的話3.2節的聚合又不對了)。
超級感謝論文做者 的耐心解惑,一會兒清楚多啦。以下:
首先,3.3節的n與3.1節的n是相同的指代,若是做者以爲指代相同的時候有什麼問題的話,歡迎進一步交流。同時,很是抱歉咱們在3.1裏把3.2中定義的東西用了進來,其中3.1節的S_k指的是3.2節中的S的每個組成部分,即,S_1, S_2,...,S_t,S_r。若是還有相關問題,歡迎隨時來交流!
不過,其實這裏的思想很明確,就是說,之前的paper呀,獲得utterance embedding後就直接拿去RNN了,都沒有像處理word embedding那樣去好好作encoding,因此咱們這裏對utterance embedding也一樣要作深度的encoding!
那麼怎麼作這個encoding呢?經過觀察上面的倆cases能夠發現,不少時候對話中是有hole的(好比上面case1中的u9的上一句話是u4,因此u5-u8造成了一個空洞),甚至可能不少個hole,因此這裏作encoding的時候最合適的是使用self-attention而不是RNN更不是CNN。因此做者在這裏先用了一層(加性)self-attention來把上下文編碼進每一個utterance embedding:
這裏 是t時刻的utterance embedding(就是前面聚合操做以後的那個向量表示),
是其上下文(即所有時刻的utterance embedding,一共n個)。 經過這個encoding操做,一會兒每一個時刻的utterance都能跨越時間和空洞把本身的那一羣小夥伴聚在一塊兒啦。
然鵝顯然self-attention丟失了utterance的順序信息,所以做者這裏又把encoding後的utterance embedding跟encoding前的utterance embedding拼接起來又過了一層Gated RNN:
Gated RNN(GRU、LSTM等)一方面能夠按照時序進一步encoding,另外一方面裏面的輸入門也起到了filter的做用,正好能夠在增強encoding的同時把無用的信息過濾掉。看,這樣就完成了當時的motivation,最後的這個utterance embedding能夠說乾淨合理的多了。整個模型的其餘部分則跟SMN基本沒區別。
從實驗結果來看,DUA的性能確實比SMN有了進一步明顯的提高。
這篇是多輪對話領域可貴的好paper,可能xiangyang大佬太忙,都木有打打廣告什麼的╮( ̄▽ ̄"")╭。做者這裏拋棄了以前的建模utterance embedding sequence的思路,而是把NLP不少領域的前沿操做優雅乾淨的整合爲一個全新的框架來建模多輪對話問題,不只模型很是work,實驗章節也對模型各個component的特色和有效性進行了充分的探索和論證,是繼Multi-view和SMN以來多輪對話領域又一個不得不提的經典模型。
另外,遇到一張清晰漂亮的模型圖不容易哇,就直接上圖吧
ps:這張圖這麼少女心,我猜是lilu女神畫的。
還記得前面說的SMN的一個亮點是作了兩級粒度的文本表示嘛?那麼很天然的就有了一個問題:兩級就夠了嘛?有沒有必要設置更多級呢?若是有必要的話,那麼怎麼去表示和學習這更多級粒度的語義表示呢?
首先答案固然是確定的,17年的SSE文本匹配模型和今年特別火的ELMo[10]都說明了對文本的深層表示能夠學習到更加高level的語義單元,然而咱們知道像SSE和ELMo這種堆多層RNN的作法會極大的增長模型的推理代價,這極大的限制了它們在工業界的應用。而堆多層CNN在文本里又不容易調work,須要精細的設計網絡並藉助一些tricks,所以很天然的作法就是使用Transformer[11] encoder來獲得文本的多級表示啦(沒看過transformer那篇paper的趕忙去補啦,作NLP哪能不知道transformer)。
因此如圖,DAM首先就用transformer的encoder來獲得了每一個utterance和response的多粒度文本表示(即圖中的Representation部分),以後做者對每一個utterance-response pair的每一個粒度下的表示分別計算兩個對齊矩陣(即圖中的Matching部分)。
等下,怎麼是倆對齊矩陣?除了傳統的計算對齊矩陣的方式,還有新的玩法啦?
這裏做者提出了一種更加深(隱)層(晦)的匹配方法,操做不難,可是爲何會work仍是挺難以理解透徹的(雖然做者在5.2節已經有很努力的講了)。總之,先來簡單提一下傳統的attention計算對齊矩陣的方式。
傳統的方法無非就是把文本1中的word embedding sequence和文本2中的word embedding sequence進行詞-詞比較,這裏的比較分爲加性方法和乘性方法,基礎差的同窗能夠看下面這段複習一下。
注:詞-詞比較的方式分爲加性和乘性,加性就是將要比較的兩個word embedding進行相加(相加前能夠先過一個線性變換甚至MLP)而後激活後跟一個虛擬的向量作內積(其實這個虛擬向量就是個可訓練的同維度向量,我理解的它存在的意義就是對每一個維度的加法比較+激活後的結果進行scaling,畢竟維度不一樣方差也可能不一樣嘛),內積的結果就是對齊程度啦。乘性則容易理解一些,就是將兩個word embedding直接進行相乘(準確說是內積)或中間夾一個可訓練方陣(即 的形式),內積的結果就是對齊的程度啦。不過要記得當維度很高時,乘性方式最好對結果作個歸一化以避免進入softmax飽和區(參考Transformer)。
如上式,做者這裏使用的是乘性的方式,這裏的l就是指的第l級粒度, 是指的第i個utterance,
有
個詞,response有
個詞。這裏就是說,對於每級語義粒度的每一個utterance,都是將其中的每一個詞k去跟response中該粒度下的每一個詞t去算內積,從而獲得一個
的對齊矩陣。
對於傳統的attention,若是兩個詞在semantic或syntactic上離得近,就容易獲得比較大的匹配值(如run和runs, do和what)。然而對於一些比較深層和隱晦的語義關係就很難直接匹配了(咱們不能強求前面的網絡把各級粒度的語義單元的embedding都學的那麼完美呀對吧),因此做者這裏提出了一個更加間接和隱晦的attention方式,以下
這裏的AttentiveModule的3個參數依次爲attention的Query、Key和Value,不熟悉的同窗去複習Transformer,這裏就不贅述啦。首先看公式8和9,這裏先經過傳統的attention來把utterance和response中的每一個詞用對面文本的詞加權表示,獲得新的utterance的word embeding sequence表示和新的response的word embedding sequence表示,以後再用一層傳統的attention來計算出一個對齊矩陣來做爲第二個對齊矩陣。
顯然這種方式將utterance中的詞和response中的詞之間的依賴關係(dependency information)也做爲詞的表示加入了對齊矩陣的計算,因此說是建模了更加深(復)層(雜)的語義關係。不過,做者在論文5.2節有提到這兩種attention方式匹配文本的操做實際上是互補的,而且給出了一個case解釋,然而小夕功力有限,努力理解了一下仍是沒理解
╮( ̄▽ ̄"")╭但願有看懂的小夥伴給小夕講講或者貼到評論區~
通過這麼深層的匹配後,每一個utterance中的每一個詞位都包含了2(L+1)維的匹配信息(L爲Transformer encoder的層數,1爲原始的word embedding,2爲對齊矩陣的數量),做者這裏又把utterances堆疊到一塊兒,就造成了這個漂亮的3D粉色大立方體
因此這個大立方體的三個維度分別表明對話上下文中的每一個utterance、utterance中的每一個詞(位)、response中的每一個詞(位)。
以後,再經過一個兩層的3D的卷積神經網絡來從這個大立方體中抽取特徵,獲得匹配層的特徵,最後的最後經過一個單層感知機獲得該candidate response的匹配機率。
說了這麼多,來看看實驗結果吧~
能夠看到實驗結果很是漂亮(當前的state-of-art),尤爲是 這種比較有實際意義的指標(從10個candidates裏召回top1)。並且DAM沒有像DUA那樣對utterance embedding sequence作深層encoding(這裏直接用的3D conv抽特徵了),可是實驗結果明顯比DUA好,能夠說網絡設計的很棒棒啦。
另外,做者這裏也給出了去掉各個component後的性能狀況:
好比對比DAM與倒數第二行能夠看到,去掉那個複雜的深度注意力機制後,網絡性能出現了明顯的降低,說明論文中提出的這個「間接」的注意力機制確實能捕獲到一些神奇的模式。
最後小夕很是主觀的總結一下這四個模型的亮點:
參考文獻
[1] Multi-view Response Selection for Human-Computer Conversation, EMNLP2016
[2] Sequential Matching Network- A New Architecture for Multi-turn Response Selection in Retrieval-Based Chatbots, ACL2017
[3] Modeling Multi-turn Conversation with Deep Utterance Aggregation, COLING2018
[4] Multi-Turn Response Selection for Chatbots with Deep Attention Matching Network, 2018ACL
[5] Text Matching as Image Recognition, AAAI2016
[6] Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering, COLING2018
[7] Enhanced LSTM for Natural Language Inference, ACL2017
[8] Shortcut-Stacked Sentence Encoders for Multi-Domain Inference, Proceedings of the 2nd Workshop on Evaluating Vector Space Representations for NLP. 2017
[9] Learning Deep Structured Semantic Models for Web Search using Clickthrough Data, CIKM2013
[10] Deep contextualized word representations, NAACL2018
[11] Attention Is All You Need, NIPS2017
前言:本文做者@我偏笑,是咱們「AI產品經理大本營」成員,也是「AI研習小分隊」的分享嘉賓之一(每4周分享一篇AI產品經理相關的學習心得總結);歡迎更多有興趣「主動輸出」的朋友們一塊兒加入、共同進步:)
以一週前的這條微博做爲開始——
一週前我講:相對的,天然語言解析技術已經逐漸再也不成爲各家廣義智能助理產品的核心競爭力,識別用戶意圖以後所提供的服務開始成爲對話機器人差別化的核心。
對於一個對話系統而言,我微博中所指的『後續服務』,就是上圖中的 DST(對話狀態維護)以及 Policy(動做候選排序),或者統一的稱其爲 DM(Dialogue Mannagement,對話管理)。也即,當接收到 NLU 模塊的輸出、其餘場景及用戶特徵信息以後,判斷系統應該跳轉到什麼狀態,以及執行什麼樣的動做。
產品角度,DM 是對話機器人封閉域多輪對話體驗的核心,正是一次次 DST + Policy 造成了人機間的多輪對話體驗。(注:我我的傾向於將「識別用戶意圖以後,爲了獲取必要信息,與用戶進行的有目的的多輪對話」稱爲封閉域多輪對話,區別於識別用戶意圖以前,爲了利用上文信息,所採用的『上下文替換』、『主體補全』等技術,也即開放域多輪對話。下文提到的『多輪對話』,均指封閉域多輪對話。)
既然多輪對話在對話機器人類產品體驗中扮演着如此重要的角色,我便開始思考:一個架構完備的多輪對話體系應該是什麼樣的。也即,多輪對話系統中,至少須要包含哪些模塊,才能爲用戶提供一種與人人對話相去不遠的人機對話體驗。
多輪對話定義
我有個習慣,就是在構造一個複雜系統以前,先從紛繁的細節之中跳出,嘗試抽象的描述整個系統,及系統中的各個模塊,也即爲它們『下定義』。這能幫助你在多種可行方案中作出選擇,也即幫你明確:什麼該作,什麼不應作,什麼該誰作。
基於以上思想,我嘗試先給出幾個我我的對於多輪對話體系定義問題的回答——
基本定義:什麼是多輪對話? (封閉域)多輪對話是一種,在人機對話中,初步明確用戶意圖以後,獲取必要信息以最終獲得明確用戶指令的方式。多輪對話與一件事情的處理相對應。
補充說明1:所謂『必要信息』必定要經過與用戶的對話獲取嗎? 不必定,即使是人與人之間的交流,對話自己所包含的信息也只佔總傳遞信息量的小部分,更多信息來源於說話人的身份、當前的時間/地點等一系列場景信息。因此多輪對話的信息獲取方式,也不該當只侷限於用戶所說的話。
補充說明2:多輪對話必定在形式上表現爲與用戶的屢次對話交互嗎? 不必定,若是用戶的話語中已經提供了充足的信息,或者其它來源的補充信息已足夠將用戶的初步意圖轉化爲一條明確的用戶指令,那就不會存在與用戶的屢次對話交互。
以上,是針對多輪對話總體定義問題的回答,每一個模塊的相關定義會在下文嘗試給出。
一、槽(slot)
基本定義:什麼是槽? 槽是多輪對話過程當中將初步用戶意圖轉化爲明確用戶指令所須要補全的信息。一個槽與一件事情的處理中所須要獲取的一種信息相對應。
補充說明:多輪對話中的全部的槽位都須要被填充完整嗎? 不必定,以以下對話爲例——
我:『去蕭山機場多少錢』
出租車司機:『70』
對話中的『70』,應當被理解爲70元人民幣,而沒必要再去追問:『你說的是人民幣、美圓、日元仍是港幣?』。這類信息應當以默認值的形式存在,也即槽有必填與非必填之分,與上文所說的『信息未必須要經過與用戶的對話獲取』相對應。
二、詞槽與接口槽
上文反覆的提到,對話內容並非獲取信息的惟一方式,用戶身份以及當前場景也包含着大量值得被利用的隱含信息。因此,與此相對的,一個完備的多輪對話體系應當同時具有從用戶話裏以及話外獲取信息的能力。
我我的將「利用用戶話中關鍵詞填寫的槽」叫作詞槽,「利用用戶畫像以及其餘場景信息填寫的槽」叫作接口槽。
舉個例子,我講『我明天要坐火車去上海』。其中,分別將『明天』、『上海』填入名爲『出發時間』、『目的地』的詞槽中,而我當前所在的位置,則填入到了名爲『出發地』的接口槽中。
三、槽組與槽位
我我的將「利用用戶話中關鍵詞填寫的槽」叫作詞槽,「利用用戶畫像以及其餘場景信息填寫的槽」叫作接口槽。
舉個例子,我講『我後天要坐火車去上海』。其中,分別將『後天』、『上海』填入名爲『出發時間』、『目的地』的詞槽中,而我當前所在的位置,則填入到了名爲『出發地』的接口槽中。
不知道上文錯的如此離譜的結論,有沒有引發你的注意:)
仔細讀一遍上面舉的例子,就會發現一個很嚴重的矛盾點:難道『出發地』這個槽不能由用戶指定?用戶徹底能夠說『我後天要坐火車從北京去上海』,那它是詞槽仍是接口槽?並且更進一步的,難道只能用『我當前所在的位置』來填入『出發地』這個槽中?好比,若是能讀到個人日程表,發現我明天會去杭州,那是否是就應該用『杭州』而不是『我如今所在的位置』來填『出發地』這個槽了?
從中咱們能發現什麼呢?同一個槽,可能會存在多種填槽方式。
我將可能包含多種填槽方式的槽稱爲槽組,槽組下面可能存在任意多個槽位,也即任意多種填槽方式,而每一個槽位又都對應着『詞槽』與『接口槽』兩種槽位類型之一。
本質上來說,槽組(也即上文中提到的『槽』),對應着一種信息,而幾乎不會有哪一種信息的獲取方式只有一種。因此一個『槽』會同時對應多種填槽方式也就是天然而然的了。
依照上文,同一種信息會有多種獲取方式,也即同一個槽組會對應多種填槽方式(槽位)。那不一樣填槽方式之間必然會存在優先級的概念。
就如同上文『訂票』的例子,『出發地』槽包含三種填寫方式,一種詞槽、兩種接口槽,天然的,詞槽的優先級最高,『日程表中隱含的出發地』次之,『我當前所在的位置』再次。
若是將其與前文提到過的必填/非必填結合起來,其填槽過程應當遵循如下步驟:
嘗試填寫詞槽
若失敗,嘗試填寫第一接口槽『用戶日程表中隱含的出發地』
若失敗,嘗試填寫第二接口槽『用戶當前所在位置』
若失敗,判斷是否該槽必填
若必填,反問用戶,重填詞槽 *若非必填,則針對該槽組的填槽過程結束
咱們須要知道,必填/非必填在邏輯上與槽組而不是槽位平級,只有信息纔會分爲必要/非必要,填槽方式不作這種區分。並且是否必填實際上與接口槽無關,只取決因而否須要與用戶進行交互。
四、澄清話術
與槽組(也即與一種信息)平級的概念還有一個,叫作澄清話術。
澄清話術是對話機器人但願獲取某種信息時所使用的問句。好比『目的地』對應的澄清話術就是『您想從哪出發呢?』,『出發時間』對應的澄清話術就是『您想什麼時間出發呢?』。
顯而易見的,澄清話術與槽組而不是槽位平級。
五、槽的填寫
上文講到,一個槽組可能會有多個槽位,槽位存在詞槽與接口槽之分。
先說詞槽。
詞槽信息的抽取其實仍是有些麻煩的,不過這屬於解析的問題,不在本文探討的範圍內,這裏只是簡單提一下,舉兩個例子:
用戶表達『不』,可能會有『不行』、『不是』、『算了』、『沒有』等一系列說法。
用戶話中有多個符合條件的關鍵詞,咱們整套多輪對話中有多個槽,每一個槽填一個仍是多個值?哪一個槽與哪一個詞對應?
同義詞典、規則、雙向LSTM+CRF,各有各的方法。
再說接口槽。
接口槽與詞槽相比,額外存在一個問題,就是:接口返回的結果就是用戶須要的結果嗎?
這裏須要分紅兩種狀況來討論,一種是:咱們明確知道接口的返回值能夠直接填入槽位(不是槽/槽組)中,不須要向用戶確認。
特別的,這裏還要明確一點,即使是上述狀況,也並不意味着當前槽/槽組只有該特定接口槽這一個槽位。有兩種狀況存在:一種是該槽組下只有這一個槽位,該接口的返回值直接填入槽位中,也至關於填入了槽/槽組中;或者該槽位下有多個槽位,接口槽的填入值並不必定最終做爲槽/槽組的填入值。
另外一種是:咱們知道接口的返回值只能做爲參考,須要用戶的協助才能進行槽位的填寫。
這種狀況下,須要提供選項,讓用戶最終決定該槽位的填入值,與詞槽同樣,這裏一樣須要處理單值/多值的問題。單值/多值在邏輯上與槽組平級。
此外,這裏還要注意一個否定選項的問題,好比我對阿里小蜜說,我忘記密碼了,它會經過接口拿到個人當前帳號,而後將其提供選項給我,問『你是忘記了哪一個帳號的密碼?』,不過,除了我當前帳號以外,還有一個選項也被提供出來了,就是『不,不是這個帳號』。
這表明了一類問題的存在,用戶的意圖並不必定包含在接口的所有返回值之中。因此就必然會有這樣一種相似『不要/不是/不』的選項,我將其叫作否定選項。
用戶選擇否定選項後,即意味着該槽位的填寫失敗了,須要填入一個特殊值表明失敗。用戶選擇否定選項的失敗,能夠與接口調用失敗等其它意外狀況合併處理,由於這都意味着該槽位填寫失敗,意味着該種信息獲取方式未能成功獲取信息。
若是該槽組下只有這一個槽位,這個特殊的失敗表徵值就應看成爲整個槽組的填入值,若是還有其餘槽位值,則根據槽位間優先級最終肯定槽組填入值。
六、平級槽和依賴槽
上面說到底都在講一個槽組的填寫,也即一種信息的獲取,但多輪對話的目的是將初步用戶意圖轉化爲明確用戶指令,這其中所須要的信息一般都不僅有一種。
談完了槽組與槽位之間的關係,接下來談一下槽組與槽組之間的關係,也即信息與信息之間的關係。
爲了便於理解,我先舉兩個例子來表明兩種多輪對話中所包含的極端狀況。
第一種:訂車票,你須要知道用戶出發的時間、地點、目的地、座位種類。這四個槽組之間,沒有任何依賴關係。換言之,你只須要肯定好這四個槽組中必填槽組之間的澄清順序,接收到用戶問句後,對還未填充完成的必填槽組依次進行澄清便可。我將這四個槽組之間的關係稱爲平級槽關係。
另外一種,不知道讀者玩沒玩過橙光,或者其它多結局的劇情類遊戲。它們的特色是什麼呢?每個選擇都會有影響到後續劇情發展也即 每一個槽組的填寫結果會影響其它槽組的填寫。換言之,部分槽組依賴前序槽組的填寫結果,在其依賴的前序槽組填寫完成以前,該槽組都沒法進行填寫。我將槽組間的這種關係稱爲依賴槽關係。
這種狀況下,整個多輪對話過程就造成了一棵樹,極端狀況下,這棵樹是滿的。樹上的每一個節點放置着一個會對後續對話走向產生影響的槽組。
槽關係的選擇要根據實際業務場景來肯定。
若是錯將平級槽採用依賴槽關係來管理,就會出現信息的丟失。好比 A、B、C,三者本爲平級槽關係,但卻將其用 A->B->C 的依賴槽關係來管理,那即使用戶問句中包含填寫 B、C 槽組的信息,也可能會因爲 A 槽組的未填寫而形成 B、C 槽組的填寫失敗。
若是錯將依賴槽採用平級槽的關係來管理,就會出現信息的冗餘,好比 A、B、C三者的關係爲 A、A1->B、A2->C,那即使用戶將值 A1 填入槽組 A 後,卻仍然須要向用戶詢問本不須要的 C 槽組的填寫信息。
上述兩種狀況屬於全平級槽關係與全依賴槽關係的特殊狀況,在實際的業務場景中,這兩種關係會是同時存在的,不一樣槽組間,既有平級槽關係,又有依賴槽關係。
實際業務場景中,完整的多輪對話過程一般會以樹的形式存在,每一個節點存在一個或多個槽組,用於獲取一種或多種信息,節點間的槽組爲依賴關係,節點內的槽組爲平級關係。
上文將多輪對話定義爲一件事情的處理,槽組/槽定義爲一種信息的獲取,槽位定義爲信息的一種獲取方式。這裏我傾向於將多輪對話樹結構中的一個節點定義爲處理事情的一個步驟。
一件事情的處理包含多個步驟,每一個步驟中須要補全一種或多種信息,每種信息存在一種或多種獲取方式。
上述定義和組裏算法大佬的定義有些分歧,不過誰讓這是個人文章呢:)就按個人來。
七、填槽意義
結合上文,咱們須要瞭解到,填槽的意義有兩個:做條件分支多輪對話、做信息補全用戶意圖。換言之,填槽不只是補全用戶意圖的方式,並且前序槽位的填寫還會起到指導後續信息補全走向的做用。
八、准入條件
上文咱們講到,完整的多輪對話過程一般會以樹的形式存在,樹中包含多個節點,表明處理這件事情的一個步驟。
而每一個節點,都應當有其特別的准入條件。樹的根節點每每須要限制 NLU 模塊的輸出,也即明確什麼樣的用戶意圖將會由該棵多輪對話樹來處理;樹的中間及葉子節點每每須要根據前序槽組的填槽結果以及其餘背景信息進行條件限制。(若是將全部信息,好比 NLU 模塊輸出,或是其餘背景信息都看作前序槽組的填寫結果,那就能獲得統一的槽組-條件-槽組-條件······形式,槽組用於獲取信息,條件用於信息限制)
我嘗試從兩個角度來描述一套完備的准入條件體系。
一個是多條件的組織形式,准入條件在邏輯上應該支持條件間的與或非,百度的 UNIT 平臺提供了一種相對成熟的組織形式,將准入條件總體劃分爲條件和條件組,條件包含在條件組中,組內條件間是且關係,條件組之間是或關係(固然這裏的且與或能夠根據自身業務狀況對調),條件自己支持非關係。
一個是單條件的限制能力,准入條件應當同時支持對前序槽組填寫值、填寫方式、填寫狀態進行限制。也即須要有針對值的條件、針對類型的條件和針對狀態的條件。簡單的講,狀態就是『填了嗎』,類型就是『誰填的』,值就是『填了什麼』。
不一樣業務場景下咱們會須要不一樣角度的限制條件。好比,上文中提到填槽的意義包含兩種:做條件分支多輪對話、做信息補全用戶意圖,若是僅僅做信息,那咱們一般就只關心『填了嗎』,只要填寫完成就進行後續步驟,並不關係『誰填的』以及『填了什麼』;可是若是槽組內的填入值會影響後續多輪對話走向,那咱們就傾向於經過槽組的填入方式或填入值來做多輪對話的分支。
1)答案系統
先明確一個觀點,多輪對話樹的節點屬於對話節點而不是答案節點,同一份答案可能會出如今多個對話節點中。
答案系統和多輪過程應當是解耦的,答案系統中的每份答案都應當設置好本身的觸發條件。舉個例子,若存在 ABC 三個槽,A=A一、B=B三、C=C1 提供答案一,A=A二、B=B一、C=C2 或 A=A三、B=B二、C=C1 提供答案二。
另外,答案的種類也不該僅侷限於文本,富文本、接口、話題切換,均可以視爲合理的答案形式。
2)話題切換
話題切換指用戶與用戶的對話從一個多輪過程切換至另外一個多輪過程,話題切換有主動切換和被動切換之分。
上文提到的做爲答案的話題切換,就能夠理解爲主動的話題切換。
被動的話題切換是指,系統發現沒法從用戶的問句中抽取信息以繼續當前的多輪對話,只好將其做爲一條全新的問句從新進行解析和話題識別。
話題切換,尤爲是主動的話題切換會涉及到一個新問題:槽繼承。舉個例子——
我:『我明天要坐高鐵從杭州到北京』
我:『算了,仍是坐飛機吧』
這種狀況下,機器人不該當重複詢問『出發地』、『出發時間』和『目的地』。
除了槽繼承,還有一個與之相對的問題叫作槽記憶,這一般適用在被動式的話題切換中。因爲解析失誤,或者其餘緣由,使得用戶跳出了原話題,當用戶在必定時間內從新回到原話題時,不該讓用戶重複進行填槽,該技術已被用於阿里小蜜,不過他們彷佛稱之爲『多輪狀態記憶』。
舉個例子——
我:幫我訂張從杭州到北京的機票。
VPA:請問您但願哪天出發呢?
我:明天杭州下雨嗎?
VPA:明天杭州有雷陣雨。
我:後天呢?
VPA:後天杭州天氣晴。
我:機票訂後天的。
VPA:好的,已幫你預約後天從杭州到北京的機票。
三、狀態切換
咱們還須要思考這樣一個問題,既然話題能夠切換,也即一個多輪過程能夠切換到另外一個多輪過程,那多輪過程當中的對話狀態是否能夠切換?
我舉兩個例子——
第一個:
我:幫我訂張機票,從杭州出發。
VPA:請問你想去哪呢?
我:(發現明天杭州有雷陣雨)換出發地。
VPA:請問你想從哪出發呢?
我:上海。
多輪對話應當容許回到前序節點。
第二個:
我:我想買個杯子。
VPA:如下是爲您推薦的杯子。(展現結果一)
我:換一換。
VPA:如下是爲您推薦的杯子。(展現結果二)
多輪對話應當容許重複進入同一節點。
就先這麼多吧:)
注,飯糰「AI產品經理大本營」 ,是黃釗hanniman創建的、行業內第一個「AI產品經理成長交流社區」,經過天天干貨分享、每個月線下交流、每季職位內推等方式,幫助你們完成「AI產品經理成長的實操路徑」。
---------------------
做者:黃釗hanniman,圖靈機器人-人才戰略官,前騰訊產品經理,5年AI實戰經驗,8年互聯網背景,微信公衆號/知乎/在行ID「hanniman」,飯糰「AI產品經理大本營」,分享人工智能相關原創乾貨,200頁PPT《人工智能產品經理的新起點》被業內普遍好評,下載量1萬+。