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

具體將圍繞下面五點(diǎn)展開(kāi):
- 京東搜索召回技術(shù)概述
- 雙塔語(yǔ)義召回模型
- 圖模型
- 同義詞召回
- 索引聯(lián)合訓(xùn)練模型
01
京東搜索召回技術(shù)概述
首先介紹下京東搜索語(yǔ)義檢索中采用的多路召回技術(shù)。

多路語(yǔ)義召回包含同義詞召回、向量召回和離線語(yǔ)義召回。這些語(yǔ)義召回方式能夠解決傳統(tǒng)策略費(fèi)時(shí)費(fèi)力、不準(zhǔn)不全的問(wèn)題,但是同樣也面臨著一些技術(shù)難點(diǎn),包括準(zhǔn)確性、相關(guān)性和豐富性等。準(zhǔn)確性是向量召回技術(shù)存在的一個(gè)基本問(wèn)題,主要原因是因?yàn)榇笠?guī)模向量的近似查找會(huì)引入精度損失。而語(yǔ)義匹配也很容易引入相關(guān)性問(wèn)題,比如品牌一致性、型號(hào)一致性等。不僅如此,語(yǔ)義召回在滿足前兩個(gè)問(wèn)題的前提下,還應(yīng)該盡量地召回更多更豐富的商品,提高類目多樣性、品牌多樣,為下游任務(wù)提供更多的選擇。
接下來(lái)我們就詳細(xì)介紹一些我們目前采用的一些語(yǔ)義召回的模型和技術(shù)。首先是一個(gè)基礎(chǔ)的雙塔語(yǔ)義召回模型。
02
雙塔語(yǔ)義召回模型
雙塔語(yǔ)義召回模型的核心思想是將query/item嵌入到共享低維空間上,然后通過(guò)向量距離來(lái)度量相關(guān)性。

上圖右側(cè)是我們整體的模型和線上服務(wù)的框架。其中左邊是離線的雙塔模型,包含一個(gè)query塔和一個(gè)item塔,分別用來(lái)進(jìn)行query和item的語(yǔ)義表征。Query側(cè)主要使用其文本信息,分詞方式是n-gram,實(shí)際應(yīng)用時(shí)會(huì)使用unigram和bigram。右側(cè)item塔主要使用item的自身特征,包括標(biāo)題、品牌、類目、派送方式等信息。Query和item塔在結(jié)構(gòu)上大體是分離的,但是它們之間需要一些信息的共享。信息共享主要由兩個(gè)方面實(shí)現(xiàn):輸入層的query embedding和item的標(biāo)題embedding共享embedding矩陣;輸出層query與item的embedding會(huì)進(jìn)行點(diǎn)乘來(lái)實(shí)現(xiàn)信息交互。
右側(cè)是模型服務(wù)的流程,主要分為兩個(gè)過(guò)程。首先是一個(gè)離線導(dǎo)出過(guò)程,需要將item的embedding導(dǎo)出,建立索引。與此同時(shí),我們還需要將query一側(cè)的模型導(dǎo)出。導(dǎo)出的query模型和建好的索引共同服務(wù)線上召回任務(wù)。

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

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

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

圖結(jié)構(gòu)適合的任務(wù)有:社交網(wǎng)絡(luò)中廣告的投放,社交關(guān)系的預(yù)測(cè),推薦系統(tǒng)中商品的推薦,新用戶的推薦等。那么圖模型能夠解決搜索中的什么問(wèn)題呢?前面的語(yǔ)義模型具有一些遺留問(wèn)題,比如低頻商品的embedding學(xué)習(xí)得不夠充分,因?yàn)樵谟?xùn)練時(shí)我們的訓(xùn)練樣本使用的是點(diǎn)擊的數(shù)據(jù),數(shù)據(jù)分布與線上用戶的點(diǎn)擊分布是一致的,所以一些低頻商品無(wú)法獲得比較充分的學(xué)習(xí)。其次,在電商場(chǎng)景下搜索query通常比較短,query側(cè)語(yǔ)義信息比較匱乏。另外,我們的訓(xùn)練數(shù)據(jù)是由一對(duì)query和商品組成的,訓(xùn)練效率較低。
使用圖模型可以相應(yīng)地解決這些問(wèn)題,主要做法是利用用戶的點(diǎn)擊行為來(lái)構(gòu)建一個(gè)異構(gòu)點(diǎn)擊網(wǎng)絡(luò)。網(wǎng)絡(luò)節(jié)點(diǎn)除了query和商品之外,還有商品的店鋪、品牌等。query與商品之間的邊是點(diǎn)擊關(guān)系,商品和品牌以及店鋪之間的邊是從屬關(guān)系。利用這樣的圖結(jié)構(gòu),我們就可以把更多的query和商品的語(yǔ)義信息聚合,進(jìn)而提升query和商品的語(yǔ)義表征能力。

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

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

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

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

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

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

