1. 程式人生 > 實用技巧 >Embedding在網易嚴選搜尋推薦中的應用

Embedding在網易嚴選搜尋推薦中的應用

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

01

向量體系

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

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

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

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

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

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

02

演算法模型

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

  1. 確認商品是整個電商場景中的核心,單獨學習優化商品向量表徵

  2. 其他物件都和商品有直接或者間接的關係(互動),通過專門的聚合模組得到物件表徵

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

1. 商品向量學習

商品向量的學習關鍵在於使用者行為資料的梳理以及模型的構建(參考了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模型在我們的場景中效果還可以。

2. 擴充套件向量學習

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

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

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

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

03

相關技術

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

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

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

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

04

落地分享

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

1. 搜尋場景

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

例如發現詞場景,我們需要基於使用者的行為對使用者推薦相關可能想搜的詞彙,傳統的方式通常基於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的運用)

2. 推薦召回

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

3. 購買預測

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

05

總結展望

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

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