向量體系(Embedding)在嚴選的落地實踐

向量化在業界的運用越來越廣,近期也有許多文章分享過相關的主題。嚴選於18年下半年開始探索向量化在搜索推薦場景中的運用,從最開始基於商品召回用戶的任務到後續的搜索召回、搜索個性化排序、搜索底紋、搜索發現詞、搜索建議詞、跨類目推薦、推薦召回、多興趣召回、通用排序、端智能重排等等,我們不斷拓寬向量體系在嚴選的運用,在這過程中一點點迭代與沉澱。本文將從模型算法和落地運用等角度做簡要介紹,希望能給讀者一些啓發。

向量體系

上圖是對嚴選向量體系的一個概覽。引言中說了那麼多運用場景,第一眼看會覺得有些場景之間跨度蠻大,但是仔細考慮一下我們會發現,其實電商場景的大部分任務(包含以上所述的)都是在做對象之間的匹配,可能是商品和人的匹配,可能是檢索詞和商品的匹配,可能是用戶和檢索詞的匹配等等。

於是,擺在我們面前的問題就是如何把我們目前遇到的以及將來會遇到的對象進行一個比較好的表徵並刻畫對象之間的相似度,其本質是學習出各個對象在同一個空間中距離的刻畫。

如果我們把各個對象都學習到同一個空間,那麼這些對象之間的組合幾乎能覆蓋各種運用場景,例如我們擁有用戶(U)、商品(I)、檢索詞(Q) 的表徵,僅僅是這三者的組合就可以有例如U2I、Q2I、I2Q、Q2Q、U2Q、I2I等等,我們進一步擴展類目、專題等等的表徵之後能覆蓋的場景就更多了。

那麼我們如何去表徵各個對象呢?向量憑藉着簡單的結構、快速的相似性計算、強大的表徵能力有着得天獨厚的優勢。因此我們選擇向量作爲對象的表徵方式。

當然有了向量表徵僅僅是第一步,爲了能讓其服務於各個場景,線上線下需要其他模塊的輔助配合,需要將具體的場景進行抽象,同時過程中也離不開不斷的迭代優化,需要考慮模型的效果、穩定性、可擴展性、以及線上性能等等。

由點及面,在有了向量基礎後,我們需要進一步擴展向量存儲、向量計算等能力,進一步,由面到體,我們需要不斷去分析和抽象具體的業務場景,以此不斷鋪開向量體系在實際業務中的落地運用。

算法模型

最開始我們使用的是圖嵌入技術同時學習商品和用戶,例如LINE、Node2Vec等模型(節點做標示進行區分),後續也嘗試過使用YoutubeDNN的方式學習商品和用戶向量,最後爲了兼顧模型的可擴展性以及稀疏數據上表徵的可靠性,我們選擇了兩步走的策略。

  1. 確認商品是整個電商場景中的核心,單獨學習優化商品向量表徵
  2. 其他對象都和商品有直接或者間接的關係(交互),通過專門的聚合模塊得到對象表徵

實踐表明,這個兩步走的策略在我們的場景中要優於之前嘗試的方案,接下來我會對這兩步做簡要的介紹。

商品向量學習

商品向量的學習關鍵在於用戶行爲數據的梳理以及模型的構建(參考了Airbnb的模型,在其基礎上做了較多改進)。

商品是電商場景下用戶交互最核心的東西,大部分的用戶行爲都圍繞着商品。大量的用戶行爲中,天然的包含了用戶對商品的認知,通過對這些認知的提取,我們便能夠刻畫出用戶眼中商品的樣子,利用用戶眼中商品的樣子能更好得去引導用戶的行爲。

我們有用戶和商品交互的各種數據以及商品自身的一些屬性。用戶的連續點擊行爲能在商品之間構建關聯;用戶的購買行爲能告訴我們用戶的探索路徑更容易收斂到哪些商品;用戶的相繼的購買行爲能反應商品之間的搭配購買信息;商品自身的屬性能在冷啓動時給我們提供很多額外信息等等。我們要做的就是融合行爲屬性學習出商品向量。

從上圖可以看到,我們訓練數據的構建其實可以等效看成構建了商品之間有權有向的關係圖,同時增加了一些轉化導向的長連接。我們的模型訓練有別於傳統的方式,對一個單一訓練樣本 center(中心商品):contexts(臨近點擊):global(序列內購買) ,我們希望 center 和 contexts(包含多個id) 以及 center 和  global 的距離越接近越好,所以在構建損失函數的時候我們一次性算出 center 和 contexts(包含多個id) 的相似性以及 center 和 global 的相似性,然後再加上負採樣的約束。對於負採樣,我們採取的是在一個 batch 內構建負樣本的方式,這種方式簡單有效且能滿足按照樣本出現的頻率採樣,同時結合矩陣運算能加快訓練數據。在獲取負樣本後我們進一步構建 pair-wise 的loss,這對模型效果能有一些提升。模型的細節可以參考下圖。

