京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

導讀:搜索主要經(jīng)歷四個階段:召回、粗排、精排和重排,最后呈現(xiàn)給用戶最終的結果。而召回的結果主要來自兩個部分:倒排檢索和語義召回。傳統(tǒng)的倒排檢索依賴字面匹配,很難去召回一些語義相似但是字面不匹配的商品。傳統(tǒng)的語義召回策略有人工干預召回、人工構建同義詞表進行同義詞替換等等。但是相比于深度語義模型,這些技術費時費力,并且覆蓋率低下,很難適應快速增長的海量商品的召回需求。今天想要和大家分享的是在深度學習背景下,京東基于語義的搜索召回技術和新的進展。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

具體將圍繞下面五點展開:

  • 京東搜索召回技術概述
  • 雙塔語義召回模型
  • 圖模型
  • 同義詞召回
  • 索引聯(lián)合訓練模型

01
京東搜索召回技術概述

首先介紹下京東搜索語義檢索中采用的多路召回技術。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

多路語義召回包含同義詞召回、向量召回和離線語義召回。這些語義召回方式能夠解決傳統(tǒng)策略費時費力、不準不全的問題,但是同樣也面臨著一些技術難點,包括準確性、相關性和豐富性等。準確性是向量召回技術存在的一個基本問題,主要原因是因為大規(guī)模向量的近似查找會引入精度損失。而語義匹配也很容易引入相關性問題,比如品牌一致性、型號一致性等。不僅如此,語義召回在滿足前兩個問題的前提下,還應該盡量地召回更多更豐富的商品,提高類目多樣性、品牌多樣,為下游任務提供更多的選擇。

接下來我們就詳細介紹一些我們目前采用的一些語義召回的模型和技術。首先是一個基礎的雙塔語義召回模型。

02
雙塔語義召回模型

雙塔語義召回模型的核心思想是將query/item嵌入到共享低維空間上,然后通過向量距離來度量相關性。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

上圖右側是我們整體的模型和線上服務的框架。其中左邊是離線的雙塔模型,包含一個query塔和一個item塔,分別用來進行query和item的語義表征。Query側主要使用其文本信息,分詞方式是n-gram,實際應用時會使用unigram和bigram。右側item塔主要使用item的自身特征,包括標題、品牌、類目、派送方式等信息。Query和item塔在結構上大體是分離的,但是它們之間需要一些信息的共享。信息共享主要由兩個方面實現(xiàn):輸入層的query embedding和item的標題embedding共享embedding矩陣;輸出層query與item的embedding會進行點乘來實現(xiàn)信息交互。

右側是模型服務的流程,主要分為兩個過程。首先是一個離線導出過程,需要將item的embedding導出,建立索引。與此同時,我們還需要將query一側的模型導出。導出的query模型和建好的索引共同服務線上召回任務。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

具體地,對于用戶的一次請求,我們首先調(diào)用query模型server來得到query embedding,然后用query embedding請求索引服務得到最終召回的商品。如果分為兩階段服務,存在兩個問題:首先,我們需要管理query模型服務和索引服務之間的映射關系;其次,每次用戶請求會在內(nèi)部經(jīng)歷兩次網(wǎng)絡請求,增加召回時延。所以在工程上,我們將query的模型服務和索引服務整合成一個服務,使得我們可以通過一次請求得到召回結果。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

在此基礎上,我們還做了一些改進的工作。比如部分搜索詞具有一定的語義多義性。例如,蘋果這個詞既可以表示蘋果的電子產(chǎn)品,也可以表示水果蘋果。在上一版的語義模型中,我們發(fā)現(xiàn)這種多義的搜索詞通常會傾向于表達用戶點擊更頻繁的商品。比如在蘋果這一例子下,上一版模型召回的更多是蘋果手機。但是在實際召回中,就語義相關性而言,更合理的狀態(tài)應該是既能召回蘋果產(chǎn)品,又能召回水果蘋果。因此我們修改了網(wǎng)絡結構來提升模型的多語義表征能力。具體地,我們會為query學習多個head,然后在輸出層使用注意力機制來使query的每個head具有不同的表征性,從而實現(xiàn)多義商品的召回。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

