wide&deep論文學習筆記
來自專欄 linger的腦洞5 人贊了文章
在大多數情況下,稀疏輸入的大規模回歸和分類問題都是通過線性模型和非線性特徵來解決。通過特徵交叉帶來的Memorization(記憶能力)非常有效和可解釋,然後generalization(泛化能力)需要更多的特徵工程的成本。但是,如果用DNN的話,不需要那麼多特徵工程,就有足夠的泛化能力,對稀疏特徵進行embedding後得到的低維稠密特徵隱含了一些特徵組合。不過,DNN容易導致over-generalize(過度泛化),當user-item交互行為矩陣較為稀疏並且是high-rank的時候模型容易推薦出少部分一些不相關的item。在這篇論文中,作者提出wide&deep的模型,對線性模型和DNN進行jointly trained(共同訓練),取長補短獲得較好的記憶能力和泛化能力,對推薦系統帶來收益。該方法已在google
play應用和驗證過,Google play可是一款超過十億活躍用戶和超過百萬app的商業化的手機應用市場。通過在線實驗的結果發現,相對於wide-only和deep-only的模型,wide&deep模型能夠顯著地提升app的轉化。另外,該模型的實現已經通過tensorflow進行了開源。大多數的推薦系統的演算法架構,都是分為retrieval和ranking兩個部分。retrieval(叫檢索或者召回)通過機器演算法或者人工規則的方法把相關的item檢索出來,然後ranking模塊對候選item進行精準排序。Ranking問題可以抽象為P(y|x)這麼一個數學表達,x為特徵,包括user features(用戶特徵比如年齡)、contextual features(上下文特徵比如設備、時間)、impression features(展示特徵比如app主頁、歷史統計量)。通常會將前兩者合併叫query,後者叫item,抽象為query-item的輸入輸出問題。論文主要討論將wide&deep模型應用在ranking模塊。
在工業界中大規模推薦系統的排序模塊,廣義線性模型比如邏輯回歸被廣泛應用,因為簡單、可擴展、可解釋。模型通常是通過one-hot編碼的二值化特徵輸入進行訓練。這種線性模型的記憶能力通常是通過特徵交叉來表達,比如AND(user_installed_app=netflix, impression_app=pandora")表示的是用戶安裝過netflix這個app並且當前即將展示的app是pandora。這種特徵設計的方式,其實是想通過模型學習到user特徵和item特徵的關聯性,就用這例子來說,假如在實際的數據上,很多安裝過netflix的用戶喜歡點擊pandora這個內推薦的app,那麼模型就可以根據這個交叉特徵AND(user_installed_app=netflix, impression_app=pandora")學習到內在的關聯性,如果模型的輸入沒有這個交叉特徵那麼模型就沒法學習到。在線性模型的這個前提下,模型的泛化能力需要更多粒度更為寬泛的特徵作為輸入,比如上面的交叉特徵可以往上泛化衍生出一個新的交叉特徵AND(user_installed_category=video,impression_category=music),顯然,這需要大量的特徵工程,就這個例子來說,需要對netflix和pandora等等app進行分類或者打標籤。特徵交叉的方式能夠使得線性模型具備捕獲關聯性的能力,但是泛化能力還需要輸入的數據有具體的特徵,假如query-item的feature-pair在訓練數據中沒有,模型就沒法學習到,比如上面的例子,假如模型的特徵設計中沒有AND(user_installed_category=video,impression_category=music)這種更為高階的泛化交叉特徵,模型就沒法學習到「安裝過視頻app的用戶更喜歡點擊推薦的音樂app」這麼一個關聯性的規律。
對於FM或者DNN這種embedded的模型,一般會對輸入的query-item feature pair進行embedding,每個query和每個item都得到一個低維稠密的向量,這種情況下,不需要更多的特徵工程就使得模型具備泛化能力。但是,如果輸入的query-item的矩陣是稀疏和高秩的話,比如一些user有一些特殊罕見的特徵和一些不熱門的item,很難學習出有效的低維稠密向量表達。在這種情況下,大部分的query-item
pair應該是不會有交互行為出現的,但是基於dense embedding的向量預測,會對所有的query-item產生很多非0的預測,從而導致過度泛化而推薦出一些不相關的item。另一方面,帶交叉特徵表達的線性模型可以通過少部分的參數記憶住這種特殊的規則,比如某些query-item pair並沒有那麼相關。基於以上考慮,論文提出了一種wide&deep的學習框架,共同訓練一個線性模型組件(wide組件)和一個神經網路模型組件(deep組件),在一個模型中學習到memorization(記憶能力)和generalization(泛化能力)。
wide組件和deep組件的輸出的對數幾率加權求和後再輸入到共同的一個logistic loss function。值得注意的是,jointly
training(共同訓練)和ensemble(集成學習)的一個主要區別是,在ensemble中,模型之間是獨立訓練的,互相併不感知對方的存在,他們的預測值在推理階段結合在一起而不是在訓練階段。而jointly training是同時優化所有參數,在訓練階段就考慮了wide組件和deep組件以及他們之間的加權求和的權重參數。另外在模型的大小也是有區別,對於ensemble,因為訓練是互斥的,每個獨立的模型為了達到有效的準確性通常導致模型很大(比如更多的特徵和更多轉換),這樣ensemble才能有效。但是相反,對於jointly training,wide組件僅需要補充deep組件的弱點,通常是一小部分交叉特徵的變換,而不是一個整個full-size的wide模型。Jointly training一個wide&deep模型是可以通過從模型輸出到wide組件和deep組件反向傳播梯度利用mini-batch的隨機梯度的方法優化完成。在Google的實驗中,對於wide組件是通過帶L1正則項的ftrl優化,對於deep組件通過AdaGrad優化完成。模型的預測輸出如下,由wide組件和deep組件加起來套進一個sigmoid函數。
模型在Google Play的實現如下圖。值得注意的是,對於連續值的特徵,是這麼做歸一化的,先將原始值通過累計分布函數進行變換P(X <=x),然後用分位數表示,最後用分位數進行歸一。訓練階段,輸入層將訓練數據和詞表產生稀疏和稠密的特徵以及label。Wide組件由用戶安裝app和展示app的交叉特徵構成。對於deep組件,枚舉類的稀疏特徵embedding成為一個32維的向量,然後跟連續值特徵拼接在一起成為一個1200維的向量。串聯後的向量會灌進三層ReLU layer。最後deep組件和wide組件一起輸入到logistic。
整個wide&deep模型通過超過500billion的樣本訓練完成。每一次有新的訓練數據,模型都需要重新訓練,這樣會造成極大的計算成本以及更新延遲。為了解決這個問題,系統實現了熱啟動的方式,利用上一次的模型參數來初始化embeddings的向量以及線性模型的參數。新的模型訓練完,會跟之前模型對比進行測試檢驗後,再上線。
Google Play的實驗分為三個組,以wide-only模型作為對照組,deep模型以及wide&deep模型作為測試組,每組分別1%的user流量。可以看到,相比於對照組,wide&deep模型獲得3.9%的app轉化率(從推薦列表到app落地頁)。結合模型離線auc以及線上的轉化率來看,可以看到兩點有趣的現象。第一是,deep-only模型離線auc比wide-only低千分之四,但是轉化率卻提高了2.9%。第二是,wide&deep模型離線auc比wide-only提高僅千分之二,但是線上的轉化率卻提高了3.9%。對於第二點,論文中有這麼一個解釋,一個可能的原因是在離線數據中展示和label的數據都是固定的,而在線上系統,調配泛化能力和記憶能力能夠展示新挖掘出來的候選item,然後在從新的用戶反饋中學習。
本文作者:linger
本文鏈接:
linger liu:wide&deep論文學習筆記
推薦閱讀:
※生成式和判別式
※機器學習筆記019 | 反向傳播演算法與神經網路的梯度
※系統學習泛函之前的一個高觀點
※大數據與機器學習(3)
※多目標追蹤-初步調研
TAG:推薦演算法 | 深度學習DeepLearning | 機器學習 |