天天看點

深度學習要多深,才能了解你的心?——DNN在搜尋場景中的應用

dnn在搜尋場景中的應用潛力,也許會比你想象的更大。

1.背 景

搜尋排序的特征在于大量的使用了lr,gbdt,svm等模型及其變種。我們主要在特征工程,模組化的場景,目标采樣等方面做了很細緻的工作。但這些模型的瓶頸也非常的明顯,盡管現在阿裡集團内部的ps版本lr可以支援到50億特征規模,400億的樣本,但這對于我們來說,看起來依然是不太夠的,現在上億的item資料,如果直接使用id特征的話,和任意特征進行組合後,都會超出lr模型的極限規模,對于gbdt,svm等模型的能力則更弱,而我們一直在思考怎麼可以突破這種模型的限制,找到更好的特征;另外,及時lr模型能支援到上億規模的特征,在實時預測階段也是有極大的工程挑戰,性能與記憶體會有非常大的瓶頸。

是以我們第一考慮到的是降維,在降維的基礎上,進一步考慮特征的組合。是以dnn(深度神經網絡)很自然進入了我們的考慮範圍。再考慮的是如果把使用者行為序列模組化起來,我們希望是使用者打開手淘後,先在有好貨點了一個商品,再在猜你希望點了一個商品,最後進入搜尋後會受到之前的行為的影響,當然有很多類似的方法可以間接實作這樣的想法。但直接模組化的話,lr這類的模型,很難有能力來支援這類特征,是以很容易就想到了rnn模型。

2.相 關 工 作

同時前人有很多工作給予了我們提示。deep learning over multi-field categorical data這篇paper開始使用id類的特征進行ctr預估。

google也推出wide & deep learning for recommender systems的wide&deep模型用于推薦場景。在fnn的基礎上,又加上了人工的一些特征,讓模型可以主動抓住經驗中更有用的特征。

3. 我們的deep learning模型

在搜尋中,使用了dnn進行了嘗試了轉化率預估模型。轉化率預估是搜尋應用場景的一個重要問題,轉化率預估對應的輸入特征包含各個不同域的特征,如使用者域,寶貝域,query域等,各種特征的次元都能高達千萬,甚至上億級别,如何在模型中處理超高次元的特征,成為了一個亟待解決的問題,簡單的線性模型在處理高維稀疏特征存在比較好的優勢,但是單一的線性模型無法處理特征交叉的問題,比如,我們在轉化率預估時并不能單獨隻考慮寶貝次元的轉化率,而更需要考慮使用者到寶貝的轉化率或者query到寶貝的轉化率,這種情況下,我們使用單一次元的線性模型就無法解決現有問題,而需要人工構造高階的組合特征來完成,會消耗巨大的計算量。

大規模id特征實時深度神經網絡模型,可以處理上億次元的id類輸入特征,并通過複雜神經網絡結構對不同域的特征(使用者,寶貝,query)進行特征組合,解決了單一線性模型無法處理特征交叉的問題,同時也避免了人工構造高階組合特征的巨大計算量。

深度神經網絡通過構造稀疏id特征的稠密向量表示,使得模型能有更好的泛化性,同時,為了讓模型能更好的拟合大促期間商品特征資料的劇烈變化,在深度網絡的最後一層增加商品id類特征,id組合特征和實時的統計量特征,使得整個網絡同時兼顧泛化性和實時性的特點。

id feature: item_id, seller_id,學習已經出現過的商品,賣家在訓練資料上的表現。

id cross feature: user_id x item_id , user_id x seller_id

連續值統計特征是非常有用的特征,google的模型是把embedding向量和統計特征放到同一個dnn網絡中學習,但實驗發現這樣會削弱統計特征的作用。我們為統計特征專門又組建了一個包含2個隐層的網路,并且為了增強非線性效果,激活函數從relu改為tanh/sigmiod。

deep model

首先需要把離散特征(item_id,item_tag, user_id,user_tag,query_tag)embeding成連續特征。

将embedding後的向量作為dnn的輸入。考慮到最終線上預測性能的問題,目前我們的dnn網絡還比較簡單,隻有1到2個隐層。

整體模型使用三層全連接配接層用于sparse+dense特征表征學習,再用兩層全連接配接層用于點選/購買與否分類的統一深度學習模型解決方案:

第一層為編碼層,包含商品編碼,店家編碼,類目編碼,品牌編碼,搜尋詞編碼和使用者編碼。

在普适的ctr場景中,使用者、商品、查詢等若幹個域的特征次元合計高達幾十億,假設在輸入層後直接連接配接100個輸出神經元的全連接配接層,那麼這個模型的參數規模将達到千億規模。直接接入全連接配接層将導緻以下幾個問題:1. 各個域都存在冷門的特征,這些冷門的特征将會被熱門的特征淹沒,基本不起作用,跟全連接配接層的連接配接邊權值會趨向于0,冷門的商品隻會更冷門。2. 模型的大小将會非常龐大,超過百g,在訓練以及預測中都會出現很多工程上的問題。為了解決上述兩個問題,本文引入了紫色編碼層,具體分為以下兩種編碼方式:1. 随機編碼 2. 挂靠編碼,下面将對以上兩種編碼方式進行詳細的描述。

随機編碼

假設某一域的輸入id類特征的one-hot形式最大次元為n,其one-hot示意圖則如下所示:

其中黑色為0,隻有紅色為1,該特征表達方式即為one-hot形式,在這種表達形式下有兩個硬規則:1. 任何兩個不同的特征都隻有一個元素為1。 2. 沒有交叉重疊的紅色為1的元素。