為了更直觀地呈現(xiàn)最終的召回效果,我們對embedding做了t-sne的可視化展示,不同的簇代表不同的類目或者品牌。圖一和圖二代表的是不同類目,圖三對應不同的品牌。從圖一可以看到當模型只有一個頭的情況下,召回還是傾向于蘋果手機;而在使用兩個頭時可以看到第一個頭主要還是召回iPhone,但第二個頭更傾向于召回水果蘋果。第三張圖是query為手機的情況下,兩個頭的雙塔模型在召回品牌上的分布。我們可以發(fā)現(xiàn)不同的head是分別傾向于召回不同的手機品牌,這也證明了多head對于解決語義多義性有比較明顯的效果。

03
圖模型

接下來為大家介紹的是圖模型在召回中的應用。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

圖結構適合的任務有:社交網(wǎng)絡中廣告的投放,社交關系的預測,推薦系統(tǒng)中商品的推薦,新用戶的推薦等。那么圖模型能夠解決搜索中的什么問題呢?前面的語義模型具有一些遺留問題,比如低頻商品的embedding學習得不夠充分,因為在訓練時我們的訓練樣本使用的是點擊的數(shù)據(jù),數(shù)據(jù)分布與線上用戶的點擊分布是一致的,所以一些低頻商品無法獲得比較充分的學習。其次,在電商場景下搜索query通常比較短,query側語義信息比較匱乏。另外,我們的訓練數(shù)據(jù)是由一對query和商品組成的,訓練效率較低。

使用圖模型可以相應地解決這些問題,主要做法是利用用戶的點擊行為來構建一個異構點擊網(wǎng)絡。網(wǎng)絡節(jié)點除了query和商品之外,還有商品的店鋪、品牌等。query與商品之間的邊是點擊關系,商品和品牌以及店鋪之間的邊是從屬關系。利用這樣的圖結構,我們就可以把更多的query和商品的語義信息聚合,進而提升query和商品的語義表征能力。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

上圖是SearchGCN的網(wǎng)絡結構。左邊是以query為中心的圖結構,右邊是以item中心的圖結構。兩側我們都是使用二階的信息:query側,一階的節(jié)點是用戶點擊過的商品,二階節(jié)點是商品關聯(lián)的query和商品本身的屬性特征(如品牌、類目等);item側,一階的節(jié)點是與item關聯(lián)的query和屬性,二階的節(jié)點是一階節(jié)點關聯(lián)的商品。在實際使用的時候,我們分別聚合query和item側的二階信息。值得注意的是,對于當前聚合操作的query和商品的點擊對,我們需要分別mask掉對應商品的節(jié)點信息,同理對于item側也需要mask掉對應query的節(jié)點信息,以防止訓練過程出現(xiàn)信息泄露,導致模型過擬合。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

圖模型中比較關鍵的是選取消息傳遞的方式,即如何對節(jié)點信息進行聚合和更新。對于第L層的節(jié)點,我們需要聚合第L-1層的節(jié)點信息,具體做法是對第L-1層的節(jié)點使用attention機制做加權求和的計算。我們還需要一個融合操作來對節(jié)點本身的信息做聚合,這里我們使用了直接求和的操作,即直接對所有層的節(jié)點embedding進行求和,來得到這個節(jié)點的最終表示。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

通過embedding的t-sne可視化表示可以觀察模型的效果,上圖左側是baseline語義模型的embedding分布,右側是SearchGCN得到的embedding分布。從分布的情況與召回的結果來看,右邊圖模型的分布更為合理,即相同類目的商品的分布更加集中,類目之間的邊界也更為清晰。從召回結果來看,電商場景下有一類比較典型的搜索詞,即一次搜索中出現(xiàn)多個產(chǎn)品詞,如牛奶巧克力。牛奶和巧克力分別是兩個產(chǎn)品詞,單從字面語義相關性來看,既可以召回牛奶也可以召回巧克力,但是從自然語言理解的角度,牛奶是一個修飾詞,真正的產(chǎn)品詞是巧克力。在實際的訓練數(shù)據(jù)里,用戶點擊更多的都是巧克力的商品,所以在圖中這個query的鄰居節(jié)點更多的也是巧克力的商品,這就使得巧克力可以獲得更高的學習權重,最終的embedding也更傾向于召回巧克力商品。

04
同義詞召回

下面給大家介紹一下同義詞模型和同義詞模型的召回效果。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

