微軟小冰智能聊天是如何實現的?


謝邀。

微軟亞洲研究院副院長周明博士本月在清華大學的演講——自然語言聊天、問答和對話,剛好可以回答這個問題。演講中,周明博士與大家分享了微軟小冰背後的人機對話機理。

&" dw="542" dh="351" class="origin_image zh-lightbox-thumb lazy" w="542" data-original="https://pic2.zhimg.com/v2-243a262f761ce74d0b269d0e83b46782_r.jpg" data-actualsrc="//i1.wp.com/pic2.zhimg.com/50/v2-243a262f761ce74d0b269d0e83b46782_hd.jpg">

周明博士,微軟亞洲研究院副院長、國際計算語言學協會(ACL)候任主席、中國計算機學會理事、中文信息技術專委會主任、術語工作委員會主任、中國中文信息學會常務理事、哈爾濱工業大學、天津大學、南開大學、山東大學等多所學校博士導師。

————這裡是正式回答的分割線————

微軟小冰就是在模擬人跟電腦的對話。電腦接收文字、圖像或者語音,識別其中的內容,然後給予適當的回復。我們團隊在微軟做自然語言人機對話方面的研究,並提供了小冰的關鍵自然語言處理技術。下面我將介紹一下人機對話機理,希望對大家有所幫助,也希望大家一起加入到人機對話的創新過程中,把人機對話做的更好。

&" dw="528" dh="358" class="origin_image zh-lightbox-thumb lazy" w="528" data-original="https://pic4.zhimg.com/v2-a342b11ba509e32ef2c686aea396ac8c_r.jpg" data-actualsrc="//i1.wp.com/pic4.zhimg.com/50/v2-a342b11ba509e32ef2c686aea396ac8c_hd.jpg">

人機對話有三個層次,一個是聊天,一個是問答,還有一個是對話,即面向某一特定任務的對話。比如,我要買東西時,一進門,售貨員會打招呼說,「你好!」,我回復「你好」。接著她會問「你想看看什麼?」,我說「我想買兩包速食麵」。她問「什麼牌子的呢?這個三塊錢一包,這個五塊錢一包」,我說「那要三塊錢一包的吧。」她說「那好,你用支付寶還是微信付款呢?」我說「微信」。她說「好,這就是你買的東西」。可以注意到,在我們每天都會產生的這些對話中實際上包含了三個最基本的人類智力的活動:

  • 第一個,聊天。聊天一般沒有太多實質性的內容,主要是拉近人與人之間的關係;
  • 第二個,問答。比如「你買什麼東西」,「這個速食麵多少錢一包」,這是提問,它的目的是提供信息;
  • 第三個,面向特定意圖的對話。比如售貨員知道我的意圖是買速食麵,開始圍繞這個意圖跟我進行了有目的的對話。最終我完成支付行為,售貨員把速食麵放到我手上。

這三個技能是我們在研究人機對話當中最重要的三個技能。

最近幾年,深度神經網路逐漸取代了傳統的統計機器學習,成為主流的研究方向。現在,自然語言技術已全部轉向深度學習網路,我們的對話系統也都用到了深度學習網路,所以先向大家介紹一下深度學習網路(內容略,詳情見文末微信鏈接)。

再來介紹一下剛才所說的三種對話的功能。第一個,聊天是怎麼做的,這樣的人機對話是怎樣形成的?其實一般有兩種辦法。

一種很簡單,就是將網上的論壇、微博或是網站里出現過的對話句子抽取出來,當成訓練語料庫。當來了一個句子時,系統會從語料庫里找到一個跟這個句子最相像的句子,而這個句子對應的答覆就可以直接輸出作為電腦的回復。雖然看起來這個方法簡單粗暴,但有時候還是挺有效的。

然而有的時候,系統找到的句子可能對應了很多回復,它不知道哪個回復最適合當前的輸入語句。所以這裡就要有一個匹配的過程,就是怎麼判斷輸入語句跟語料庫里的回復在語義上是相關的或者是一致的。這裡就有了很多度量的方法,給大家介紹其中的兩種。

第一種,如下圖,q代表當前輸入的語句,r代表目前的一個回復,想看q和r是否相關或者一致,要給它一個分數。如果有多個選擇時,首先要把所有的東西排下去,輸出最佳的分數,即實際上是對整個句子進行編碼,對問題、回復進行編碼。編碼的方式可以用循環神經網路,也可以用卷積神經網路,也可以用最簡單的就是每個維度取平均值,最後算一下這兩個向量之間的距離。

