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