機器之魂:聊天機器人是怎麼工作的

lsvih發表於2017-08-14

機器之魂:聊天機器人是怎麼工作的

自早期的工業時代以來,人類就被能自主操作的裝置迷住了。因為,它們代表了科技的“人化”。

而在今天,各種軟體也在逐漸變得人性化。其中變化最明顯的當屬“聊天機器人”。

但是這些“機械”是如何運作的呢?首先,讓我們回溯過去,探尋一種原始,但相似的技術。

音樂盒是如何工作的

早期自動化的樣例 —— 機械音樂盒。
一組經過調音的金屬齒排列成梳狀結構,置於一個有針的圓柱邊上。每根針都以一個特定的時間對應著一個音符。

當機械轉動時,它便會在預定好的時間通過單個或者多個針的撥動來產生樂曲。如果要播放不同的歌,你得換不同的圓柱桶(假設不同的樂曲對應的特定音符是一樣的)。

除了發出音符之外,圓筒的轉動還可以附加一些其它的動作,例如移動小雕像等。不管怎樣,這個音樂盒的基本機械結構是不會變的。

聊天機器人是如何工作的

輸入的文字將經過一種名為“分類器”的函式處理,這種分類器會將一個輸入的句子和一種“意圖”(聊天的目的)聯絡起來,然後針對這種“意圖”產生迴應。

一個聊天機器人的例子

你可以將分類器看成是將一段資料(一句話)分入幾個分類中的一種(即某種意圖)的一種方式。輸入一句話“how are you?”,將被分類成一種意圖,然後將其與一種迴應(例如“I’m good”或者更好的“I am well”)聯絡起來。

我們在基礎科學中早學習了分類:黑猩猩屬於“哺乳動物”類,藍鳥屬於“鳥”類,地球屬於“行星”等等。

一般來說,文字分類有 3 種不同的方法。可以將它們看做是為了一些特定目的製造的軟體機械,就如同音樂盒的圓筒一樣。

聊天機器人的文字分類方法

  • 模式匹配
  • 演算法
  • 神經網路

無論你使用哪種分類器,最終的結果一定是給出一個迴應。音樂盒可以利用一些機械機構的聯絡來完成一些額外的“動作”,聊天機器人也如此。迴應中可以使用一些額外的資訊(例如天氣、體育比賽比分、網路搜尋等等),但是這些資訊並不是聊天機器人的組成部分,它們僅僅是一些額外的程式碼。也可以根據句子中的某些特定“詞性”來產生迴應(例如某個專有名詞)。此外,符合意圖的迴應也可以使用邏輯條件來判斷對話的“狀態”,以提供一些不同的迴應,這也可以通過隨機選擇實現(好讓對話更加“自然”)。

模式匹配

早期的聊天機器人通過模式匹配來進行文字分類以及產生迴應。這種方法常常被稱為“暴力法”,因為系統的作者需要為某個迴應詳細描述所有模式。

這些模式的標準結構是“AIML”(人工智慧標記語言)。這個名詞裡用了“人工智慧”作為修飾詞,但是它們完全不是一碼事

下面是一個簡單的模式匹配定義:

<aiml version = "1.0.1" encoding = "UTF-8"?>
   <category>
      <pattern> WHO IS ALBERT EINSTEIN </pattern>
      <template>Albert Einstein was a German physicist.</template>
   </category>

   <category>
      <pattern> WHO IS Isaac NEWTON </pattern>
      <template>Isaac Newton was a English physicist and mathematician.</template>
   </category>

   <category>
      <pattern>DO YOU KNOW WHO * IS</pattern>
      <template>
         <srai>WHO IS <star/></srai>
      </template>
   </category>
</aiml>複製程式碼

然後機器經過處理會回答:

Human: Do you know who Albert Einstein is
Robot: Albert Einstein was a German physicist.複製程式碼

它之所以知道別人問的是哪個物理學家,只是靠著與他或者她名字相關聯的模式匹配。同樣的,它靠著創作者預設的模式可以對任何意圖進行迴應。在給予它成千上萬種模式之後,你終將能看到一個“類人”的聊天機器人出現。

2000 年的時候,John Denning 和他的同事就以這種方法做了個聊天機器人(相關新聞),並通過了“圖靈測試”。它設計的目標是模仿來自烏克蘭的一個 13 歲的男孩,這孩子的英語水平很蹩腳。我在 2015 年的時候和 John 見過面,他沒有矢口否認這個自動機的內部原理。因此,這個聊天機器人很可能就是用“暴力”的方法進行模式匹配。但它也證明了一點:在足夠大的模式匹配定義的支援下,可以讓大部分對話都貼近“自然”的程度。同時也符合了圖靈(Alan Turing)的斷言:製作用來糊弄人類的機器是“毫無意義”的。

使用這種方法做機器人的典型案例還有 PandoraBots,他們宣稱已經用他們的框架構建了超過 28.5 萬個聊天機器人。

演算法

暴力窮舉法做自動機讓人望而卻步:對於每個輸入都得有可用的模式來匹配其迴應。人們由“老鼠洞”得到靈感,建立了模式的層級結構。

我們可以使用演算法這種方法來減少分類器以便對機器進行管理,或者也可以說我們為它建立一個方程。這種方法是電腦科學家們稱為“簡化”的方法:問題需要縮減,那麼解決問題的方法就是將其簡化。

