[人工智能]
本文轉(zhuǎn)載自:微軟亞洲研究院
機器接收文字、圖像或者語音,識別其中的內(nèi)容,然后給予適當(dāng)?shù)幕貜?fù)。有的回復(fù)很有意思,讓人覺得好像電腦后面就坐著一個真實的人,但有的時候回復(fù)也差強人意。以下是微軟亞洲研究院副院長周明分享的他們團隊在微軟做自然語言人機對話方面的研究,并提供了小冰的關(guān)鍵NLP技術(shù)。
我要買東西時,一進門,售貨員會打招呼說,“你好!”,我回復(fù)“你好”。接著她會問“你想看看什么?”,我說“我想買兩包方便面”。她問“什么牌子的呢?這個三塊錢一包,這個五塊錢一包”,我說“那要三塊錢一包的吧。”她說“那好,你用支付寶還是微信付款呢?”我說“微信”。她說“好,這就是你買的東西”。

可以注意到,在我們每天都會產(chǎn)生的這些對話中實際上包含了三個最基本的人類智力的活動。第一個,聊天。聊天一般沒有太多實質(zhì)性的內(nèi)容,主要是拉近人與人之間的關(guān)系;第二個就是問答,比如“你買什么東西”,“這個方便面多少錢一包”,這是提問,它的目的是提供信息;第三個,面向特定意圖的對話。比如售貨員知道我的意圖是買方便面,開始圍繞這個意圖跟我進行了有目的的對話。最終我完成支付行為,售貨員把方便面放到我手上。這三個技能是我們在研究人機對話當(dāng)中最重要的三個技能。
最近幾年,深度神經(jīng)網(wǎng)絡(luò)逐漸取代了傳統(tǒng)的統(tǒng)計機器學(xué)習(xí),成為主流的研究方向。現(xiàn)在,自然語言技術(shù)已全部轉(zhuǎn)向深度學(xué)習(xí)網(wǎng)絡(luò),我們的對話系統(tǒng)也都用到了深度學(xué)習(xí)網(wǎng)絡(luò),所以先向大家介紹一下深度學(xué)習(xí)網(wǎng)絡(luò)。
深度學(xué)習(xí)網(wǎng)絡(luò)一般有一個輸入層,一個輸出層,中間有N層是神經(jīng)網(wǎng)絡(luò),他們之間通過一種連接方式以不同的權(quán)值來發(fā)揮作用,當(dāng)輸入時,根據(jù)神經(jīng)網(wǎng)絡(luò)的權(quán)值逐層推進,就會得到一個輸出。

其實在訓(xùn)練的時候有很多樣本,輸入和輸出是對應(yīng)的。當(dāng)輸入到神經(jīng)網(wǎng)絡(luò)時,有的時候會發(fā)現(xiàn)結(jié)果不對,那么則可以根據(jù)它與答案之間的差距進行反向傳播并修正參數(shù)。當(dāng)網(wǎng)絡(luò)趨勢越來越好,那么到一定時候網(wǎng)絡(luò)就可以收斂,進而網(wǎng)絡(luò)就達到了一定的智能行為,這就是最簡單的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
再來說一下常見的卷積神經(jīng)網(wǎng)絡(luò)的基本原理,我們以低密、低維的卷積神經(jīng)網(wǎng)絡(luò)為例。它實際上是從頭開始,會以一個小的窗口進行滑動,每個窗口截取一定的信息,并抽取出來做卷積,這叫卷積的行為。而每次會滑動都會得到一個值,最后得到一個卷積的結(jié)果。一般卷積之后還可以抽取最大值,這整個過程都體現(xiàn)了信息抽取的過程。

第二個比較常用的是二維的卷積,它是在矩陣里找一個小的窗口滑動,每個窗口通過卷積得到一個值,再通過填充所有窗口可以滑動的位置最后得到結(jié)果,這就是二維卷積的過程。

