Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks解读

摘要

使用bert和roberta来计算句子相似度太耗时,本文作者提出sentence-bert,使用孪生或三生网络对bert pretrain 进行修整,在sentence embeddings methods上取得sota。

介绍

1 .bert计算句子相似度

a.监督方法
做法:合理使用bert结构,将上句和下句放入bert结构中,进行finetune 。BERT uses a cross-encoder: Two sentences are passed to the transformer network and the target value is predicted
不足: 速度超级超级慢
举例如有10000个句子,我们想要找出最相似的句子对,需要计算(10000*9999/2)次,需要大约65个小时。
b.非监督方法
做法:对bert 输出层向量求meaning ;使用第一个字(‘[CLS]’)的向量
不足:效果很差,甚至不如GLOVE

结论 :Bert模型的构造使得它既不适合语义相似度搜索,也不适合非监督任务

2.提出sentence-bert
目的1:涉及的siamese网络结构使输入句子的固定大小的向量可以导出
目的2:在句子相似度模型上取得sota效果

模型

这里作者主要提出了三种从bert结构下获取词向量的策略,并且为了让bert能够快速计算相似度,提出了在finetune阶段三种不同的目标函数方法。

1 .三种策略获取词向量
先作者介绍了三种方法从bert结构获得向量,分别是:

CLS向量策略,就是将bert模型中,开始标记为[cls]的向量,作为整句话的句向量。

平均池化策略,就是将句子通过bert模型得到的句子中所有的字向量进行求均值操作,最终将均值向量作为整句话的句向量。

最大值池化策略,就是将句子通过bert模型得到的句子中所有的字向量进行求最大值操作,最终将最大值向量作为整句话的句向量。

通过后续试验得出的结论是 平均池化策略最佳

  1. 三种构建目标函数方法
    (1)Classification Objective Function
    Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks解读_第1张图片
    在这里插入图片描述
    如上图,对于分类任务,u,v是从bert 获得向量后进行pooling,后乘上权值矩阵,再接softmax,进行分类任务。分类任务一般使用交叉熵损失,以上的输出o再和已知的label进行交叉熵损失计算,后反向传播。
    模型的参数为Wt以及bert模型内部参数更新。
    (2)Regression Objective Function
    Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks解读_第2张图片
    对于回归任务,直接使用向量u,v进行余弦相似度计算,获取一个相似度得分,再和已知的标签算一个误差值,这里使用mse作为损失函数
    模型的参数主要只有bert本身的参数更新。

(3)Triplet Objective Function
在这里插入图片描述
场景是给了一个锚定句子sa,一个正样本句子sp,一个负样本句子sn,重新设定损失函数为上式,意图
拉远锚定句子与负样本的距离,同时缩小锚定句子与正样本的距离,loss有点类似hingeloss。场景类似于pair-wise sort。

试验

作者做了大量的实验,比较三种求句子向量策略的好坏,认为平均池化策略最优,并且在多个数据集上进行了效果验证。虽然效果没有bert输入两句话的效果好,但是比其他方法还是要好的,并且速度很
快。

实际案例

见链接

你可能感兴趣的:(bert,深度学习)