Netflix開源麵向稀疏數據優化的輕量級神經網絡庫Vectorflow
介紹
隨著過去幾年來深度學習庫和軟件創新的蓬勃發展,研究機器學習是一個激動人心的時刻。大多數機器學習的庫都是從相當專業的計算代碼演變而來的,這些計算代碼一般用於解決大密集度問題,例如為稀疏模型提供邊緣支持的基於神經網絡的圖像分類通用框架。
在Netflix公司,我們的機器學習科學家在多個不同的領域處理著各種各樣的問題:從根據你的愛好來定製電視和推薦電影,到優化編碼算法。我們有一小部分問題涉及到處理極其稀疏的數據;手頭問題的總維度數很容易就能達到數千萬個特征,即使每次要看的可能隻是少數的非零項。對於這些情況,我們認為需要有一個經過專門優化的輕量級的庫,這個庫用於在單一設備、多核環境下對稀疏數據進行淺層前饋神經網絡的訓練。我們想要一些小巧而又易用的工具,所以我們構建了Vectorflow,它是目前機器學習科學家使用的眾多工具之一。
設計注意事項
敏捷性。我們希望數據科學家能夠在完全自主的情況下輕鬆地運行和迭代他們的模型。所以我們用D語言寫了Vectorflow。D語言是一種並不難學的現代係統語言,它具備快速的編譯器和函數編程功能,為初學者提供了類似Python的使用體驗,但在運行時通常具有多個數量級的性能提升,同時讓經驗豐富的開發人員能夠利用其優秀的模板引擎、編譯時功能和低級別特性(C接口、內聯匯編器、手動內存管理、自動向量化等等)。Vectorflow沒有任何第三方的依賴,從而簡化了其部署。它提供了一個基於回調的API,可輕鬆接入自定義的損失函數來進行訓練。
稀疏感知。在設計稀疏數據庫與淺層架構庫的過程中,運行時瓶頸往往是在IO方麵:例如,與大密集度矩陣上的卷積層不同,其運行每一行的操作極少。Vectorflow能夠盡可能地避免在正向與反向傳遞過程中的內存複製或分配操作。矩陣向量操作同時擁有稀疏與密集兩種實現方式,其中密集型是SIMD向量化的。Vectorflow還提供了一種在處理稀疏輸出梯度時進行稀疏反向傳遞的方式。
IO未知。如果是IO綁定,那麼根據定義,訓練器的運行速度由IO層的速度決定。Vectorflow對底層數據模式的要求非常寬鬆(僅需提供一個具有“features”屬性的行迭代器),以便可以根據數據源編寫高效的數據適配器,以及在使用同一編程語言的時候避免任何預處理或數據轉換步驟。這樣,你就能根據數據來移動代碼,而不是根據代碼移動數據。
單一設備。分布式係統難以調試,而且還會引入固定成本,例如作業調度。基於新型機器學習技術的分布式優化則更加困難。因此,我們基於單機設置建立了一個高效的解決方案,以此來降低了建模的迭代時間,並且不會犧牲中小規模任務(1億行)的可擴展性。我們選擇使用Hogwild的通用異步SGD解算器作為免鎖定方案,以使得在沒有通信成本的情況下將負載分散到各個不同的內核上。隻要數據足夠稀疏,這就適用於大多數的線性或淺層網絡模型。由於從用戶的角度來看,所有的一切都運行在非分布式的環境下,這樣就避免了在算法分布方麵花過多的精力。
應用程序
在項目啟動後的幾個月裏,我們看到了很多基於該庫的用例,同時也有多個研究項目及生產係統開始利用Vectorflow進行因果推論、生存回歸、密度估算和推薦排名算法。事實上,我們正在使用 Vectorflow對Netflix主頁的部分用戶體驗進行測試。Vectorflow也被包含在Netflix機器學習從業者所使用的基礎實例內的默認工具箱中。
例如,我們基於Netflix在營銷工作當中遇到的一項宣傳問題對該庫的性能進行了調查。在這個案例中,我們要用生存指數分布執行加權最大似然估計。要實現這個目標,需要向Vectorflow傳遞出以下自定義的回調函數:
利用此回調進行訓練,我們可以輕鬆比較這三種模型:
- 模型 1:基於小型稀疏特征的線性模型(需要學習約 500 個參數)
- 模型 2:基於大型稀疏特征的線性模型(需要學習 100 萬個參數)
- 模型 3:基於稀疏特征的淺層神經網絡(需要學習 1000 萬個參數),訓練數據量翻倍
這裏的數據源是存儲在S3上的一個Hive表,其中的列式數據格式是Parquet。另外,我們通過將該數據流傳入c4.4xlarge實例並構建內存內訓練集的方式進行直接訓練。結果如下所示:
解壓縮和特征編碼都是在單線程上實現的,因此這還有改進的空間,但根據其端到端的運行時來看,並不需要使用針對中等規模稀疏數據集和淺層架構的分布式解決方案。請注意,訓練時間與數據的稀疏度以及行數存在線性關係。阻止線性可擴展性的一個原因是,當多個異步SGD線程的權重相同時,CPU存儲器內在結構創建的緩存將會無效,因此如果模型參數訪問模式不夠稀疏的話,會破壞Hogwild的理論結果(詳細內容請參見這篇文章)。
未來的工作
接下來,除了簡單線性、多項式或者前饋架構之外,我們計劃進一步開發更加專業的層以擴大拓撲支持能力,並在維持Vectorflow項目“極簡”設計理念的前提下探索新的並行策略。
文章原標題《Introducing Vectorflow》,作者:Benoît Rostykus, Netflix Technology,譯者:夏天,審校:主題曲哥哥。
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-08-13 22:33:50