如何利用機器學習方法構建智能聊天機器人?

編輯|Emily

AI前線出品|ID:ai-front

您是否曾經利用 Siri、Alexa 或者 Cortana 以對話方式設置鬧鐘、呼叫朋友甚至是安排會議日程?相信大多數朋友和我一樣,感覺雖然這些方案在日常生活與工作中能夠起到一定作用,但仍然很難與之談論一般性、特別是哲學層面的話題。

Statsbot 團隊特別邀請了數據科學家 Dmitry Persiyanov,希望由他解釋如何利用神經對話模式解決這一問題,并借助機器學習技術構建聊天機器人。

通過自然語言與機器交互屬于通用型人工智能方案的基本要求之一。這一 AI 研究領域被稱為對話系統、口語對話系統或者是聊天機器人。在這類場景下,機器需要能夠結合對話背景為用戶提供翔實的答案,而且在理想情況下應實現與人類無異的溝通效果。

但在實踐當中,最后一項要求往往很難達成。不過幸運的是,只要機器人能夠切實提供幫助并且具備一定幽默感,人類用戶就完全能夠接受這樣的對話方式。目前的對話系統主要分為兩大類:面向目標型(例如 Siri、Alexa 以及 Cortana 等等)以及通用對話型(微軟 Tay 機器人)。前者負責通過自然語言幫助人類用戶解決日常問題,而后者則負責與人類交流以應對更為廣泛的話題。

在今天的文章當中,我將對基于深層神經網絡的通用型對話系統進行比較式概述。具體來講,我將對其主要架構類型以及改進方法作出說明,同時提供與之相關的論文、教程以及實現指南鏈接。

希望這篇文章能夠成為各位有志利用機器學習技術創建自有聊天機器人方案的朋友們的理想切入點。如果大家認真通讀本篇文章,相信能夠對訓練自有對話模型的相關任務胸有成竹——準備好了嗎?我們馬上進入正題。

首先,我會以遞歸神經網絡(簡稱 RNN)與單詞嵌入作為起點,這意味著大家必須了解二者的概念與工作原理,進而跟上文章的討論思路。如果大家對它們還不太熟悉,我在文末附上了相關教程,各位請各取所需、不用客氣~

生成式模型與選擇式模型

通用型對話模型主要分為兩大類——生成式模型與選擇式(或者叫排名式)模型。另外,目前也存在不少混合式模型。但最為常見的解決思路在于,這些模型會根據對話語境構想幾條回應語句,并預測與情境相符的潛在答案。通過下圖,大家可以明確了解此類系統的工作原理。

在本篇文章中,當我提及“網絡消費單詞序列”或者“將單詞傳遞至 RNN”時,我所指的是將單詞嵌入傳遞至網絡——而非對單詞 ID 進行傳遞。

對話數據表達的標注

在深入探討之前,我們首先需要聊聊對話數據集的表現形式。以下提到的全部模型皆進行配對訓練(情境與回復)。其中的情景表現為回復之前的數個句子(也可能是單個句子)。該語句被視為從詞匯中所獲得的一條標記序列。

為了便于理解,下面來看表格內容。我們從兩位對話者的交流內容中提取出三份樣本:

嗨!

你好。

您多大年紀了?

22 歲。你呢?

我也是!巧了!

這里需要注意每句末的“eos”(即序列末)標記。這一特殊標記能夠幫助神經網絡理解各句子的界限,從而更為準確地更新內部狀態。

某些模型可能利用其它來自數據的元數據信息,例如對話者身份、性別以及情緒等。現在,我們開始討論生成式模型。

生成式模型

在這里我們從最簡單的對話模型起步,相關信息請參閱《神經對話模型》論文。

為了進行對話建模,該篇論文部署了一套序列到序列(簡稱 seq2seq)框架,其在神經機器翻譯領域快速興起并擁有相當出色的對話問題解決效果。這套架構包含兩套配備有不同參數集的 RNN。我們將左側的 RNN(對應 A-B-C 標記)稱為“編碼器”,而右側的(對應-W-X-Y-Z 標記)則被稱為“解碼器”。

編碼器如何工作?