倘若打破以上兩個規則,讓one-hot變成six-hot,并且讓兩兩six-hot中最多允許有三個為1的元素是重疊的,那麼對1w維的每個one-hot特征都可以找到一個随機的six-hot特征與其對應,并且可以将這six-hot的最高維設定為500,在這種情況下可以将1w維的one-hot特征壓縮到500維,實作20倍的特征壓縮,如果輸入特征是n萬維,則可以将其分成n段,并且在每一段裡根據上述尋找到的随機碼本進行特征壓縮,最後n萬維的one-hot特征可以采用以上six-hot形式将其壓縮到n/20萬維,并且保證兩兩特征最多隻有三個為1的元素是重疊的,示意圖如下所示:

通過以上任一一種的編碼方式,都可以實作模型大小将近20倍的壓縮,使得百億規模的模型參數壓縮到了幾億維規模,但幾億規模參數的模型前向将會達到秒級,對于幾十億樣本的模型訓練,以及ctr模型的前向來講将會是一個災難,接下來将描述如何采用紅色稀疏全連接配接層進行模型前向以及後向的時間壓縮。

挂靠編碼

上述的随機編碼對使用者域非常适用,但對商品域而言,雖然冷門商品會一定機率跟熱門商品重疊一些為1的元素共享一些連接配接邊權值,緩解了冷門商品越冷門的問題。但這裡并沒有利用好相似商品的資訊,如何利用相似商品的資訊,将冷門的商品與非冷門的相似商品建立共享權值?假設非冷門商品采用one-hot編碼,冷門商品采用m-hot編碼,如果冷門商品能通過i2i找到對應的熱門商品,則該冷門商品共享一維該熱門商品的編碼,另外m-1維編碼采用随機編碼;否則,直接對m維進行随機編碼。假設非冷門商品a的one-hot編碼最後一位為1,冷門商品b通過i2i找到相似非冷門商品a,冷門商品b采用six-hot編碼,則其挂靠編碼示意圖如下:

分詞編碼

上述的兩種編碼很好的解決了使用者域與商品域的編碼問題,但對查詢域還是不夠。在對查詢域做處理的時候,往常模型往往會對查詢短語先進行id化,然後通過近義詞合并一些id,再經過熱門查詢詞統計來篩選出大概幾百w的熱門查詢id,然後就會輸入到模型中。

在以上的流程中,無法處理有重疊詞語的兩個查詢短語的關系,比如“紅色連衣裙”,“紅色鞋子”,這兩個查詢短語都有“紅色”這個詞語,但是在往常的進行中,這兩者并沒有任何關系,是獨立的兩個查詢id,如此一來可能會丢掉一些使用者對某些詞語偏好的pattern。

基于以上觀察,可以對查詢短語首先進行分詞,然後對每個詞語進行one-hot編碼,最後針對每個查詢短語進行合并詞語編碼,也就是每個查詢短語元素為1的個數是不定長的,它元素1的個數是由自身能分成多少個詞語來決定的。分詞編碼的示意圖如下:

從第二層到第四層組成了“域間獨立”的“行為編碼網絡”,其中第二層為針對稀疏編碼特别優化過的全連接配接層( sparse inner product layer ),通過該層将壓縮後的編碼資訊投影到16維的低維向量空間中,第三層和第四層均為普通全連接配接層,其輸出次元分别為16和32。“行為編碼網絡”也可以被看做是針對域資訊的二次編碼,但是與第一層不同,這部分的最終輸出是基于行為資料所訓練出來的結果,具有行為上相似的商品或者使用者的最終編碼更相近的特性。

第五層為concat層,其作用是将不同域的資訊拼接到一起。

第六層到第八層網絡被稱為“預測網絡”,該部分由三層全連接配接組成,隐層輸出分别為64,64和1。該部分的作用在于綜合考慮不同域之間的資訊後給出一個最終的排序分數。

最後,softmax作為損失函數被用在訓練過程中; 非線性響應函數被用在每一個全連接配接之後。

online update

雙11當天資料分布會發生巨大變化,為了能更好的fit實時資料,我們将wdl的一部分參數做了線上實時訓練。embeding層由于參數過多,并沒有線上訓練,其他模型參數都會線上學習更新。

deep端網絡參數和wide端參數更新的政策有所不同,wide端是大規模稀疏特征,為了使訓練結果有稀疏性,最好用ftrl來做更新。deep端都是稠密連續特征,使用的普通的sgd來做更新,學習率最好設定小一點。

和離線batch training不同,online learning會遇到一些特有的問題:

a. 實時streaming樣本分布不均勻

現象:線上環境比較複雜,不同來源的日志qps和延遲都不同,造成不同時間段樣本分布不一樣,甚至在短時間段内樣本分布異常。比如整體一天下來正負例1:9,如果某類日志延遲了,短時間可能全是負例,或者全是正例。 解決:pairwise sampling。pv日志到了後不立即産出負樣本,而是等點選到了後找到關聯的pv,然後把正負樣本一起産出,這樣的話就能保證正負樣本總是1:9

b. 異步sgd更新造成模型不穩定

現象:權重學飄掉(非常大或者非常小),權重變化太大。解決:mini batch,一批樣本梯度累加到一起,更新一次。

<a href="https://mp.weixin.qq.com/s/lf_ud92kgetciqkhlyjmgg">原文連結</a>

上一篇: 小程式踩坑

繼續閱讀