wangyuxinwhy / uniem

unified embedding model

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于M3e模型微调的问题

vegaviazhang opened this issue · comments

@wangyuxinwhy 大佬,非常感谢开源贡献的这个项目。

小白有一个疑问。
请问m3e模型如何微调?

因为我这里主要是医疗数据,这里m3e文本嵌入的向量间的相似度有点高,需要进行调整。
图中这个是我的训练数据和测试样例
image

大佬,下面这种思路对吗?

1.处理上面这种自己的数据形成dataset

参考lcqmc这个数据集构建dataset,这个数据集也是text1、text2、label的形式
image

2 以大佬训练出来的模型为基础

  • 我先下载大佬的模型到服务器上,比如:model
python scripts/train_m3e.py model <data_dir>

3.输出模型

非常好的问题,因为在不同使用场景中可能对于什么是相似有着不同的定义,因此面对不同场景的问题可能是必要的。

但我这边进行测试,发现区分度还是比较大的。不知道是什么原因导致的。

目前的脚本 train_m3e 是 in-batch 对比学习,所以和你的场景不是很符合,你的场景更符合 CoSent Loss 的方式进行微调。我今天会专门开发一个 fine-tune 的脚本。有了这个脚本你 fine-tune 起来就容易多了。

大佬,下面这种思路对吗?

1.处理上面这种自己的数据形成dataset

参考lcqmc这个数据集构建dataset,这个数据集也是text1、text2、label的形式 image

2 以大佬训练出来的模型为基础

  • 我先下载大佬的模型到服务器上,比如:model
python scripts/train_m3e.py model <data_dir>

3.输出模型

这个思路整体上是对的,其实就是准备数据 + 运行命令就可以了

非常感谢大佬的回复,感谢后续的fine-tune工程。

  • 主要发现在医疗领域句子对question1和question2的相似度都很高,我了整理一万条数据,拿出来做测试,发现这里面最低的相似度是0.56。就像大佬说的,不同场景下对相似的定义不同。
    大佬看下面的图。

  • 图1:相似度很高
    image

  • 图2:测试相似度高的图【question1是字符串1,question2是医疗问题】
    image

大佬需要我这里提供这些数据做参考吗?

  • 我的数据大概长这样
    image

你说的这个问题是真实存在的,M3E 的模型校准并不好,余弦相似度为 0.5 不代表概率,只是一个相对的分数,这是由于Loss 选择的问题导致的,可以说是对比学习 Loss 的通病,CoSent 可能会好一些,也有可能是温度(0.01)太低了导致的.... 这部分我们只有初步的认识,后续的模型会考虑解决校准的问题。

如果你的数据集可以开源就好了,比如开源一个子集,不用太多,几百条也好。我可以把你的数据集加入到 MTEB-zh 中,这样你可以很直观的看到现在主流的开源 embedding 模型中,哪一个在你的数据集上表现得比较好。

大佬好,我已经从数据集中抽出了1000条数据,放在代码根目录下的一个新文件夹upload_datasets中的文件Clinical_Query_Data.csv,提交了一个PR,但是我不会添加到MTEB-zh中,辛苦大佬了。

image

后续等大佬将这类数据在M3E的微调工程开发完了,我再进行尝试,到时候也与大佬沟通。

大佬好,我已经从数据集中抽出了1000条数据,放在代码根目录下的一个新文件夹upload_datasets中的文件Clinical_Query_Data.csv,提交了一个PR,但是我不会添加到MTEB-zh中,辛苦大佬了。

image

后续等大佬将这类数据在M3E的微调工程开发完了,我再进行尝试,到时候也与大佬沟通。

老哥,finetune 的部分已经开发完了,现在的 README 中介绍了如何 finetune,就像下面这样

from datasets import load_dataset

from uniem.finetuner import FineTuner

dataset = load_dataset('shibing624/nli_zh', 'STS-B')
# 指定训练的模型为 m3e-small
finetuner = FineTuner('moka-ai/m3e-small', dataset=dataset)
finetuner.run(epochs=1)

