Uber 開源 Plato:擴展性極強的開發測試會話 AI 平台,可實現多智能體並行訓練!
在過去的幾十年中,智能會話系統已經發生了顯著的變化,從關鍵字識別互動式語音應答(IVR)系統到跨平台智能個人助理,都在慢慢成為日常生活中不可或缺的一部分。在這樣的背景環境下,我們需要一個直觀、靈活和全面的研發平台,用來幫助我們進行新演算法評估、快速原型創建以及可靠地部署會話 AI 智能體。
因此,Uber AI 發布了名為「柏拉圖研究會話系統」(Plato Research Dialogue System)的開源人工智慧平台,來解決這個問題。AI開發者將其文章整理編譯如下。
柏拉圖研究會話系統(Plato)簡介
Plato 是一個用於構建、訓練和部署會話 AI 智能體的平台。它能夠使我們在會話 AI 中進行最先進的研究,快速創建原型和演示系統,以及更便捷的採集會話數據。而且該系統有「簡潔」和「易於理解」的特點,並與現有的深度學習和與現有深度學習框架和貝葉斯優化框架(用於模型調優)集成,可減少編寫代碼的需要。因此不論是經驗豐富的研究人員還是會話 AI 背景有限的興趣愛好者,都能夠輕鬆掌握其使用方法。
同時,我們也在平台拓展性方面做出了許多努力,如一般研究或特定用例所用工具,包括 Olympus,PyDial,ParlAI,Virtual Human Toolkit,Rasa,DeepPavlov,ConvLab 等。在評估是否利用這些工具時,我們發現許多用戶需要熟悉特定於平台的源代碼,關注特定的用例。這既不靈活也無法可靠地支持其他用戶使用,並且有時還需要使用許可證。
Plato 則能夠解決這些問題,並旨在構建、訓練和部署會話 AI 智能體。它支持通過語音、文本或結構化信息(會話行為)進行交互,並且每個會話智能體可以與人類用戶、其他會話智能體(在多智能體設置中)或數據進行交互。最重要的是,Plato 可以為每個會話智能體組件合併現有的預訓練模型,並且每個組件都可以在線(在交互期間)或離線(從數據)進行訓練。
Plato 如何運作?
從概念上講,會話智能體需要經過各種步驟才能處理它接收的輸入信息(例如,「今天天氣如何?」)併產生恰當的輸出(「有風但不太冷」)。主要步驟對應於標準體系結構的主要組件(見圖 1):
語音識別(將語音轉錄為文本)
語言理解(從該文本中提取意義)
狀態跟蹤(迄今為止所說和所做工作的匯總信息)
API 調用(搜索資料庫,查詢 API 等)
會話策略(生成智能體響應的抽象含義)
語言生成(將抽象意義轉換為文本)
語音合成(將文本轉換為語音)
我們使 Plato 的設計儘可能模塊化且具有靈活性,它支持傳統的和自定義的會話 AI 架構。更重要的是,它支持多方交互,其中的多個智能體可能具有不同的角色,可以相互交互,同時進行訓練,並解決分散式問題。
下面的圖 1 和圖 2 描繪了與人類用戶和模擬用戶交互時 Plato 會話智能體架構的示例。與模擬用戶交互是研究社區中用於快速開始學習的常見做法(即在與人類交互之前學習一些基本行為)。每個單獨的組件都可以用任意機器學習庫(例如,Ludwig,TensorFlow 或 PyTorch)進行在線或離線的訓練。因為 Plato 是一個通用框架,Uber 的開源深度學習工具箱 Ludwig 是一個很好的選擇,因為 Ludwig 不需要編寫代碼並且與 Plato 完全兼容。
圖 1:Plato 的模塊化架構有助於組件的在線或離線訓練,可以通過自定義或預先訓練的模型進行替換。(圖中的灰色組件不是核心柏拉圖組件)
圖 2:使用模擬用戶而不是人類用戶,如圖 1 所示,我們可以預先訓練柏拉圖各組件的統計模型。然後,這些可以用於創建原型會話智能體,該智能體可以與人類用戶交互以收集更多自然數據,這些數據隨後可用於訓練更好的統計模型。(圖中的灰色組件不是柏拉圖核心組件)
除了單智能體交互之外,Plato 還支持多智能體會話,其中多個柏拉圖智能體可以相互交互並相互學習。具體來說,柏拉圖將產生會話智能體,確保輸入和輸出(每個智能體聽到和說出的內容)被恰當地傳遞給每個智能體,並跟蹤會話。
這種設置可以促進多智能體學習的研究,其中智能體需要學習如何生成語言以執行任務,以及在多方交互的子領域中進行研究(會話狀態跟蹤、會話輪控制等等)。會話原則定義了每個智能體可以理解的內容(實體或含義的本體,例如:價格、位置、偏好、烹飪類型等)以及它可以做什麼(詢問更多信息、提供一些信息、調用 API 等)。智能體可以通過語音、文本或結構化信息(會話行為)進行通信,並且每個智能體都有自己的配置。下面的圖 3 描述了這種架構,概述了兩個智能體和各種組件之間的通信:
圖 3:Plato 的架構允許對多個智能體進行並行訓練,每個智能體可能具有不同的角色和目標,並且可以促進多方交互和多智能體學習等領域的研究。(圖中的灰色組件不是核心柏拉圖組件)
最後,Plato 通過圖中所示的通用智能體體系結構支持自定義體系結構(例如:將 NLU 拆分為多個獨立組件)和聯合訓練的組件(例如:文本到會話狀態、文本到文本或任何其他組合)。如圖 4 所示:
圖 4:Plato 的通用智能體體系結構支持廣泛的自定義,包括聯合組件、語音到語音組件和文本到文本組件,所有這些組件都可以串列或並行執行。
此模式脫離了標準會話智能體體系結構,支持任何類型的體系結構(例如:使用聯合組件、文本到文本或語音到語音組件或任何其他設置),並允許將現有或預先訓練有素的模型載入進 Plato 中。
用戶只需為模塊提供 Python 類名和包路徑,以及模型的初始化參數,或將自己的組件載入 Plato 中,就可以自行定義這個體系結構。用戶簡單的按照應該執行的順序將模塊列出之後,Plato 就可以負責其餘部分了,包括:包裝輸入/輸出、鏈接模塊和處理會話。Plato 支持模塊的串列和並行執行。
Plato 還通過組合結構的貝葉斯優化(BOCS)為會話 AI 架構或單個模塊參數的貝葉斯優化提供支持。
Plato 安裝及運行
版本 Plato(v.1.1)不需要實際安裝,因為它允許用戶修改部分代碼或擴展現有用例以獲得更大的靈活性。但是,Plato 確實依賴於某些外部庫,需要安裝這些庫。可以按照以下兩個步驟完成此過程:
注意:Plato 是用 Python 3 開發的。
1.克隆存儲庫:
2.安裝要求:
MacOS:
Ubuntu / Debian:
Windows:
為了支持語音,則必須安裝 PyAudio,它具有開發人員機器上可能不存在的許多依賴項。如果上述步驟不成功,PyAudio 安裝錯誤這篇文章(https://stackoverflow.com/questions/5921947/pyaudio-installation-error-command-gcc-failed-with-exit-status-1)包含了有關如何獲取這些依賴項並安裝 PyAudio 的說明。
其他常見安裝問題的解決方案可在Commonsues.md.查看。
3. 運行:
有關配置文件以及如何運行 Plato 的快速介紹,請參見下文。
運行 Plato 會話智能體
要運行 Plato 會話智能體,用戶必須使用相應的配置文件運行以下命令(請參閱示例/ simulate_agenda.yaml 以獲取示例配置文件,其中包含有關環境和要創建的智能體的許多設置以及他們的組件):
下面列出了一些示例模式和配置:
1)運行單個會話智能體
使用 Cambridge Restaurants 域中基於議程的用戶模擬器運行模擬:
使用 Cambridge Restaurants 域中基於議程的模擬器運行基於文本的交互:
使用 Cambridge Restaurants 域中基於議程的模擬器運行基於語音的交互:
2)運行多個會話智能體
柏拉圖的主要功能之一是允許兩個智能體互相交互。每個智能體可以具有不同的角色(例如,系統和用戶)、不同的目標,並接收不同的獎勵信號。例如,要在基準劍橋餐廳域上運行多個 Plato 智能體,我們運行以下命令來訓練智能體的會話策略並對其進行測試:
訓練階段
測試階段
3)運行通用 Plato 會話智能體
本文中的大多數討論和示例都圍繞傳統的會話智能體體系結構展開。然而,Plato 不需要堅守這條規則,它的通用智能體支持任何範圍的自定義模塊,包括:將自然語言理解分解成許多組件、將多個組件並行運行以及只有一個文本到文本模型等等。
通用智能體允許用戶將其自定義模塊作為 Python 類對象載入。對於配置文件中列出的每個模塊,Plato 將使用給定的路徑和參數實例化該類模型。然後在每次會話期間,通用智能體將按順序調用每個模塊(按照其配置文件中提供的順序),並將當前模塊的輸出傳遞給列表中的下一個模塊,最後通用智能體將返回最後一個模塊的輸出。
以下是在通用模塊模式下運行單個 Plato 智能體或多個 Plato 智能體的兩個示例。
單一通用智能體,用於實現自定義體系結構或使用現有的預先訓練的統計模型:
多個通用智能體,與上述相同,但適用於多個智能體(假設該智能體已使用 Examples / config / CamRest_MA_train.yaml 訓練過會話策略):
數據訓練
Plato 支持使用任何深度學習框架在線(在交互期間)或離線(從數據)方式訓練智能體的內部組件。實際上,只要符合 Plato 介面輸入/輸出的類型,任何模型都可以載入到 Plato 中。例如:目標模型是自定義 NLU,它只需要具有 Plato 的 NLU 抽象類,實現必要的功能,並將數據打包/解壓到自定義模型中即可。
Plato 內部經驗數據追蹤
為了便於在線學習、調試和評估,Plato 在一個稱為會話情節記錄器的結構中跟蹤其內部經驗數據,包含有關先前的會話狀態、採取的行動、當前會話狀態、收到的話語信息和產生的話語信息、收到的獎勵以及一些其他結構,如:一個可用於跟蹤上述類別無法收集的任何其他內容的自定義欄位。
在會話結束或按照指定時間間隔結束時,每個會話智能體將調用其內部組件的 train()函數,將會話經驗數據作為訓練數據傳遞;然後每個組件都會選擇訓練所需的信息部分。
要使用在 Plato 中實現的學習演算法,任何外部數據(如 DSTC2 數據)都需要被解析為 Plato 類型的經驗數據,以便這些外部數據可以由訓練中相應的組件進行載入和使用。或者用戶可以解析數據,並在 Plato 之外訓練他們的模型;然後在需要將這些數據用於 Plato 智能體時簡單地載入訓練模型。
在線/離線訓練
在線訓練的過程就跟用戶希望將所訓練每個組件配置中的「Train」標誌轉換為「True」一樣簡單。而以數據進行訓練的離線訓練中,用戶只需載入他們從數據集中解析的經驗數據。我們將使用 DSTC2 數據集作為 Plato 離線訓練的一個例子,該數據集可以從「第二會話狀態跟蹤挑戰網站」(http://camdial.org/~mh521/dstc/downloads/dstc2_traindev.tar.gz)中獲得。
該 runDSTC2DataParser.py 腳本將解析 DSTC2 數據,並將其保存為 Plato 的經驗數據。然後,它將載入該經驗數據並訓練受監督的策略:
可以使用以下配置文件測試經過訓練的策略:
注意:用戶可以將經驗數據從過去的交互或從數據載入到 Plato,然後通過強化學習或其他學習方法繼續訓練他們的模型。
用 Plato 和 Ludwig 進行訓練
Ludwig 是一個由 Uber 發布的開源深度學習框架,它允許用戶在不編寫任何代碼的情況下訓練模型。用戶只需將其數據解析為 CSV 文件,創建 Ludwig 配置文件,然後在終端中簡單執行運行命令即可。用 YAML 編寫的 Ludwig 配置文件描述了神經網路的架構,其中包含在 CSV 文件中使用到的功能以及其他參數。
在上一節中,runDSTC2DataParser.py 腳本實際上生成了一些 CSV 文件,可用於訓練自然語言理解和生成,可在以下位置找到:Data/data。作為一個例子,我們將看到如何訓練系統端自然語言生成器。為此,用戶需要編寫 yaml 配置文件,類似於下面所示。
並訓練他們的模型:
接下來是在 Plato 中載入模型。用戶應該轉到 simulate_agenda_nlg.yaml 配置文件,並在必要時更新 Ludwig 模型的路徑:
並測試該模型的工作原理:
請記住,Ludwig 每次調用時都會創建一個新的 experiment_run_i 目錄,因此用戶需要確保 Plato 配置文件中的模型路徑是最新的。
Ludwig 還提供了一種在線訓練模型的方法,因此在實踐中,用戶只需要編寫非常少的代碼來構建、訓練和評估 Plato 中新的深度學習組件。
Plato 智能體新域生成
為了給面向任務的應用程序(如插槽填充)構建會話智能體,用戶需要一個項目資料庫和一個描述其域的本體。Plato 提供了一個腳本來自動執行此過程。
例如,假設用戶想要為在線花店構建會話智能體,在 CSV 文件中包含以下項目:
用戶只需調用 createSQLiteDB.py 即可自動生成 DB SQL 文件和 JSON 本體文件。用戶可以在配置文件中指定信息、請求和系統可請求的插槽,如下所示:
注意:ONTOLOGY 部分是可選的。如果 ONTOLOGY 未被提供,腳本將假定所有插槽都是信息性的、可請求的和系統可請求的。
並運行腳本:
A flowershop-rules.json 和 a flowershop-dbase.db 可以在 Domain/Domains 中找到。我們現在可以簡單地使用虛擬組件運行 Plato 並與簡單智能體進行交互作為完整性檢查:
Plato 智能體新模塊生成
根據其功能,我們有兩種方法可以創建新模塊。如果模塊採用了執行 NLU 或會話策略的新方法實現,那麼用戶應該編寫一個自相應抽象類的類。
但是,如果一個模塊不適合單個智能體基本組件之一,例如:它執行命名實體識別或從文本預測會話行為,那麼用戶必須編寫一個直接從 ConversationalModule 得到的類,然後這個類只由通用智能體使用。
自抽象類
用戶需要創建一個自相應 Plato 抽象類的新類,並實現抽象類定義的介面以及他們希望的任何其他功能。此類應具有唯一名稱(例如「myNLG」),用於在解析配置文件時將其與其他選項區分開來。在此版本中,除非用戶使用通用智能體,否則需要手動添加解析配置文件的一些條件(例如:會話智能體、會話管理器等)。
構建新模塊
要構造新模塊,用戶必須將其代碼添加到從會話模塊得到的新類中。然後他們可以通過在配置中提供適當的包路徑、類名和參數,用通用智能體來載入模塊。
用戶負責確保新模塊能夠適當地處理前面模塊的輸出,並且新模塊的輸出可以按照其通用配置文件中的規定,由其他模塊恰當地使用。
未來計劃
由 Uber AI 研發的項目 Plato 被用於促進 SIGDial 2019 的工作,即同時訓練兩個通過自生成語言相互交流的會話智能體。在這項工作中,我們可以利用 Plato 輕鬆對這兩個會話智能體進行訓練,使它們中一個能實現餐館信息詢問,而另一個則可以提供該問題回答的信息。並且隨著時間的推移,他們的談話將變得越來越自然。
我們相信,Plato 能夠在 Ludwig、TensorFlow、PyTorch、Keras 以及其他開源項目的深度學習框架中更加無縫地進行會話智能體的訓練,從而改進學術和行業應用中的會話 AI 技術。
https://eng.uber.com/plato-research-dialogue-system/
GitHub 地址:
https://github.com/uber-research/plato-research-dialogue-system
更詳細的使用方法:
https://uber-research.github.io/plato-research-dialogue-system/


※新鮮出爐 700+ICML 2019 論文集合!
※谷歌公布亞毫秒級人臉檢測演算法 BlazeFace,人臉檢測又一突破!
TAG:AI研習社 |