天天看點

推薦系統Embedding向量召回在即刻的工程實踐

作者:閃念基因

即刻首頁的動态廣場是一個發現好玩圈子和有趣即友的地方。如何讓每一個使用者都能在上面看到自己感興趣的内容,是即刻推薦團隊一直以來努力的目标。

去年我們分享了一篇技術文章,介紹如何線上上服務中使用Spark MLlib,解決了排序模型的線上serving問題。過去這一年,即刻推薦系統完成了從Spark+XGBoost到TF+DNN的技術更新。在排序模型深度化之後,我們開始探索深度學習在召回層上的應用。

推薦系統Embedding向量召回在即刻的工程實踐

推薦系統召回層的目标,就是根據使用者畫像以及過往的消費曆史,從百萬級的推薦池裡粗篩出目前使用者最可能感興趣的幾百條内容,并将結果交由排序模型進一步排序。與排序不同的是,召回層面對的候選集量級通常是巨大的。這就導緻在召回時,沒法将候選集中的每條内容逐個與目前使用者進行比對計算,挑出使用者最可能喜歡的。是以,我們一般會根據不同業務的需求,将候選池中的内容按照某種方式做索引,進而根據某方面的特征挑出使用者可能喜歡的一批内容。不同的索引方式,對應着不同的召回政策。多路召回政策并行地工作,總體來看,就是從不同角度去搜集使用者可能感興趣的内容,完成一次召回。不同的業務場景有獨特的召回政策,不同的内容類型也有各異的索引方式。

在這些召回政策中,有一類特殊的,被稱為基于向量embedding的召回。作為一種既考慮了精确度又兼顧了覆寫面的召回政策,它被廣泛運用于各類業務場景中。向量召回的索引方式,就是基于向量來完成的。在訓練好一個embedding模型,得到關于物品和使用者的向量後,就可以将物品的向量作為索引的key,使用者的向量作為查詢的query,通過一些模糊最近鄰(ANN)的算法快速從海量候選池中找到一批最比對的物品。由于embedding的普适性,幾乎任何業務場景和内容類型都可以嘗試使用向量召回。

在即刻,我們為動态廣場推薦流的場景制定了一些召回政策,在一定程度上滿足了幫助即友發現有趣内容的需求。但随着社群興趣圈的豐富,使用者的喜好也變得更加多元。為了讓推薦系統能好滿足個性化的需求,我們決定開始嘗試在召回政策中加入基于embedding向量的召回。

## 模型結構

業界成熟的embedding模型有很多:從最原始的Matrix Factorization,到受word2vec啟發的item2vec、node2vec;從基于使用者點選序列的YouTubeDNN,到基于圖的GCN和GraphSAGE。不同的模型複雜度不同,也有不同的應用場景。

考慮到即刻動态流推薦對于實時性的要求,我們受到DSSM的啟發,選擇了一個簡單的DNN雙塔模型,并通過有監督的方式訓練,優化目标是點選率。

推薦系統Embedding向量召回在即刻的工程實踐

雙塔模型的兩個塔分别接收使用者側的特征和内容側的特征,輸出使用者向量和内容向量。對于單個塔内部的結構,我們選用了最簡單的多層全連接配接的結構:第一層是特征embedding層,将原始輸入的多個特征通過embedding得到向量表示,并将所有特征向量concat;最後一層是輸出的embedding層,得到使用者側和内容側的向量表示。得到雙側的向量表示後,直接用一個簡單的距離函數,計算兩個向量的距離,得到最後的輸出為[0,1]之間的一個标量,通過交叉熵的方式與使用者點選的回報做loss計算。考慮到線上召回的實時性要求,最後輸出的embedding次元設為64。

## 模型部署

在得到一個訓練好的模型後,我們需要将模型部署成一個線上服務,供線上的推薦系統使用。由于在實際使用中,内容側的向量和使用者側的向量是分開計算的。是以在部署服務時,需要将雙塔模型的兩個塔拆成兩個小模型部署:内容模型隻接收内容的特征輸入,輸出一個内容側向量;使用者模型則接收使用者側的特征,輸出使用者向量。

使用TensorFlow Serving,可以友善地将模型檔案直接部署為線上服務。

## 索引召回架構

将模型部署到線上後,需要在現有的推薦系統架構中整合基于embedding的召回政策。

推薦系統Embedding向量召回在即刻的工程實踐

我們目前的索引、召回流程是基于Elasticsearch完成的,将新增的向量召回通道內建進ES是最省時又友善的做法了。

整個索引召回流程分成兩個部分。在動态索引階段,通過消費MongoDB的operation log,可以實作動态的近實時索引和特征更新。索引服務在接收到索引請求時,通過特征服務擷取或計算動态的近實時特征,然後預估服務調用TF-serving計算得到動态embedding向量,最後連同其他字段一起索引進ES。在推薦召回階段,通過調用特征服務計算使用者的實時特征,然後調用TF-serving計算得到使用者embedding向量,再去ES中檢索使用者最可能喜歡的一批動态,完成一次embedding召回。

ES在7.X版本中原生支援dense vector索引和查詢,但由于我們目前的ES版本是6.7,還沒有原生的向量索引功能,是以使用了阿裡雲提供的向量索引插件來完成向量的索引和模糊查詢。向量檢索的P95耗時基本滿足推薦服務的延遲要求。

## 效果與疊代方向

第一版基于embedding向量的召回政策上線後,即刻動态廣場的整體互動率提升了33.75%,達到了單次上線最大效果提升。基于embedding的召回政策不僅是所有召回政策裡互動率最高的,而且也是分發量最大的。

初版模型隻是我們将深度學習應用在召回層的一次小小嘗試,這版模型還存在很多問題,無論是模型結構還是推薦架構都有很多優化空間。在架構上,一個亟需解決的是,如何自動地完成embedding模型更新帶來的向量版本同步問題。我們知道,embedding模型的一個根本性問題,就是每個次元的語義是未知且易變的,每次訓練得到的向量空間都不同,也就是說不同版本的向量之間無法比較。這就為模型疊代優化造成了很多阻礙,怎麼持續地完成模型更新內建,是一個很大難題。在模型結構上,雙塔模型有其優勢,但也有很多不足的地方,比如沒有考慮行為序列等。後續我們計劃在模型結構和訓練方式上嘗試更多可能。

在即刻,我們持續研究複雜的前沿機器學習算法,并将其應用于真實的推薦系統中;我們還關注如何建立一套靈活、靈活的部署流程,友善快速疊代模型。這一切,都是為了幫助即友們發現更多好玩的圈子、認識更多有趣的朋友。即刻推薦團隊歡迎優秀的工程師加入我們,一起建設即刻鎮。

----

參考連結:

-

-

-

-

-

作者:

歐承祖,即刻算法工程師

來源-微信公衆号:即刻技術團隊

出處:https://mp.weixin.qq.com/s/X9lJhI7v2M5P_FLu14Ilmw

繼續閱讀