過去幾年來,隨著深度學習庫與軟件創新成果的蓬勃發展,機器學習問題的研究已經成為令人興奮的熱門議題。大多數庫從負責處理大量密集問題的專業計算代碼演變而來,其中自然也包括將圖像分類為通用框架以構建起能夠為稀疏模型提供間隔支持的神經網絡模型。
在 Netflix 公司,我們的機器學習科學家們需要立足廣泛領域應對各類復雜問題:從根據您的喜好作出針對性影視作品推薦,到優化編碼算法等等。作為實際任務中的一部分,我們需要處理極為稀疏的數據資源——盡管每一次觀察到的非零項數量非常有限,但待處理問題的總體維度數量卻往往會輕松達到數千萬級別。
在這樣的背景之下,我們認為有必要開發出一款專門針對單一設備、多核心環境的輕量庫,并針對淺前饋神經網絡的訓練進行專門優化。我們希望相關成果擁有體積小、易于調整等特點,而 Vectorflow 項目正是由此而生,并成為 Netflix 內部機器學習科學家們常用的重要工具之一。
開源地址:
https://github.com/Netflix/vectorflow
設計考量敏捷性我們希望數據科學家能夠以全自治方式輕松運行并迭代其模型。因此,我們決定用 D 語言編寫 Vectorflow——這是一種現代系統語言,且提供較易接受的學習曲線。憑借著高速編譯器與函數編程能力,其可為新人們提供類似于 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 項目的“極簡”設計理念。
編者注稀疏數據是指,數據框中絕大多數數值缺失或者為零的數據。在現代社會中,隨著信息的爆炸式增長,數據量也呈現出爆炸式增長,數據形式也越來越多樣化。在數據挖掘領域,常常要面對海量的復雜型數據。其中,稀疏數據這一特殊形式的數據正在越來越為人們所注意。
稀疏數據絕對不是無用數據,只不過是信息不完全,通過適當的手段是可以挖掘出大量有用信息的。然而在一些情況下,數據的稀疏程度甚至會達到 95% 以上,這使得傳統的統計方法不適于處理此類數據。
AI 前線微信社群
入群方法
關注 AI 前線公眾賬號(直接識別下圖二維碼),點擊自動回復中的鏈接,按照提示進行就可以啦!還可以在公眾號主頁點擊下方菜單“加入社群”獲得入群方法~AI 前線,期待你的加入!