《Embedding-based Retrieval in Facebook Search》論文精讀
https://arxiv.org/pdf/2006.11632.pdf
EBR算是很經(jīng)典的一篇工業(yè)界論文,是facebook發(fā)表在KDD2020上的一篇關(guān)于搜索召回的paper。這篇文章提到的大多trick對(duì)于做過召回的同學(xué)比較熟悉了,可貴之處在于全面,包括了特征、樣本、模型、全鏈路等各種細(xì)節(jié)知識(shí),本文盡量會(huì)把一些關(guān)鍵但容易忽視的點(diǎn)強(qiáng)調(diào)一下,介于個(gè)人水平問題難免有不準(zhǔn)確的表述,歡迎留言討論。(本文提到的各種結(jié)論都只可作為參考,不同的業(yè)務(wù)和數(shù)據(jù)可能會(huì)有不同的結(jié)論)
1. 整體思路與框架
本文的出發(fā)點(diǎn)是搜索只做到query關(guān)鍵詞匹配的程度是遠(yuǎn)遠(yuǎn)不夠的,還要結(jié)合用戶信息及上下文提供個(gè)性化搜索服務(wù),比如一個(gè)熱愛數(shù)碼的大學(xué)生和農(nóng)村賣水果的果農(nóng)搜索【蘋果】得到的結(jié)果應(yīng)該分別是手機(jī)和水果。
通常的搜索分為召回和排序兩個(gè)階段,基于embedding的語義召回主要在第一階段,它要解決的問題是如何從千萬個(gè)文本中找到相關(guān)的topK個(gè),難點(diǎn)一個(gè)是【準(zhǔn)】,一個(gè)是【快】,準(zhǔn)要求和用戶+query高度的匹配,快要求從海量候選中搜索的延時(shí)低。
模型是雙塔模型,當(dāng)然這里做了一些特征和樣本的trick,后面會(huì)提。整個(gè)架構(gòu)如下:
左邊采用了query understanding+embedding inference兩部分,即向量表征是補(bǔ)充而非替換
在構(gòu)建index時(shí)采用了embedding quantization
retrieval包括NN operator和Boolean Match

評(píng)估的時(shí)候?yàn)榱丝焖俚?yàn)證,采用了離線topk命中作為評(píng)估。我個(gè)人認(rèn)為從召回的本質(zhì)出發(fā),本就沒辦法離線去準(zhǔn)確評(píng)估一個(gè)召回的價(jià)值,當(dāng)然迫于迭代效率+搜索場(chǎng)景,這個(gè)指標(biāo)闡述一些feature的價(jià)值是可以接受的。下面就圍繞這個(gè)指標(biāo)的提升,闡述一下本文的各種工業(yè)界trick經(jīng)驗(yàn)總結(jié)
2. 模型
模型結(jié)構(gòu)就是雙塔,特征也貼出來了

