关于M3e模型微调的问题
vegaviazhang opened this issue · comments
@wangyuxinwhy 大佬,非常感谢开源贡献的这个项目。
小白有一个疑问。
请问m3e模型如何微调?
你说的这个问题是真实存在的,M3E 的模型校准并不好,余弦相似度为 0.5 不代表概率,只是一个相对的分数,这是由于Loss 选择的问题导致的,可以说是对比学习 Loss 的通病,CoSent 可能会好一些,也有可能是温度(0.01)太低了导致的.... 这部分我们只有初步的认识,后续的模型会考虑解决校准的问题。
如果你的数据集可以开源就好了,比如开源一个子集,不用太多,几百条也好。我可以把你的数据集加入到 MTEB-zh 中,这样你可以很直观的看到现在主流的开源 embedding 模型中,哪一个在你的数据集上表现得比较好。
大佬好,我已经从数据集中抽出了1000条数据,放在代码根目录下的一个新文件夹
upload_datasets
中的文件Clinical_Query_Data.csv
,提交了一个PR,但是我不会添加到MTEB-zh中,辛苦大佬了。后续等大佬将这类数据在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中,辛苦大佬了。后续等大佬将这类数据在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 的话,你可以在这里 上传数据集。感谢你为中文开源社区做的贡献~
一、感谢
二、惊喜
- 其实有一个惊喜,我瞄了一眼源码,训练时这行代码传入的dataset是根据传入字典中的字段数量和名称,自动选择RecordType, PairRecord, TripletRecord, ScoredPairRecord其中的一种
finetuner = FineTuner(m3e_model_path, dataset=self_dataset)
- 我把函数给抽出来单独跑了一下,真实得到了对应的record_type
三、数据集
- 数据集已经传了:在这里
@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
查看有无文件2.运行微调脚本,设置输出目录
output_dir
为output_model_20230616
3.脚本正常结束,没有报错
4.查看服务器中,模型输出文件夹,没有任何内容
太奇怪了,我这里是正常的,因为所有保存模型和 checkpoint 的操作都是通过 accelerate 这个包来实现的,所以我们写任何测试.... 不过 accelerate 这么多人用,不应该有这种 bug 呀....
好的,大佬。估计和我这边的环境有关,我用的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