12月21日,阿里巴巴旗下的大數據營銷平臺阿里媽媽開源了其應用于自身廣告業務的算法框架X-DeepLearning(XDL)。該框架非常擅長處理高維稀疏數據,對構建推薦、搜索和廣告系統非常有優勢。此外,阿里還配套發布了一系列官方模型,它們都是阿里在實際業務或產品中采用的高效模型。
在XDL開源前夕,記者采訪了其團隊的四位主要負責人:
靖世,研究員,阿里媽媽定向廣告技術團隊負責人兼阿里媽媽算法平臺負責人
見獨,資深技術專家,阿里媽媽工程平臺技術負責人
懷人,資深算法專家,阿里媽媽算法平臺深度學習方向負責人兼定向廣告排序算法團隊負責人
樂迪,資深技術專家,阿里媽媽大數據計算與機器學習平臺的工程架構負責人
「高維稀疏數據的數據處理、模型計算以及在線服務一直是深度學習應用于業界的一個核心挑戰區。作為一個真實在廣告業務下解決過大量技術問題的團隊,我們為了解決這些問題提出了大量的方法。阿里媽媽第一代的基于深度學習的CTR模型研制與大規模線上部署都是XDL支撐的,我們將其中對業界有貢獻的部分提供給用戶,希望做出對大家有增量的東西。」靖世這樣描述XDL開源的初衷。
而現有框架在處理高維稀疏數據的「痛點」究竟在哪里?使用的模型有什么不同?更加具體的,XDL框架如何使用?如何與現有框架及模型結合?XDL團隊為機器之心的讀者做了詳細的解答。
XDL項目地址:https://github.com/alibaba/x-deeplearning
高維稀疏數據怎么搞?
其實最早的時候,阿里巴巴深度模型的研發也是在嘗試已有的框架,例如Caffe、TensorFlow和MXNet等。但當時阿里巴巴發現已有框架在生產化方面有很多局限,首先第一個是大規模稀疏數據的處理能力,其次是如何實現結構化數據。
大規模稀疏數據體現在搜索、推薦和廣告等任務上,例如某系統一共有10億的商品量,那么用戶是不是訪問過每一個商品就是一維特征。因此,表征用戶的特征維度就可能有10億維,而只有訪問過的商品才有值「1」,未訪問過的商品全為「0」,這也就是高維稀疏的意義。這樣的結構和傳統機器學習一個特征矩陣加一列標注很不一樣,因此也就需要特定的框架高效處理。
除了用戶的稀疏表征,商品同樣也是稀疏的,它們可能有各種各樣的特征,例如顏色、形狀、圖像和名稱等。在一般的推薦系統中,樣本都是平鋪的,例如一個用戶點擊了商品1和商品2。那么樣本1為(用戶,商品1)、樣本2為(用戶,商品2),這種平鋪的數據是非常低效的,因此XDL對于大規模稀疏數據有一個結構化的過程。這種結構化會將實體與實體之間的復雜關系進行關聯化,并繼續投入到計算中,因此XDL整體就是一個結構化的計算流。
其實XDL團隊在處理大規模高維數據后,發現整個計算模式可以進一步提升,以前的張量計算流也許可以使用結構化的計算流代替。可能讀者對數據結構化還是缺少了一種直觀感受,如下圖所示為簡單的數據結構化。其中左邊的樣本是傳統平鋪的訓練數據,而右邊的樹型結構化會大大降低存儲需求。
?
圖示:如上圖所示左邊為平鋪的數據,其一個用戶配一個商品(Item)就為一個樣本,用于表征用戶的高維特征需要重復使用。而箭頭右邊樹型結構化的數據會節約很大的存儲成本,它同樣表示三個獨立的樣本。
XDL團隊表示在淘寶原來的信息流廣告里,他們需要300臺以上的機器才能支持模型訓練一次。但是這種結構化數據大大簡化了數據的表示,因此整個數據集減少了一百倍以上的硬盤存儲,計算速度也提升了十多倍。因此最后本來需要幾百臺機器的模型訓練,可以精簡到十臺機器左右就能完成訓練。
最后,除了數據結構化,模型同樣也可以結構化。因為當阿里巴巴開始探索將圖像、文本和語音等信息加到推薦等系統時,他們會發現這些信息和其它信息又是一個復雜的結構化關系,因此他們開始將模型的分布也結構化。首先數據根據結構關系可以分布在不同的機器上,而這些結構同樣可以將計算分配到不同的機器上。所以將模型的計算與數據的結構耦合在一起,它們間的計算量和通訊傳輸量都能有效降低。
所以以上幾點是XDL整個的脈絡,XDL團隊表示它主要在三個層面上對通用框架有比較大的提升:
首先是對大規模稀疏性數據的建設;
其次是結構化的計算流;
最后在結構化的計算流基礎上,模型的分布也需要結構化。
當然,這些都是XDL團隊在實踐中的探索,它們也并沒有完美處理各種高維稀疏的情況。但是經過阿里巴巴業務上的檢驗,整個框架和配套開源的推薦/廣告/搜索算法都被被證明非常有效。也許通過開源社區的共同參與,高維稀疏數據的處理能更高效。
用于解決不完全信息下的開放問題的模型
「圖像、語音、文本,都是在完全信息下定義的封閉問題。而互聯網領域里的機器學習是不完全信息下的開放問題。」靖世概括道。「圖像像素已經表征了所有信息,模型能力如果達到極限,就應該能夠判定圖像中有什么東西,獲取目標信息。而在互聯網領域,可選數據非常多。以電商為例,除了item級別的表征之外,商品圖像、詳情頁信息、評論……都是可以引入的相關數據,但即使囊括所有可得的相關數據,其合集仍然不是完全信息。」
而模型的意義,就是能夠從數據中找到特定的規律,既能夠擬合現有數據,又能夠有一定的推廣性。從業務的角度出發,找規律的過程中用到的「數據」,應該是平臺能夠充分利用所有可得的信息,無論它是以何種形式呈現的。而如何將盡可能多的、類別各不相同的信息引入到模型中,就是XDL著重解決的一個問題。
用于廣告、推薦、搜索這樣任務中的模型,可能乍一看很「簡單」:它們不會像單純的視覺模型一樣有數以百計的層數,也不會像純粹的NLP模型一樣用模型結構跨越漫長的時間步,幾層的模塊、全連接的模塊在系統里都會很常見。然廣告等領域模型的其復雜性正是體現在其「復合」這一特點上。
當模型的輸入數據異構特性非常明顯的時候,稀疏數據需要做嵌入、時序的數據需要過LSTM模塊捕捉時序關系、圖像數據需要逐層卷積抽象不同粒度的特征,串聯多種特征轉化為其他網絡可接受的輸入后,還要進行統一的稠密的計算。不同網絡的聯動,乃至進一步到系統層面,樣本的I/O問題,數據流水線的優化工作、訓練階段機器之間頻繁的大量的參數交換等等問題,都是沒有相應框架就做不了的。
因此,任務與數據形態的不同,看起來是帶來了一個算法問題,其實是導致最大的變動出現在框架。樂迪舉了個例子,「模型結構復雜了之后,其內部的前向與后向計算的迭代就很難用標準化的方式去做了,批規模的安排、超參的設計與反饋速率,都會極大影響迭代過程。TensorFlow劃分了ps(parameterserver)和worker,但是worker不會再切分。我們的模式可以把模型任意地切分,每一部分都可以選擇不同的迭代速率等參數,從而讓整個復雜網絡的訓練變得非常高效。」
「像八爪魚套八爪魚。」靖世打了個比方。這樣的模型的體量通常十分驚人,見獨表示,阿里的場景下,模型的參數規模通常會到達幾十億甚至上百億,內部應用的模型已經有千億規模出現。
和XDL一起開源的就有一些阿里媽媽實際在用的、驗證過有用的「八爪魚」模型,在xdl-algorithm-solution文件夾里,首批就公開了六個模型,其中包括利用圖像信息幫助點擊率預估的DICM以及以預估CTR為約束刻畫用戶興趣的DIEN。
CrossMedia Network(論文中具體指Deep Image CTRModel,DICM),旨在幫助精準展示廣告系統為每次投放請求選擇收益最大化的廣告。CrossMedia Network主要利用圖像信息,包括用于展示和點擊的廣告圖像(Ad image)和用戶點擊過的商品組成的用戶行為圖像(User behavior images)。利用這兩類信息,結合原有ID特征,DICM模型對于每個廣告展示樣本的點擊或未點擊的二元判別,進而轉化為點擊率預估。
Deep Interest Evolution Network(DIEN)模型主要用于定向廣告排序中的CTR(點擊率)預估階段,應用于阿里媽媽定向廣告各大產品中。傳統的點擊率預測算法通常直接將用戶歷史行為表示用戶興趣,DIEN提出了興趣抽取和和興趣演化兩個模塊,在興趣提取模塊用auxiliaryloss約束模型找到能夠推測出后續的行為的隱層表達,在興趣演化模塊用GRU模塊根據不同的預估目標商品構建不同的興趣演化路徑。??
除了框架、模型之外,XDL也有提供數據和服務的打算:
「很多測試用戶反映模型跑不起來,那我們內部也整理了一些覺得對業界比較有用的數據,在保護用戶隱私的前提下,打算以公開數據集的形式發布出來。這個體量對于阿里的業務本身來說可能已經很小了,但是相信對于研究者使用框架跑一些算法驗證還是很有幫助的。但是真實數據的規模是非常龐大的,比如我們在某個場景只抽出了1%的數據出來,大小仍然有50G的規模。」
而懷人也提到,當結構復雜后,在線預估也會遇到瓶頸:「我們也正在探索根據數據前向計算所需算力的分布,用不同的硬件來做對應的計算,最終做到全局最優化。」在未來,XDL也計劃在訓練框架之外,進一步開源高性能在線推理服務引擎,將超大規模模型參數的分布式存儲、分布式計算問題也一并解決。
XDL的使用姿態
對于開發者而言,最關心的可能是XDL如何使用,以及它能幫助我們獲得怎樣的提升。想象一下,如果我們已經費了九牛二虎之力構建出一個TensorFlow深度模型,然而最終發現它在高維稀疏數據下效率很低。那么我們該如何將這個模型遷移到XDL,并利用其數據結構化與模型結構化的優勢進行高效訓練?
XDL團隊表示他們在文檔上會有一個完整的示例,如果我們寫了一個完整的TensorFlow模型,那么基本上模型定義部分就不需要修改了,我們只需要在外圍寫大概十來行的分布式驅動代碼就行。增加了XDL的分布式驅動后,單機的TensorFlow模型就能分布式運行,并具備XDL面向高維稀疏數據的大規模并行能力。
靖世表示,其實我們可以認為XDL構建了一個大型高維分布式計算圖,我們可以將TensorFlow構建的靜態計算圖嵌入到XDL分布式計算圖中。然后在大型計算圖中,TensorFlow構建的子圖可以調用對應的框架,并完成計算。所以說如果模型已經進入到密集的運算及架構設計上,那么其實我們可以將這個子圖包裝一下并嵌入到XDL中。
此外,值得注意的是數據格式,XDL團隊表示輸入數據流是根據框架定義的規范和格式,我們需要根據這些格式來準備數據。但是當數據流進入到單機上的稠密網絡時,所有數據結構會自動轉化為TensorFlow內部的數據格式,我們可以按照TensorFlow那樣的格式定義后面各種各樣的網絡。雖然XDL定義了新的數據結構,用戶必須按照經優化的模板定義數據結構,但這樣統一的格式可以避免保存、部署和遷移等遇到的大量問題,也能獲得更多的性能提升。
總的而言,在使用XDL構建大型分布式計算圖后,分布式數據流也需要按照格式定義才能傳入該計算圖。隨后我們可以將自己用TensorFlow構建的計算圖嵌入到XDL計算圖中,且當XDL數據流傳輸到該獨立的子計算圖時,它會轉化成對應深度學習框架的數據格式,并調用對應的后端完成計算。
TensorFlow嵌入實例
在XDL的使用示例中,其展示了如何結合密集型特征和稀疏性特征,并完成聯合訓練。其中密集型特征可能是圖像或語音等數據,而稀疏性特征可能是用戶和商品之間的訪問關系。這就相當于將TensorFlow模型嵌入到XDL中,并承擔密集型特征運算,而XDL本身會處理稀疏性特征。
在這個示例中,模型包含一路密集型特征(deep0)以及兩路稀疏性特征(sparse[0-1]),稀疏性特征通過Embedding計算生成兩個8維密集型向量,并與本來的密集型特征拼接后執行4層全連接層運算,并最后得出模型損失。
代碼地址:https://github.com/alibaba/x-deeplearning/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
首先是讀取數據,我們可以定義讀取器,并配置線程數和批量數等讀取等設定。因為數據格式是有規范的,所以我們可以像使用Pandas讀取CSV那樣簡單地抽取不同類型的數據,包括稀疏的訪問記錄和密集的圖像數據等。
?
隨后我們需要定義模型,這里可以分為兩路,即稀疏和稠密。其中稀疏數據可以借助XDL構建稠密的特征向量,這有點類似于構建NLP中的詞嵌入向量,它在保留用戶和商品等信息的情況下盡可能為密集計算提供便利。
?
在構建嵌入向量后,它就應該與前面密集型特征拼接在一起并完成第二路的稠密計算。這里僅使用三層全連接網絡作為示例,但是我們可以根據需要完成各種復雜的神經網絡。此外,由于已有的框架在這些計算上非常有優勢,因此我們可以直接導入TensorFlow等框架,并將密集型計算分配給它們,這正相當于將子計算圖嵌入到了XDL分布式計算圖中。
?
最后,我們只要定義最優化器與對應的訓練過程就行了,當然損失函數等訓練信息也需要在這一部分定義。如下所示,值得注意的是,這里是直接運行XDL定義的計算圖,并不用管嵌入的TensorFlow計算圖是什么樣的。此外由TrainSession可見,XDL采用的也是一種靜態計算圖。
?
當然,這可能只是最簡單的一種用法,模型的計算主要集中在單機后面的密集型網絡中。但是XDL其實還是構建了一個分布式計算圖的,它可以理解為多個不同的單機節點構成的復雜網絡。其中不同表示我們可以構建很多子網絡,這些子網絡可以使用XDL構建一個更龐大的深度學習網絡。這種高級應用其實在業務中很常見,因為搜索、推薦和廣告等場景需要的系統通常都非常大。當然如果只需要XDL高性能的分布式訓練,我們可以僅簡單地嵌入單個計算圖。
本文來源:機器之心
評論
查看更多