檢索式chatbot:word2vec/GloVe/fasttext

 

小夕從7月份開始收到第一場面試邀請,到9月初基本結束了校招(面夠了面夠了T_T),深深的意識到今年的對話系統/chatbot方向是真的超級火呀。從微軟主打情感計算的小冰,到百度主打智能家庭(與車聯網?)的DuerOS和UNIT,到滲透在阿里許多產品的全能型智能客服小蜜,以及騰訊的小微和搜狗的汪仔,更沒必要說那些大佬坐鎮的獨角獸公司了,小夕深感以對話爲主戰場的NLP之風在工業界愈演愈烈,嚇得小夕趕忙碼了這篇文章。php

1. 掃盲

對話的概念很大,從輸入形式上分爲文本和語音,本文固然只考慮文本。從對話目的上分爲任務型對話與非任務型/閒聊型對話。顧名思義,任務型對話就是爲了解決任務而進行的對話,好比你讓Siri幫你定鬧鐘、發短信等,而閒聊型對話固然就是human-to-human的正常聊天啦。本文就不討論任務型對話了,有興趣的同窗能夠戳這裏掃掃盲,本文聚焦在非任務型對話的多輪對話問題上。html

要完成對話的建模,目前主要分爲檢索式、生成式以及檢索與生成融合的方式。顧名思義,檢索式就是經過檢索與匹配的方式從已有的大量candidate responses中找出最合適的那個做爲response;生成式則是事先經過訓練來把對話知識塞進模型中,推理的時候首先模型的encoder部分去讀歷史對話,而後模型中的decoder/語言模型部分直接生成相應的回覆;檢索與生成相結合的方法則玩法不少了,好比用生成模型來作檢索模型的reranker用生成模型來做改寫用生成模型生成的response來做爲檢索模型的一條response等。限於篇幅,本文只講純檢索式的,其餘的之後再說(maybe不會過久╮( ̄▽ ̄"")╭)。python

2. 檢索式模型的套路

檢索式對話的通常套路是首先構建一個由大量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

  • 發表於: 2018-06-19
  • 原文連接:https://kuaibao.qq.com/s/20180619B0PABZ00?refer=cp_1026
  • 騰訊「雲+社區」是騰訊內容開放平臺賬號(企鵝號)傳播渠道之一,根據《騰訊內容開放平臺服務協議》轉載發佈內容。
 
 
 

 

 

NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用)

有不少改進版的word2vec,可是目前仍是word2vec最流行,可是Glove也有不少在說起,筆者在本身實驗的時候,發現Glove也仍是有不少優勢以及能夠深刻研究對比的地方的,因此對其進行了必定的學習。 
部分學習內容來源於小象學院,由寒小陽老師授課《深度學習二期課程》


高級詞向量三部曲:

一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用) 
二、NLP︱高級詞向量表達(二)——FastText(簡述、學習筆記) 
三、NLP︱高級詞向量表達(三)——WordRank(簡述) 
四、其餘NLP詞表示方法paper:從符號到分佈式表示NLP中詞各類表示方法綜述


1、理論簡述

一、word2vec

word2vec:與通常的共現計數不一樣,word2vec主要來預測單詞周邊的單詞,在嵌入空間裏類似度的維度能夠用向量的減法來進行類別測試。

弊端:

  • 一、對每一個local context window單獨訓練,沒有利用包含在global co-corrence矩陣中的統計信息
  • 二、多義詞處理乏力,由於使用了惟一詞向量

二、GloVe

GloVe和word2vec的思路類似(論文連接 
可是充分考慮了詞的共現狀況,比率遠比原始機率更能區分詞的含義。

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

GloVe綜合了LSA、CBOW的優勢,訓練更快、對於大規模語料算法的擴展性也很好、在小語料或者小向量上性能表現也很好 
. 
.


2、測評

本節主要來自於52NLP的文章:斯坦福大學深度學習與天然語言處理第三講:高級的詞向量表示

. 
.

一、詞向量測評方法

一直以來,如何測評詞向量仍是一件比較頭疼的事情。 
主要方法分爲兩種:內部測評(詞類比)與外部測評(命名實體識別(NER))。 
詞類比。經過評測模型在一些語義或語法類比問題上的餘弦類似度距離的表現來評測詞向量 
固然,在測評時候,會去除一些來自於搜索的輸入詞、干擾詞、經常使用停用詞等,讓測評結果更加顯著

  • 內部類比方式一:不一樣的城市可能存在相同的名字

類比數據來源: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):找到人名,地名和機構名 
    . 
    .

二、測評結果

一些測評方式可參考:Paper2:[Improving Word Representations via Global Context 
and Multiple Word 
Prototypes]

  • (1)內部測評

類比評測和超參數:

這裏寫圖片描述

相關性評測結果: 
這裏寫圖片描述

  • (2)外部測評

命名實體識別(NER):找到人名,地名和機構名 
這裏寫圖片描述

. 
.

三、利用詞向量解決歧義問題

也許你寄但願於一個詞向量能捕獲全部的語義信息(例如run便是動車也是名詞),可是什麼樣的詞向量都不能很好地進行凸顯。 
這篇論文有一些利用詞向量的辦法:Improving Word Representations Via Global Context And Multiple Word Prototypes(Huang et al. 2012) 
解決思路:對詞窗口進行聚類,並對每一個單詞詞保留聚類標籤,例如bank1, bank2等

這裏寫圖片描述

