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

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

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

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

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

## 模型結構

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

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

雙塔模型的兩個塔分別接收用戶側的特徵和內容側的特徵,輸出用戶向量和內容向量。對於單個塔內部的結構,我們選用了最簡單的多層全連接的結構:第一層是特徵embedding層,將原始輸入的多個特徵通過embedding得到向量表示,並將所有特徵向量concat;最後一層是輸出的embedding層,得到用戶側和內容側的向量表示。得到雙側的向量表示後,直接用一個簡單的距離函數,計算兩個向量的距離,得到最後的輸出爲[0,1]之間的一個標量,通過交叉熵的方式與用戶點擊的反饋做loss計算。考慮到線上召回的實時性要求,最後輸出的embedding維度設爲64。

## 模型部署

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

使用 TensorFlow Serving ,可以方便地將模型文件直接部署爲在線服務。

## 索引召回架構

將模型部署到線上後,需要在現有的推薦系統架構中整合基於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://zhuanlan.zhihu.com/p/143763320

- https://zhuanlan.zhihu.com/p/97821040

- https://zhuanlan.zhihu.com/p/73853438

- https://posenhuang.github.io/papers/cikm2013_DSSM_fullversion.pdf

- https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf

作者:

歐承祖,即刻算法工程師

相關文章