第三個叫循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN,也叫遞歸神經(jīng)網(wǎng)絡(luò)),它描述的是一個序列串的過程。任何位置的輸出都受限于前一位置或前一狀態(tài)的位置信息,我們叫隱狀態(tài)ht-1的信息,它和當(dāng)前的輸入字符串的信息一起會得到當(dāng)前的隱形狀態(tài)ht,然后根據(jù)這個當(dāng)前的隱狀態(tài)再預(yù)測每個詞的輸入概率。

循環(huán)神經(jīng)網(wǎng)絡(luò)訓(xùn)練完以后,任何句子都可以走這樣的循環(huán)神經(jīng)網(wǎng)絡(luò)了,它的結(jié)果是由N個隱狀態(tài)組成,而最后的隱狀態(tài),我們則可以認為它繼承了前面所有句子、詞的信息。
當(dāng)然,每個位置也代表了到目前為止句子的信息,所以使用時,要么用最后一個結(jié)點,要么就把結(jié)點全用起來,形成一個向量來代表當(dāng)前句子的編碼。這樣訓(xùn)練就比較簡單了,一個句子進來走一遍剛才的這個過程,就可以得到每一位置詞的輸出概率,這些概率之乘就是這個循環(huán)神經(jīng)網(wǎng)絡(luò)的損失函數(shù),然后根據(jù)損失函數(shù),用反向傳播去修正網(wǎng)絡(luò)的連接強度,最后等網(wǎng)絡(luò)穩(wěn)定時就可以得到循環(huán)神經(jīng)網(wǎng)絡(luò)。

所以,只要有大規(guī)模的語料庫,通過這種訓(xùn)練方法就會形成一個描述當(dāng)前語料庫每個句子的循環(huán)神經(jīng)網(wǎng)絡(luò)。
再來介紹一下剛才所說的三種對話的功能。第一個,聊天是怎么做的,這樣的人機對話是怎樣形成的?其實一般有兩種辦法。一種很簡單,就是將網(wǎng)上的論壇、微博或是網(wǎng)站里出現(xiàn)過的對話句子抽取出來,當(dāng)成訓(xùn)練語料庫。當(dāng)來了一個句子時,系統(tǒng)會從語料庫里找到一個跟這個句子最相像的句子,而這個句子對應(yīng)的答復(fù)就可以直接輸出作為電腦的回復(fù)。雖然看起來這個方法簡單粗暴,但有時候還是挺有效的。
然而有的時候,系統(tǒng)找到的句子可能對應(yīng)了很多回復(fù),它不知道哪個回復(fù)最適合當(dāng)前的輸入語句。所以這里就要有一個匹配的過程,就是怎么判斷輸入語句跟語料庫里的回復(fù)在語義上是相關(guān)的或者是一致的。
這里就有了很多度量的方法,給大家介紹其中的兩種。
第一種,如下圖,q代表當(dāng)前輸入的語句,r代表目前的一個回復(fù),想看q和r是否相關(guān)或者一致,要給它一個分數(shù)。如果有多個選擇時,首先要把所有的東西排下去,輸出最佳的分數(shù),即實際上是對整個句子進行編碼,對問題、回復(fù)進行編碼。編碼的方式可以用循環(huán)神經(jīng)網(wǎng)絡(luò),也可以用卷積神經(jīng)網(wǎng)絡(luò),也可以用最簡單的就是每個維度取平均值,最后算一下這兩個向量之間的距離。

第二個方法也比較簡單,就是把問題和回答的每個詞都算一個距離,這樣就形成了一個相似度的矩陣,通過卷積得到矩陣變換的信息,然后再取最大池化層,矩陣的維度就越來越小,最后可能就做到一個結(jié)點上。這個可以有多種變換,那么最后就會有一組結(jié)點,所有的結(jié)點其實都代表了這兩個字符串之間的距離,再通過多層感知就可以算出句子。
然而這些方法都有一個問題,就是短字符串匹配的時候太依賴于自己的信息了。而我們?nèi)粘Uf話時往往是有背景、有常識的,我們說的每句話都有一個主題詞表。比如我來到了清華三食堂,那這個背后的主題詞可以說吃飯、早飯、中飯、晚飯、價錢、飯卡等,這些詞都是跟它相關(guān)的主題詞,匹配的時候要體現(xiàn)出這些主題詞。
怎么體現(xiàn)呢?首先找出輸入語句的N個主題詞,然后再找出可以回復(fù)的那些句子的主題詞,用主題詞來增強匹配的過程。這也是通過神經(jīng)網(wǎng)絡(luò)來算兩個詞串,再加上主題詞增義的相似度。

