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