sbert笔记

一、如何使用bert度量句子的相似度

目前业内常用的度量文本相似性的做法有两种,效果差不多:

  1. 把文本A和文本B拼接起来,进行二分类任务,分类标签为相似或不相似,最后可以输出相似和不相似的概率。github有该方法的具体实现:https://github.com/Brokenwind/BertSimilarity。这个方法跟基于bert的排序类似,基于bert的排序是将用户query和用户点击或者没有点击的title拼接起来,进行二分类任务,分类标签为点击或不点击。
  2. 直接用文本A和文本B在预训练模型上度量相似性,得到的是两个tensor,计算余弦相似度即可。这样可以得到一个数值,来衡量相似性。

二、sbert是啥意思

挛生网络Siamese network(后简称SBERT),其中Siamese意为“连体人”,即两人共用部分器官。SBERT模型的子网络都使用BERT模型,且两个BERT模型共享参数。当对比A,B两个句子相似度时,它们分别输入BERT网络,输出是两组表征句子的向量,然后计算二者的相似度。

三、如何通过bert获取句子向量

由于输入的Sentence长度不一,而我们希望得到统一长度的Embeding,所以当Sentence从BERT输出后我们需要执行pooling操作。实验中采取了三种pooling策略做对比:

  1. CLS向量策略,直接采用CLS位置的输出向量代表整个句子的向量表示
  2. MEAN策略,计算各个token输出向量的平均值代表句子向量
  3. MAX策略,取所有输出向量各个维度的最大值代表句子向量。

作者做了大量的实验,比较三种求句子向量策略的好坏,认为平均池化策略最优,并且在多个数据集上进行了效果验证。虽然效果没有bert输入两句话的效果好,但是比其他方法还是要好的,并且速度很快。三个策略的实验对比效果如下:
在这里插入图片描述
可见三个策略中,MEAN策略是效果最好的,所以后面实验默认采用的是MEAN策略。

四、如何训练sbert

SBERT(SNLI) :用SNLI训练集进行监督训练SBERT,因为SNLI是三元组(anchor, positive, negative)的形式,所以这里损失函数为TripleLoss
SBERT(STS-B):用STS-B训练集进行监督训练SBERT,因为把STS-B标签的0·5映射为相似度0, 0.2, 0.4, 0.6, 0.8, 1。损失函数采用与评价指标一样的CosineSimilarLoss
在这里插入图片描述其中左图是训练的模型,右图是训练好模型之后利用句向量计算2个句子之间的相似度。u,v分别表示输入的2个句子的向量表示,|u-v|表示取两个向量的绝对值,(u, v, |u-v|)表示将三个向量在-1维度进行拼接,因此得到的向量的维度为 3*d,d表示隐层维度。
当损失函数是softmax时,论文里提到把u,v,|u-v|拼接起来后接分类层效果是最好的,其实sbert库SoftmaxLoss也是默认采用这种做法,但做inference的时候,sbert还是默认拿mean pooling后的向量做后续相似度计算。

五、如何评价句向量生成的好坏

句向量评测 SentEval

六、跑个例子感受下

先安装sentence-transformers

 pip3 install -U sentence-transformers
import os
from sentence_transformers import SentenceTransformer, util
os.environ['CUDA_VISIBLE_DEVICES'] = '2'
# 下面的这行代码会默认自动下载hugging face上面的模型,存储目录默认在/home/yourname/.cache/torch/transformers
model = SentenceTransformer('distiluse-base-multilingual-cased')
emb1 = model.encode('Natural language processing is a hard task for human')
emb2 = model.encode('自然语言处理对于人类来说是个困难的任务')
cos_sim = util.pytorch_cos_sim(emb1, emb2)
print(cos_sim)

运行结果:

tensor([[0.8960]])

七、如何优雅得下载"huggingface-transformers模型"

https://zhuanlan.zhihu.com/p/475260268

参考文献:

  • https://www.jianshu.com/p/3b1bad16c351
  • https://zhuanlan.zhihu.com/p/113133510?from_voters_page=true
  • https://www.cnblogs.com/gczr/p/12874409.html
  • https://zhuanlan.zhihu.com/p/388680608
  • https://blog.51cto.com/u_13707997/5067160
  • https://blog.csdn.net/weixin_43922901/article/details/106014964
  • https://mimiyouyou.com/2021/11/04/transformers-BERT%E9%A2%84%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B%E5%BA%A6%E9%87%8F%E6%96%87%E6%9C%AC%E7%9B%B8%E4%BC%BC%E6%80%A7/
  • https://jishuin.proginn.com/p/763bfbd7851a
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sbert-base-chinese-nli是一种基于中文的预训练模型,用于处理中文自然语言推理(Natural Language Inference)任务。该模型基于Sentence-BERT(SBERT)架构,在大规模的中文文本数据上进行了预训练。 SBERT模型是采用Transformer网络结构的句子嵌入模型,通过预训练将句子映射到一个高维空间中的向量表示。sbert-base-chinese-nli是其中的一个中文版本,被训练用于判断两个句子之间的关系,包括蕴含、中立和矛盾三种情况。 sbert-base-chinese-nli的输入是一对中文句子,输出是一个向量,表示这对句子之间的关系。该模型通过学习句子之间的语义信息和相似性,在句子级别上进行推理。 sbert-base-chinese-nli的应用非常广泛。例如,在问答系统中,可以使用这个模型判断用户提问和文档中的答案之间的相关程度。在文本分类任务中,可以使用该模型对文本进行分类。在信息检索领域,可以使用它来进行相似文档的匹配。 这个模型的好处是,它可以捕捉到句子之间更深层次的语义关系,而不仅仅是基于表面上的字词相似性。这使得它在处理含有歧义或隐含信息的句子时表现更好。 总结来说,sbert-base-chinese-nli是一个基于中文的预训练模型,用于处理中文自然语言推理任务。它通过学习句子之间的语义信息和相似性,可以判断句子之间的关系,并在问答系统、文本分类和信息检索等任务中有广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值