網約車服務商 Uber 開源併發布了它們開發的 Ludwig,這是一款基於 Google TensorFlow 框架上的開源工具箱。藉由 Ludwig,使用者無需再編寫任何程式碼即可進行深度學習的開發。
在過去的十年中,人們證明了深度學習在視覺、語音和語言方面執行各種各樣的機器學習任務非常有效。Uber 將這些深度學習模型用於各種任務,包括客戶支援、物件檢測、改進地圖、簡化聊天溝通、預測和防止欺詐。
現在有很多開源庫,包括 TensorFlow、PyTorch、CNTK 和 Chainer 等,已經實現了構建此類模型所需的構件,從而可以進行更快、更不易出錯的開發。而這些反過來又推動了機器學習研究界和行業從業者採用這種模型,從而在架構設計和行業解決方案方面取得了快速的進展。
Uber AI 決定避免重新發明輪子,在開源庫所提供的強大基礎之上開發軟體包。為此,Uber AI 於 2017 年釋出了 Pyro,這是一種基於 PyTorch 的深度概率程式語言,並藉助開源社群的力量繼續改進。Uber 開發的另一個主要開源人工智慧工具是 Horovod,這是由 LF 深度學習基金會(LF Deep Learning Foundation)託管的一個框架,允許在多個 GPU 和多臺機器上對深度學習模型進行分散式訓練。
Uber 在 TensorFlow 的基礎上開發了一款開源深度學習工具箱,命名為 Ludwig,允許使用者在無需編寫程式碼的情況下即可訓練並測試深度學習模型。
Ludwig 的獨特之處在於它能夠幫助非專家更容易地理解深度學習,併為經驗豐富的機器學習開發者和研究人員提供更快的模型改進迭代週期。通過使用 Ludwig,專家和研究人員可以簡化原型設計過程及資料處理,這樣他們就可以專注於開發深度學習體系架構,而不是深陷資料整理。
Ludwig
在過去兩年裡,為了簡化應用專案中深度學習模型的使用,因為它們通常需要在不同架構和快速迭代之間進行比較,Uber 內部一直在開發 Ludwig。Uber 已經見證了 Ludwig 對 Uber 自有的幾個專案帶來的價值,包括人工智慧客服助理平臺(Customer Obsession Ticket Assistant ,COTA)、駕照的資訊提取、司乘之間對話興趣點的識別、送餐速度預測等等。出於這些原因,Uber 決定開源併發布 Ludwig,因為他們認為目前還沒有任何其他解決方案具有相同的易用性和靈活性。
Uber 最初將 Ludwig 設計為通用工具,用於在處理新的應用機器學習問題時簡化模型開發和比較過程。為實現這一目標,Uber 從其他機器學習軟體汲取了靈感:Weka 和 MLlib,它們直接處理原始資料並提供一定數量的預構建模型的想法;Caffe 定義檔案的宣告性;scikit-learn,一套簡單的程式設計 API。這些靈感混合在一起,使得 Ludwig 迥異於常見的深度學習庫,後者提供張量代數(tensor algebra)原語和很少的其他工具來編碼模型,同時使 Ludwig 比 PyText、StanfordNLP、AllenNLP 和 OpenCV 等其他專業庫更加通用。
Ludwig 提供了一組模型架構,這些架構可以組合在一起,為給定的用例建立端到端模型。打個比方,如果說深度學習庫為你的建築提供了構建塊,那麼 Ludwig 就相當於構建城市的構建塊,你可以選擇可用的建築物或你自己的建築物新增到可用的建築中。
Uber 在 Ludwig 工具箱中提出的核心設計原則是:
- 無需編碼: 該工具無需編碼技能即可訓練模型並將其用於獲取預測。
- 通用性: 一種新的基於資料型別的深度學習模型設計方法,使該工具可用於許多不同的用例。
- 靈活性: 經驗豐富的使用者可以對模型構建和訓練進行廣泛的控制,而對新手而言,該工具易於使用。
- 可擴充套件性: 該工具易於新增新的模型架構和新的特徵資料型別。
- 可理解性: 深度學習模型內部通常被認為是 “黑盒”,但 Uber 提供了標準的視覺化來理解它們的效能並比較它們的預測。
Ludwig 允許使用者通過僅提供包含資料的表格檔案(如 CSV)和 YAML 配置檔案來訓練深度學習模型,YAML 配置檔案指定表格檔案的哪些列是輸入特徵,哪些列是輸出目標變數。配置檔案的簡單性可以加快原型設計速度,從而有望將編碼時間減少到幾分鐘。如果指定了多個輸出目標變數,Ludwig 將執行多工學習,學習同時預測所有的輸出,而這通常需要定製程式碼。
模型定義可以包含附加資訊,尤其是資料集中每個特徵的預處理資訊,用於每個特徵的編碼器或解碼器,每個編碼器和解碼器的架構引數以及訓練引數。預處理、訓練和各種模型架構引數的預設值是依據 Uber 的經驗選擇的,或者是根據學術文獻改變的,這樣新手就可以輕鬆訓練複雜的模型。同時,在模型配置檔案中分別設定每一項的能力,為專家提供了充分的靈活性。使用 Ludwig 訓練的每個模型都將會被儲存,並且可以在以後載入來獲得對新資料的預測。比如,模型可以被載入到服務環境中,這樣就可以在軟體應用中提供預測。
圖 1:可以在 Ludwig 的模型描述檔案中指定幾個輸入和輸出特徵,它們的組合涵蓋了許多機器學習任務。
Ludwig 引入的主要新思想是資料型別特定編碼器和解碼器的概念,這為 Uber 帶來了高度模組化和可擴充套件的架構:支援的每種資料型別(文字、影像、類別等)都有特定的預處理功能。簡言之,編輯器將原始資料對映到張量,而解碼器則將張量對映到原始資料。
通過這種設計,使用者可以訪問組合器(架構的膠合元件),他們組合了來自所有輸入編碼器的張量,並進行處理,然後返回用於輸出解碼器的張量。例如,Ludwig 的預設合併多個資料組合器連線不同編碼器的輸出,將它們傳遞到完全連線的層,並提供最終啟用作為輸出解碼器的輸入。其他組合器可用於其他用例,通過實現簡單的函式介面即可輕鬆新增更多的組合器。
通過組合這些特定於資料型別的元件,使用者可以在各種任務上構建 Ludwig 訓練模型。例如,通過組合文字編碼器和類別編碼器,使用者可以獲得文字分類器;而組合影像編碼器和文字解碼器則可獲得影像字幕模型。
每種資料型別可以有多個編碼器和解碼器。例如,文字可以使用卷積神經網路(CNN)、遞迴神經網路(RNN)或其他編碼器進行編碼。然後,使用者可以直接在模型定義檔案中指定要使用的引數及超引數,而無需編寫任何程式碼。
這種靈活多樣的編碼器 - 解碼器架構使經驗不足的深度學習從業者能夠輕鬆地訓練各種機器學習任務的模型,例如文字分類、物件分類、影像字幕、序列標記、迴歸、語言建模、機器翻譯、時間序列預測和問答系統等。這就開啟了各種用例,而這些用例對毫無經驗的從業者而言通常是遙不可及的,並且還允許在一個領域中有經驗的使用者去接觸新的領域。
目前,Ludwig 包含了二進位制值、浮點數、類別、離散序列、集合、包、影像、文字和時間序列的編碼器和解碼器,以及載入一些預訓練的模型(例如詞嵌入)的功能。Uber 還計劃在未來版本中繼續擴充套件支援的資料型別。
除了可用性和靈活的架構外,Ludwig 還為非程式設計師提供了額外的好處。Ludwig 整合了一組用於訓練、測試模型和獲取預測的命令列實用程式。為了進一步提高可用性,工具箱還提供了一套程式設計 API,使用者可以只需幾行程式碼即可訓練和使用模型。
此外,它還包括一套其他工具,使用者評估模型,通過視覺化來比較它們的效能和預測,並從中提取出模型權重和啟用。
最後,通過使用開源分散式訓練框架 Horovod,在多個 GPU 上以本地和分散式的方式訓練模型,這一做法使得在模型上迭代和快速獲得結果成為可能。