深度學習要多深,才能了解你的心?——DNN在搜索場景中的應用
DNN在搜索場景中的應用潛力,也許會比你想象的更大。
搜索排序的特征在於大量的使用了LR,GBDT,SVM等模型及其變種。我們主要在特征工程,建模的場景,目標采樣等方麵做了很細致的工作。但這些模型的瓶頸也非常的明顯,盡管現在阿裏集團內部的PS版本LR可以支持到50億特征規模,400億的樣本,但這對於我們來說,看起來依然是不太夠的,現在上億的item數據,如果直接使用id特征的話,和任意特征進行組合後,都會超出LR模型的極限規模,對於GBDT,SVM等模型的能力則更弱,而我們一直在思考怎麼可以突破這種模型的限製,找到更好的特征;另外,及時LR模型能支持到上億規模的特征,在實時預測階段也是有極大的工程挑戰,性能與內存會有非常大的瓶頸。
所以我們第一考慮到的是降維,在降維的基礎上,進一步考慮特征的組合。所以DNN(深度神經網絡)很自然進入了我們的考慮範圍。再考慮的是如果把用戶行為序列建模起來,我們希望是用戶打開手淘後,先在有好貨點了一個商品,再在猜你希望點了一個商品,最後進入搜索後會受到之前的行為的影響,當然有很多類似的方法可以間接實現這樣的想法。但直接建模的話,LR這類的模型,很難有能力來支持這類特征,所以很容易就想到了RNN模型。
同時前人有很多工作給予了我們提示。Deep Learning over Multi-field Categorical Data這篇paper開始使用id類的特征進行CTR預估。
Google也推出Wide & Deep Learning for Recommender Systems的Wide&Deep模型用於推薦場景。在FNN的基礎上,又加上了人工的一些特征,讓模型可以主動抓住經驗中更有用的特征。
在搜索中,使用了DNN進行了嚐試了轉化率預估模型。轉化率預估是搜索應用場景的一個重要問題,轉化率預估對應的輸入特征包含各個不同域的特征,如用戶域,寶貝域,query域等,各種特征的維度都能高達千萬,甚至上億級別,如何在模型中處理超高維度的特征,成為了一個亟待解決的問題,簡單的線性模型在處理高維稀疏特征存在比較好的優勢,但是單一的線性模型無法處理特征交叉的問題,比如,我們在轉化率預估時並不能單獨隻考慮寶貝維度的轉化率,而更需要考慮用戶到寶貝的轉化率或者query到寶貝的轉化率,這種情況下,我們使用單一維度的線性模型就無法解決現有問題,而需要人工構造高階的組合特征來完成,會消耗巨大的計算量。
大規模id特征實時深度神經網絡模型,可以處理上億維度的id類輸入特征,並通過複雜神經網絡結構對不同域的特征(用戶,寶貝,query)進行特征組合,解決了單一線性模型無法處理特征交叉的問題,同時也避免了人工構造高階組合特征的巨大計算量。
深度神經網絡通過構造稀疏id特征的稠密向量表示,使得模型能有更好的泛化性,同時,為了讓模型能更好的擬合大促期間商品特征數據的劇烈變化,在深度網絡的最後一層增加商品id類特征,id組合特征和實時的統計量特征,使得整個網絡同時兼顧泛化性和實時性的特點。
a. id feature: item_id, seller_id,學習已經出現過的商品,賣家在訓練數據上的表現。
b. id cross feature: user_id x item_id , user_id x seller_id
連續值統計特征是非常有用的特征,Google的模型是把embedding向量和統計特征放到同一個DNN網絡中學習,但實驗發現這樣會削弱統計特征的作用。我們為統計特征專門又組建了一個包含2個隱層的網路,並且為了增強非線性效果,激活函數從RELU改為TanH/Sigmiod。
a. 首先需要把離散特征(item_id,item_tag, user_id,user_tag,query_tag)embeding成連續特征。
b. 將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作為損失函數被用在訓練過程中; 非線性響應函數被用在每一個全連接之後。
雙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,一批樣本梯度累加到一起,更新一次。
最後更新:2017-06-21 14:32:03