. 
. 
.


3、Glove實現&R&python

一、Glove訓練參數

本節主要來自於52NLP的文章:斯坦福大學深度學習與天然語言處理第三講:高級的詞向量表示

  • 最佳的向量維度:300左右,以後變化比較輕微 
  • 對於GloVe向量來講最佳的窗口長度是8
  • 訓練迭代次數。對於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).  
最後是softmax層進行分類。The last layer is a softmax over all output classes.

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)

提出了一種通用的方法分析和解釋了神經網絡模型的決策——這種方法經過擦除輸入表示的某些部分,好比將輸入詞向量的某些維、隱藏層的一些神經元或者輸入的一些詞。咱們提出了幾種方法來分析這種擦除的影響,好比比較擦除先後模型的評估結果的差別,以及使用強化學習來選擇要刪除的最小輸入詞集合,使用於分類的神經網絡模型的分類結果發生改變。 
在對多個 NLP 任務(包括語言特徵分類、句子情感分析、文檔級別的 sentiment aspect prediction)的綜合分析中,咱們發現咱們提出的方法不只能提供神經網絡模型決策的清晰解釋,並且能夠用來進行錯誤分析。

**分析揭示了 Word2Vec 和 Glove 產生的詞向量之間存在一些明顯的差別,同時也代表訓練語料中的詞頻對產生的詞的表達有很大的影響; 
在句子級別的情感分析上的實驗代表情感詞對情感分類結果影響顯著,有意思的是還能找出來一些使模型誤分類的詞;** 
在文檔級別的 aspect prediction 實驗則清晰地揭示出文檔中哪部分文本和特定的 aspect 是強關聯的。同時這些實驗都代表,雙向 LSTM 的表達能力比經典 LSTM 強,經典 RNN 則最弱。



 

 



 

 

NLP︱高級詞向量表達(二)——FastText(簡述、學習筆記)

FastText是Facebook開發的一款快速文本分類器,提供簡單而高效的文本分類和表徵學習的方法,不過這個項目實際上是有兩部分組成的,一部分是這篇文章介紹的
fastText 文本分類(paper:A. Joulin, E. Grave, P. Bojanowski, T. Mikolov,
Bag of Tricks for Efficient Text
Classification(高效文本分類技巧)
),
另外一部分是詞嵌入學習(paper:P.
Bojanowski*, E. Grave*, A. Joulin, T. Mikolov, Enriching Word Vectors
with Subword
Information
(使用子字信息豐富詞彙向量))。
按論文來講只有文本分類部分纔是 fastText,但也有人把這兩部分合在一塊兒稱爲
fastText。筆者,在這即認爲詞嵌入學習屬於FastText項目。
github連接:https://github.com/facebookresearch/fastText

.

高級詞向量三部曲:

一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用)
二、NLP︱高級詞向量表達(二)——FastText(簡述、學習筆記)
三、NLP︱高級詞向量表達(三)——WordRank(簡述)
四、其餘NLP詞表示方法paper:從符號到分佈式表示NLP中詞各類表示方法綜述


如何在python 很是簡單訓練FastText,可見筆者博客:

極簡使用︱Gemsim-FastText 詞向量訓練以及OOV(out-of-word)問題有效解決


1、FastText架構