我們知道同義詞改寫可以一定程度上擴大商品召回的豐富性。很多商家會在標題中通過同義詞堆砌來獲得更多曝光,過長的標題會造成不好的用戶搜索體驗。針對這個問題,業(yè)務層面上我們會使用人工構造同義詞表的方法來解決,但是這一方法效率低下。所以對同義詞的自動生成有一定的需求。這里最大的難點在于缺乏用于大規(guī)模訓練的同義詞對齊語料,所以我們想利用query和點擊商品的標題來生成同義詞訓練樣本。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

模型上主要分為兩個階段,一個query到title的前向生成模型,一個title到query的反向生成模型,模型結構基于transformer。如上圖左側所示,通過兩階段的訓練得到query到query的生成模型。但是這種訓練方式?jīng)]有達到我們從query到query生成的直接目的,缺乏query與query的對齊效果。因此,我們將兩階段整合成了一個聯(lián)合訓練的模型,增加了query到query的生成損失。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

模型的推理是兩段式的。對于用戶的一個搜索詞而言,我們首先會通過前向的生成模型生成一些候選的標題,然后在候選標題中選取概率較高的title,通過反向生成模型來生成最終的query。為了提高生成query的多樣性,我們在decode的過程中做了采樣的操作。具體地,在decode 的第一步,模型會根據(jù)最終的生成概率來選取概率最大的K個token,但是在后續(xù)decode時不會繼續(xù)保留所有token,而是會在K個token里做一個隨機采樣的過程。以此提高模型的泛化能力,增強最終生成query的多樣性。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

上圖羅列可一些在實際應用過程中模型生成query的效果,其中上半部分是分離式模型的生成效果,下半部分是聯(lián)合式模型的生成效果。兩個模型都有一定的生成偏好,但是可以發(fā)現(xiàn)相較于分離式模型,聯(lián)合式模型的生成query的相關性明顯更優(yōu)。

05
索引聯(lián)合訓練模型

最后介紹一下我們的一項新工作:索引聯(lián)合訓練模型。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

這個工作的主要目的是為了降低ANN向量檢索的精度損失問題?,F(xiàn)在工業(yè)界使用的檢索方式大多是基于PQ(Product Quantization)的向量檢索,用得比較多的工具是facebook的開源檢索庫FAISS,而我們前面所介紹的語義模型也是使用FAISS索引。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

首先來介紹一下基于PQ的向量檢索的基本原理。PQ的基本思想是將高維空間映射成低維空間的笛卡爾積,然后在低維空間進行向量的相似度計算。舉個例子,首先將1024維的向量劃分為8個128維的向量,然后在每個子向量空間里做聚類,得到聚類中心,對聚類中心進行編碼后,計算好item向量的子向量到聚類中心的距離,使用最近的中心的編碼來表示當前的子向量,同時計算出編碼之間的距離并存表,這就是索引構建的基礎過程。在進行檢索時,首先將query embedding,進行相應的向量切分,然后使用query的子向量在索引空間中尋找最近的類中心,用提前計算好的類中心以及類中心之間的距離和item子向量的類編碼,就可以通過查表得到query到item之間的近似距離。通過這樣的方法,我們可以極大地減少浮點運算的次數(shù),從而獲得檢索速度的提升,且量化程度越高檢索速度越快。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

量化操作雖然能夠帶來速度的提升,但是引入了檢索精度損失的問題,它包含兩部分:子空間劃分帶來的計算誤差以及通過聚類中心衡量item相似度的計算誤差。為此,我們將PQ的過程移植到了模型內(nèi)部,將子空間和聚類中心進行參數(shù)化學習,從而減少計算損失。為了提高可用性,我們將整個PQ過程封裝在完整的層中,只需要將嵌入在模型item塔的輸出層即可,可移植性較高。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

PQ層的具體實現(xiàn)可以分為四個過程。首先是旋轉操作,即將原始向量與一個正交矩陣相乘,目的是希望將item embedding的dimension做重排序,使得在子空間劃分后,落在相同子空間的子向量的相關度更高。第二步是一個粗粒度的量化過程(coarse quantization),其目的是為了提高檢索效率。具體做法是對完整的item向量做一次聚類,計算向量到類中心的距離,最后使用最近的中心對來表示原始向量。第三步是PQ,這一步與前面介紹的過程一致。首先進行子空間的劃分,然后在子空間內(nèi)對子向量進行聚類,最后利用子空間類中心來做向量表示。最后一步我們需要使用第一步的正交矩陣的逆來恢復原始向量dimension的順序。由于我們子空間的劃分和聚類中心始終是與最終的優(yōu)化目標保持一致,這樣做就能夠減少直接PQ所造成的的精度損失。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

