深度神經網絡的一般會話對話系統

通過自然語言與機器交互是通用人工智能的要求之一。人工智能的這一領域被稱爲對話系統,語音對話系統或聊天機器人。機器需要爲你提供信息豐富的答案,維持對話的上下文,並且難以與人類(理想情況下)區分。

在實踐中,最後一項要求尚未達到,但幸運的是,如果機器人有用,並且是一個有趣的溝通者,可以進行一些有趣的溝通,那麼人類就準備好與他們進行對話了。

生成和選擇模型

一般會話模型可以簡單地分爲兩種主要類型 - 生成模型和選擇性(或排名)模型。此外,混合模型也是可能的。但常見的是,這些模型構思了對話語境的幾個句子並預測了這種語境的答案。在下圖中,你可以看到此類系統的說明。

在這篇文章中,當我說“網絡使用單詞序列”或“單詞被傳遞給RNN”時,我的意思是單詞嵌入被傳遞到網絡,而不是單詞ID。

關於對話數據表示的註釋

在深入討論之前,我們應該討論一下對話數據集是什麼樣的。下面描述的所有模型都是成對訓練(上下文,回覆)。上下文是在回覆之前的幾個句子(可能是一個)。 這個句子只是它的詞彙表中的一系列標記。

爲了更好地理解,請查看錶格。從兩個人之間的原始對話中提取了三個樣本:

  • 嗨! - 嗨,你好。 - 你幾歲? - 二十二。你呢? - 我也是!哇!

請注意批處理中每個句子末尾的“ ”(序列結尾)標記。這個特殊標記有助於神經網絡理解句子的邊界並明智地更新其內部狀態。

某些模型可能會使用來自數據的附加元信息,例如說話者的ID,性別,情感等。

現在,我們準備繼續討論生成模型。

生成模型

我們從最簡單的會話模型開始,“ 神經對話模型”。

新知圖譜, 使用機器學習算法來構建智能聊天機器人

爲了對對話進行建模,本文采用了一個序列到序列(seq2seq)框架,該框架出現在神經機器翻譯領域,併成功地適應了對話問題。該體系結構由兩個具有不同參數集的RNN組成。左邊的一個(對應於ABC標記)稱爲編碼器, 而右邊的一個(對應於 -WXYZ標記)稱爲×××。

編碼器如何工作的?

編碼器RNN每次構造一個上下文的標記序列,並更新它的隱藏狀態。在處理整個上下文序列之後,它產生一個最終隱藏的狀態,這個隱藏狀態結合了上下文的意義並用於生成答案。

×××如何工作?

×××的目標是從編碼器獲取上下文表示並生成一個答案。爲此目的,在×××RNN中維護詞彙上的softmax層。在每個時間步長中,該層採用×××隱藏狀態並輸出其詞彙表中所有單詞的概率分佈。

以下是生成回覆的工作原理:

使用最終編碼器隱藏狀態(h_0)初始化×××隱藏狀態。
傳遞標記作爲×××的第一個輸入並更新隱藏狀態(h_1)
從softmax層(使用h1)採樣(或以最大概率取一個)第一個字(w1)。
將此單詞作爲輸入傳遞,更新隱藏狀態(h1 - > h2)並生成新單詞(w_2)。
重複步驟4,直到生成標記或超出最大答案長度。
新知圖譜, 使用機器學習算法來構建智能聊天機器人

×××中生成回覆,適用於那些喜歡公式而不是單詞的人。這裏,w_t是時間步長t上採樣的單詞; θ是×××參數,phi是密集層參數,g表示密集層,p-hat是時間步長t詞彙表的概率分佈。

在生成回覆時使用argmax,當使用相同的上下文時,總是會得到相同的答案(argmax是確定性的,而採樣是隨機的)。

我上面描述的過程只是模型推理部分,但也有模型訓練部分,它以稍微不同的方式進行工作 - 在每個解碼步驟,我們使用正確的單詞y_t而不是生成的單詞(w_t)作爲輸入。換句話說,在訓練時,×××使用正確的回覆序列,但刪除了最後一個標記並且標記被預先添加。