2.1 損失函數(shù)
本文將搜索相關(guān)性以pair-wise的角度建模,采用的是triplet loss,形式如下
margin是很重要的,說白了這個(gè)參數(shù)是劃分樣本難度的,如果特別大沒辦法收斂,如果特別小又沒區(qū)分度,雖然對(duì)于m本文沒講怎么設(shè)置,但是講述了負(fù)例采樣數(shù)n應(yīng)該設(shè)置為top-K=N/n,其實(shí)也容易理解,既然召回本質(zhì)上是去全量候選中選topk,那么訓(xùn)練的時(shí)候一個(gè)正樣本對(duì)應(yīng)n個(gè)負(fù)樣本如果能對(duì)齊這個(gè)比例就很好,當(dāng)然現(xiàn)實(shí)中因?yàn)橘Y源的問題很難如此對(duì)齊。
2.2 正負(fù)樣本選取
召回正負(fù)樣本選取之前也寫過一次iwtbs:召回模型中的負(fù)樣本構(gòu)造,本文依舊是這個(gè)結(jié)論:
【正樣本】點(diǎn)擊樣本 > 展現(xiàn)樣本
【負(fù)樣本】隨機(jī)負(fù)采樣 > 展現(xiàn)未點(diǎn)擊
當(dāng)然本文詳細(xì)講述了hard mining的一些嘗試,按照正負(fù)例分別介紹下:
hard negative mining
隨機(jī)負(fù)采樣難免導(dǎo)致樣本太簡(jiǎn)單,雖然簡(jiǎn)單負(fù)樣本已經(jīng)證明了對(duì)召回的效果提高有用,但是總不能全都太簡(jiǎn)單了吧,所以總要挖掘少數(shù)介于簡(jiǎn)單和困難之間的負(fù)例,讓模型感受世界的參差,不能只識(shí)別出來我不喜歡看美妝美食 喜歡看籃球,還要能識(shí)別出來我喜歡看湖人隊(duì)還是籃網(wǎng)隊(duì),其中前者就是隨機(jī)負(fù)采樣干的事情,而后者就主要靠hard mining提供了。
本文提出了online和offline兩種mining方式
online:在線一般是batch內(nèi)其他用戶的正例當(dāng)作負(fù)例池隨機(jī)采,本文提到選相似度最高的作為hard樣本,同時(shí)強(qiáng)調(diào)了最多不能超過兩個(gè)hard樣本。
offline:在線batch內(nèi)池子太小了不一定能選出來很好的hard樣本,離線則可以從全量候選里選。具體做法是對(duì)每個(gè)query的top-k結(jié)果利用hard selection strategy找到hard樣本加入訓(xùn)練,然后重復(fù)整個(gè)過程。這里提到要從101-500中采,太靠前的也許根本不是hard負(fù)例,壓根就是個(gè)正例。以及兩個(gè)很好的經(jīng)驗(yàn),第一個(gè)是樣本easy:hard=100:1,第二個(gè)是先訓(xùn)練easy再訓(xùn)練hard效果<先hard后easy
hard positive mining
本文認(rèn)為有一些用戶未點(diǎn)擊但是也能被認(rèn)為是正樣本,做法就是從日志中挖掘潛在的正樣本,這也能解釋為什么上面hard負(fù)樣本是101-500了,因?yàn)檫@里可能1-10就是正樣本了。
2.3 模型融合
本文提到采用不同正負(fù)樣本比例訓(xùn)練出來的模型具有不同的優(yōu)勢(shì),具體融合的方式有并行和串行兩種。
并行就是加權(quán)求和。為了能夠使用FAISS,必須將多個(gè)模型產(chǎn)出的embedding融合成一個(gè)向量,將權(quán)重乘item embedding然后將各個(gè)模型產(chǎn)出拼接起來。
串行就是先A模型后B模型,相當(dāng)于召回拆成了兩段。
串行這塊我倒是覺得沒啥意義,極端點(diǎn)你把負(fù)樣本改成真實(shí)展現(xiàn)未點(diǎn)擊那不就是個(gè)小精排,在召回搞個(gè)兩階段當(dāng)然離線測(cè)出來有效果;并行做過多興趣召回的能get到點(diǎn),我覺得也是相同的底層思想。本文結(jié)論是使用挖掘出來的hard negative訓(xùn)練出來的hard model,效果比曝光未點(diǎn)擊更好。
3. 特征
本文主要介紹了三個(gè)特征,分別是文本、地域、社交特征,當(dāng)然線上我猜肯定還有很多好用的特征不方便寫出來。
text features
主要對(duì)比了word n-gram和character n-gram,然后結(jié)論是character級(jí)別的更好,畢竟character量級(jí)更少,泛化也更容易,本文提到在character基礎(chǔ)上增加word表征能提高效果。
location features
位置特征很好理解,這里的關(guān)鍵點(diǎn)在于query和doc端都要增加這個(gè)特征
social embedding features
可以理解為搞了一個(gè)單獨(dú)的嵌入模型學(xué)習(xí)社交表征emd作為特征,具體怎么構(gòu)建方法很多,最簡(jiǎn)單的比如搞個(gè)圖deepwalk,推薦里面經(jīng)常會(huì)有各種信息表征的向量作為特征,比如多模態(tài) ?embedding就是大家都比較熟悉的
4. 索引
這塊可能對(duì)于大多數(shù)人比較陌生,一般我們說召回用雙塔結(jié)構(gòu)主要優(yōu)勢(shì)就是在serving時(shí)可以快速響應(yīng),訓(xùn)練的時(shí)候user embedding和item embedding點(diǎn)積越大說明相似度越高,這樣可以把所有候選item embedding離線構(gòu)建索引,線上只需要計(jì)算user embedding然后近鄰查找即可,最終都是查找精度和速度的trade off。
本文主要提到了比如ivf、PQ等關(guān)鍵詞,這里簡(jiǎn)單介紹一下,Int8/float/PQ是常見的量化方法,主要目的是降低內(nèi)存帶寬和存儲(chǔ)空間;而IVF/BF/HNSW則是檢索算法,目的是提高檢索的速度和精度。我們當(dāng)然是希望存儲(chǔ)小精度高,但這往往是相反的,所以根據(jù)自己候選量+精度對(duì)推薦效果的影響權(quán)衡一下,本文也提到了一些trick,比如聚簇個(gè)數(shù)、product quantization算法選擇等問題,這種serving效果在大廠里工程團(tuán)隊(duì)基本都定制優(yōu)化了,大致了解一下即可。
本文提過但是容易被忽略的一個(gè)點(diǎn)在于,全量候選構(gòu)建索引是非常耗存儲(chǔ)和費(fèi)時(shí)的,所以facebook在構(gòu)建索引的時(shí)候,只選擇了月活用戶、近期/熱門的item,即部分query不會(huì)觸發(fā)EBR,推薦場(chǎng)景同理,根據(jù)自己的召回目標(biāo)搞合適的候選往往對(duì)于部分分層有奇效。
5. 全鏈路優(yōu)化
之前寫召回的文章也提到優(yōu)化一定是全鏈路才能發(fā)揮最大的效用,本文也秉承著這個(gè)思想對(duì)于召回外的相關(guān)優(yōu)化進(jìn)行了闡述。
將embedding作為排序模型的特征。如果不太了解思想的可以讀一下《Deep Match to Rank Model for Personalized Click-Through Rate Prediction》,簡(jiǎn)單來講就是給排序模型透穿召回信息,同理給召回透?jìng)髋判虻男畔⑻嵘懦雎室彩浅R?guī)操作。至于這里具體是怎么做的沒有太詳細(xì)的講,常見的問題比如end2end還是拆開、多目標(biāo)排序怎么搞、多路召回怎么透?jìng)鞫伎梢愿鶕?jù)自己的系統(tǒng)架構(gòu)設(shè)計(jì)。
訓(xùn)練數(shù)據(jù)反饋循環(huán)。 向量表征一般召回率不錯(cuò)但是精度一般, 為了提高精度,本文搞了一個(gè)人工評(píng)分反饋流程, 記錄結(jié)果并后將這些結(jié)果發(fā)送給運(yùn)營(yíng)標(biāo)記是否相關(guān),在原本的基礎(chǔ)上疊加這些人工評(píng)分?jǐn)?shù)據(jù)來重新訓(xùn)練相關(guān)性模型。這個(gè)也很好理解,相當(dāng)于補(bǔ)充了一些更準(zhǔn)的訓(xùn)練數(shù)據(jù),當(dāng)然現(xiàn)實(shí)里有沒有這么多人力去搞,推薦問題有沒有搜索相關(guān)性這么好定義label就是另一回事了。
【總結(jié)】
本文有一些經(jīng)驗(yàn)值得借鑒和思考,但比起結(jié)論更重要的是思維的方法,比如為什么要做hard mining,自己的場(chǎng)景哪些數(shù)據(jù)值得hard mining,自己系統(tǒng)中召回問題最關(guān)鍵的是樣本、架構(gòu)還是數(shù)據(jù)流,只有先定義了問題才能做ROI最高的優(yōu)化。

