過去幾年來,隨著深度學(xué)習(xí)庫與軟件創(chuàng)新成果的蓬勃發(fā)展,機器學(xué)習(xí)問題的研究已經(jīng)成為令人興奮的熱門議題。大多數(shù)庫從負(fù)責(zé)處理大量密集問題的專業(yè)計算代碼演變而來,其中自然也包括將圖像分類為通用框架以構(gòu)建起能夠為稀疏模型提供間隔支持的神經(jīng)網(wǎng)絡(luò)模型。
在 Netflix 公司,我們的機器學(xué)習(xí)科學(xué)家們需要立足廣泛領(lǐng)域應(yīng)對各類復(fù)雜問題:從根據(jù)您的喜好作出針對性影視作品推薦,到優(yōu)化編碼算法等等。作為實際任務(wù)中的一部分,我們需要處理極為稀疏的數(shù)據(jù)資源——盡管每一次觀察到的非零項數(shù)量非常有限,但待處理問題的總體維度數(shù)量卻往往會輕松達到數(shù)千萬級別。
在這樣的背景之下,我們認(rèn)為有必要開發(fā)出一款專門針對單一設(shè)備、多核心環(huán)境的輕量庫,并針對淺前饋神經(jīng)網(wǎng)絡(luò)的訓(xùn)練進行專門優(yōu)化。我們希望相關(guān)成果擁有體積小、易于調(diào)整等特點,而 Vectorflow 項目正是由此而生,并成為 Netflix 內(nèi)部機器學(xué)習(xí)科學(xué)家們常用的重要工具之一。
開源地址:
https://github.com/Netflix/vectorflow
設(shè)計考量敏捷性我們希望數(shù)據(jù)科學(xué)家能夠以全自治方式輕松運行并迭代其模型。因此,我們決定用 D 語言編寫 Vectorflow——這是一種現(xiàn)代系統(tǒng)語言,且提供較易接受的學(xué)習(xí)曲線。憑借著高速編譯器與函數(shù)編程能力,其可為新人們提供類似于 Python 的使用體驗,但同時亦可將性能水平提升幾個數(shù)量級。
另外,經(jīng)驗豐富的開發(fā)人員亦能夠利用其出色的模板引擎、編譯時功能以及低級功能(例如 C 接口、內(nèi)聯(lián)匯編器、手動內(nèi)存管理以及自動向量化等等)。Vectorflow 中并不存在任何第三方依賴關(guān)系,因此能夠顯著簡化部署流程。其提供的基于回調(diào)的 API 能夠在訓(xùn)練當(dāng)中輕松插入定制化損失函數(shù)。
稀疏感知設(shè)計稀疏數(shù)據(jù)庫與淺架構(gòu)庫意味著運行時瓶頸往往體現(xiàn)在 IO 方面:舉例來說,與大型密集矩陣上的卷積層不同,其運行每行時所需要的運算量極低。
Vectorflow 能夠盡可能避免在正向與反向傳遞過程中進行任何內(nèi)存復(fù)制或分配 ; 事實上,各個層都會從其父級與子級處引用所需數(shù)據(jù)。矩陣 - 向量操作擁有稀疏與密集兩種實現(xiàn)方式,其中密集型表現(xiàn)為 SIMD 向量化,而 Vectorflow 的出現(xiàn)則為我們帶來了處理稀疏輸出梯度時進行稀疏反向傳遞的可行途徑。
IO 未知如果您進行 IO 綁定,那么根據(jù)定義,訓(xùn)練器的運行速度將直接由您 IO 層的速度決定。Vectorflow 立足于底層數(shù)據(jù)模式采取非常寬松的要求(僅提供包含一條‘features’屬性的行迭代器),因此大家能夠根據(jù)數(shù)據(jù)源編寫出高效數(shù)據(jù)適配器,從而在無需任何預(yù)處理或數(shù)據(jù)轉(zhuǎn)換步驟的前提下始終使用同一編程語言。如此一來,您能夠?qū)⒋a移動至數(shù)據(jù),而非將數(shù)據(jù)移動至代碼。
單一設(shè)備分布式系統(tǒng)調(diào)試難度極高且會帶來無法消除的固定成本(例如任務(wù)調(diào)度)。而在新型機器學(xué)習(xí)技術(shù)方案當(dāng)中實現(xiàn)分布式優(yōu)化則更為困難。
考慮到這些因素,我們決定立足單一設(shè)備建立高效解決方案,從而在降低建模迭代時間的同時繼續(xù)保持中小型規(guī)模任務(wù)(1 億行級別)的可擴展能力。我們決定使用 Hogwild 的通用異步 SGD 解算器作為免鎖定方案,旨在以無通信成本方式將負(fù)載分發(fā)至各個計算核心當(dāng)中。
只要數(shù)據(jù)稀疏程度得當(dāng),這種方法即適用于大多數(shù)線性或者淺網(wǎng)絡(luò)模型 ; 由于從用戶角度來看,一切皆運行于非分布式場景之下,因此能夠避免在算法分布層面分散過多精力。
應(yīng)用程序在項目啟動后的幾個月中,我們陸續(xù)觀察到多種圍繞該庫建立的泛用性用例 ; 亦有不少研究項目及生產(chǎn)系統(tǒng)開始利用 Vectorflow 進行因果推論、生存分析、密度估算或者推薦排名計算。事實上,我們已經(jīng)在利用 Vectorflow 對 Netflix 主頁的部分使用體驗進行測試。此外,Vectorflow 亦被納入到 Netflix 機器學(xué)習(xí)從業(yè)者所使用的基礎(chǔ)實例內(nèi)的默認(rèn)工具箱中。
舉例來說,我們立足 Netflix 在營銷工作當(dāng)中遭遇的一項宣傳問題對該庫的性能水平進行調(diào)查。在此案例中,我們需要配合一條生存指數(shù)分布對最大似然估算進行加權(quán)計算。要實現(xiàn)這貢目標(biāo),我們向 Vectorflow 傳遞出以下定制化回調(diào)函數(shù):
利用此回調(diào)進行訓(xùn)練,我們可以輕松比較三種模型:
模型 1:小型稀疏特征組上的線性模型(需要學(xué)習(xí)約 500 項參數(shù))
模型 2:大型稀疏特征組上的線性模型(需要學(xué)習(xí) 100 萬項參數(shù))
模型 3:稀疏特征組上的淺層神經(jīng)網(wǎng)絡(luò)(需要學(xué)習(xí) 1000 萬項參數(shù)),訓(xùn)練數(shù)據(jù)量翻倍
此處的數(shù)據(jù)源為存儲于 S3 上的一套 Hive 表,其中的列式數(shù)據(jù)格式為 Parquet。另外,我們通過將該數(shù)據(jù)流引入一個 c4.4xlarge 實例并構(gòu)建內(nèi)存內(nèi)訓(xùn)練集的方式進行直接訓(xùn)練。具體結(jié)果如下:
這里的壓縮與特征編碼皆利用單一線程實現(xiàn),因此這套方案仍有改進的空間 ; 不過從端到端運行時表現(xiàn)來看,并不需要在中等規(guī)模稀疏數(shù)據(jù)集及淺架構(gòu)場景下使用分布式解決方案。需要注意的是,訓(xùn)練時間與數(shù)據(jù)稀疏度及行數(shù)存在線性關(guān)聯(lián)。線性可擴展性面臨的一大阻礙在于,當(dāng)存在多個異步 SGD 線程訪問同一組權(quán)重時,CPU 內(nèi)在結(jié)構(gòu)將創(chuàng)建無效緩存 ; 這意味著如果模型參數(shù)訪問模式的稀疏度不足(點擊此處查看原論文以了解更多信息,英文原文),則可能破壞 Hogwild 的理論結(jié)果。
下一步計劃接下來,我們計劃在簡單的線性、多項式或者前饋架構(gòu)之外,進一步開發(fā)更為專業(yè)的層(例如周期性單元)以擴大拓?fù)渲С帜芰?; 并在探索新型并行策略的同時,繼續(xù)維持 Vectorflow 項目的“極簡”設(shè)計理念。
編者注稀疏數(shù)據(jù)是指,數(shù)據(jù)框中絕大多數(shù)數(shù)值缺失或者為零的數(shù)據(jù)。在現(xiàn)代社會中,隨著信息的爆炸式增長,數(shù)據(jù)量也呈現(xiàn)出爆炸式增長,數(shù)據(jù)形式也越來越多樣化。在數(shù)據(jù)挖掘領(lǐng)域,常常要面對海量的復(fù)雜型數(shù)據(jù)。其中,稀疏數(shù)據(jù)這一特殊形式的數(shù)據(jù)正在越來越為人們所注意。
稀疏數(shù)據(jù)絕對不是無用數(shù)據(jù),只不過是信息不完全,通過適當(dāng)?shù)氖侄问强梢酝诰虺龃罅坑杏眯畔⒌?。然而在一些情況下,數(shù)據(jù)的稀疏程度甚至?xí)_到 95% 以上,這使得傳統(tǒng)的統(tǒng)計方法不適于處理此類數(shù)據(jù)。
AI 前線微信社群
入群方法
關(guān)注 AI 前線公眾賬號(直接識別下圖二維碼),點擊自動回復(fù)中的鏈接,按照提示進行就可以啦!還可以在公眾號主頁點擊下方菜單“加入社群”獲得入群方法~AI 前線,期待你的加入!