zejunwang1 / bert4vec

一个基于预训练的句向量生成工具
Apache License 2.0
132 stars 11 forks source link

增加对roformer-ft新模型的支持 #4

Open blmoistawinde opened 2 years ago

blmoistawinde commented 2 years ago

你好,感谢你写的这个工具库,接口包装得用起来很方便!

注意到苏建林老师后面又提供了有监督训练增强的roformer-sim-ft,得到的相似度结果会一般会更加符合人的直觉,不过目前在这个库中还没有得到支持。

所以我仿照了你提到的方法对苏神release的ckpt做了转换和上传,然后在代码里添加了相应模型的支持。

https://huggingface.co/blmoistawinde/roformer-sim-ft-small-chinese https://huggingface.co/blmoistawinde/roformer-sim-ft-base-chinese

我比较了增强前后的模型(实验代码也放在里面了),发现ft模型确实能体现出更符合普通常规认知的相似度打分,比如加了“不”字后相似度明显降低。(虽然跟苏神原文中的数字有一点点不同,不知道是转化中出现了误差还是什么别的问题,但是感觉输出的效果基本上还是挺好的)。如果你觉得可以的话,就把这个PR merge一下吧。

blmoistawinde commented 2 years ago

最近又检查了一下数字对不上的问题出在哪里,发现有两点:

  1. 使用了mean pooling而不是CLS pooling
  2. 不应该在CLS embedding上再加tanh激活
  3. 修复这两点以后,现在的实验数字就跟苏神汇报的一模一样了

https://github.com/blmoistawinde/bert4vec/blob/main/examples/compare_models.ipynb

另外,之前用bert的转换代码来转换roformer总是有点奇怪,所以自己研究了一下roformer的转换代码,也附在里面了

https://github.com/blmoistawinde/bert4vec/blob/main/examples/convert_roformer_sim_original_tf_checkpoint_to_pytorch.py

zejunwang1 commented 2 years ago

最近又检查了一下数字对不上的问题出在哪里,发现有两点:

  1. 使用了mean pooling而不是CLS pooling
  2. 不应该在CLS embedding上再加tanh激活

修复这两点以后,现在的实验数字就跟苏神汇报的一模一样了

https://github.com/blmoistawinde/bert4vec/blob/main/examples/compare_models.ipynb

另外,之前用bert的转换代码来转换roformer总是有点奇怪,所以自己研究了一下roformer的转换代码,也附在里面了

https://github.com/blmoistawinde/bert4vec/blob/main/examples/convert_roformer_sim_original_tf_checkpoint_to_pytorch.py

你好,我发现你提供的 roformer-ft 测试例子都是苏神原博客的几个例子,但我在下面数据上进行测试发现,roformer-ft 计算出来的相似度区分性不够:

queries = ["光眼睛大就好看吗", "小蝌蚪找妈妈怎么样", "给我推荐一款红色的车", "电影不错", "我喜欢北京"] keys = ["眼睛好看吗?", "小蝌蚪找妈妈是谁画的", "给我推荐一款黑色的车", "电影不好", "我不喜欢北京"] print(sv.similarity(queries, keys))

roformer-ft 计算出的余弦相似度矩阵为:

[[0.7833775 0.18097427 0.3469231 0.48279086 0.32417536] [0.49847323 0.6883738 0.35418096 0.38131297 0.3605941 ] [0.43186927 0.1605316 0.71349144 0.38259056 0.35559577] [0.66077334 0.18071806 0.49310035 0.6396949 0.33369505] [0.56831586 0.22106932 0.5294188 0.4273827 0.532035 ]]

观察最后一行,“我喜欢北京” 这个句子和 "眼睛好看吗?" 的相似度达到 0.56831586,和 “我不喜欢北京” 的相似度只有 0.532035。我做这个工具的出发点是相似文本检索,如果说因为加了一个 “不” 字,导致召回出其他毫不相关的句子,那我觉得意义不大。

blmoistawinde commented 2 years ago

嗯嗯,对于什么样的句子算“相似”,这个定义确实在不同的场景和需求下可以是很不同的。

我这边也只是增加了一些选项。如果使用的用户面对的场景类似于那个模型finetune的数据集,比如金融、搜索领域的相似query检索等,或者对于是否、颜色等属性的区别要求敏感的,那么这些新的模型会有优势。如果不需要的话,那就继续用原来的模型就行了。