&" dw="554" dh="416" class="origin_image zh-lightbox-thumb lazy" w="554" data-original="https://pic1.zhimg.com/v2-63aa5c39c259a1e483fb1e86026f2d94_r.jpg" data-actualsrc="//i1.wp.com/pic1.zhimg.com/50/v2-63aa5c39c259a1e483fb1e86026f2d94_hd.jpg">

第二個方法也比較簡單,就是把問題和回答的每個詞都算一個距離,這樣就形成了一個相似度的矩陣,通過卷積得到矩陣變換的信息,然後再取最大池化層,矩陣的維度就越來越小,最後可能就做到一個結點上。這個可以有多種變換,那麼最後就會有一組結點,所有的結點其實都代表了這兩個字元串之間的距離,再通過多層感知就可以算出句子。

然而這些方法都有一個問題,就是短字元串匹配的時候太依賴於自己的信息了。而我們日常說話時往往是有背景、有常識的,我們說的每句話都有一個主題詞表。比如我來到了清華三食堂,那這個背後的主題詞可以說吃飯、早飯、中飯、晚飯、價錢、飯卡等,這些詞都是跟它相關的主題詞,匹配的時候要體現出這些主題詞

怎麼體現呢?首先找出輸入語句的N個主題詞,然後再找出可以回復的那些句子的主題詞,用主題詞來增強匹配的過程。這也是通過神經網路來算兩個詞串,再加上主題詞增義的相似度。

具體演算法實際上是通過Attention model(注意力模型)計算每個主題詞跟當前這句話的匹配強度,所有主題詞根據強度不同進行加權以體現當前背景主題詞的強度,然後再和原句匹配在一起,來算相似度。

&" dw="554" dh="382" class="origin_image zh-lightbox-thumb lazy" w="554" data-original="https://pic4.zhimg.com/v2-c94d4cfd5534a16b05b9c20759574866_r.jpg" data-actualsrc="//i1.wp.com/pic4.zhimg.com/50/v2-c94d4cfd5534a16b05b9c20759574866_hd.jpg">

另外,我們也可以把主題詞當成所謂的Knowledge base(知識圖譜),通過主題詞限定當前的輸入應該有哪些信息可以輸出,哪些信息不要輸出,哪些信息應該補足,哪些信息可以直接使用等等。實際上在具體實現時可以看到一個句子有三種表示方法,兩個句子之間每個句子都有三種表示方法,用兩兩表示方法計算距離,最後就會得到一個矢量,再通過多層感知得到一個數值,來表徵這兩個輸入串的距離。所以,這兩個輸入串不是赤裸裸地直接去匹配,而是用周圍知識所代表的主題詞來增強。

&" dw="554" dh="409" class="origin_image zh-lightbox-thumb lazy" w="554" data-original="https://pic4.zhimg.com/v2-d77a5cb9661da5bf22a786378e03034a_r.jpg" data-actualsrc="//i1.wp.com/pic4.zhimg.com/50/v2-d77a5cb9661da5bf22a786378e03034a_hd.jpg">

以上是基於搜索的一種回復方法,我們也可以用生成模型,其實生成模型走的也是神經網路的路線。輸入一個句子,然後通過循環神經網路進行編碼,再通過解碼的過程輸出每個詞。當機器翻譯的時候是跨語言的輸出,由原文輸出譯文,而在古詩里是第一句生成第二句,在這裡就是輸入一個用戶的問題得到一個系統的回復。

這就是一個生成的過程,可以看到圖中下部是進行一個句子的編碼,用這個編碼指導每一個詞的輸出,在輸出時既考慮原始句子的編碼,也考慮前面的詞輸出什麼樣的詞以及前面的隱狀態是什麼,最後傳遞輸出,直到輸出詞尾。

&" dw="554" dh="392" class="origin_image zh-lightbox-thumb lazy" w="554" data-original="https://pic2.zhimg.com/v2-2fc49d708f620be838ed7d7462d8b906_r.jpg" data-actualsrc="//i1.wp.com/pic2.zhimg.com/50/v2-2fc49d708f620be838ed7d7462d8b906_hd.jpg">

實際上,輸出時不能一而貫之所有的詞都等價對待。有的詞權重比較高,這就由Attention model來體現輸出某一類詞時,哪個源端詞對它的影響力最大,要體現在輸出的概率方面。

用傳統的RNN以及注意力模型就可以做問題輸入,系統回復。但是它也有很多問題,比如它的回答太枯燥不豐富,那怎麼辦?