你也可以尝试一下 colab 的示例,colab 示例

试试在你自己的数据集上微调是否有问题。

我会把你提供的数据集添加到评测集中,给你的数据集起个名字吧~

大佬好,我已经从数据集中抽出了1000条数据,放在代码根目录下的一个新文件夹upload_datasets中的文件Clinical_Query_Data.csv,提交了一个PR,但是我不会添加到MTEB-zh中,辛苦大佬了。

image

后续等大佬将这类数据在M3E的微调工程开发完了,我再进行尝试,到时候也与大佬沟通。

老哥,finetune 的部分已经开发完了,现在的 README 中介绍了如何 finetune,就像下面这样

from datasets import load_dataset

from uniem.finetuner import FineTuner

dataset = load_dataset('shibing624/nli_zh', 'STS-B')
# 指定训练的模型为 m3e-small
finetuner = FineTuner('moka-ai/m3e-small', dataset=dataset)
finetuner.run(epochs=1)

你也可以尝试一下 colab 的示例,colab 示例

试试在你自己的数据集上微调是否有问题。

我会把你提供的数据集添加到评测集中,给你的数据集起个名字吧~

  • 好嘞,大佬,我待会就来试下微调。看我能不能顺利微调出来。
  • 数据集名字就叫Med_QQpairs吧,哈哈哈,医疗领域的问题Query匹配问题Question的句对。

如果微调时遇到什么问题,可以直接问我。

你介意把数据集托管到 HuggingFace 上吗?因为如果把这个数据集作为 MTEB-zh BenchMark 的一部分,需要其他评测者也能访问到这个数据集。如果不介意托管到 HuggingFace 的话,你可以在这里 上传数据集。感谢你为中文开源社区做的贡献~

如果微调时遇到什么问题,可以直接问我。

你介意把数据集托管到 HuggingFace 上吗?因为如果把这个数据集作为 MTEB-zh BenchMark 的一部分,需要其他评测者也能访问到这个数据集。如果不介意托管到 HuggingFace 的话,你可以在这里 上传数据集。感谢你为中文开源社区做的贡献~

一、感谢

  • 好嘞,昨晚上太晚了,没卷了。
  • 今天早上来看的,就几行代码解决了。已经在跑了,目前没啥问题。后续有问题再沟通。^v^
    image

二、惊喜

  • 其实有一个惊喜,我瞄了一眼源码,训练时这行代码传入的dataset是根据传入字典中的字段数量和名称,自动选择RecordType, PairRecord, TripletRecord, ScoredPairRecord其中的一种
finetuner = FineTuner(m3e_model_path, dataset=self_dataset)
  • 我把函数给抽出来单独跑了一下,真实得到了对应的record_type

image

  • 而这里RecordType.SCORED_PAIR正是指向的ScoredPairRecord,和预想的一致
    image
  • 这个确实挺巧妙。

三、数据集

测试时候发现一个小问题:

output_dir
  • output_dir为全路径时,可以保存模型和checkpoint
  • output_dir为相对路径时,不可以保存模型和checkpoint
    image

测试时候发现一个小问题:

output_dir
  • output_dir为全路径时,可以保存模型和checkpoint
  • output_dir为相对路径时,不可以保存模型和checkpoint
    image

我在本地没有复现这个 bug ,能把报错贴一下吗?

大佬,过程没有报错,但是就是运行完后,模型输出文件夹为空,我跑一个简单的例子看下。

1.新建目录output_model_20230616,并ll查看有无文件

image

2.运行微调脚本,设置输出目录output_diroutput_model_20230616

  • 图中已经正常跑起来了
    image

3.脚本正常结束,没有报错

image

4.查看服务器中,模型输出文件夹,没有任何内容

image

大佬,过程没有报错,但是就是运行完后,模型输出文件夹为空,我跑一个简单的例子看下。

1.新建目录output_model_20230616,并ll查看有无文件