還有需要提及的一點是,爲了學習到更好的商品向量表徵,通常的方式是每日全量重新訓練商品向量,但是這就引入了一些問題,例如每日的商品向量不在同一個空間中,相互之間的計算是沒有意義的,如果不小心拿隔日向量進行了計算,會引入意外的結果。於是有人會採用增量訓練的方式,每日只對新增的商品做推斷獲取它們的向量,但是這樣也會引入一些問題,比如商品之間的關係並不是穩定不變的,只針對新商品做推斷的話會使得原有商品之間的關係無法依據新數據進行調整。

針對這些問題我們提出了兩種解決方案,一種是在隔日的向量空間之間學習一個仿射變換,對當日學得的向量做仿射變換,然後最小化相鄰兩天共現對象向量間的差異,這樣仿射變換後的向量就能變換到歷史空間中,同時包含一些新的結構信息。還有一種方案類似預訓練的方式,在第二日訓練的時候拿前一日的向量做初始化,對於沒有出現過的對象做隨機初始化,然後降低學習率做微調學習。在我們的場景中第二種方案效果相對好一些,第一種也能取得不錯的效果。

此外從19年下半年開始我們也針對GNN相關的模型做了嘗試,例如graphSAGE、LightGCN、SR-GNN等,目前看來SR-GNN模型在我們的場景中效果還可以。

擴展向量學習

假設我們只有商品向量(I),我們能做的事相對比較侷限,例如我們可以做基於I2I的各種任務、我們可以將商品向量作爲預訓練的向量提供給具體場景用於遷移學習。進一步我們獲取了用戶向量(U)之後,我們便可以做U2I、I2U等召回場景,很多分享案例都止步於此,但是隻要我們再加一個對象例如檢索詞向量(U),我們的運用場景就瞬間開闊了許多,進一步我們還會有類目向量©、專題向量(T)等等。

隨着業務場景的鋪開,我們會遇到越來越多的對象匹配任務。我們可以針對每個場景分別學習,例如針對商品和檢索詞構建深度模型,學習他們的相似度量,例如針對檢索詞歷史進行挖掘做檢索詞的相關推薦,例如針對用戶和商品的歷史交互建模做商品的召回,例如針對用戶和專題的交互歷史做專題召回等等,在這樣的模式下每新增一個場景我們就需要花費人力去開發和後期維護,並且有的新增場景一開始並沒有訓練數據給你使用。考慮到可擴展性,我們可以將這些對象統一到一個增量向量產出框架中,抽象出一套聚合邏輯,產出同一向量空間中的向量。

結合落地實踐,我們的聚合模塊主要包含上圖所示的子模塊, 我們將新增對象叫做target,將基礎的商品叫做source。到實際場景中,對象和商品的交互可能存在時間上的先後,因此需要時間衰減模塊來處理時間因子;考慮到對象和商品的交互次數會有頻次上的差異,我們需要權重累計模塊來處理這個因素;考慮到對象和商品的交互會有一些噪音數據比如用戶的誤點擊行爲、或者運營的錯誤配置等等,我們需要噪音過濾模塊來對噪音數據降權;考慮到有的場景使用單向量表徵更合適,我們需要對交互數據做自注意力機制的處理,來凸顯主要興趣,因此引入了注意力機制模塊;但是在有些場景,對象交互的商品往往是分佈在空間中的多個區域(對用戶而言是多興趣表徵,對檢索詞而言是多義詞表徵),爲此我們加入了聚類模塊(可以使用傳統的聚類算法,也可以考慮用複雜網絡中的社區檢測算法來進行聚類,一般是在全局商品上進行操作),來輸出對象的多向量表徵。

憑藉通用聚合框架,每次我們要新增對象的向量表徵的時候,只需要處理一份target和source的關係表,同時每一個source都帶上target和它交互的相關附加信息,將這份關係數據輸入聚合框架便能產出和商品向量屬於同一向量空間的對象向量了,任意對象之間都可以相互計算,判斷相似情況。此外聚合模塊的邏輯經過較小的改動也可以直接運用到線上對象的實時向量表徵中。

相關技術

要建造大樓僅僅有基礎的磚塊肯定是不夠的,我們還需要鋼筋和水泥,需要腳手架等等。

