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


TAG:人工智慧頭條 |