新知圖譜, 使用機器學習算法來構建智能聊天機器人

×××推斷階段的說明。前一時間步長的輸出作爲當前時間步長的輸入。

目標是在每個時間步長上最大化限度的提高下一個正確的單詞的概率。更簡單地說,我們要求網絡通過爲序列提供正確的前綴來預測序列中的下一個單詞。通過最大似然訓練進行訓練,這導致經典的交叉熵損失:

這裏,y_t是在時間步驟t的回覆中的正確答案。

生成模型的修改

現在我們對序列到序列框架有了基本的瞭解。我們如何爲這些模型添加更多泛化能力?有很多方法:

向編碼器或/和×××RNN 添加更多層。
使用雙向編碼器。由於×××的正向生成結構,使得×××無法實現雙向傳輸。
試驗嵌入。你可以預先初始化單詞嵌入,也可以與模型一起從頭開始學習它們。
使用更高級的回覆生成過程 - beamsearch。我的想法是不“貪婪地”生成答案(通過將argmax用於下一個單詞),但考慮更長鏈詞的概率並在其中進行選擇。
使你的編碼器或/和×××卷積的。Convnet可能比RNN更快地工作,因爲它們可以有效地並行化。
使用注意機制。注意機制最初是在神經機器翻譯論文中引入的,並且已經成爲一種非常流行且強大的技術。
在每次執行步驟時,將最終編碼器狀態傳遞給×××。×××僅查看最終編碼器狀態一次,然後可能會忘記它。一個好的主意是將其與單詞嵌入一起傳遞給×××。
不同編碼器/×××狀態大小。我上面描述的模型要求編碼器和×××具有相同的隱藏狀態大小(因爲我們用最終編碼器的狀態初始化×××狀態)。你可以通過從編碼器最終狀態向初始×××狀態添加投影(密集)層來消除此要求。
使用字符而不是單詞或字節對編碼來構建詞彙表。字符級模型是值得考慮的,因爲它們的詞彙量較小,並且可以理解詞彙中沒有的單詞,因此它們的工作速度更快。字節對編碼(BPE)是兩全其美的。我們的想法是在序列中找到最常見的指標對,並將它們合併爲一個指標。
生成模型的問題

稍後,我將爲你提供流行實現的鏈接,以便你可以訓練自己的對話模型。但現在我想告訴你一些你將面對的生成模型的常見問題。

通用回覆

通過極大似然訓練的生成模型傾向於預測一般回覆的高概率,例如“好”,“否”,“是”和“我不知道”的廣泛情境。

回覆不一致/如何合併元數據

seq2seq模型的第二個主要問題是它們可以爲釋義的上下文生成不一致的回覆,但具有相同的意義:

最常被引用的與之相關的工作是“ 基於角色的神經對話模型”。作者爲每個話語使用說話者的ID來產生答案,這不僅取決於編碼器狀態,還取決於說話者的嵌入。揚聲器嵌入與模型一起從頭開始學習。

使用這個想法,你可以使用你擁有的不同元數據來擴充你的模型。例如,如果你知道說話的時態(過去/現在/將來),你可以在推理時以不同的時態生成回覆!你可以調整回覆者的性格(性別,年齡,情緒)或回覆屬性(時態,情緒,問題/非問題等),同時你有這些數據來訓練模型。

爲了你的練習

下面是一些不同框架中的seq2seq模型,如果你可以打開的話,可以看一下,都是一些外網的模型數據之類的。

TensorFlow

谷歌官方的實現
另外兩個實現,你可能會覺得使用PyTorch更舒服(seq2seq用於翻譯,但你可以使用相同的代碼進行對話)
使用seq2seq進行翻譯(你可以使用相同的代碼但是使用對話的數據)
來自IBM的實現
Keras

流行的實現方法和良好的API
論文和指南

關於序列到序列聊天機器人的教程
注意機制 - Bahdanau的注意 - Luong的注意 - 使用多頭注意+前饋網絡機器翻譯任務的最新技術。 - 關於RNN注意的教程
字節對編碼紙
ConvS2S論文
深入選擇性模型

