Poly-encoder
Poly-encoder
论文《Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring》开放了一种新的transformer体系结构,即Poly-encoder。
Poly-encoder学习全局而不是token级别的self-attention特征,同时解决了Bi-encoder匹配质量低的问题以及 ARC-II、BERT等交互式的cross-encoder匹配速度慢的问题。
Bi-encoder
如图,Bi-encoder采用两个相同的网络(如BERT)得出两个句子各自的特征向量,再进行相似度计算。
-
计算context向量: y c x t = r e d ( T 1 ( C T X T ) ) y_{cxt}=red(T_1(CTXT)) ycxt=red(T1(CTXT))
-
计算candidate向量: y c a n d = r e d ( T 1 ( C A N D ) ) y_{cand}=red(T_1(CAND)) ycand=red(T1(CAND))
red()的三种计算方法:·List item取第一个位置(CLS)的向量
·求所有位置向量的平均
· 求前n个位置向量的平均 -
相似度得分:dot-product(点积),即s{CTXT,CAND}= y c x t ⋅ y c a n d y_{cxt} ·y_{cand} ycxt⋅ycand
-
训练,cross-entopy(交叉熵)
总体来讲,利用2个网络分别将context和candidate编码成向量,最后再通过一个相似性判别函数(如cosine、dot-product)计算两个向量间的相似度。
Bi-encoder的特点是context和candidate编码成向量的过程独立(编码过程不交互),最后才开始交互,速度快但匹配质量不高。
因此,这种独立编码的方式可以使我们离线计算出所有candidates的向量,线上服务时,只需要计算query的向量再进行相似度匹配,匹配速度快但质量不能达到最佳。
cross-encoder
如图:
- 计算context和candidate的向量 y c t x t , c a n d = h 1 = f i r s t ( T ( c t x t , c a n d ) ) y_{ctxt,cand}=h_1=first(T(ctxt,cand)) yctxt,cand=h1=first(T(ctxt,cand))
- 相似度得分: s ( c t x t , c a n d ) = y c t x t , c a n d W s(ctxt,cand)=y_{ctxt,cand}W s(ctxt,cand)=yctxt,candW
- 训练:cross-entopy(交叉熵)。
cross-encoder的特点是context和candidate输入至同意网络结构中,编码过程完全交互(即context和candidate时时刻刻应相互交互),但匹配速度慢,同时无法离线计算出所有candidates的表征向量,没处理一个context必须与所有candidates进行交互,模型非常耗时。
poly-encoder
- 计算context向量
用多个向量表示context,(简化版:直接去前m个向量) - 利用一个独立的encoder编码出candidate的表示特征。
- 二者交互,
- 相似度得分:dot-product。