Sentence-BERT学习

适用领域:
1.句向量生成
2.语义相似度计算
3.语义搜索
4.无监督任务(聚类)

1.1表示型模型(单塔模型)

BERT和RoBERTa 在文本语义相似度(Semantic Textual Simailarty) 等句子回归任务上,已经达到SOTA的结果,其语义相似度计算的处理方式是构造句子对[CLS]sen1[SEP]sen2输入到模型中,通过各种句子间的特征交互完成相似度计算,这就是交互式模型,但是它们都需要吧两个句子同时送入网络,这样会导致巨大的计算开销,从10000个句子中找出相似句子对,大概需要5000万个推理计算,大约需要65个小时,这种结构是的BERT不适合语义相似度搜索,同样不适合无监督任务,比如聚类。

1.2表示型模型(双塔模型)

概括来说就是分别针对单个句子计算句向量表示,再对两个句向量进行距离计算,形成交互。表示型匹配模型的共同特点是:对将要匹配的两个句子分别进行编码和特征提取,最后进行相似度交互计算,其优点是:
1.将文本映射为一个简介的表示,便于存储。
2.匹配的计算速度快。
3。模型在表示层可以用大量无监督数据进行训练,因此非常适合信息检索这种对存储和速度要求都比较高的任务,
但是其缺点是:
1.匹配不仅仅是一一对应,而且有层次,有结构,分别从两个对象单独提取特征,很难捕获匹配中的结构信息。

2 Bert进行单句Sentence Embedding

为什么不用bert对句子进行sentence embedding ,然后进行交互量量计算距离,实际上bert有过sentence embedding 工作研究,通过一个单一句子输入到bert得到它的word embedding ,然后通过CLS,或者meaning的方式得到固定长度的embedding,但是这样看来,并没有什么有效的方法去评估这种嵌入的效果如何,

在语义相似度任务中,直接bert输出sentence embedding效果并不好,

3 SBERT

针对文本相似度等回归问题,SBERT主要在bert的基础上进行了结构设计:采用Siamese(孪生网络)和triplet(三级)网络结构来获取语义embedding.

3.1Siamese(孪生)

Siamese network 是一个简单而又神奇的网路结构,就像连体人一样,孪生网络采用权值共享的方式,
Sentence-BERT学习_第1张图片
权值共享两个输入共享权重信息,实现上面其实就是一个模型。
孪生网络,
衡量两个输入的相似程度,孪生网络有两个输入,将两个输入feed进入两个神经网络,这两个神经网络分别将输入映射到新的空间,形成输入在新的空间表示,生成具有语义的句子Embedding向量,,通过loss计算评价两个输入的相似度,反向调整权重,语义相近的句子,其embedding向量距离就比较近。

3.2 Pooling操作

在bert输出层之后,进行pooling可以将word embeddings 变成一个固定程度的sentence embedding 一般pooling有三种操作:
1.max:取出word embeddings 中最大值作为sentence embedding
2.CLS-token:也就是bert的做法,将CLS作为sentence embedding
3.Mean:将句子的所有token在token维度上计算平均,实验表示,这是三者中最好的策略
Sentence-BERT学习_第2张图片

3.3分类任务网络(训练模型)

通过将输出的sentence embeddings串联起来,得到三个特征(u,v,|u-v|),经过一个softmax层,训练权重W,进行分类
o=softmax(W(u,v,|u-v|))
其中,损失函数为交叉熵CrossEntropyLoss,emedding维度为n,(一般是768,最大是1024),W的维度为3nK(K是label数)
,u,v分别表示输入的2个句子的向量表示,|u-v|表示取两个向量的绝对值,(u, v, |u-v|)表示将三个向量在-1维度进行拼接,因此得到的向量的维度为 3
d,d表示隐层维度。
Sentence-BERT学习_第3张图片

3.4 回归任务网络结构(推理模型)

两个句子向量embedding向量u,v的余弦相似度计算结构如下,损失函数为MAE(mean squared error)pearson和spearman作为评价指标
Sentence-BERT学习_第4张图片

3.5Triplet 目标函数

给定一个主句a,一个正面句子p和一个负面句子n,三元组损失调整网络,使得a,p之间的距离尽可能小,a,n之间的距离尽可能大,数学上,我们期望最小化一下的损失函数:

4SBERT为何更快(推理+训练)

主要可以从训练和推理效率来说明,在训练中

在输入上表示为:一次性输入2个句子,即[CLS]句子0[SEP]\n[CLS]句子1[SEP]。而bert的输入长度是[CLS]句子0[SEP]句子1[SEP],长度是2倍。而运行速度和句子的长度是呈平方递增的,句子变短了所以效率有所提升。虽然SBERT的batch数增大了二倍,但不是平方的关系。
在推理上

对于n个句子,SBERT只需要计算n次,BERT需要计算n(n-1)/2次。因为SBERT对每个句子计算sentence embedding之后就保存,然后直接计算两两之间的余弦相似度即可,距离的计算可以忽略不计。所以在10000个句子,推理才有可能从65h变成5s左右。

连接:
链接: link

你可能感兴趣的:(python,深度学习,神经网络,自然语言处理)