有了基礎向量,隨之而來的就是大規模向量計算問題。初期各種任務主要集中在離線計算,所以我們自研了基於數據分塊、矩陣運算和並行計算的離線大規模相似度計算模塊,百億規模的精確計算在單機上基本能在幾分鐘內完成,後期進一步調研了一些最近鄰搜索算法後,使用了LSH、FAISS等方式來做大規模向量召回,並運用到線上實時召回中,感興趣的讀者可自行查閱相關資料。

我們的向量體系不僅僅運用在常見的召回任務中,在很多線上的基礎排序任務中也發揮了重要作用。我們開發了一套線上向量存取和實時向量異步聚合的服務。基於這個服務,我們進一步開發了通用排序服務,例如基於用戶的實時向量對搜索結果做Top個性化重排、基於檢索詞對專題進行排序、對衆多的活動頁商品做實時個性化排序等等。也正是基於這個服務,我們在一定程度上將搜索和推薦的部分任務統一到了同一個框架中。

此外在電商場景中效果的提升離不開實時數據的輔助,因此在我們的體系中實時行爲數據模塊也發揮了重要的作用。

落地分享

最後針對一些具體的場景展開介紹下,給讀者一個更爲完整的閱讀體驗。

搜索場景

先談一談搜索場景,搜索場景不僅僅限於商品的召回和排序,搜索的底紋、發現詞、建議詞等都能爲搜索導流,而這些也都能利用統一向量體系得到較好的解決。

例如發現詞場景,我們需要基於用戶的行爲對用戶推薦相關可能想搜的詞彙,傳統的方式通常基於query挖掘,基於用戶先前搜索的詞彙給用戶推薦更多相關的詞彙,但其實從用戶瀏覽過的商品也能推測出用戶想搜的商品,而這兩個角度很自然得可以通過向量體系中的Q2Q(基於用戶的搜索詞)和I2Q(基於用戶的瀏覽商品)來得到解決,進一步也可以直接通過U2Q(基於用戶的各種行爲)來獲取 。(Q2Q  、I2Q 、U2Q的運用)

在此多說一句,爲了更好的效果,通常需要結合離線數據和實時的數據,例如用戶(U)就會有離線長期向量、離線短期向量、實時聚合向量(時間維度)、實時多興趣向量(空間維度)等區分,同時爲了性能提升部分相似性計算也可以挪到離線完成,此外在類似推薦的場景使用非多興趣向量的時候多樣性往往擴散得不夠,這時候就會需要I2I(可拆分出相似和相關結果)的幫忙。(時空表徵的運用)

建議詞場景同理,基於Q2Q便可以,當然實際運用時Q2Q中的第二個Q和第一個Q是不同的,第二個Q需要是質量較好的Q,候選是需要考慮Q的句法結構,例如形容詞+名詞、名詞+名詞等,需要考慮Q被大衆搜索過的次數、需要考慮Q在搜索後能召回的數量、需要考慮Q在搜索後用戶點擊的數量等等,這些都可以離線處理好,在檢索詞向量庫的基礎上過濾出一份優質檢索詞向量庫。(Q2Q的運用)

此外基於檢索詞向量做商品的召回擴充其實在一定程度上融合並強化了傳統的基於同義詞擴充召回、基於SEO擴充召回等等方案,因爲檢索詞向量之間的相似性天然的刻畫了基於用戶行爲的詞彙同義性,同時單商品上的SEO詞會通過商品關係網擴充到其他商品上,那麼基於檢索詞向量自然能召回那些即使沒有相應SEO但是應該有那些SEO的商品。(Q2I的運用)

基於向量體系對搜索排序的優化也是水到渠成的,所有的優化可以看作是基於預訓練向量的排序運用,而且擴展了數據的邊界,不僅僅侷限於搜索場景,將全局的行爲都融入到了搜索中。

搜索場景的重點是幫用戶快速找到他需要的商品,傳統的認知是檢索詞包含了用戶所有的意圖,但是事實顯然不是如此,比如T恤一詞就相當寬泛。這其實可以看作是貝葉斯推斷,假設我們不知道用戶任何其他信息,基於T恤一詞我們會有一個先驗估計,得出一個基礎排序。(檢索詞向量、商品向量的運用)

但是當我們獲取更多是事實之後,我們的信息多了,那麼必然可以去修正我們之前估計。例如我知道這個用戶前幾天看了一些女性鞋子,那麼顯然將女性T恤排在更前面會是合理的選擇**(離線長短期用戶向量、商品向量的運用),同時我們又知道這個用戶剛剛在其他頁面瀏覽了一些運動健身的器械,那麼顯然將部分運動T恤提前會有不錯的收益,實際模型上線後提升了搜索排序的魯棒性、提高了搜索個性化的實時反饋能力、提升了搜素轉化率,取得了不錯的效果。(實時用戶向量、商品向量的運用)**