有一種叫做“樸素貝葉斯多項式模型”的經典文字分類演算法,你可以在這兒或者別的地方學習它。下面是它的公式:

實際用起它來比看上去要簡單的多。給定一組句子,每個句子對應一個分類;接著輸入一個新的句子,我們可以通過計算這個句子的單詞在各個分類中的詞頻,找出各個分類的共性,並給每個分類一個分值(找出共性這點是很重要的:例如匹配到單詞“cheese”(乳酪)比匹配到單詞“it”要有意義的多)。最後,得到最高分值的分類很可能就是輸入句子的同類。當然以上的說法是經過簡化的,例如你還得先找到每個單詞的詞幹才行。不過,現在你應該對這種演算法已經有了基本的概念。

下面是一個簡單的訓練集:

class: weather
    "is it nice outside?"
    "how is it outside?"
    "is the weather nice?"

class: greeting
    "how are you?"
    "hello there"
    "how is it going?"複製程式碼

讓我們來對幾個簡單的輸入句子進行分類:

input: "Hi there"
 term: "hi" (**no matches)**
 term: "there" **(class: greeting)**
 classification: **greeting **(score=1)

input: "What’s it like outside?"
 term: "it" **(class: weather (2), greeting)**
 term: "outside **(class: weather (2) )**
 classification: **weather **(score=4)複製程式碼

請注意,“What’s it like outside”在分類時找到了另一個分類的單詞,但是正確的分類給了單詞較高的分值。通過演算法公式,我們可以為句子計算匹配每個分類對應的詞頻,因此不需要去標明所有的模式。

這種分類器通過標定分類分值(計算詞頻)的方法給出最匹配語句的分類,但是它仍然有侷限性。分值與概率不同,它僅僅能告訴我們句子的意圖最有可能是哪個分類,而不能告訴我們它的所有匹配分類的可能性。因此,很難去給出一個閾值來判定是接受這個得分結果還是不接受這個結果。這種型別的演算法給出的最高分僅僅能作為判斷相關性的基礎,它本質上作為分類器的效果還是比較差的。此外,這個演算法不能接受 is not 型別的句子,因為它僅僅計算了 it 可能是什麼。也就是說這種方法不適合做為包含 not 的否定句的分類。

有許多的聊天機器人框架都是用這種方法來判斷意圖分類。而且大多數都是針對訓練集進行詞頻計算,這種“幼稚”的方法有時還意外的有效。

神經網路

人工神經網路發明於 20 世紀 40 年代,它通過迭代計算訓練資料得到連線的加權值(“突觸”),然後用於對輸入資料進行分類。通過一次次使用訓練資料計算改變加權值以使得神經網路的輸出得到更高的“準確率”(低錯誤率)。

上圖為一種神經網路結構,其中包括神經元(圓)和突觸(線)

其實除了當今的軟體可以用更快的處理器、更大的記憶體外,這些結構並沒有出現什麼新奇的東西。當做數十萬次的矩陣乘法(神經網路中的基本數學運算)的時候,執行記憶體和計算速度成為了關鍵問題。

在前面的方法裡,每個分類都會給定一些例句。接著,根據詞幹進行分句,將所有單詞作為神經網路的輸入。然後遍歷資料,進行成千上萬次迭代計算,每次迭代都通過改變突觸權重來得到更高的準確率。接著反過來通過對訓練集輸出值和神經網路計算結果的對比,對各層重新進行計算權重(反向傳播)。這個“權重”可以類比成神經突觸想記住某個東西的“力度”,你能記住某個東西是因為你曾多次見過它,在每次見到它的時候這個“權重”都會輕微地上升。

有時,在權重調整到某個程度後反而會使得結果逐漸變差,這種情況稱為“過擬合”,在出現過擬合的情況下繼續進行訓練,反而會適得其反。

訓練好的神經網路模型的程式碼量其實很小,不過它需要一個很大的潛在權重矩陣。舉個相對較小的樣例,它的訓練句子包括了 150 個單詞、30 種分類,這可能產生一個 150x30 大小的矩陣;你可以想象一下,為了降低錯誤率,這麼大的一個矩陣需要反覆的進行 10 萬次矩陣乘法。這也是為什麼說需要高效能處理器的原因。

神經網路之所以能夠做到既複雜又稀疏,歸結於矩陣乘法和一種縮小值至 -1,1 區間的公式(即啟用函式,這裡指的是 Sigmoid),一箇中學生也能在幾小時內學會它。其實真正困難的工作是清洗訓練資料。

就像前面的模式匹配和演算法匹配一樣,神經網路也有各種各樣的變體,有一些變體會十分複雜。不過它的基本原理是相同的,做的主要工作也都是進行分類。

機械音樂盒並不瞭解樂理,同樣的,聊天機器人並不瞭解語言

聊天機器人實質上就是尋找短語集合中的模式,每個短語還能再分割成單個單詞。在聊天機器人內部,除了它們存在的模式以及訓練資料之外的單詞其實並沒有意義。為這樣的“機器人”貼上“人工智慧”的標籤其實也很糟糕

總結:聊天機器人就像機械音樂盒一樣:它就是一個根據模式來進行輸出的機器,只不過它不用圓筒和針,而是使用軟體程式碼和數學原理。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章