具體算法實際上是通過Attention model(注意力模型)計算每個主題詞跟當(dāng)前這句話的匹配強度,所有主題詞根據(jù)強度不同進行加權(quán)以體現(xiàn)當(dāng)前背景主題詞的強度,然后再和原句匹配在一起,來算相似度。
另外,我們也可以把主題詞當(dāng)成所謂的Knowledge base(知識圖譜),通過主題詞限定當(dāng)前的輸入應(yīng)該有哪些信息可以輸出,哪些信息不要輸出,哪些信息應(yīng)該補足,哪些信息可以直接使用等等。實際上在具體實現(xiàn)時可以看到一個句子有三種表示方法,兩個句子之間每個句子都有三種表示方法,用兩兩表示方法計算距離最后就會得到一個矢量,再通過多層感知得到一個數(shù)值,來表征這兩個輸入串的距離。所以,這兩個輸入串不是赤裸裸地直接去匹配,而是用周圍知識所代表的主題詞來增強。

以上是基于搜索的一種回復(fù)方法,我們也可以用生成模型,其實生成模型走的也是神經(jīng)網(wǎng)絡(luò)的路線。輸入一個句子,然后通過循環(huán)神經(jīng)網(wǎng)絡(luò)進行編碼,再通過解碼的過程輸出每個詞。當(dāng)機器翻譯的時候是跨語言的輸出,由原文輸出譯文,而在古詩里是第一句生成第二句,在這里就是輸入一個用戶的問題得到一個系統(tǒng)的回復(fù)。
這就是一個生成的過程,可以看到圖中下部是進行一個句子的編碼,用這個編碼指導(dǎo)每一個詞的輸出,在輸出時既考慮原始句子的編碼,也考慮前面的詞輸出什么樣的詞以及前面的隱狀態(tài)是什么,最后傳遞輸出,直到輸出詞尾。

實際上,輸出時不能一而貫之所有的詞都等價對待。有的詞權(quán)重比較高,這就由Attention model來體現(xiàn)輸出某一類詞時,哪個源端詞對它的影響力最大,要體現(xiàn)在輸出的概率方面。
用傳統(tǒng)的RNN以及注意力模型就可以做問題輸入,系統(tǒng)回復(fù)。但是它也有很多問題,比如它的回答太枯燥不豐富,那怎么辦?
我們要用到外部知識來豐富回答。我們可以用主題詞增義。原始的句子可以用Attention model輸出每個位置的詞,然后再增強跟這個句子有關(guān)的主題詞,把主題詞編碼,也做一種Attention model來預(yù)測輸出。一個詞的輸出除了來自源端的信息之外,還受到了主題詞的制約,最后輸出的概率是這兩個輸出預(yù)測結(jié)果的概率之和,選擇一個最優(yōu)的來輸出。

剛才說的是單輪的,現(xiàn)在說多輪怎么回答,因為人在說話的時候是考慮上下文的,不是只看當(dāng)前的一句話,多輪的信息都要考慮進去。所以要把整個對話(session)考慮進去,對session進行編碼,用session來預(yù)測輸出的回復(fù)。