image

2.运行微调脚本,设置输出目录output_diroutput_model_20230616

  • 图中已经正常跑起来了
    image

3.脚本正常结束,没有报错

image

4.查看服务器中,模型输出文件夹,没有任何内容

image

太奇怪了,我这里是正常的,因为所有保存模型和 checkpoint 的操作都是通过 accelerate 这个包来实现的,所以我们写任何测试.... 不过 accelerate 这么多人用,不应该有这种 bug 呀....

image

@vegaviazhang
老哥,你的数据集已经添加成功了,是 MTEB-zh 的第一个 PairClassification 的数据集 https://github.com/wangyuxinwhy/uniem/blob/main/mteb-zh/mteb_zh/tasks.py#L26

我帮你评测了三个模型
text2vec

"cos_sim": {
      "accuracy": 0.869,
      "accuracy_threshold": 0.8055720329284668,
      "ap": 0.9361846523581879,
      "f1": 0.8613756613756612,
      "f1_threshold": 0.8055720329284668,
      "precision": 0.9146067415730337,
      "recall": 0.814
    }

m3e-small

"cos_sim": {
      "accuracy": 0.868,
      "accuracy_threshold": 0.9344593286514282,
      "ap": 0.9332631409877954,
      "f1": 0.8595744680851064,
      "f1_threshold": 0.9344593286514282,
      "precision": 0.9351851851851852,
      "recall": 0.7952755905511811
    }

m3e-base

"cos_sim": {
      "accuracy": 0.89,
      "accuracy_threshold": 0.9231852293014526,
      "ap": 0.9483734546897714,
      "f1": 0.8865979381443299,
      "f1_threshold": 0.9231852293014526,
      "precision": 0.9148936170212766,
      "recall": 0.86
    }

以 m3e-base 为例,意思是说当你把 0.923 作为阈值,来切分是否相似的话,模型有 0.89 的准确率。我也尝试了微调(前500做训练微调,后500做验证),2epoch small 模型上提高了 1.5 个点,而且没有伤害模型在其他数据集上的表现。

大佬,过程没有报错,但是就是运行完后,模型输出文件夹为空,我跑一个简单的例子看下。

1.新建目录output_model_20230616,并ll查看有无文件

image

2.运行微调脚本,设置输出目录output_diroutput_model_20230616

  • 图中已经正常跑起来了
    image

3.脚本正常结束,没有报错

image

4.查看服务器中,模型输出文件夹,没有任何内容

image

太奇怪了,我这里是正常的,因为所有保存模型和 checkpoint 的操作都是通过 accelerate 这个包来实现的,所以我们写任何测试.... 不过 accelerate 这么多人用,不应该有这种 bug 呀....

image

好的,大佬。估计和我这边的环境有关,我用的pycharm远程ssh解释器的,暂时先不管了吧。

@vegaviazhang 老哥,你的数据集已经添加成功了,是 MTEB-zh 的第一个 PairClassification 的数据集 https://github.com/wangyuxinwhy/uniem/blob/main/mteb-zh/mteb_zh/tasks.py#L26

我帮你评测了三个模型 text2vec

"cos_sim": {
      "accuracy": 0.869,
      "accuracy_threshold": 0.8055720329284668,
      "ap": 0.9361846523581879,
      "f1": 0.8613756613756612,
      "f1_threshold": 0.8055720329284668,
      "precision": 0.9146067415730337,
      "recall": 0.814
    }

m3e-small

"cos_sim": {
      "accuracy": 0.868,
      "accuracy_threshold": 0.9344593286514282,
      "ap": 0.9332631409877954,
      "f1": 0.8595744680851064,
      "f1_threshold": 0.9344593286514282,
      "precision": 0.9351851851851852,
      "recall": 0.7952755905511811
    }

m3e-base

"cos_sim": {
      "accuracy": 0.89,
      "accuracy_threshold": 0.9231852293014526,
      "ap": 0.9483734546897714,
      "f1": 0.8865979381443299,
      "f1_threshold": 0.9231852293014526,
      "precision": 0.9148936170212766,
      "recall": 0.86
    }

