abstract
计算相似度,原始bert需要将两个句子都放到里面去重新计算,计算量非常大。
本文修改预训练bert的网络结构,利用siamese和triplet网络结构来计算语义相似度
优化了速度,维持了精度
1 Introduction
本文可以支持将bert用于大规模的相似度比较,聚类,信息检索,以及语义搜索。
现在比较常见的方法是取最后一层bert的平均值,或者取cls特征。
上面两个取得的embedding效果非常差,可能比平均Glove embedding还差
比inferSent网络居然高了差不多十个点?
polyencoders的score计算方式也比较耗时?
3 Model
3.1 结构图
3.2 解析
- 分类目标函数:训练阶段利用[u, v, |u-v|]作为特征
- 回归目标函数:推理阶段通过cos函数计算相似度,并使用均方误差作为损失函数
- triplet损失函数:正样本的差值和负样本的差值的比较,正样本的差值应该小于负样本的差值。
- 默认pooling策略是mean均值
3.3 triplet loss
5 Evaluation
5.1 总结
- 无监督STS:通过计算embedding之间的spearman rank分数来比较,直接使用bert效果比较差,mean 54.81, cls特征 29.19, 都比直接用Glove差
- 有监督STS:
2.1 直接用STS训练
2.2 在NLI预训练,然后再STS上训练,预训练大概带来1,2个点的提升 - cross-topic数据集上表现比较差,降低6-7个点,bert可以利用交叉特征,sbert相当于只利用了一个高纬度的topic特征,挑战比较大。
5.2 详细STS数据集结果
无监督和有监督STS数据集评估
5.3 详细cross-topic评估结果
6. 消融实验
7 计算效率
8 结论
bert->高质量的计算相似度的vector
gpu上:比infersent快9%,比Universal sentance encoder快55%
10000句子的聚类,bert要65小时,sbert,只需要5秒钟。