完成生成模型之後,讓我們瞭解選擇性神經對話模型的工作原理(它們通常被稱爲DSSM,代表深層語義相似性模型)。

選擇模型不是估計概率p(回覆|上下文; w),而是學習相似性函數 - sim(回覆,上下文; w),其中回覆是預定義的可能答案池中的元素之一(參見下圖)。

直覺是網絡將上下文和候選答案作爲輸入,並返回它們彼此之間的可信度。

選擇性(或排名或dssm)網絡由兩個“塔”組成:第一個用於上下文,第二個用於響應。每座塔都可能擁有你想要的任何結構。塔取其輸入並將其嵌入語義向量空間(圖中的向量R和C)。然後,計算上下文和應答向量之間的相似性,即使用餘弦相似度。

在推理時,我們可以計算給定上下文和所有可能答案之間的相似性,並選擇具有最大相似性的答案。

爲了訓練模型,我們使用三重損失。Triplet loss在triplets上定義(context, replycorrect, replywrong),等於:

選擇性模型的三重損失。它與SVM中的最大邊際損失非常相似。

什麼是replywrong?它也被稱爲“負面”樣本(replycorrect稱爲“正面”樣本),在最簡單的情況下,它是來自答案池的隨機回覆。因此,通過最小化這種損失,我們以絕對值不提供信息的排序方式學習相似性函數。但請記住,在推理階段,我們只需要比較所有回覆的分數,並選擇一個得分最高的。

選擇模型中的抽樣方案

你可能會問,我們爲什麼要從數據集中隨機抽取樣本?也許使用更復雜的抽樣方案是個好主意?確實如此。如果你仔細觀察,你可能會發現三元組的數量是O(n³),因此正確選擇負數是很重要的,因爲我們無法完成所有這些(大數據,你知道)。

例如,我們可以從池中抽取K個隨機否定回覆,對其進行評分,並選擇最高得分的那個作爲否定答案。這種方案被稱爲“硬負面”開採。如果你想深入挖掘,請閱讀“ 深度嵌入學習中的採樣事項 ”一文。

生成性與選擇性:利弊

此時,我們已經瞭解了生成模型和選擇模型的工作原理。但是你選擇哪種類型?這完全取決於你的需求。下表是爲了幫助你做出決定。

最難的部分是評估

其中一個最重要的問題是如何評估神經對話模型。有許多自動指標用於評估聊天機器人與機器學習:

選擇性模型的精確度/召回率/準確度
生成模型的困惑/損失值
BLEU / METEOR從機器翻譯得分
但是最近的一些研究)表明,所有這些指標都與人類對特定情境的答覆適當性的判斷密切相關。

例如,假設你有上下文“Statsbot是否破壞了我們處理數據的方式”?,然後回答“當然是這樣”。但是你的模型會回答例如“這絕對是真的。”之類的話來回答上下文。上面顯示的所有指標都會給出這樣一個答案的低分,但我們可以看到這個答案與你的數據提供的一樣好。

因此,目前最合適的方法是使用目標指標對模型進行人工評估,然後選擇最佳模型。是的,這似乎是一個昂貴的過程(你需要使用像Amazon Mechanical Turk這樣的東西來評估模型),但是目前我們沒有更好的東西。無論如何,研究界都朝這個方向發展。

爲什麼我們不能在智能手機中看到它們?

最後,我們準備創建最強大,最智能的會話模型,通用的人工智能,對吧?如果是這樣的話,擁有數千名研究人員的蘋果,亞馬遜和谷歌等公司已經將它們與個人助理產品一起部署。

儘管在這個領域做了很多工作,神經對話系統還沒有準備好在開放領域與人交談,併爲他們提供信息/有趣/有用的答案。但至於封閉領域(例如技術支持或問答系統),有成功的案例。

總結

會話模型起初可能看起來很難掌握(而且不僅僅只有一開始)。當你準備練習時,選擇一些簡單的架構,從一個流行的數據集或者自己的數據集(Twitter,Reddit或其他)中選取一個,並在上面訓練一個會話模型。

來源商業新知網,原標題:使用機器學習算法來構建智能聊天機器人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章