Facebook向量召回双塔模型
不知道多少人還記得 《做向量召回 All You Need is 雙塔》那篇,那篇介紹了國(guó)內(nèi)外各個(gè)大廠做召回的用的雙塔模型,其中提到一篇《Embeding-based Retrieval in FaceBook Search》,還跟大家強(qiáng)烈建議,該篇必讀,不知道有多少煉丹師認(rèn)真讀了?什么?你還沒讀!沒關(guān)系,十方今天就給大家解讀這篇論文。
很多煉丹師往往迷戀于各種復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),比如某市值跌了幾個(gè)“百”的大廠,每年都有各種花里胡哨的論文,這些結(jié)構(gòu)有用嗎?既然能發(fā)論文肯定有用(手動(dòng)滑稽)。為什么十方在眾多論文中強(qiáng)推"臉書"這篇呢?先給大家看下臉書的"雙塔"。
看完結(jié)構(gòu)后,會(huì)不會(huì)有點(diǎn)勸退,什么!十方你就給我看這個(gè),普普通通的雙塔?Attention呢?Bert呢?FM呢?RNN呢?沒錯(cuò),這篇論文的精髓,不是網(wǎng)絡(luò)結(jié)構(gòu),而是你在做召回時(shí)會(huì)遇到的方方面面的問題,以及解決方案,十方給大家慢慢揭曉。
對(duì)于一個(gè)搜索引擎而言,往往由兩個(gè)層構(gòu)成,一個(gè)叫召回層,另一個(gè)叫排序?qū)印U倩貙拥哪康木褪窃诘脱訒r(shí),低資源利用的情況下,召回相關(guān)的documents。排序?qū)泳褪峭ㄟ^很復(fù)雜的算法(網(wǎng)絡(luò)結(jié)構(gòu))把和query最相關(guān)的document排序到前面。論文的題目,簡(jiǎn)單直白的告訴了大家,用embeding 表示query和document來做召回。
論文提到,召回的難點(diǎn),主要體現(xiàn)在候選集合非常龐大,處理億級(jí)別的documents都是正常操作。不同于面部識(shí)別召回,搜索引擎的召回需要合并字面召回和向量召回兩種結(jié)果。"臉書"的召回,還有其他難點(diǎn),"人"的特征,在"臉書"的搜索尤其重要。
先膜拜下"臉書"的召回系統(tǒng):
我們可以清楚的看到幾個(gè)大模塊。
- Query處理
- 索引模塊
- 召回模塊
- 排序模塊
既然是召回模型,那評(píng)價(jià)指標(biāo),當(dāng)然要有recall,我們看下"臉書"的召回指標(biāo)。給定一個(gè)Query,和目標(biāo)結(jié)果集合T={t1,t2,...,tN}還有模型召回的top K {d1,d2,...,dk},recall@K定義如下:
至于Target集合怎么來的,它是有真實(shí)用戶點(diǎn)擊和專家標(biāo)注組成的。模型訓(xùn)練用的是雙塔配合triplet loss。
該loss中的D,就是1-cos(emb_q, emb_d)。
論文提到很重要的一點(diǎn)是,調(diào)節(jié)m值影響最終召回5%-10%,煉丹師看到這,是不是又要把自己triplet loss的模型回爐重造了。然后"臉書"作者,又語出驚人了。如果給每個(gè)正例采n個(gè)負(fù)例,候選集合大小為N,模型實(shí)際優(yōu)化的top K 召回率,K約等于N/n。
訓(xùn)練數(shù)據(jù)的構(gòu)造,應(yīng)該是做召回最重要且沒有之一的事了。花大精力去探索一兩個(gè)不常見的特征,增加個(gè)什么attention結(jié)構(gòu),都沒有構(gòu)造一個(gè)良好的訓(xùn)練數(shù)據(jù)帶來的增益要高。對(duì)于正樣本用有點(diǎn)擊的即可,負(fù)樣本構(gòu)造方式就有很多了。
- 隨機(jī)負(fù)樣本:對(duì)于每個(gè)query,在候選集合中隨機(jī)的去選。
- 未點(diǎn)擊的曝光: 對(duì)于每個(gè)query,隨機(jī)的采樣有曝光未點(diǎn)擊的樣本。
論文提到,用未點(diǎn)擊的曝光作為負(fù)樣本訓(xùn)練出來的模型非常糟糕,十方在實(shí)踐中也發(fā)現(xiàn)了這個(gè)問題。原因是這部分負(fù)樣本太hard了,這么hard當(dāng)然要放到精排去學(xué),召回任務(wù)最重要的是快速把和query相關(guān)的documents拉出來。如果召回階段就能把曝光未點(diǎn)擊的過濾掉,那還要精排干嘛。
論文對(duì)正樣本還做了一些有趣的探索:
- 點(diǎn)擊樣本:這個(gè)不難理解,用戶有點(diǎn)擊行為,是因?yàn)樽罱K曝光的結(jié)果是符合用戶當(dāng)前意圖的(誤點(diǎn)除外)。
- 曝光樣本:作者認(rèn)為召回就是粗粒度的排序,因此召回階段就是要召回排序會(huì)打高分的documents,既然樣本會(huì)曝光,說明排序模型認(rèn)為這些樣本分高,因此召回階段應(yīng)把這些樣本當(dāng)作正樣本,不管有沒有點(diǎn)擊。
論文提到,實(shí)驗(yàn)中無論使用點(diǎn)擊樣本作為正樣本,還是曝光樣本作為正樣本,效果最終都差不多。兩個(gè)樣本一起用,也沒有質(zhì)的提高。為了提高模型表現(xiàn),必須要加入些hard的負(fù)樣本。
關(guān)于召回的hard樣本挖掘,"臉書"表示現(xiàn)有的大部分研究,都是針對(duì)圖像領(lǐng)域的,在召回領(lǐng)域,沒有明確"類別"的概念,于是論文作者給了自己的解決方案。
hard負(fù)樣本挖掘
論文提到,他們發(fā)現(xiàn)top K召回結(jié)果大部分是同文本的,也就是說模型并沒有充分利用社交特征。這主要因?yàn)殡S機(jī)負(fù)樣本對(duì)于模型而言,因?yàn)楹蛁uery文本完全不同,模型太容易學(xué)偏,認(rèn)為文本一樣就是需要召回的。為了能使模型對(duì)相似的結(jié)果能有所區(qū)分,所以我們可以找到那些embeding很近,但實(shí)際上是負(fù)樣本,讓模型去學(xué)。一種方法是在線hard負(fù)樣本挖掘,這個(gè)思路就是in-batch負(fù)采樣,在一個(gè)batch內(nèi),有n個(gè)相關(guān)的query和document,對(duì)于任意一個(gè)query,其他的document都是它的負(fù)樣本,但是由于每個(gè)batch也是隨機(jī)產(chǎn)生的,in-batch內(nèi)負(fù)采樣并不能獲得足夠的hard負(fù)樣本。所以就有了離線hard負(fù)樣本采樣。論文提到,在實(shí)驗(yàn)中發(fā)現(xiàn),簡(jiǎn)單用hard負(fù)樣本,效果是比用隨機(jī)負(fù)樣本要差的,主要原因是hard負(fù)樣本需要非文本的特征區(qū)分,而easy負(fù)樣本主要用文本特征區(qū)分,因此需要調(diào)整采樣策略。論文還提到一點(diǎn),hard負(fù)樣本取排序模型排在101-500效果最好(所以其實(shí)要用semi-hard的樣本),而且hard負(fù)樣本需要和easy負(fù)樣本混合在一起用。混合方法有兩種。
(1)easy:hard = 100 : 1
(2) 先用hard樣本學(xué)習(xí),再基于該模型用easy樣本學(xué)習(xí)。這兩種方法效果都很好。
論文提到,"臉書"在融合了各種特征,也給召回帶來了不同程度的提升。特征羅列如下:
- 文本特征:"臉書"使用字符級(jí)的n-gram特征,與單詞級(jí)別的n-gram相比,詞典大小大大縮簡(jiǎn),OOV問題(拼寫錯(cuò)誤或其他問題)也得到了解決,實(shí)驗(yàn)也證明字符級(jí)別的特征,泛化能力也很好。當(dāng)然字符和單詞混用,也帶來了泛化性能的提升(+1.5% recall)。因?yàn)閱卧~級(jí)詞典較大,需要用hash的方法去處理。
- 位置特征:用戶的城市,地域,國(guó)家,語言。
- 社交embeding特征:“臉書“有豐富的社交圖譜,基于圖神經(jīng)網(wǎng)絡(luò)訓(xùn)練出用戶實(shí)體的embedding,直接作為召回模型的輸入。
下圖是不同特征帶來的增益:
這里十方看完挺意外的,臉書并沒有用Annoy Tree,HNSW這些近鄰檢索方法,而是用了PQ算法(矢量量化編碼算法,關(guān)鍵是碼本的建立和碼字搜索算法。比如常見的聚類算法,就是一種矢量量化方法。而在相似搜索中,向量量化方法又以PQ方法最為典型),這個(gè)本文就不贅述了(大家真的特別感興趣留言,十方單獨(dú)寫一篇),感興趣的可以看下Product quantization,論文鏈接:
https://lear.inrialpes.fr/pubs/2011/JDS11/jegou_searching_with_quantization.pdf
"臉書"用這種ANN serving,主要考慮到他們現(xiàn)有索引系統(tǒng),用這種方法能最簡(jiǎn)單的融合向量召回。對(duì)于向量召回階段,論文提到他們也做了大量的調(diào)參。有個(gè)很重要的一點(diǎn),就是論文提到,當(dāng)模型發(fā)生改變(比如增加了負(fù)樣本),ANN的參數(shù)也需要重調(diào)。
我們都知道排序階段的結(jié)果,會(huì)成為召回的訓(xùn)練樣本,而排序的輸入又是召回的輸出,這樣模型學(xué)的就是有偏的,次優(yōu)的,因此論文提出兩個(gè)解決辦法。
- 排序模型加召回模型的embedding特征:這樣ranker能學(xué)到召回模型學(xué)到的特征,也能學(xué)到一個(gè)大概的相似度特征。具體做法是把query和document的embeding cosine,Hadamard product,和embeddings直接作為排序階段的特征,實(shí)驗(yàn)證明,用cosine效果最好。
- 人工標(biāo)注樣本:把ANN召回的結(jié)果落到日志中,再由人工去標(biāo)注,最后再喂給召回模型訓(xùn)練,提升召喚準(zhǔn)確率。
論文提到兩種模型融合方式:
加權(quán)融合: 該方法其實(shí)就是簡(jiǎn)單的線性加權(quán),比如我有n個(gè)模型,就有n個(gè)query embedding,n個(gè)document embedding,正常加權(quán)如下:
這樣加權(quán),就要算n次cos了,而且ann也要做n次,召回的解也不是最優(yōu)的,有沒有辦法把權(quán)重加到embedding里呢?當(dāng)然是可以的,很容易推導(dǎo)出下式:
很容易證明這樣修改embeding后:
因此我們只需要線上用通過所有模型預(yù)估結(jié)果計(jì)算出EQ,線下用ED建ANN索引即可。
級(jí)聯(lián)融合
就像瀑布一樣地先去召回一個(gè)比較大的集合,再用加入hard負(fù)樣本的模型過濾掉一部分,再輸出到后面的排序模型。這里特別提到hard負(fù)樣本不要用曝光未點(diǎn)擊,而是要用上文提到的離線hard負(fù)樣本。
結(jié)論
這篇論文,看似樸實(shí),但其實(shí)寫了很多大家在做召回時(shí)會(huì)遇到的問題,并給出了合理的解決方案。該論文的很多經(jīng)驗(yàn)都值得我們借鑒,避免我們花大量時(shí)間去踩坑。
更多干貨,請(qǐng)關(guān)注公眾號(hào):煉丹筆記 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Facebook向量召回双塔模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当推荐系统遇上多模态Embedding
- 下一篇: 做向量召回 All You Need i