我們要用到外部知識來豐富回答。我們可以用主題詞增義。原始的句子可以用Attention model輸出每個位置的詞,然後再增強跟這個句子有關的主題詞,把主題詞編碼,也做一種Attention model來預測輸出。一個詞的輸出除了來自源端的信息之外,還受到了主題詞的制約,最後輸出的概率是這兩個輸出預測結果的概率之和,選擇一個最優的來輸出。

&" dw="519" dh="374" class="origin_image zh-lightbox-thumb lazy" w="519" data-original="https://pic3.zhimg.com/v2-403456610cc1b9483984d96fbb2587d2_r.jpg" data-actualsrc="//i1.wp.com/pic3.zhimg.com/50/v2-403456610cc1b9483984d96fbb2587d2_hd.jpg">

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

&" dw="506" dh="332" class="origin_image zh-lightbox-thumb lazy" w="506" data-original="https://pic3.zhimg.com/v2-805209a7450276150b0d8133b18557dd_r.jpg" data-actualsrc="//i1.wp.com/pic3.zhimg.com/50/v2-805209a7450276150b0d8133b18557dd_hd.jpg">

在計算的時候,我們有幾個這樣的模型。剛才是基於搜索的方式,還可以用多層感知的方式來模擬多輪對話。對每一個之前出現的句子進行編碼,每個編碼都可以通過一個句子的編碼體現整個句子的信息,再通過Attention model跟目標連接,最後預測的時候就是通過基於句子的Attention model來預測。大家可以理解為我們在回復的時候既要看到前面哪一句話重要,還要看到那一句話里哪個詞重要,所以是一個雙層的Attention model。

以上是關於聊天的介紹,還有問答和對話。

問答就是用戶有問題,系統要理解這個問題,然後利用系統所有的資源來回答這個問題。資源可能是FAQ、文檔、表格、知識圖譜等等,哪一個回答出來了,就說明哪一個是答案,如果有多個資源都可以回答問題,那我們選取那個最有可能的來進行輸出。

簡單說一下所謂Knowledge base(知識圖譜)有兩條路走,一條是對用戶的問題進行語義理解,一般用Semantic Parsing(語義分析),語義分析有很多種,比如有用CCG、DCS,也有用機器翻譯來做的。它得到了一個句子的邏輯表示,根據邏輯表示再到知識庫里去查,查到這個結點是什麼,關係是什麼等,通過這種方式,自然而然就查到了。

&" dw="535" dh="347" class="origin_image zh-lightbox-thumb lazy" w="535" data-original="https://pic2.zhimg.com/v2-4910f8d2148b8e2a0618254593c5c615_r.jpg" data-actualsrc="//i1.wp.com/pic2.zhimg.com/50/v2-4910f8d2148b8e2a0618254593c5c615_hd.jpg">

還有一種辦法就是最近幾年流行的信息檢索方法。比如,一個問題「where was Barack Obama born ?」這句話里出現的了一個實體——Obama,假設這個知識庫是完備的,那麼系統就會判斷答案一定是跟Obama關聯的某個結點,這樣就可以到知識庫里以Obama為半徑,把跟它有關的詞全部挖出來,然後系統要算相似度,相似度算的時候有一種辦法,是把這個知識圖譜的某一個知識單元用自然語言表徵出來,也可以用詞嵌入做一個多維向量表示。這時候做一個Ranker跟當前的問題算一個距離,距離近的就是它的答案。我們也將這些技術運用在了微軟小冰里,比如小冰回答問題,跟你聊天等等。

————這裡是回答結束的分割線————

以上回答摘選自周明博士的演講,了解完整演講內容,請移步: 講堂|周明:自然語言對話引擎



感謝大家的閱讀。

本賬號為微軟亞洲研究院的官方知乎賬號。本賬號立足於計算機領域,特別是人工智慧相關的前沿研究,旨在為人工智慧的相關研究提供範例,從專業的角度促進公眾對人工智慧的理解,並為研究人員提供討論和參與的開放平台,從而共建計算機領域的未來。

微軟亞洲研究院的每一位專家都是我們的智囊團,你在這個賬號可以閱讀到來自計算機科學領域各個不同方向的專家們的見解。請大家不要吝惜手裡的「邀請」,讓我們在分享中共同進步。

也歡迎大家關注我們的微博和微信賬號,了解更多我們研究。

http://weixin.qq.com/r/PUliejrEzWeyrX4Z9xwv (二維碼自動識別)


剛好做過一個類似的產品,雖然沒有那麼高大上,但一些核心技術原理應該也參考意義,說一下做的思路。