本節內容參考自:
一、開源中國社區 [http://www.oschina.net] 《Facebook 開源的快速文本分類器 FastTexT》
二、雷鋒網文章:《比深度學習快幾個數量級,詳解Facebook最新開源工具——fastText

.

一、fastText 架構原理

fastText 方法包含三部分:模型架構、層次 Softmax 和 N-gram 特徵。

fastText 模型輸入一個詞的序列(一段文本或者一句話),輸出這個詞序列屬於不一樣類別的機率。
序列中的詞和詞組組成特徵向量,特徵向量經過線性變換映射到中間層,中間層再映射到標籤。
fastText 在預測標籤時使用了非線性激活函數,但在中間層不使用非線性激活函數
fastText 模型架構和 Word2Vec 中的 CBOW 模型很相似。不一樣之處在於,fastText 預測標籤,而 CBOW 模型預測中間詞

這裏寫圖片描述.
.
二、改善運算效率——softmax層級

對於有大量類別的數據集,fastText使用了一個分層分類器(而非扁平式架構)。不一樣的類別被整合進樹形結構中(想象下二叉樹而非 list)。在某些文本分類任務中類別不少,計算線性分類器的複雜度高。爲了改善運行時間,fastText 模型使用了層次 Softmax 技巧。層次 Softmax 技巧創建在哈弗曼編碼的基礎上,對標籤進行編碼,可以極大地縮小模型預測目標的數量。(參考博客
這裏寫圖片描述

考慮到線性以及多種類別的對數模型,這大大減小了訓練複雜性和測試文本分類器的時間。fastText 也利用了類別(class)不均衡這個事實(一些類別出現次數比其餘的更多),經過使用 Huffman 算法創建用於表徵類別的樹形結構。所以,頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高。
這裏寫圖片描述.
.
.


2、FastText的詞向量表徵

一、FastText的N-gram特徵

經常使用的特徵是詞袋模型。但詞袋模型不能考慮詞之間的順序,所以 fastText 還加入了 N-gram 特徵
「我 愛 她」 這句話中的詞袋模型特徵是 「我」,「愛」, 「她」。這些特徵和句子 「她 愛 我」 的特徵是同樣的。
若是加入 2-Ngram,第一句話的特徵還有 「我-愛」 和 「愛-她」,這兩句話 「我 愛 她」 和 「她 愛 我」 就能區別開來了。固然,爲了提升效率,咱們須要過濾掉低頻的 N-gram

在 fastText 中一個低維度向量與每一個單詞都相關。隱藏表徵在不一樣類別全部分類器中進行共享,使得文本信息在不一樣類別中可以共同使用。這類表徵被稱爲詞袋(bag of words)(此處忽視詞序)。在 fastText中也使用向量表徵單詞 n-gram來將局部詞序考慮在內,這對不少文本分類問題來講十分重要。

舉例來講:fastText可以學會「男孩」、「女孩」、「男人」、「女人」指代的是特定的性別,而且可以將這些數值存在相關文檔中。而後,當某個程序在提出一個用戶請求(假設是「我女朋友如今在兒?」),它可以立刻在fastText生成的文檔中進行查找而且理解用戶想要問的是有關女性的問題。
.
.
二、FastText詞向量優點

(1)適合大型數據+高效的訓練速度:可以訓練模型「在使用標準多核CPU的狀況下10分鐘內處理超過10億個詞彙」,特別是與深度模型對比,fastText能將訓練時間由數天縮短到幾秒鐘。使用一個標準多核 CPU,獲得了在10分鐘內訓練完超過10億詞彙量模型的結果。此外, fastText還能在五分鐘內將50萬個句子分紅超過30萬個類別。
(2)支持多語言表達:利用其語言形態結構,fastText可以被設計用來支持包括英語、德語、西班牙語、法語以及捷克語等多種語言。它還使用了一種簡單高效的歸入子字信息的方式,在用於像捷克語這樣詞態豐富的語言時,這種方式表現得很是好,這也證實了精心設計的字符 n-gram 特徵是豐富詞彙表徵的重要來源。FastText的性能要比時下流行的word2vec工具明顯好上很多,也比其餘目前最早進的詞態詞彙表徵要好。
這裏寫圖片描述(3)fastText專一於文本分類,在許多標準問題上實現當下最好的表現(例如文本傾向性分析或標籤預測)。FastText與基於深度學習方法的Char-CNN以及VDCNN對比:
FastText與基於深度學習方法的Char-CNN以及VDCNN對比 (4)比word2vec更考慮了類似性,好比 fastText 的詞嵌入學習可以考慮 english-born 和 british-born 之間有相同的後綴,但 word2vec 卻不能(具體參考paper)。
.
.

三、FastText詞向量與word2vec對比

本節來源於博客:fasttext
FastText= word2vec中 cbow + h-softmax的靈活使用

靈活體如今兩個方面:

  1. 模型的輸出層:word2vec的輸出層,對應的是每個term,計算某term的機率最大;而fasttext的輸出層對應的是 分類的label。不過無論輸出層對應的是什麼內容,起對應的vector都不會被保留和使用;
  2. 模型的輸入層:word2vec的輸出層,是 context window 內的term;而fasttext 對應的整個sentence的內容,包括term,也包括 n-gram的內容;

二者本質的不一樣,體如今 h-softmax的使用。
Wordvec的目的是獲得詞向量,該詞向量 最終是在輸入層獲得,輸出層對應的 h-softmax 也會生成一系列的向量,但最終都被拋棄,不會使用。
fasttext則充分利用了h-softmax的分類功能,遍歷分類樹的全部葉節點,找到機率最大的label(一個或者N個)

相關文章:Jupyter notebooks:Comparison of FastText and Word2Vec (感受值得一看)
.
.
.


3、FastText實現

github連接:https://github.com/facebookresearch/fastText
fastText基於Mac OS或者Linux系統構築,使用 C++11 的特性。須要python 2.6 或者更高版本支持,以及numpy & scipy等軟件支持。
FastText默認參數:

$ ./fasttext supervised
Empty input or output path.

The following arguments are mandatory:
  -input              training file path
  -output             output file path

The following arguments are optional:
  -lr                 learning rate [0.1]
  -lrUpdateRate       change the rate of updates for the learning rate [100]
  -dim                size of word vectors [100]
  -ws                 size of the context window [5]
  -epoch              number of epochs [5]
  -minCount           minimal number of word occurences [1]
  -minCountLabel      minimal number of label occurences [0]
  -neg                number of negatives sampled [5]
  -wordNgrams         max length of word ngram [1]
  -loss               loss function {ns, hs, softmax} [ns]
  -bucket             number of buckets [2000000]
  -minn               min length of char ngram [0]
  -maxn               max length of char ngram [0]
  -thread             number of threads [12]
  -t                  sampling threshold [0.0001]
  -label              labels prefix [__label__]
  -verbose            verbosity level [2]
  -pretrainedVectors  pretrained word vectors for supervised learning []
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Mikolov 在 fastTetxt 的論文中報告了兩個實驗,其中一個實驗和 Tagspace 模型進行對比。實驗是在 YFCC100M 數據集上進行的, YFCC100M 數據集包含將近 1 億張圖片以及摘要、標題和標籤。實驗使用摘要和標題去預測標籤。Tagspace 模型是創建在 Wsabie 模型的基礎上的。Wsabie 模型除了利用 CNN 抽取特徵以外,還提出了一個帶權近似配對排序 (Weighted Approximate-Rank Pairwise, WARP) 損失函數用於處理預測目標數量巨大的問題。
這裏寫圖片描述上面就是實驗結果,從實驗結果來看 fastText 可以取得比 Tagspace 好的效果,並擁有無以倫比的訓練測試速度。但嚴格來講,這個實驗對 Tagspace 有些不公平。YFCC100M 數據集是關於多標記分類的,即須要模型能從多個類別裏預測出多個類。Tagspace 確實是作多標記分類的;但 fastText 只能作多類別分類,從多個類別裏預測出一個類。而評價指標 prec@1 只評價一個預測結果,恰好可以評價多類別分類。

YFCC100M 數據: https://research.facebook.com/research/fasttext/


.
延伸一:重磅:facebook公開了90種語言的Pre-trained word vectors

https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md
可怕的facebook,用fasttext進行訓練,使用默認參數,300維度

 

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 的效果。

  • VDCNN架構

總體架構如Figure1所示,句子長度爲 [公式] ,首先會通過lookup層,每一個字符映射爲一個 [公式] 維的向量,所以文本被表示爲一個大小爲[公式] 的tensor。在本文中 [公式] 的長度固定爲1024, [公式] 的大小固定爲16。而後,網絡會通過三次池化操做。每次池化以前是若干個"Convolutional Block"。濾波器數量遵循兩個原則:

  1. 對於相同的輸出特徵圖大小,圖層有相同數量的濾波器;
  2. 若是特徵圖的大小被減半,過濾器的數量增長一倍。

論文說這樣能夠減小內存佔用,還沒想明白是爲何。—— ??

 

三次池化操做,每次池化特徵圖的大小都會減半,因此濾波器的數量也會相應double。如Figure1所示,濾波器的數量有三個量級,分別是128,256,512。最終Convolutional Block的輸出tensor大小爲 [公式] ,其中 [公式] , [公式] 。在本文中 [公式] 的大小固定爲1024,所以 [公式] 。而實際上 [公式] 的長度能夠是不固定的,尤爲在使用Attention的時候。

Convolutional Block的輸出會通過一個k-max pooling變成固定維度爲 [公式] 的tensor,而後通過三個全鏈接。本文中k的大小取值爲8,全鏈接的神經元數量爲2048。

這裏的池化操做使用的 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

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是在時序位置上作歸一化(對應特徵圖的每個時刻向量)。

  • 最優參數
  1. 一共69個token:「abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:’"/| #$%ˆ&*˜‘+=<>()[]{}」加上padding token,space, unknown token。
  2. embedding size:16
  3. 文本長度:1024
  4. batch size:128
  5. learning rate:0.01
  6. 動量:0.9
  • 實驗結果分析

做者在深度爲9,17,29,49的狀況下作了實驗。實驗結果如Table5所示。

  1. VDCNN在大數據集上表現較好
  2. 加深網絡深度能提升效果
  3. MaxPooling的效果要優於其餘Pooling。此處說的pooling應該是指網絡前三次pooling。
  4. VDCNN要比state of art的卷積網絡要好(【Zhang】)。除了小數據集AG和Sogou,其餘數據集上都要比【Zhang】效果更好。在AG和Sogou上雖然沒有TFIDF方式好,可是已經很接近了。
  5. 對u與VDCNN,29層的網絡取得了最好的效果,再加深效果就降低了,可是得以證實的是採用相似ResNet那樣的Shortcut connections能夠下降梯度消失帶來的影響從而提高效果。文中設計了49層的神經網絡,雖然這種快捷鏈接改善VDCNN的效果,可是他仍是沒有達到它應該有的效果,可是這已是對VDCNN在NLP中的里程碑了。
 

 

NLP︱高級詞向量表達(三)——WordRank(簡述)

若是說FastText的詞向量在表達句子時候很在行的話,GloVe在多義詞方面表現出色,那麼wordRank在類似詞尋找方面表現地不錯。 
其是經過Robust Ranking來進行詞向量定義。

相關paper:WordRank: Learning Word Embeddings via Robust 
Ranking
 
相關博客:https://rare-technologies.com/wordrank-embedding-crowned-is-most-similar-to-king-not-word2vecs-canute/?from=singlemessage&isappinstalled=0#

查詢king關鍵詞,WordRank 、 word2vec、fastText三者效果對比: 
這裏寫圖片描述WordRank 、fastText都相對比較精準「crowned」、「throne」,而不是word2vec的「Canute」


. 
.

一、wordRank,與 word2vec、fastText三者對比

來源博客:《WordRank embedding: 「crowned」 is most similar to 「king」, not word2vec’s 「Canute」》 
根據Ranking算法獲得的wordRank,與 word2vec、fastText三者對比 
這裏寫圖片描述在不一樣的項目需求上,有着不一樣的訓練精度,句法表達上,fastText更好,而在單個詞語的類似性等內容表達上wordRank是三者中最好的 
同時隨着數據量的增長精度呈現增加的趨勢。 
. 
.


二、wordRank,與 word2vec、GloVe三者對比

來源paper:WordRank: Learning Word Embeddings via Robust Ranking

  • (1)精度

這裏寫圖片描述

左圖使用數據:WS-353 word similarity benchmark 
右圖使用數據:Google word analogy benchmark 
從兩個數據集的效果來看,wordRank效果極佳

  • (2)詞類比與詞類似比較

這裏寫圖片描述類似詞的尋找方面極佳,詞類比方面不一樣數據集有不一樣精度。

結論:

  • 1.在語義類比中三種模型在低頻詞語上表現相對較差,在高頻詞語上表現效果較好;——有沒有後續文章專門研究如何提升低頻詞的效果??
  • 2.在語法類比中,FastText優於Word2Vec和WordRank 。FastText模型在低頻詞語上表現的至關好,可是當詞頻升高時,準確率迅速下降(——爲何?),而WordRank和Word2Vec在不多出現和很頻繁出現的詞語上準確率較低(——爲何?);
  • 3.FastText在綜合類比中表現更好,最後一幅圖說明總體類比結果與語法類比的結果比較類似,由於語法類比任務的數量遠遠多於語義類比,因此在綜合結果中語法類比任務的結果佔有更大的權重;
  • 四、WordRank在語義類比任務上效果優於其餘兩種模型,而FastText在語法類比上效果更好。值得一提的是,若是用WordRank模型生成兩個集合(詞集合和上下文集合),WordRank使用它們詞向量的內積對他們之間的關係建模,內積和他們之間的關係是直接成比例的,若是該詞和上下文越相關,內積就會越大

綜上,WordRank更適合語義類比,FastText更適合不一樣語料庫下全部詞頻的語法類比。


.

高級詞向量三部曲:

一、NLP︱高級詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用) 
二、NLP︱高級詞向量表達(二)——FastText(簡述、學習筆記) 
三、NLP︱高級詞向量表達(三)——WordRank(簡述) 
四、其餘NLP詞表示方法paper:從符號到分佈式表示NLP中詞各類表示方法綜述

 
   

 

文本分類相關的知識,因此在此作一個總結。

介紹

定義

  • 在給定的分類體系中,將文本分到指定的某個或某幾個類別當中
    • 分類對象:短文本(句子/標題/商品評論)、長文本(文章)
  • 分類體系通常由人工構造
    • 政治、體育、軍事
    • 正能量、負能量
    • 好評、中性、差評
  • 分類模式
    • binary:2類問題,屬於或不屬於
    • multi-class:多類問題
    • multi-label:多標籤問題,一個文本能夠屬於多類

應用

  • 垃圾郵件的斷定
    • 是垃圾郵件、不是垃圾郵件
  • 根據標題爲圖文視頻打標籤
    • 政治、體育、娛樂、暴力、涉黃……
  • 根據用戶閱讀內容創建畫像標籤
    • 娛樂、教育、醫療……

方法

  • 人工方法
    • 基於規則的特徵匹配,容易理解(足球、聯賽->體育)
    • 依賴專家系統,不一樣人物須要專門構建特徵規則。費時費力
    • 準確率不高
  • 機器學習方法
    • 特徵工程+算法(Naive Bayes/SVM/LR/KNN……)
  • 深度學習方法
    • 詞向量+模型(FastText/TextCNN/TextRNN/TextRCNN)

傳統方法

分類流程

 

 

文本預處理

英文

  • 數據中非英文部分
    • html、json等格式,提取出文本數據
    • 文本泛化:數字、表情符號、網址……
  • 拼寫檢查更正
  • 詞幹提取(steming)、詞形還原(lemmatization)
    • has/had/having->have am/is/are->is isn't->is not
  • 大寫轉小寫
  • 去停用詞
    • a, to, the, according, any...

中文

  • 數據中非中文部分
    • html、json等格式,提取出文本數據
    • 文本泛化:數字、英文、網址……
  • 中文編碼問題
  • 中文分詞
    • 結巴分詞、nltk、SnowNLP……
  • 去停用詞
    • 啊、哎、哎喲、可是、不如……
  • 詞語替換
    • 俺->我,俺們->咱們,裝13->裝逼
    • 禾鬥匕匕->科比,孬->很差,灰機->飛機
    • CEO->首席執行官,Tencent->騰訊

文本表示

將文本轉換成計算機可理解的方式。一篇文檔表示成向量,整個語料庫表示成矩陣

[公式]

  • 詞袋模型(Bag of Words,unigram)
    • 忽略其詞序和語法,句法,將文本僅僅看作是一個詞集合。若詞集合共有NN個詞,每一個文本表示爲一個NN維向量,元素爲0/1,表示該文本是否包含對應的詞。( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
    • 通常來講詞庫量至少都是百萬級別,所以詞袋模型有個兩個最大的問題:高緯度、高稀疏性
  • n-grams 詞袋模型(Bag of n-grams)
    • 與詞袋模型相似,考慮了局部的順序信息,可是向量的維度過大,基本不採用。若是詞集合大小爲NN,則bi-gram的單詞總數爲N^2N2 向量空間模型
  • 向量空間模型(Vector Space Model)
    • 以詞袋模型爲基礎,向量空間模型經過特徵選擇下降維度,經過特徵權重計算增長稠密性。

特徵權重計算

  • 布爾權重
    若是出現則爲1,沒出現則爲0。就是詞袋模型。

[公式]

  • TFIDF型權重(Boolean weighting)

TF:詞頻率

[公式]

TF*IDF: 詞頻率乘以逆文本頻率

[公式]
TFC: TF*IDF的歸一化,使得同一文本中的詞語能夠相互比較

[公式]

  • 基於熵概念的權重(Entropy weighting)
    idf的做用是懲罰在語料中出現較多的詞語。可是若是某一特徵(詞語)在同類文檔中大量出現時,應該賦予較高的權重。 [公式]

特徵選擇

特徵選擇是根據某個評價指標獨立的對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其他的特徵項,從而達到降維的目的

  • 基於DF
    • DF小於某個閾值的去掉(太少,沒有表明性)
    • DF大於某個閾值的去掉(太多,沒有區分度)
  • 基於熵 該值越大,說明分佈越均勻,越有可能出如今較多的類別中(區分度差);該值越小,說明分佈越傾斜,詞可能出如今較少的類別中(區分度好)
    [公式]
  • 信息增益
    體現詞項爲整個分類所能提供的信息量(不考慮該詞項的熵和考慮該詞項後的熵的差值)
    [公式]
  • [公式] 統計量
    統計詞項和類別之間的獨立性。 [公式] 越大,二者獨立性越小,相關性越大

[公式]

[公式]

[公式]

分類器
將文本用向量表示以後,可適用於大部分機器學習方法

  • 樸素貝葉斯
  • KNN方法
  • 決策樹
  • 支持向量機
  • GBDT/XGBOOST

深度學習方法

利用詞向量表示文本,將沒歌詞表達爲nn維稠密,連續的實數向量。

  • fastText
    論文:Bag of Tricks for Efficient Text Classification

原理是把句子中全部的詞進行lookup獲得詞向量以後,對向量進行平均(某種意義上能夠理解爲只有一個avg pooling特殊CNN)而後直接接 softmax 層預測label。在label比較多的時候,爲了下降計算量,論文最後一層採用了層次softmax的方法,既根據label的頻次創建哈夫曼樹,每一個label對應一個哈夫曼編碼,每一個哈夫曼樹節點具備一個向量做爲參數進行更新,預測的時候隱層輸出與每一個哈夫曼樹節點向量作點乘,根據結果決定向左右哪一個方向移動,最終落到某個label對應的節點上。
特色就是快,在效果和其餘方法差很少的狀況下,訓練速度比其餘方法快一個量級。

  • TextCNN
    論文:Convolutional Neural Networks for Sentence Classification

詳細原理以下:

首先,對句子作padding或者截斷,保證句子長度爲固定值 [公式] ,單詞embedding成 [公式] 維度的向量,這樣句子被表示爲(s,d)(s,d)大小的矩陣(類比圖像中的像素)。而後通過有 filter_size=(2,3,4) 的一維卷積層,每一個filter_size 有兩個輸出 channel。第三層是一個1-max pooling層,這樣不一樣長度句子通過pooling層以後都能變成定長的表示了,最後接一層全鏈接的 softmax 層,輸出每一個類別的機率。
重點1:卷積是一維卷積,只在ss方向上作卷積,不在dd方向上作卷積,既卷積核的寬度大小爲dd。由於文本和圖像不一樣,文本的局部特徵只存在於上下文單詞之間,既所謂的n-gram。卷積核大小設置爲(2,3,4)就是爲了分別尋找2-gram,3-gram,4-gram特徵。
重點2:這裏的特徵就是詞向量,有靜態(static)和非靜態(non-static)方式。static方式採用好比word2vec預訓練的詞向量,訓練過程不更新詞向量,實質上屬於遷移學習了,特別是數據量比較小的狀況下,採用靜態的詞向量每每效果不錯。non-static則是在訓練過程當中更新詞向量。推薦的方式是 non-static 中的 fine-tunning方式,它是以預訓練(pre-train)的word2vec向量初始化詞向量,訓練過程當中調整詞向量,能加速收斂,固然若是有充足的訓練數據和資源,直接隨機初始化詞向量效果也是能夠的。

  • TextRNN
    論文:Recurrent Neural Network for Text Classification with Multi-Task Learning 利用CNN進行文本分類,說到底仍是利用卷積核尋找n-gram特徵。卷積核的大小是超參。而RNN基本是處理文本信息的標配了,由於RNN先天就是爲處理時間序列而設計的,它經過先後時刻的輸出連接保證了「記憶」的留存。但RNN循環機制過於簡單,先後時刻的連接採用了最簡單的f=activate(ws+b)f=activate(ws+b)的形式,這樣在梯度反向傳播時出現了時間上的連乘操做,從而致使了梯度消失和梯度爆炸的問題。RNN的 變種LSTM/GRU在必定程度上減緩了梯度消失和梯度爆炸問題,所以如今使用的其實要比RNN更多
    利用RNN作文本分類也比較好理解。對於英文,都是基於詞的。對於中文,首先要肯定是基於字的仍是基於詞的。若是是基於詞,要先對句子進行分詞。以後,每一個字/詞對應RNN的一個時刻,隱層輸出做爲下一時刻的輸入。最後時刻的隱層輸出h_ThT​catch住整個句子的抽象特徵,再接一個softmax進行分類。

 

  • TextRNN + Attention
    RNN雖然號稱能保持長久「記憶」,但其實仍是沒法「記住」太長久的東西。越靠後的字詞對最終輸出的影響越大,可是這和人類閱讀文本的習慣是不同的。一句話中對文本意義影響最大一一定是句子中間的某幾個重點詞彙。Attention的提出就是爲了應對這個問題。詳細介紹Attention恐怕須要一小篇文章的篇幅,感興趣的可 參考14年這篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。具體原理不做介紹,你們能夠看論文呀~
    Attention運用到文本分類當中,參考論文Hierarchical Attention Networks for Document Classification。論文爲了對doc進行分類,將doc從兩個層次進行特徵提取,首先在word層面提取sentence特徵,而後從sentence層面提取doc特徵,而且每一個層次都運用了Attention。在此我類比到句子分類中,講一下Attention是怎麼運用的。
    假設RNN每一個時刻的輸出爲 [公式] ,在上文TextRNN中咱們已經提到,最後時刻的輸出會用做softmax的輸入,既 [公式] 。Attention層其實就是普通的一層,它接收 [公式] ​,獲得一個相應score,並通過歸一化以後表明當前詞的重要性,既 [公式] , [公式] 。Attention向量是每一個時刻輸出的加權平均,既 [公式] 。最終輸出爲 [公式] 。

 

利用前向和後向RNN獲得每一個詞的前向和後向上下文的表示:
[公式]

[公式]
這樣詞的表示就變成詞向量和前向後向上下文向量concat起來的形式了,即:
[公式]
最後再接跟TextCNN相同卷積層,pooling層便可,惟一不一樣的是卷積層 filter_size = 1就能夠了,再也不須要更大 filter_size 得到更大視野,這裏詞的表示也能夠只用雙向RNN輸出

  • VDCNN
    論文:Very Deep Convolutional Networks for Text Classification 上述提到的文本分類模型都是淺層模型,目前NLP領域的模型,不管是機器翻譯、文本分類、序列標註等問題大都使用淺層模型。這篇論文探究的是深層模型在文本分類任務中的有效性,文中最優性能網絡達到了29層。具體請見此處
編輯於 2018-07-20
 
   

 

基礎比較差的同窗能夠看這篇文章,從2013年的DSSM[9]開始入手,慢慢補。篇幅所限,加上這方面研究相對很充分了,小夕就不展開講啦。因此話說回來,將多輪對話與候選回覆進行匹配的正確方式是什麼呢?

3. 論文串燒

一切還要從兩年前的秋天提及,曾經,有一個少年。。。

算了算了,仍是正經點吧,要否則無法寫了╮( ̄▽ ̄"")╭總之,小夕從衆多魚龍混雜的檢索式多輪對話的論文裏精選出以下4篇進行串燒(按時間順序,從經典到state-of-art),包括:

  • EMNLP2016 百度天然語言處理部的xiangyang大佬  的Multi-view[1]
  • ACL2017 MSRA   大佬的SMN[2]
  • COLING2018 上交的DUA[3]
  • ACL2018 百度天然語言處理部xiangyang大佬和lilu女神的DAM[4]

不過不要怕,小夕的論文分享老是淺顯易懂還帶點萌( ̄∇ ̄)

必需要提的:Multi-view model

想一下,怎麼才能從單輪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帶來了匹配效果的大幅度提高,這也標誌着檢索式多輪對話這方面的玩法也將變得豐(麻)富(煩)。

一次大大的進化:SMN model

若是說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有很大的提高,這也說明了:

  1. 在q-r匹配上,基於交互的模型相比基於表示的模型有更大的優點,這一點與檢索式問答和NLI任務中的實驗表現一致;
  2. 對文本進行多粒度表示是頗有必要的。

utterance也要深度encoding!DUA model

雖然看似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有了進一步明顯的提高。

state-of-the-art:DAM model

這篇是多輪對話領域可貴的好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與倒數第二行能夠看到,去掉那個複雜的深度注意力機制後,網絡性能出現了明顯的降低,說明論文中提出的這個「間接」的注意力機制確實能捕獲到一些神奇的模式。

總結

最後小夕很是主觀的總結一下這四個模型的亮點:

  • Multi-view提出了將utterance建模爲一個語義單元來建模多輪對話問題;
  • SMN使用基於交互的匹配模型代替基於表示的匹配模型,並對文本進行多粒度表示;
  • DUA對utterance embedding進行深度的encoding來建模utterances之間的依賴關係;
  • DAM一方面對文本對進行多粒度表示並提出了一種深度attention的方法,另外一方面拋棄了以前建模utterance embedding sequence的思路,提出了一種將word-level和utterance-level的信息整合到一塊兒,構建一個多通道的3D Image(其實把utterance當作單幀的圖像,那這個大方塊更像是一個視頻),進而經過3D Image分類器完成匹配的新思路。

 

參考文獻

[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技術概念

hanniman  12031閱讀 2017-10-13

​前言:本文做者@我偏笑,是咱們「AI產品經理大本營」成員,也是「AI研習小分隊」的分享嘉賓之一(每4周分享一篇AI產品經理相關的學習心得總結);歡迎更多有興趣「主動輸出」的朋友們一塊兒加入、共同進步:)

1-封面.jpeg

序言

以一週前的這條微博做爲開始——

2微博.jpeg

一週前我講:相對的,天然語言解析技術已經逐漸再也不成爲各家廣義智能助理產品的核心競爭力,識別用戶意圖以後所提供的服務開始成爲對話機器人差別化的核心。

3對話系統的組成.jpeg

對於一個對話系統而言,我微博中所指的『後續服務』,就是上圖中的 DST(對話狀態維護)以及 Policy(動做候選排序),或者統一的稱其爲 DM(Dialogue Mannagement,對話管理)。也即,當接收到 NLU 模塊的輸出、其餘場景及用戶特徵信息以後,判斷系統應該跳轉到什麼狀態,以及執行什麼樣的動做。

產品角度,DM 是對話機器人封閉域多輪對話體驗的核心,正是一次次 DST + Policy 造成了人機間的多輪對話體驗。(注:我我的傾向於將「識別用戶意圖以後,爲了獲取必要信息,與用戶進行的有目的的多輪對話」稱爲封閉域多輪對話,區別於識別用戶意圖以前,爲了利用上文信息,所採用的『上下文替換』、『主體補全』等技術,也即開放域多輪對話。下文提到的『多輪對話』,均指封閉域多輪對話。)

既然多輪對話在對話機器人類產品體驗中扮演着如此重要的角色,我便開始思考:一個架構完備的多輪對話體系應該是什麼樣的。也即,多輪對話系統中,至少須要包含哪些模塊,才能爲用戶提供一種與人人對話相去不遠的人機對話體驗。

 

1、多輪對話

多輪對話定義

我有個習慣,就是在構造一個複雜系統以前,先從紛繁的細節之中跳出,嘗試抽象的描述整個系統,及系統中的各個模塊,也即爲它們『下定義』。這能幫助你在多種可行方案中作出選擇,也即幫你明確:什麼該作,什麼不應作,什麼該誰作

 

基於以上思想,我嘗試先給出幾個我我的對於多輪對話體系定義問題的回答——

基本定義:什麼是多輪對話? (封閉域)多輪對話是一種,在人機對話中,初步明確用戶意圖以後,獲取必要信息以最終獲得明確用戶指令的方式。多輪對話與一件事情的處理相對應。

補充說明1:所謂『必要信息』必定要經過與用戶的對話獲取嗎? 不必定,即使是人與人之間的交流,對話自己所包含的信息也只佔總傳遞信息量的小部分,更多信息來源於說話人的身份、當前的時間/地點等一系列場景信息。因此多輪對話的信息獲取方式,也不該當只侷限於用戶所說的話。

補充說明2:多輪對話必定在形式上表現爲與用戶的屢次對話交互嗎? 不必定,若是用戶的話語中已經提供了充足的信息,或者其它來源的補充信息已足夠將用戶的初步意圖轉化爲一條明確的用戶指令,那就不會存在與用戶的屢次對話交互。

以上,是針對多輪對話總體定義問題的回答,每一個模塊的相關定義會在下文嘗試給出。

 

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 槽組的填寫信息。

上述兩種狀況屬於全平級槽關係全依賴槽關係的特殊狀況,在實際的業務場景中,這兩種關係會是同時存在的,不一樣槽組間,既有平級槽關係,又有依賴槽關係。

 

實際業務場景中,完整的多輪對話過程一般會以的形式存在,每一個節點存在一個或多個槽組,用於獲取一種或多種信息,節點間的槽組爲依賴關係,節點內的槽組爲平級關係

上文將多輪對話定義爲一件事情的處理,槽組/槽定義爲一種信息的獲取,槽位定義爲信息的一種獲取方式。這裏我傾向於將多輪對話樹結構中的一個節點定義爲處理事情的一個步驟

一件事情的處理包含多個步驟,每一個步驟中須要補全一種或多種信息,每種信息存在一種或多種獲取方式。

 

上述定義和組裏算法大佬的定義有些分歧,不過誰讓這是個人文章呢:)就按個人來。

 

七、填槽意義

結合上文,咱們須要瞭解到,填槽的意義有兩個:做條件分支多輪對話做信息補全用戶意圖。換言之,填槽不只是補全用戶意圖的方式,並且前序槽位的填寫還會起到指導後續信息補全走向的做用。

4.jpeg

 

八、准入條件

上文咱們講到,完整的多輪對話過程一般會以的形式存在,樹中包含多個節點,表明處理這件事情的一個步驟

而每一個節點,都應當有其特別的准入條件。樹的根節點每每須要限制 NLU 模塊的輸出,也即明確什麼樣的用戶意圖將會由該棵多輪對話樹來處理;樹的中間及葉子節點每每須要根據前序槽組的填槽結果以及其餘背景信息進行條件限制。(若是將全部信息,好比 NLU 模塊輸出,或是其餘背景信息都看作前序槽組的填寫結果,那就能獲得統一的槽組-條件-槽組-條件······形式,槽組用於獲取信息,條件用於信息限制

 

我嘗試從兩個角度來描述一套完備的准入條件體系。

一個是多條件的組織形式,准入條件在邏輯上應該支持條件間的與或非,百度的 UNIT 平臺提供了一種相對成熟的組織形式,將准入條件總體劃分爲條件條件組,條件包含在條件組中,組內條件間是關係,條件組之間是關係(固然這裏的且與或能夠根據自身業務狀況對調),條件自己支持關係。

一個是單條件的限制能力,准入條件應當同時支持對前序槽組填寫值、填寫方式、填寫狀態進行限制。也即須要有針對值的條件針對類型的條件針對狀態的條件。簡單的講,狀態就是『填了嗎』,類型就是『誰填的』,值就是『填了什麼』。

不一樣業務場景下咱們會須要不一樣角度的限制條件。好比,上文中提到填槽的意義包含兩種:做條件分支多輪對話做信息補全用戶意圖,若是僅僅做信息,那咱們一般就只關心『填了嗎』,只要填寫完成就進行後續步驟,並不關係『誰填的』以及『填了什麼』;可是若是槽組內的填入值會影響後續多輪對話走向,那咱們就傾向於經過槽組的填入方式填入值來做多輪對話的分支。

5准入條件.jpeg

 

3、答案系統、話題切換和狀態切換

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萬+。

相關文章
相關標籤/搜索