在計算的時候,我們有幾個這樣的模型。剛才是基于搜索的方式,還可以用多層感知的方式來模擬多輪對話。對每一個之前出現(xiàn)的句子進行編碼,每個編碼都可以通過一個句子的編碼體現(xiàn)整個句子的信息,再通過Attention model跟目標(biāo)連接,最后預(yù)測的時候就是通過基于句子的Attention model來預(yù)測。大家可以理解為我們在回復(fù)的時候既要看到前面哪一句話重要,還要看到那一句話里哪個詞重要,所以是一個雙層的Attention model。
以上是關(guān)于聊天的介紹,還有問答和對話。
問答就是用戶有問題,系統(tǒng)要理解這個問題,然后利用系統(tǒng)所有的資源來回答這個問題,資源可能是FAQ、文檔、表格、知識圖譜等等,哪一個回答出來了,就說明哪一個是答案,如果有多個資源都可以回答問題,那我們選取那個最有可能的來進行輸出。
簡單說一下所謂Knowledge base(知識圖譜)有兩條路走,一條是對用戶的問題進行語義理解,一般用Semantic Parsing(語義分析),語義分析有很多種,比如有用CCG、DCS,也有用機器翻譯來做的。它得到了一個句子的邏輯表示,根據(jù)邏輯表示再到知識庫里去查,查到這個結(jié)點是什么,關(guān)系是什么等,通過這種方式,自然而然就查到了。

還有一種辦法就是最近幾年流行的信息檢索方法。比如,一個問題“where was Barack Obama born ?”這句話里出現(xiàn)的了一個實體——Obama,假設(shè)這個知識庫是完備的,那么系統(tǒng)就會判斷答案一定是跟Obama關(guān)聯(lián)的某個結(jié)點,這樣就可以到知識庫里以O(shè)bama為半徑,把跟它有關(guān)的詞全部挖出來,然后系統(tǒng)要算相似度,相似度算的時候有一種辦法,是把這個知識圖譜的某一個知識單元用自然語言表征出來,也可以用詞嵌入做一個多維向量表示。這時候做一個Ranker跟當(dāng)前的問題算一個距離,距離近的就是它的答案。我們也將這些技術(shù)運用在了微軟小冰里,比如小冰回答問題,跟你聊天等等。我們還做了京東商城里的導(dǎo)購。
怎么在京東商城里通過對話過程來實行導(dǎo)購呢?實際上就是對用戶輸入的話,檢測意圖是什么,如果檢測不到,系統(tǒng)就判斷可能是聊天,然后通過聊天的引擎進行溝通。如果檢測到意圖,比如知道用戶是要訂旅館,那么就有對應(yīng)的訂旅館的對話狀態(tài)表記錄目前進行的狀態(tài)及要填充哪些信息。
系統(tǒng)知道要填什么信息的時候,就會生成相應(yīng)的問題讓用戶回答,用戶回答完之后系統(tǒng)再把信息抽取過來填充到這個表里,直到所有的信息全部填充完畢,就完成了這個任務(wù)的對話過程。

這里就涉及到了對問題的理解,問題中有哪些信息要抓取出來,還有對話管理,比如狀態(tài)的轉(zhuǎn)移,slot的填充或者更改,選擇一個新的slot開始對話,以及如果要決定填充哪個slot的時候,怎么生成對話可以讓用戶很自然地回答這個問題,從而獲得系統(tǒng)所需要的信息。
今天簡單的給大家介紹了三個關(guān)鍵技術(shù),這三個技術(shù)每個都不容易,我們現(xiàn)在雖然取得了一定的成績,但還有很多問題需要解決,也期待大家運用自己的智慧把這個領(lǐng)域推進一步,更好的解決難題。
在未來有三件大事非常重要,第一個就是如何更好地來為上下文或者是多輪對話建模,目前還是用比較粗糙的信息表示方法來做,沒有精確的來斷定前文出現(xiàn)了哪些具體的信息,將來我們可以用信息抽取的方法把這些信息記錄下來,引導(dǎo)未來的對話。第二個,個性化的信息如何指導(dǎo)生成個性化的回復(fù)。最后,現(xiàn)在的回復(fù)也是千篇一律,大人、小孩、男孩、女孩,可能都是一樣的,但人們在實際對話中面對不同的人群是不一樣的,如何能夠?qū)貜?fù)的風(fēng)格進行自動調(diào)整,使對話更加豐富多彩,這也是目前的一個挑戰(zhàn)。