其中的編碼器 RNN 一次構想一條情境標記序列,并對其隱藏狀態進行更新。在完成對整體情境序列的處理之后,其會生成一項最終隱藏狀態——此狀態將包含情境意識并被用于生成答案。

解碼器如何工作?

解碼器的目標在于從編碼器處獲取情境表達并借此生成答案。為了實現這一目標,編碼器 RNN 當中需要維持一個處于詞匯之上的 softmax 分類層。在每一時間步長當中,該層會獲取解碼器的隱藏狀態,并立足其詞匯表中的所有單詞輸出一條概率分布結果。

以下為回復內容的生成方式:

利用最終編碼器隱藏狀態(h_o)對解碼器隱藏狀態進行初始化。

將標記作為初始輸入內容傳遞至解碼器,借此更新隱藏狀態至 (h_1)

從 softmax 層(使用 h_1)進行首詞匯(w_1)取樣(或者選取最大概率)。

將此單詞作為輸入內容進行傳遞,更新隱藏狀態(由 h_1 至 h_2)并生成新單詞(w_2)。

重復第 4 步,直到標記生成完畢或者超出最大答案長度。

解碼器當中生成的回復,不過目前表達為公式而非單詞形式。在這里,w_t 為時間步長 t 上的采樣單詞 ; theta 為解碼器參數,phi 為密集層參數,g 代表密集層,p-hat 則為時間步長 t 條件下的詞匯概率分布。

我們在生成回復時使用 argmax,其將在利用同一情景(其中 argmax 為恒定,但采樣內容為隨機)之下始終給出同樣的答案。

以上描述的流程只是模型的推理部分,除此之外還有模型的訓練部分,且后者的實現方式略有不同——在每個解碼步驟當中,我們需要使用正確單詞 y_t 而非生成的單詞(w_t)作為輸入內容。換句話來說,在訓練過程中,解碼器會消費正確的回復序列,但移除其中的最后一個標記并添加標記。

解碼器推理階段示意圖。上一時間步長的輸出結果作為當前時間步長的輸入內容。我們的目標是在每個時間步長中最大程度提升下一正確單詞的概率。更簡單地講,我們要求該網絡通過提供正確的前綴以預測序列中的下一單詞。訓練過程以最大可能性方式進行,而這會帶來經典的交叉熵損失:

在這里,y_t 為時間步長 t 中的正確回復單詞。

生成式模型的修改

現在我們對序列到序列框架已經建立起基本認知。那么,我們該如何為此類模型添加更多生成能力?這里通常使用以下方法:

向編碼器或 / 及解碼器 RNN 中添加更多層。

使用雙向編碼器。考慮到正向生成結構,我們無法在解碼器中實現這種雙向特性。

嘗試使用嵌入。大家可以對單詞嵌入進行預初始化,或者配合模型本身從零開始學習單詞嵌入。

使用更為先進的回復生成規程——beamsearch。其基本思路并非“主動”生成回復(例如利用 argmax 生成下一單詞),而是考慮長單詞鏈的可能性并從中作出選擇。

實現編碼器或 / 及解碼器的卷積化。由于能夠實現高效并行,卷積網絡的速度往往遠高于 RNN。

使用關注機制。關注概念最早出現在一系列神經機器翻譯論文當中,且目前已經成為一種非常流行且強大的技術手段。

在每一時間步長當中將最終編碼器狀態傳遞至解碼器。解碼器只能查看一次編碼器狀態,隨后可能將其遺忘。因此,最好的辦法是將編碼器狀態連同單詞嵌入一同傳遞至解碼器處。

不同的編碼器 / 解碼器狀態大小。我在之前提到的模型要求編碼器與解碼器擁有同樣的狀態大小(因為我們會利用編碼器最終狀態對解碼器狀態進行初始化)。大家可以添加一個映射(密集)層以將編碼器的最終狀態映射為初始解碼器狀態,從而回避這一要求。

使用字符——而非單詞或字節對編碼——來構建詞匯表。字符級別的模型之所以值得肯定,是因為其詞匯量較小因此運行速度更快,且能夠理解詞匯表中不存在的單詞。字節對編碼(簡稱 BPE)則兼有二者的優勢。其基本思路在于立足單一序列找到使用頻率最高的標記對,并將二者合并為同一標記。