上圖羅列可一些在實(shí)際應(yīng)用過(guò)程中模型生成query的效果,其中上半部分是分離式模型的生成效果,下半部分是聯(lián)合式模型的生成效果。兩個(gè)模型都有一定的生成偏好,但是可以發(fā)現(xiàn)相較于分離式模型,聯(lián)合式模型的生成query的相關(guān)性明顯更優(yōu)。
05
索引聯(lián)合訓(xùn)練模型
最后介紹一下我們的一項(xiàng)新工作:索引聯(lián)合訓(xùn)練模型。

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

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

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

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

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

其次,在工程上,索引聯(lián)合訓(xùn)練模型也會(huì)有一定的效率提升。由于索引的構(gòu)建是在訓(xùn)練模型時(shí)就已經(jīng)完成,所以就不需要額外構(gòu)建索引,從時(shí)間開(kāi)銷上具有更高的效率價(jià)值。從模型serving的角度來(lái)看,索引聯(lián)合訓(xùn)練模型在訓(xùn)練完畢后可以同時(shí)將模型和索引導(dǎo)出成一個(gè)整體,線上可以直接使用model server進(jìn)行模型的加載,不需要人工地將model server和index server構(gòu)建一個(gè)完整的服務(wù)。所以無(wú)論從召回精度,生產(chǎn)效率還是從模型服務(wù)的工程復(fù)雜度而言,索引聯(lián)合訓(xùn)練模型都具備巨大的優(yōu)勢(shì)。這個(gè)項(xiàng)目已經(jīng)在github上開(kāi)源,里面做了一些tutorial,比較容易上手,整個(gè)代碼庫(kù)也已經(jīng)封裝成一個(gè)python包,大家可以很方便地通過(guò)下載安裝python包來(lái)將PQ層引入到相應(yīng)的模型中。
06
問(wèn)答環(huán)節(jié)
Q:正交矩陣是如何選取的?
A:我們首先會(huì)將正交矩陣初始化為identity矩陣,隨后會(huì)有一個(gè)初始化的迭代過(guò)程,采用的是steepest block coordinate descent算法。我們最終的訓(xùn)練目標(biāo)是希望優(yōu)化子向量空間的分布,使得PQ后落在同一子空間的embedding相似度盡量高,從而減少PQ精度損失。
Q:同義詞構(gòu)建的模型的損失函數(shù)是前向損失和后向損失相加嗎?
A:對(duì),在分離式模型中,損失函數(shù)就是將這兩部分加在一起。在聯(lián)合訓(xùn)練模型中,我們額外加入了query到query的生成概率損失,并加入一個(gè)權(quán)重進(jìn)行調(diào)節(jié)。
Q:京東零售和京東APP里的業(yè)務(wù)有聯(lián)系嗎?
A:京東APP是京東零售的載體和渠道。當(dāng)然還有其他的渠道,比如PC端、微信小程序、京喜APP、京東極速版等。召回側(cè)的話,我們會(huì)負(fù)責(zé)所有渠道的召回工作,但是在不同渠道,因?yàn)橛脩舻谋憩F(xiàn)和偏好有差異,所以召回模型對(duì)于特征處理和訓(xùn)練數(shù)據(jù)也有所不同。
Q:多頭注意力的雙塔模型中projection matrix是全連接層嗎?
A:對(duì),我們第一版模型是每個(gè)頭分別乘上一個(gè)權(quán)重矩陣來(lái)做query的映射。但是后面我們進(jìn)行了改進(jìn),在query側(cè),在輸入層會(huì)進(jìn)行dimension上的翻倍操作,即將維度擴(kuò)展為原維度的head倍,然后直接做split操作即可,我們發(fā)現(xiàn)效果比直接使用多個(gè)權(quán)重矩陣進(jìn)行映射的效果更好。
今天的分享就到這里,謝謝大家。
本文經(jīng)授權(quán)發(fā)布,不代表增長(zhǎng)黑客立場(chǎng),如若轉(zhuǎn)載,請(qǐng)注明出處:http://m.allfloridahomeinspectors.com/quan/60066.html