召回:是塔,是塔,但不是双塔!
query到doc這種文本到文本的召回,通常就是各種雙塔召回,再排序的過程.谷歌這篇論文<Transformer Memory as a Differentiable Search Index>卻偏不.這篇論文提出了Differentiable Search Index(DSI)的方法,直接就把docid編碼到了模型中,output直接就是docid,不需要像以往那樣還要建立docid到向量的索引再ANN召回.這樣在結果上顯著優于雙塔.
模型框架
上圖就是對比了傳統雙塔召回和本文的DSI召回,我們可以看到DSI是一個Encoder,Decoder的流程,通過Beam Search可以直接得到docid的list.
模型細節
索引策略:
- Inputs2Target: Seq2Seq任務,把doc的tokens翻譯成docid. (論文最終采用).
- Target2Inputs: 上面方法反轉下,用docid翻譯成tokens.
- Bidirection: co-training 上述兩種方式,使用一個前綴讓模型知道是什么方向.
- span corruption: 直接把docid和tokens拼在一起,好處是方便做預訓練.
Doc表達策略:
- Direct Index: 使用doc前L個tokens表示該doc (論文最終采用).
- Set Index: 先去重,去停用詞,然后按照類似direct index的方式操作.
- Inverted Index: 多次采樣連續的k個tokens表示該doc.
召回中docid的表達:
最簡單的就是一個doc給定一個任意不重復的int值,這樣我們就可以直接用softmax去學tokens和docid embedding直接的關系:
論文使用的是Semantically Structured Identifiers,這種方法認為docid不能任意給個int值然后lookup讓模型學embedding,docid需要包含語義信息.除了這點,該方法還必須在decoding的時候檢索性能要好.所以該方法是給定所有doc集合,先聚成10個類,每個doc第一位就是0~9,每個類都必須包含不超過c個的doc,不然就重復聚類操作.論文聚類算法用的kmeans,doc embedding用的是8層的小bert, c設置為100.
訓練過程就是2步,第一步先讓seq2seq學會記憶tokens到docid的映射,第二步就是fine-tuning到我們有label的query2doc任務上去.
實驗
- Transformer Memory as a Differentiable Search Index https://arxiv.org/pdf/2202.06991.pdf
總結
以上是生活随笔為你收集整理的召回:是塔,是塔,但不是双塔!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年Kaggle所有赛事TOP方案
- 下一篇: 对比表示学习必知的几种训练目标