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