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

  • 原文地址:Soul of the Machine: How Chatbots Work
  • 原文作者:George Kassabgi
  • 譯文出自:掘金翻譯計劃
  • 本文永久鏈接:github.com/xitu/gold-mi
  • 譯者:lsvih
  • 校對者:lileizhenshuai,jasonxia23

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

自早期的工業時代以來,人類就被能自主操作的設備迷住了。因為,它們代表了科技的「人化」。

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

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

音樂盒是如何工作的

早期自動化的樣例 —— 機械音樂盒。

一組經過調音的金屬齒排列成梳狀結構,置於一個有針的圓柱邊上。每根針都以一個特定的時間對應著一個音符。

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

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

聊天機器人是如何工作的

輸入的文本將經過一種名為「分類器」的函數處理,這種分類器會將一個輸入的句子和一種「意圖」(聊天的目的)聯繫起來,然後針對這種「意圖」產生回應。

一個聊天機器人的例子

你可以將分類器看成是將一段數據(一句話)分入幾個分類中的一種(即某種意圖)的一種方式。輸入一句話「how are you?」,將被分類成一種意圖,然後將其與一種回應(例如「I』m good」或者更好的「I am well」)聯繫起來。

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

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

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

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

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

模式匹配

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

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

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

<aiml version = "1.0.1" encoding = "UTF-8"?>n <category>n <pattern> WHO IS ALBERT EINSTEIN </pattern>n <template>Albert Einstein was a German physicist.</template>n </category>nn <category>n <pattern> WHO IS Isaac NEWTON </pattern>n <template>Isaac Newton was a English physicist and mathematician.</template>n </category>nn <category>n <pattern>DO YOU KNOW WHO * IS</pattern>n <template>n <srai>WHO IS <star/></srai>n </template>n </category>n</aiml>n

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

Human: Do you know who Albert Einstein isnRobot: Albert Einstein was a German physicist.n

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

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

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

演算法

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

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

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

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

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

class: weathern "is it nice outside?"n "how is it outside?"n "is the weather nice?"nnclass: greetingn "how are you?"n "hello there"n "how is it going?"n

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

input: "Hi there"n term: "hi" (**no matches)**n term: "there" **(class: greeting)**n classification: **greeting **(score=1)nninput: "What』s it like outside?"n term: "it" **(class: weather (2), greeting)**n term: "outside **(class: weather (2) )**n classification: **weather **(score=4)n

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

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

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

神經網路

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

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

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

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

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

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

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

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

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

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

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

掘金翻譯計劃是一個翻譯優質互聯網技術文章的社區,文章來源為掘金上的英文分享文章。內容覆蓋Android、iOS、React、前端、後端、產品、設計等領域,想要查看更多優質譯文請持續關注掘金翻譯計劃、官方微博、知乎專欄。

推薦閱讀:

未來父母教訓孩子:你看看別人機器人,再看看你自己!
當一群科學家要做衣服的時候 他們會做成什麼樣的?
設計與AI的現在Ⅱ:阿里魯班的「訓機師」
關於凸多邊形網格尋路的理解?

TAG:机器学习 | 人工智能 | 聊天机器人 |