生成式模型的問題

下面,我將整理出各類高人氣實現方案的相關鏈接,大家可以利用其訓練自己的對話模型。不過需要強調的是,大家在使用生成式模型時有可能遇到幾種常見問題。

泛型響應

通過最大可能性方式訓練出的生成式模型往往傾向于作出最為泛用的回復預測內容,例如“好的”、“不”、“是的”以及“我不知道”等等。大家可以參閱以下資料了解如何解決這些問題:

在模型推理階段變更目標函數 ;

在將 seq2seq 模型訓練為強化學習代理時,如何引入人工指標并利用其充當獎勵機制.

回復不一致 / 如何整合元數據

使用 seq2seq 模型時的另一大問題,在于其往往會在意義相同但表達不同的情境下給出不一致的回復內容:

目前最引人關注的處理方式在于“基于角色的神經對話模型”。作者為每段發言賦予對話者身份,并借此生成答案——其中不僅考慮到編碼器狀態,同時亦引入對話者嵌入因素。而對話者嵌入會在初始階段即與模型本身一同進行學習。

通過這種方式,大家即可利用手頭擁有的不同元數據對模型進行擴充。舉例來說,如果您知曉對話的時態(過去 / 現在 / 將來),則可借此推理時間并使用正確的時態生成回復內容。另外,您亦可在擁有相關訓練數據集的情況下,有效調整回復方的個性(性別、年齡、情緒等)或者回復屬性(時態、情緒、問題 / 非問題等)。

具體實踐

在文章開頭,我曾提到過要為大家提供與 seq2seq 模型實現方案相關的各類框架選項,下面馬上開始。

TensorFlow

谷歌官方實現方案

兩套實現方案,大家可以借此配合 PyTorch 進行嘗試(PyTorch 屬于翻譯類 seq2seq 方案,但您也可以利用其代碼進行對話建模)。

利用 seq2seq 進行翻譯 (您也可以利用其代碼處理對話數據)。

由 IBM 公司提供的實現方案。

Keras

高人氣實現方案加出色 API。

論文與指南

一篇關于序列到序列聊天機器人的指南文章。

關注機制

Bahdanau 的關注實現方式。

Luong 的關注實現方式。

領先方案: 利用多標頭關注 + 前饋網絡處理機器翻譯任務。

教程:RNN 中的關注機制。

字節對編碼論文。

ConvS2S 論文。

選擇式模型深度剖析

說完了生成式模型,接下來我們開始討論選擇式神經對話模型的工作原理(此類模型通常被簡稱為 DSSM,即深度語義相似性模型)。不同于估算概率 p(回復|情景 ; w),選擇式模型需要學習另一項類似函數——sim(回復、情景 ; w),其中的回復內容為來自一套預定義潛在答案池的元素之一(詳見以下示意圖)。總體來講,該網絡會將情景與一條候選答案作為輸入內容,而后返回二者之間適用性的置信度結果。

選擇式(或稱為排名式,或 dssm)網絡由兩項“塔式”因素組成:其一為情景,其二為回復。每項塔式因素都可能擁有您所需要的架構。塔式因素提取輸入內容并將其嵌入至語義向量空間(示意圖中的 R 與 C 向量)內。接下來,其計算情景與回復向量間的相似性,即使用余弦相似度公式

C^T*R/(||C||*||R||)。在推理階段,我們可以計算給定情景與全部可能答案之間的相似度,并從中選擇相似度最高的答案。為了訓練選擇式模型,我們使用三元損失函數。三元損失函數通過三項因素定義,即情景、回復_正確、回復_錯誤(context、reply_correct、reply_wrong),即:

選擇式模型中的三元損失函數。其與 SVM 當中的最大邊界損失非常類似。那么 reply_wrong 是什么?其亦被稱為“負”樣本(reply_correct 相應被稱為‘正’樣本),且在最簡單的情況下,其為答案池中的隨機回復。因此,通過盡可能降低這一損失值,我們將能夠對非正確絕對值進行排名的方式獲得相似度函數。不過需要注意的是,在推理階段,我們只需要比較所有回復的評分結果并選擇評分最高的選項。大家可以點擊此處通過微軟項目頁面深入了解 DSSM 的更多相關信息。選擇式模型的開源實現方案不像生成式模型那么豐富,但大家仍然可以點擊此處參閱在 TensorFlow 上實現選擇式模型教程。

選擇式模型中的采樣模式

大家可能會問,我們為何要從數據集中提取隨機樣本?為什么不使用更為復雜的采樣模式呢?問得好。如果進一步觀察,大家就會意識到三元組的數量為 O(n3),因此最重要的是選擇負屬性,因為我們無法對全部數據集內容進行處理(畢竟屬于大數據)。

舉例來說,我們可以從池中提取 K 隨機負回復,對其進行評分,而后將評分最高的選項作為負選項。這種模式被稱為“難分樣本”挖掘。如果大家希望了解更多細節信息,請點擊此處參閱《深度嵌入學習中的采樣機制》論文。

生成式對選擇式:優勢與劣勢

說到這里,我們已經了解了生成式模型與選擇式模型的工作原理。不過哪種類型更適合您的實際需求?以下表格也許能夠幫助大家作出正確的選擇。

最困難的部分在于評估

最重要的問題之一,在于如何評估神經對話模型。目前我們可以使用多種自動化指標以通過機器學習技術進行聊天機器人評估:

選擇式模型的精度 / 記憶 / 準確度

生成式模型的困惑 / 損失值

機器翻譯的 BLEU/METEOR 評分

不過最近的部分研究工作表明,上述指標與人類在特定情景下對回復內容的適當性判斷并無關聯。

舉例來說,假設您面對的問題為“Statsbot 是否在闡述我們處理數據的方式?”而數據集內存在“當然是。”這條回復。但您的模型卻在這樣的情景下給出了其它回復內容,例如“絕對是的。”以上提到的各項指標都會給這樣的答案打出很低的評分,但我們可以看到,這條答案跟數據集中的選項一樣正確無誤。

因此,目前最為適合的方法是利用目標指標對模型進行人工評估,而后再選擇最理想的模型選項。沒錯,這看起來是種成本高昂的處理方式(您需要使用 Amazon Mechanical Turk 等服務進行模型評估),但就當下而言,我們還沒有其它更好的解決辦法。無論如何,整個研究業界也選擇了這樣的處理思路。

這兩種模型為何在智能手機上不見蹤影?

最后,我們已經準備好構建起最為強大且睿智的對話模型——即通用人工智能了,對吧?如果真是如此,那么像蘋果、Amazon 以及谷歌這樣的技術巨頭為何坐擁成千上萬研究人員,肯定已經將其部署在個人助理產品當中了。但盡管已經在這方面投入巨量資源,但神經對話系統仍沒有做好立足開放領域與人類用戶交談,并為其提供豐富 / 有趣 / 實用答案的準備。不過在另一方面,神經對話系統已經在特定封閉領域(例如技術支持或者問答系統)帶來部分成功案例。

RNN 與單詞嵌入相關教程

遞歸神經網絡

終極教程:內附大量示意圖與代碼片段。

最引人入勝的教程之一,包含設計實驗以及良好的注解信息。

單詞嵌入

文本分類器算法。

終極指南:圖文詳解嵌入機制。

TensorFlow 教程與代碼示例。

總結

乍一看來,對話模型似乎很難掌握——事實也確實如此。因此,我建議大家認真閱讀本文中列出的各參考資料。另外,感興趣的朋友還可以點擊此處獲取一套包含對話系統相關基礎文獻的資源池。

當做好實踐準備之后,大家可以首先挑選一些簡單的架構,同時配合流行數據集或者您自己熟悉的數據集(Twitter、Reddit 之類都可以),并借此進行對話模型訓練。

原文鏈接:https://blog.statsbot.co/chatbots-machine-learning-e83698b1a91e

-全文完-

《深入淺出TensorFlow》迷你書現已發布,關注公眾號“AI前線”,ID:ai-front,回復關鍵字:TF,獲取下載鏈接!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容