以 m3e-base 为例,意思是说当你把 0.923 作为阈值,来切分是否相似的话,模型有 0.89 的准确率。我也尝试了微调(前500做训练微调,后500做验证),2epoch small 模型上提高了 1.5 个点,而且没有伤害模型在其他数据集上的表现。

  • 好的,大佬,感谢!^v^

@vegaviazhang 老哥,你的数据集已经添加成功了,是 MTEB-zh 的第一个 PairClassification 的数据集 https://github.com/wangyuxinwhy/uniem/blob/main/mteb-zh/mteb_zh/tasks.py#L26

我帮你评测了三个模型 text2vec

"cos_sim": {
      "accuracy": 0.869,
      "accuracy_threshold": 0.8055720329284668,
      "ap": 0.9361846523581879,
      "f1": 0.8613756613756612,
      "f1_threshold": 0.8055720329284668,
      "precision": 0.9146067415730337,
      "recall": 0.814
    }

m3e-small

"cos_sim": {
      "accuracy": 0.868,
      "accuracy_threshold": 0.9344593286514282,
      "ap": 0.9332631409877954,
      "f1": 0.8595744680851064,
      "f1_threshold": 0.9344593286514282,
      "precision": 0.9351851851851852,
      "recall": 0.7952755905511811
    }

m3e-base

"cos_sim": {
      "accuracy": 0.89,
      "accuracy_threshold": 0.9231852293014526,
      "ap": 0.9483734546897714,
      "f1": 0.8865979381443299,
      "f1_threshold": 0.9231852293014526,
      "precision": 0.9148936170212766,
      "recall": 0.86
    }

以 m3e-base 为例,意思是说当你把 0.923 作为阈值,来切分是否相似的话,模型有 0.89 的准确率。我也尝试了微调(前500做训练微调,后500做验证),2epoch small 模型上提高了 1.5 个点,而且没有伤害模型在其他数据集上的表现。

请问有评测脚本吗

@vegaviazhang 老哥,你的数据集已经添加成功了,是 MTEB-zh 的第一个 PairClassification 的数据集 https://github.com/wangyuxinwhy/uniem/blob/main/mteb-zh/mteb_zh/tasks.py#L26
我帮你评测了三个模型 text2vec

"cos_sim": {
      "accuracy": 0.869,
      "accuracy_threshold": 0.8055720329284668,
      "ap": 0.9361846523581879,
      "f1": 0.8613756613756612,
      "f1_threshold": 0.8055720329284668,
      "precision": 0.9146067415730337,
      "recall": 0.814
    }

m3e-small

"cos_sim": {
      "accuracy": 0.868,
      "accuracy_threshold": 0.9344593286514282,
      "ap": 0.9332631409877954,
      "f1": 0.8595744680851064,
      "f1_threshold": 0.9344593286514282,
      "precision": 0.9351851851851852,
      "recall": 0.7952755905511811
    }

m3e-base

"cos_sim": {
      "accuracy": 0.89,
      "accuracy_threshold": 0.9231852293014526,
      "ap": 0.9483734546897714,
      "f1": 0.8865979381443299,
      "f1_threshold": 0.9231852293014526,
      "precision": 0.9148936170212766,
      "recall": 0.86
    }

以 m3e-base 为例,意思是说当你把 0.923 作为阈值,来切分是否相似的话,模型有 0.89 的准确率。我也尝试了微调(前500做训练微调,后500做验证),2epoch small 模型上提高了 1.5 个点,而且没有伤害模型在其他数据集上的表现。

请问有评测脚本吗

请参考项目中的 MTEB-zh: https://github.com/wangyuxinwhy/uniem/tree/main/mteb-zh

评测命令:python run_mteb_zh.py --model-type sentence_transformer --model-id moka-ai/m3e-base --task-name MedQQPairs