我們通過多維度的實驗對模型效果進行了對比。從實驗結果中可以看到,在不同的數(shù)據(jù)集上(private數(shù)據(jù)集(京東電商的數(shù)據(jù))、MovieLens和Amazon數(shù)據(jù)集(開源數(shù)據(jù)集)),precision@100和recall@100都有不同程度的效果提升。上圖右上側展示了t-sne embedding可視化的結果,橫向?qū)Ρ葋砜?,同一個模型在不同量化參數(shù)下,隨著量化程度的加深(即量化子空間劃分程度加深),embedding的分布會從均勻分布逐漸轉變?yōu)楹芏喔〉拇?,這與PQ的過程保持一致。因為在PQ的過程中,我們對向量做了子空間的劃分,在子空間內(nèi)部會將向量納入不同的類中心,所以子向量會在類內(nèi)形成更小的簇??v向?qū)Ρ葋砜矗谑褂孟嗤炕瘏?shù)時,可以發(fā)現(xiàn)Poeem的分布更加均勻,子空間的聚類更加合理。這也解釋了為什么我們的聯(lián)合訓練模型在召回率和準確性上回去的更好的效果。

京東算法工程師張菡:深度學習下的京東搜索召回技術|?DataFunTalk

其次,在工程上,索引聯(lián)合訓練模型也會有一定的效率提升。由于索引的構建是在訓練模型時就已經(jīng)完成,所以就不需要額外構建索引,從時間開銷上具有更高的效率價值。從模型serving的角度來看,索引聯(lián)合訓練模型在訓練完畢后可以同時將模型和索引導出成一個整體,線上可以直接使用model server進行模型的加載,不需要人工地將model server和index server構建一個完整的服務。所以無論從召回精度,生產(chǎn)效率還是從模型服務的工程復雜度而言,索引聯(lián)合訓練模型都具備巨大的優(yōu)勢。這個項目已經(jīng)在github上開源,里面做了一些tutorial,比較容易上手,整個代碼庫也已經(jīng)封裝成一個python包,大家可以很方便地通過下載安裝python包來將PQ層引入到相應的模型中。

06
問答環(huán)節(jié)

Q:正交矩陣是如何選取的?

A:我們首先會將正交矩陣初始化為identity矩陣,隨后會有一個初始化的迭代過程,采用的是steepest block coordinate descent算法。我們最終的訓練目標是希望優(yōu)化子向量空間的分布,使得PQ后落在同一子空間的embedding相似度盡量高,從而減少PQ精度損失。

Q:同義詞構建的模型的損失函數(shù)是前向損失和后向損失相加嗎?

A:對,在分離式模型中,損失函數(shù)就是將這兩部分加在一起。在聯(lián)合訓練模型中,我們額外加入了query到query的生成概率損失,并加入一個權重進行調(diào)節(jié)。

Q:京東零售和京東APP里的業(yè)務有聯(lián)系嗎?

A:京東APP是京東零售的載體和渠道。當然還有其他的渠道,比如PC端、微信小程序、京喜APP、京東極速版等。召回側的話,我們會負責所有渠道的召回工作,但是在不同渠道,因為用戶的表現(xiàn)和偏好有差異,所以召回模型對于特征處理和訓練數(shù)據(jù)也有所不同。

Q:多頭注意力的雙塔模型中projection matrix是全連接層嗎?

A:對,我們第一版模型是每個頭分別乘上一個權重矩陣來做query的映射。但是后面我們進行了改進,在query側,在輸入層會進行dimension上的翻倍操作,即將維度擴展為原維度的head倍,然后直接做split操作即可,我們發(fā)現(xiàn)效果比直接使用多個權重矩陣進行映射的效果更好。

今天的分享就到這里,謝謝大家。

本文經(jīng)授權發(fā)布,不代表增長黑客立場,如若轉載,請注明出處:http://allfloridahomeinspectors.com/quan/60066.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
上一篇 2022-03-09 17:09
下一篇 2022-03-09 17:22

增長黑客Growthhk.cn薦讀更多>>

發(fā)表回復

登錄后才能評論
特別提示:登陸使用搜索/分類/最新內(nèi)容推送等功能?>>