下圖是對以上提到的部分場景的一個彙總。

當我們進一步引入類目向量和專題向量後,我們會發現運用的場景又進一步擴充了。在搜索場景中,通常會面臨類目預測的問題,當我們擁有了檢索詞向量和類目向量之後我們能輕鬆地推斷出每個檢索詞的主類目,對於沒有出現過的長檢索詞,我們在計算前加入分詞模塊,通常便可推斷出他們的類目了。此外當我們設定相似度的閾值之後,我們也可以爲檢索詞作出多類目的預測,以滿足不同場景的需求。(Q2C的運用)

此外在搜索場景,爲了充分利用搜索流量,我們還會做專題的召回以及和商品的混排,商品和專題屬於異構數據,通常我們需要構建額外的模型來對專題作出排序。但是當我們有了專題向量之後(此處提一下,專題向量其實可以有兩個,一個是基於關聯商品聚合的,還有一個是基於專題的文本進行推斷得到,因爲檢索詞本質上是文字,專題的文本可以拆分後用檢索詞向量進行描述),我們便可以方便的對專題進行排序然後呈現。(Q2T的運用)

推薦召回

接着我們再說一說向量體系在推薦召回中發揮的作用。這裏面涉及到了用戶的多種向量表徵,對於用戶的刻畫當然是越精細越好,在我們的場景中我們學習了用戶長期向量、短期向量、實時向量、用戶多興趣向量、用戶羣體向量等等,不同的向量有着不同的使用場景,對於展示位置比較少的推薦位,我們關注用戶的主要興趣,所以一般使用單興趣向量即可(我們模型訓練得到的單興趣向量也可召回不同興趣面的商品,但是相似頭部的商品相對還是比較集中);在一些展示位較多的推薦位置例如猜你喜歡模塊,我們需要兼顧推薦的多樣性,所以一般會使用用戶多興趣向量召回商品(實時多興趣和離線多興趣);對於行爲較少的新人,我們則會採用用戶羣體向量去召回商品,實際中也取得了不錯的效果。(各種U2I的運用)

購買預測

此外再提一個購買預測的場景,用戶日常的行爲可能是目的明確地瀏覽、也可能是目的不明地閒逛,那麼如何區分是哪種行爲呢。其實很簡單,分析下用戶看過的商品之間是相似的還是沒什麼關聯的就行,很顯然(I2I)能滿足我們的需求,我們可以爲每個商品計算它與其它所有商品相似度得分的均值(記爲S),如果每個商品最終得分都較大,那麼用戶是在目的明確地瀏覽,如果每個商品的得分都較小那麼用戶是在目的不明地閒逛,如果幾個商品得分較高,幾個商品得分較低,那麼用戶是相對集中的看了幾個類似商品,同時無意地點了幾個其他商品。基於以上我們可以挑選出那些目的明確地瀏覽的用戶。至此讀者可能會想,然後把得分最大的商品挑出來就可以了,但是其實還沒有結束。截止到目前我們只使用了用戶當日的行爲,但是我們上手還有用戶以往的行爲,這些信息不能浪費,它們會修正我們當下作出的判斷。假設今日挑選出的商品中,有的商品用戶前幾日就很有興趣,那麼今日他購買的概率必然比S得分相似的其他商品要更大,因此更好的判斷應當基於今日的S以及用戶前幾日興趣對商品們的得分(U2I) , 這個項目的上線明顯提升了用戶的轉化。(I2I和U2I的運用)

總結展望

向量體系有着很明顯的優勢,它能讓我們迅速完成產品新功能的上線並取得不錯的效果,同時在有的場景中也能完勝一些老的複雜的方法,這恰恰也印證了奧卡姆剃刀原則。

隨着表徵對象的增加以及對業務的進一步理解,我們仍將一步步不斷拓寬向量體系在業務中的落地,但是在實踐中我們也會發現它的侷限性,這個侷限性一方面來自於向量表徵結構自身,另一方面源於部分實際問題的複雜性需要新的表徵方式來解決,所以我們將會進一步探索其他的表徵方式,以及新的技術方向。

作者簡介

張俊,高級算法工程師,2018年畢業於中國人民大學後加入網易嚴選 ,致力於嚴選搜索推薦業務的迭代優化,推動向量體系在嚴選從無到有的構建並運用於各個業務場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章