類似小冰這樣的產品說簡單也簡單,說複雜也複雜。單純從外面看你會覺得小冰與去年人人網上流行的小黃雞類似,但在技術實現上有本質的差異。

此類應用的大致流程都是:用戶輸入一段話(不一定只是單詞)-&>後端語義引擎對用戶輸入的語句進行語義解析-&>推斷用戶最可能的意圖-&>調用對應的知識庫、應用、計算引擎-&>返回結果給用戶。

1、最初級的實現方法:關鍵詞匹配

建一個關鍵詞詞庫,對用戶輸入的語句進行關鍵詞匹配,然後調用對應的知識庫。

此種方式入門門檻很低,基本上是個程序員都能實現,例如現在微信公眾平台的智能回復、諸多網站的敏感詞過濾就是此類。

但此種方式存在諸多問題,例如:

a、由於是關鍵詞匹配,如果用戶輸入的語句中出現多個關鍵詞,此時由於涉及關鍵詞權重(與知識庫的關鍵詞對比)等等問題,此時關鍵詞匹配的方法就不擅長了

b、不存在對用戶輸入語句語義的理解,導致會出現答非所問的現象。當然在產品上對回答不上的問題就採用賣萌的方式來規避掉。

c、基本上無自學習能力,規則只能完全由人工維護,且規則基本是固定死的。

d、性能、擴展性較差。還是上面的一句話中包含多個關鍵詞的例子,採用普通程序語言來做關鍵詞匹配,性能奇差。即便採用一些文本處理的演算法來做(例如Double-array trie tree),也很難滿足大規模場景需求。

2、稍微高級點的實現方法:基於搜索引擎、文本挖掘、自然語言處理(NLP)等技術來實現

相對於1的關鍵詞匹配,此種實現方法要解決的核心的問題可以大致理解為:根據一段短文本(例如用戶問的一句話)的語義,推測出用戶最可能的意圖,然後從海量知識庫內容中找出相似度最高的結果。

具體技術實現就不細說了。舉一個很粗糙的例子來簡單說一下此種實現方法處理的思路(不嚴謹,只是為了說明思路)。

假如用戶問:北京後天的溫度是多少度?

如果採用純搜索引擎的思路(基於文本挖掘、NLP的思路不盡相同,但可參考此思路),此時實際流程上分成幾步處理:

1、對輸入語句分詞,得到北京、後天、溫度3個關鍵詞。分詞時候利用了預先建好的行業詞庫,「北京」符合預先建好的城市庫、「後天」符合日期庫、「溫度」符合氣象庫

2、將上述分詞結果與規則庫按照一定演算法做匹配,得出匹配度最高的規則。假定在規則庫中有一條天氣的規則:城市庫+日期庫+氣象庫,從而大致可以推測用戶可能想問某個地方某天的天氣。

3、對語義做具體解析,知道城市是北京,日期是後天,要獲取的知識是天氣預報

4、調用第三方的天氣介面,例如中國天氣網-專業天氣預報、氣象服務門戶 的數據

5、將結果返回給用戶

以上例子其實很粗糙,實際上還有諸多問題沒提到:語義上下文、語義規則的優先順序等等。

例如用戶上一句問:北京後天的溫度是多少度?下一句問:後天的空氣質量呢?這裡實際上還涉及語義上下文、用戶歷史喜好數據等等諸多問題。

此種處理方法存在的最大問題:規則庫還主要依賴於人工的建立,雖然有一定的學習能力,但自我學習能力還是較弱。可以藉助一些訓練演算法來完善規則,但效果並不是很好。而這也是目前流行的深度挖掘技術所擅長的。

3、當下時髦且高級的玩法:基於深度挖掘、大數據技術來實現

這是cornata、google now等後端的支撐技術,至於小冰,感覺應該是以2為主+部分領域知識的深度挖掘。

下圖是自己做的產品的架構圖,供參考:

&" class="origin_image zh-lightbox-thumb lazy" w="555" data-original="https://pic2.zhimg.com/a4d821b41a189f03227721a8794d5947_r.jpg" data-actualsrc="//i1.wp.com/pic2.zhimg.com/50/a4d821b41a189f03227721a8794d5947_hd.jpg">


推薦閱讀:

如何判斷兩段文本說的是「同一件事情」?
triplet loss 在深度學習中主要應用在什麼地方?有什麼明顯的優勢?
人工智慧的自我提升是可能的嗎?目前有什麼不可破的技術障礙嗎?
人工智慧在哪些領域還落後於人類?
人工智慧四問?

TAG:人工智慧 | 微軟Microsoft | 演算法 | 人工智慧演算法 | 微軟小冰 |