前面讲的各个语义相似性计算的模型,基本都是双塔的结构。双塔结构主要优点是相似性计算快速,这里指的快速不是模型单个数据的推理速度,而是在大量问句场景下的计算,比如相似问句的召回场景。因为双塔模型得到的其实是单个问句的表示,相似性的计算只是在最后做了简单的计算,最耗时的问句表示操作可以离线完成。而cross-encoder是在模型输入时进行了拼接输入,这样两个问句进行更深层的交互,相似句任务直接在模型中完成,而不单单是问句的语义表示模型。所以cross-encoder的相似计算效果也要明显优于双塔结构的bi-encoder,但是cross-encoder不能得到问句的向量表示,大量问句间的相似计算需要实时进行模型推理计算而消耗的时间更多。cross-encoder适合用于少量候选问句场景,所以我们用在问句的排序阶段,能否得到更好的相似识别效果。
模型结构如下图,左边为双塔结构的bi-encoder,右图则是cross-encoder结构。
实验
hfl/chinese-roberta-wwm-ext(5 epoch) | 96.25% | 82.03% | 87.46% |
hfl/chinese-roberta-wwm-ext-large(5 epoch) | 96.78% | 81.98% | 87.71% |
hfl/chinese-electra-180g-large-discriminator(5 epoch) | 97.11% | 81.56% | 87.63% |
hfl/chinese-roberta-wwm-ext(q1,q2交换)(1 epoch) | 96.69% | 83.30% | 88.41% |
hfl/chinese-roberta-wwm-ext(q1,q2交换)(5 epoch) | 97.11% | 81.60% | 87.66% |
在不同的预训练模型上进行了测试,如表中,分别使用了hfl/chinese-roberta-wwm-ext(390M),hfl/chinese-roberta-wwm-ext-large(1.2G),hfl/chinese-electra-180g-base-discriminator(1.2G)。可能因为训练集数据量已经比较大了(50w+),所以预训练模型变大之后的收益没有特别的明显。而在训练中发现对两个问句进行交换之后再次加入训练集后cross-encoder的效果也会提高,原因是消除了句子位置的差异。还有一点是cross-encoder不需要太多的训练时间,1个epoch的情况下就已经达到了较好的效果,比5个epoch情况的效果更好。