對話系統(tǒng)(對話機(jī)器人)本質(zhì)上是通過機(jī)器學(xué)習(xí)和人工智能等技術(shù)讓機(jī)器理解人的語言。它包含了諸多學(xué)科方法的融合使用,是人工智能領(lǐng)域的一個(gè)技術(shù)集中演練營。圖1給出了對話系統(tǒng)開發(fā)中涉及到的主要技術(shù)。
對話系統(tǒng)技能進(jìn)階之路
圖1給出的諸多對話系統(tǒng)相關(guān)技術(shù),從哪些渠道可以了解到呢?下面逐步給出說明。
圖1 對話系統(tǒng)技能樹 數(shù)學(xué)
矩陣計(jì)算主要研究單個(gè)矩陣或多個(gè)矩陣相互作用時(shí)的一些性質(zhì)。機(jī)器學(xué)習(xí)的各種模型都大量涉及矩陣相關(guān)性質(zhì),比如PCA其實(shí)是在計(jì)算特征向量,MF其實(shí)是在模擬SVD計(jì)算奇異值向量。人工智能領(lǐng)域的很多工具都是以矩陣語言來編程的,比如主流的深度學(xué)習(xí)框架,如Tensorflow、PyTorch等無一例外。矩陣計(jì)算有很多教科書,找本難度適合自己的看看即可。如果想較深入理解,強(qiáng)烈推薦《Linear Algebra Done Right》這本書。
概率統(tǒng)計(jì)是機(jī)器學(xué)習(xí)的基礎(chǔ)。常用的幾個(gè)概率統(tǒng)計(jì)概念:隨機(jī)變量、離散隨機(jī)變量、連續(xù)隨機(jī)變量、概率密度/分布(二項(xiàng)式分布、多項(xiàng)式分布、高斯分布、指指數(shù)族分布)、條件概率密度/分布、先驗(yàn)密度/分布、后驗(yàn)密度/分布、最大似然估計(jì)、最大后驗(yàn)估計(jì)。簡單了解的話可以去翻翻經(jīng)典的機(jī)器學(xué)習(xí)教材,比如《Pattern Recognition and Machine Learning》的前兩章,《Machine Learning: A Probabilistic Perspective》的前兩章。系統(tǒng)學(xué)習(xí)的話可以找本大學(xué)里概率統(tǒng)計(jì)里的教材。
最優(yōu)化方法被廣泛用于機(jī)器學(xué)習(xí)模型的訓(xùn)練。機(jī)器學(xué)習(xí)中常見的幾個(gè)最優(yōu)化概念:凸/非凸函數(shù)、梯度下降、隨機(jī)梯度下降、原始對偶問題。一般機(jī)器學(xué)習(xí)教材或者課程都會(huì)講一點(diǎn)最優(yōu)化的知識,比如Andrew Ng機(jī)器學(xué)習(xí)課程中Zico Kolter講的《Convex Optimization Overview》。當(dāng)然要想系統(tǒng)了解,最好的方法就是看Boyd的《Convex Optimization》書,以及對應(yīng)的PPT(https://web.stanford.edu/~boyd/cvxbook/)和課程(https://see.stanford.edu/Course/EE364A,https://see.stanford.edu/Course/EE364B)。喜歡看代碼的同學(xué)也可以看看開源機(jī)器學(xué)習(xí)項(xiàng)目中涉及到的優(yōu)化方法,例如Liblinear、LibSVM、Tensorflow就是不錯(cuò)的選擇。
常用的一些數(shù)學(xué)計(jì)算Python包:
NumPy:用于張量計(jì)算的科學(xué)計(jì)算包
SciPy:專為科學(xué)和工程設(shè)計(jì)的數(shù)學(xué)計(jì)算工具包
Matplotlib:畫圖、可視化包
機(jī)器學(xué)習(xí)和深度學(xué)習(xí)
Andrew Ng的“Machine Learning”課程依舊是機(jī)器學(xué)習(xí)領(lǐng)域的入門神器。不要小瞧所謂的入門,真把這里面的知識理解透,完全可以去應(yīng)聘算法工程師職位了。推薦幾本公認(rèn)的好教材:Hastie等人的《The Elements of Statistical Learning》,Bishop的《Pattern Recognition and Machine Learning》,Murphy的《Machine Learning: A Probabilistic Perspective》,以及周志華的西瓜書《機(jī)器學(xué)習(xí)》。深度學(xué)習(xí)資料推薦Yoshua Bengio等人的《Deep Learning》,以及Tensorflow的官方教程。
常用的一些工具:
scikit-learn:包含各種機(jī)器學(xué)習(xí)模型的Python包
Liblinear:包含線性模型的多種高效訓(xùn)練方法
LibSVM:包含各種SVM的多種高效訓(xùn)練方法
Tensorflow:Google的深度學(xué)習(xí)框架
PyTorch:Facebook的深度學(xué)習(xí)框架
Keras: 高層的深度學(xué)習(xí)使用框架
Caffe: 老牌深度學(xué)習(xí)框架
自然語言處理
很多大學(xué)都有NLP相關(guān)的研究團(tuán)隊(duì),比如斯坦福NLP組,以及國內(nèi)的哈工大SCIR實(shí)驗(yàn)室等。這些團(tuán)隊(duì)的動(dòng)態(tài)值得關(guān)注。
NLP相關(guān)的資料網(wǎng)上隨處可見,課程推薦斯坦福的“CS224n: Natural Language Processing with Deep Learning”,書推薦Manning的《Foundations of Statistical Natural Language Processing》(中文版叫《統(tǒng)計(jì)自然語言處理基礎(chǔ)》)。
信息檢索方面,推薦Manning的經(jīng)典書《Introduction to Information Retrieval》(王斌老師翻譯的中文版《信息檢索導(dǎo)論》),以及斯坦福課程“CS 276: Information Retrieval and Web Search”。
常用的一些工具:
Jieba: 中文分詞和詞性標(biāo)注Python包
CoreNLP: 斯坦福的NLP工具(Java)
NLTK: 自然語言工具包
TextGrocery:高效的短文本分類工具(注:只適用于 Python2)
LTP: 哈工大的中文自然語言處理工具
Gensim:文本分析工具,包含了多種主題模型
Word2vec: 高效的詞表示學(xué)習(xí)工具
GloVe:斯坦福的詞表示學(xué)習(xí)工具
Fasttext : 高效的詞表示學(xué)習(xí)和句子分類庫
FuzzyWuzzy: 計(jì)算文本之間相似度的工具
Elasticsearch: 開源搜索引擎
對話機(jī)器人
對話系統(tǒng)針對用戶不同類型的問題,在技術(shù)上會(huì)使用不同的框架。下面介紹幾種不同類型的對話機(jī)器人。
對話機(jī)器人創(chuàng)建平臺
如果你只是想把一個(gè)功能較簡單的對話機(jī)器人(Bot)應(yīng)用于自己的產(chǎn)品,Bot創(chuàng)建平臺是最好的選擇。Bot創(chuàng)建平臺幫助沒有人工智能技術(shù)積累的用戶和企業(yè)快速創(chuàng)建對話機(jī)器人,國外比較典型的Bot創(chuàng)建平臺有Facebook的Wit.ai和Google的Dialogflow(前身為Api.ai),國內(nèi)也有不少創(chuàng)業(yè)團(tuán)隊(duì)在做這方面的事,比如一個(gè)AI、知麻、如意等。
檢索型單輪對話機(jī)器人
檢索型單輪機(jī)器人(FQA-Bot)涉及到的技術(shù)和信息檢索類似,流程圖2所示。
圖2 FAQ-Bot流程圖
因?yàn)閝uery和候選答案包含的詞都很少,所以會(huì)利用同義詞和復(fù)述等技術(shù)對query和候選答案進(jìn)行擴(kuò)展和改寫。詞表示工具Word2vec、GloVe、Fasttext等可以獲得每個(gè)詞的向量表示,然后使用這些詞向量計(jì)算每對詞之間的相似性,獲得同義詞候選集。當(dāng)然同義詞也可以通過已經(jīng)存在的結(jié)構(gòu)化知識源如WordNet、HowNet等獲得。復(fù)述可以使用一些半監(jiān)督方法如DIRT在單語語料上進(jìn)行構(gòu)建,也可以使用雙語語料進(jìn)行構(gòu)建。PPDB網(wǎng)站包含了很多從雙語語料構(gòu)建出來的復(fù)述數(shù)據(jù)集。
知識圖譜型機(jī)器人
知識圖譜型機(jī)器人(KG-Bot,也稱為問答系統(tǒng)),利用知識圖譜進(jìn)行推理并回答一些事實(shí)型問題。知識圖譜通常把知識表示成三元組—— (主語、關(guān)系、賓語) ,其中關(guān)系表示主語和賓語之間存在的某種關(guān)系。
構(gòu)建通用的知識圖譜非常困難,不建議從0開始構(gòu)建。我們可以直接使用一些公開的通用知識圖譜,如YAGO、DBpedia、CN-DBpedia、Freebase等。特定領(lǐng)域知識圖譜的構(gòu)建可參考“知識圖譜技術(shù)原理介紹”( ),“最全知識圖譜綜述#1: 概念以及構(gòu)建技術(shù)”( https://mp.weixin.qq.com/s/aFjZ3mKcJGszHKtMcO2zFQ)等文章。知識圖譜可以使用圖數(shù)據(jù)庫存儲(chǔ),如Neo4j、OrientDB等。當(dāng)然如果數(shù)據(jù)量小的話MySQL、SQLite也是不錯(cuò)的選擇。
為了把用戶query映射到知識圖譜的三元組上,通常會(huì)使用到實(shí)體鏈接(把query中的實(shí)體對應(yīng)到知識圖譜中的實(shí)體)、關(guān)系抽?。ㄗR別query中包含的關(guān)系)和知識推理(query可能包含多個(gè)而不是單個(gè)關(guān)系,對應(yīng)知識圖譜中的一條路徑,推理就是找出這條路徑)等技術(shù)。
任務(wù)型多輪對話機(jī)器人
任務(wù)型多輪機(jī)器人(Task-Bot)通過多次與用戶對話交互來輔助用戶完成某項(xiàng)明確具體的任務(wù),流程圖見圖3。
圖3 Task-Bot流程圖
除了與語音交互的ASR和TTS部分,它包含以下幾個(gè)流程:
?
語言理解(SLU):把用戶輸入的自然語言轉(zhuǎn)變?yōu)榻Y(jié)構(gòu)化信息——act-slot-value三元組。例如餐廳訂座應(yīng)用中用戶說“訂云海肴中關(guān)村店”,我們通過NLU把它轉(zhuǎn)化為結(jié)構(gòu)化信息:“inform(order_op=預(yù)訂, restaurant_name=云海肴, subbranch=中關(guān)村店)”,其中的“inform”是動(dòng)作名稱,而括號中的是識別出的槽位及其取值。
NLU可以使用語義解析或語義標(biāo)注的方式獲得,也可以把它分解為多個(gè)分類任務(wù)來解決,典型代表是Semantic Tuple Classifier(STC)模型。
?
?
對話管理(DM):綜合用戶當(dāng)前query和歷史對話中已獲得的信息后,給出機(jī)器答復(fù)的結(jié)構(gòu)化表示。對話管理包含兩個(gè)模塊:對話狀態(tài)追蹤(DST)和策略優(yōu)化(DPO)。
DST維護(hù)對話狀態(tài),它依據(jù)最新的系統(tǒng)和用戶行為,把舊對話狀態(tài)更新為新對話狀態(tài)。其中對話狀態(tài)應(yīng)該包含持續(xù)對話所需要的各種信息。
DPO根據(jù)DST維護(hù)的對話狀態(tài),確定當(dāng)前狀態(tài)下機(jī)器人應(yīng)如何進(jìn)行答復(fù),也即采取何種策略答復(fù)是最優(yōu)的。這是典型的增強(qiáng)學(xué)習(xí)問題,所以可以使用DQN等深度增強(qiáng)學(xué)習(xí)模型進(jìn)行建模。系統(tǒng)動(dòng)作和槽位較少時(shí)也可以把此問題視為分類問題。
?
?
自然語言產(chǎn)生(NLG):把DM輸出的結(jié)構(gòu)化對話策略還原成對人友好的自然語言。簡單的NLG方法可以是事先設(shè)定好的回復(fù)模板,復(fù)雜的可以使用深度學(xué)習(xí)生成模型,如“Semantically Conditioned LSTM”通過在LSTM中加入對話動(dòng)作cell輔助答復(fù)生成。
任務(wù)型對話機(jī)器人最權(quán)威的研究者是劍橋大學(xué)的Steve Young教授,強(qiáng)烈推薦他的教程“Statistical Spoken Dialogue Systems”。他的諸多博士生針對上面各個(gè)流程都做了很細(xì)致的研究,想了解細(xì)節(jié)的話可以參考他們的博士論文。相關(guān)課程可參考Milica Ga?i?的“Speech and Language Technology”。
除了把整個(gè)問題分解成上面幾個(gè)流程分別優(yōu)化,目前很多學(xué)者也在探索使用端到端技術(shù)整體解決這個(gè)問題,代表工作有Tsung-Hsien Wen等人的“A Network-based End-to-End Trainable Task-Oriented Dialogue System”和Xiujun Li等人的“End-to-End Task-Completion Neural Dialogue Systems”。后一篇的開源代碼https://github.com/MiuLab/TC-Bot,非常值得學(xué)習(xí)。
?
閑聊型機(jī)器人
真實(shí)應(yīng)用中,用戶與系統(tǒng)交互的過程中不免會(huì)涉及到閑聊成分。閑聊功能可以讓對話機(jī)器人更有情感和溫度。閑聊機(jī)器人(Chitchat-Bot)通常使用機(jī)器翻譯中的深度學(xué)習(xí)seq2seq框架來產(chǎn)生答復(fù),如圖4。
圖4 Chitchat-Bot的seq2seq模型框架
與機(jī)器翻譯不同的是,對話中用戶本次query提供的信息通常不足以產(chǎn)生合理的答復(fù),對話的歷史背景信息同樣很重要。例如圖4中的query:“今天心情極度不好!”,用戶可能是因?yàn)榍皫滋斐鲇卫鄣难岜惩床判那椴缓玫?,這時(shí)答復(fù)“出去玩玩吧”就不合情理。研究發(fā)現(xiàn),標(biāo)準(zhǔn)的seq2seq+attention模型還容易產(chǎn)生安全而無用的答復(fù),如“我不知道”,“好的”。
為了讓產(chǎn)生的答復(fù)更多樣化、更有信息量,很多學(xué)者做了諸多探索。Jiwei Li等人的論文“Deep Reinforcement Learning for Dialogue Generation”就建議在訓(xùn)練時(shí)考慮讓答復(fù)引入新信息,保證語義連貫性等因素。Iulian V. Serban等人的論文“Building End-To-End Dialogue Systems Using Generative Hierarchical Neural Network Models”在產(chǎn)生答復(fù)時(shí)不只使用用戶當(dāng)前query的信息,還利用層級RNN把之前對話的背景信息也加入進(jìn)來。Jun Yin等人的論文“Neural Generative Question Answering”在產(chǎn)生答復(fù)時(shí)融合外部的知識庫信息。
上面的各種機(jī)器人都是為解決某類特定問題而被提出的,我們前面也分開介紹了各個(gè)機(jī)器人的主要組件。但這其中的不少組件在多種機(jī)器人里都是存在的。例如知識圖譜在檢索型、任務(wù)型和閑聊型機(jī)器人里也都會(huì)被使用。
真實(shí)應(yīng)用中通常會(huì)包含多個(gè)不同類型的機(jī)器人,它們協(xié)同合作,解答用戶不同類型的問題。我們把協(xié)調(diào)不同機(jī)器人工作的機(jī)器人稱之為路由機(jī)器人(Route-Bot)。路由機(jī)器人根據(jù)歷史背景和當(dāng)前query,決定把問題發(fā)送給哪些機(jī)器人,以及最終使用哪些機(jī)器人的答復(fù)作為提供給用戶的最終答復(fù)。圖5為框架圖。
圖5 Route-Bot框架圖 對話機(jī)器人現(xiàn)狀
對話機(jī)器人歷史悠久,從1966年MIT的精神治療師機(jī)器人ELIZA到現(xiàn)在已有半個(gè)世紀(jì)。但現(xiàn)代意義的機(jī)器人其實(shí)還很年輕。檢索型單輪對話機(jī)器人得益于搜索引擎的商業(yè)成功和信息檢索的快速發(fā)展,目前技術(shù)上已經(jīng)比較成熟。最近學(xué)術(shù)界和工業(yè)界也積極探索深度學(xué)習(xí)技術(shù)如Word2vec、CNN和RNN等在檢索型機(jī)器人中的使用,進(jìn)一步提升了系統(tǒng)精度。雖然技術(shù)上較為成熟,但在實(shí)際應(yīng)用中檢索型機(jī)器人還存在不少其他問題。例如,很多企業(yè)歷史上積累了大量非結(jié)構(gòu)化數(shù)據(jù),但這些數(shù)據(jù)并不能直接輸進(jìn)檢索型機(jī)器人,而是需要事先通過人工整理。即便有些企業(yè)存在一些回答對的數(shù)據(jù)可以直接輸入檢索型機(jī)器人,但數(shù)量往往只有幾十到幾百條,非常少??捎脭?shù)據(jù)的質(zhì)量和數(shù)量限制了檢索型機(jī)器人的精度和在工業(yè)界的廣泛使用。
相較于檢索型機(jī)器人,知識圖譜型機(jī)器人更加年輕。大多數(shù)知識圖譜型機(jī)器人還只能回答簡單推理的事實(shí)類問題。這其中的一個(gè)原因是構(gòu)建準(zhǔn)確度高且覆蓋面廣的知識圖譜極其困難,需要投入大量的人力處理數(shù)據(jù)。深度學(xué)習(xí)模型如Memory Networks等的引入可以繞過或解決這個(gè)難關(guān)嗎?
任務(wù)型多輪對話機(jī)器人只有十來年的發(fā)展歷史,目前已能較好地解決確定性高的多輪任務(wù)。但當(dāng)前任務(wù)型機(jī)器人能正常工作的場景往往過于理想化,用戶說的話大部分情形下都無法精確表達(dá)成act-slot-value三元組,所以在這個(gè)基礎(chǔ)上構(gòu)建的后續(xù)流程就變得很脆弱。很多學(xué)者提出了各種端到端的研究方案,試圖提升任務(wù)型機(jī)器人的使用魯棒性。但這些方案基本都需要利用海量的歷史對話數(shù)據(jù)進(jìn)行訓(xùn)練,而且效果也并未在真實(shí)復(fù)雜場景中得到過驗(yàn)證。
開域閑聊型機(jī)器人是目前學(xué)術(shù)界的寵兒,可能是因?yàn)榭筛倪M(jìn)的地方實(shí)在太多吧。純粹的生成式模型在答復(fù)格式比較確定的應(yīng)用中效果已經(jīng)不錯(cuò),可以應(yīng)用于生產(chǎn)環(huán)境;但在答復(fù)格式非常靈活的情況下,它生成的答復(fù)連通順性都未必能保證,更不用說結(jié)果的合理性。生成模型的另一個(gè)問題是它的生成結(jié)果可控性較低,效果優(yōu)化也并不容易。但這方面的學(xué)術(shù)進(jìn)展非??焖?,很多學(xué)者已經(jīng)在探索深度增強(qiáng)學(xué)習(xí)、GAN等新算法框架在其上的使用效果。
雖然目前對話機(jī)器人能解決的問題非常有限,短期內(nèi)不可能替代人完成較復(fù)雜的工作。但這并不意味著我們無法在生成環(huán)境中使用對話機(jī)器人。尋找到適宜的使用場景,對話機(jī)器人仍能大幅提升商業(yè)效率。截止到目前,愛因互動(dòng)已經(jīng)成功把對話機(jī)器人應(yīng)用于智能投顧、保險(xiǎn)、理財(cái)?shù)蠕N售轉(zhuǎn)化場景,也在電商產(chǎn)品的對話式發(fā)現(xiàn)和推薦中驗(yàn)證了對話機(jī)器人的作用。
如果一個(gè)對話機(jī)器人與真人能順利溝通且不被真人發(fā)現(xiàn)自己是機(jī)器人,那么就說這個(gè)機(jī)器人通過了圖靈測試。當(dāng)然目前的對話機(jī)器人技術(shù)離這個(gè)目標(biāo)還很遠(yuǎn),但我們正在逐漸接近這個(gè)目標(biāo)。隨著語音識別,NLP等技術(shù)的不斷發(fā)展,隨著萬物互聯(lián)時(shí)代的到來,對話機(jī)器人的舞臺將會(huì)越來越大。
作者簡介:
吳金龍,2017年初作為合伙人加入愛因互動(dòng),負(fù)責(zé)算法部門工作。北京大學(xué)博士,畢業(yè)后先后加入阿里云、世紀(jì)佳緣,作為世紀(jì)佳緣資深總監(jiān),負(fù)責(zé)佳緣數(shù)據(jù)和AI相關(guān)工作,開發(fā)了中文對話機(jī)器人創(chuàng)建平臺“一個(gè)AI”。
評論
查看更多