🚀 波兰语重排序模型 - polish-reranker-large-ranknet
这是一个波兰语文本排序模型,它基于大规模的文本对数据集进行训练,该数据集包含140万个查询和1000万个文档,并采用了 RankNet损失 。训练数据包含以下几个部分:1) 波兰语的MS MARCO训练集(80万个查询);2) 翻译成波兰语的ELI5数据集(超过50万个查询);3) 一组波兰语的医学问答(约10万个查询)。
作为教师模型,我们使用了基于MT5 - XXL架构的大型多语言重排序器 [unicamp - dl/mt5 - 13b - mmarco - 100k](https://huggingface.co/unicamp - dl/mt5 - 13b - mmarco - 100k) 。作为学生模型,我们选择了 [波兰语RoBERTa](https://huggingface.co/sdadas/polish - roberta - large - v2) 。
与更常用的逐点损失不同,逐点损失独立处理每个查询 - 文档对,而RankNet方法则基于查询和文档对来计算损失。具体来说,损失是根据文档相对于查询的相关性排序的相对顺序来计算的。
为了训练重排序器,我们使用教师模型来评估每个查询在检索阶段提取的文档的相关性。然后,我们根据相关性得分对这些文档进行排序,得到一个由查询和每个查询对应的20个文档的有序列表组成的数据集。
💡 实践证明,这种方法非常有效。尽管该模型的参数数量比教师模型少30倍,速度比教师模型快33倍,但在波兰信息检索基准测试中,它的表现优于教师模型! 💡
🚀 快速开始
本部分将介绍模型的使用方法和评估结果等内容。
✨ 主要特性
- 基于大规模波兰语文本对数据集训练,包含多种数据源。
- 采用RankNet损失计算方法,考虑文档相对顺序。
- 学生模型参数少、速度快,在波兰信息检索基准测试中表现优于教师模型。
📦 安装指南
文档未提及具体安装步骤,可参考相关库的官方文档进行安装,如 sentence - transformers 和 Huggingface Transformers 。
💻 使用示例
基础用法(Sentence - Transformers)
你可以使用 sentence - transformers 库来使用该模型,示例代码如下:
from sentence_transformers import CrossEncoder
import torch.nn
query = "Jak dożyć 100 lat?"
answers = [
"Trzeba zdrowo się odżywiać i uprawiać sport.",
"Trzeba pić alkohol, imprezować i jeździć szybkimi autami.",
"Gdy trwała kampania politycy zapewniali, że rozprawią się z zakazem niedzielnego handlu."
]
model = CrossEncoder(
"sdadas/polish-reranker-large-ranknet",
default_activation_function=torch.nn.Identity(),
max_length=512,
device="cuda" if torch.cuda.is_available() else "cpu"
)
pairs = [[query, answer] for answer in answers]
results = model.predict(pairs)
print(results.tolist())
高级用法(Huggingface Transformers)
也可以使用Huggingface Transformers库来使用该模型,示例代码如下:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import numpy as np
query = "Jak dożyć 100 lat?"
answers = [
"Trzeba zdrowo się odżywiać i uprawiać sport.",
"Trzeba pić alkohol, imprezować i jeździć szybkimi autami.",
"Gdy trwała kampania politycy zapewniali, że rozprawią się z zakazem niedzielnego handlu."
]
model_name = "sdadas/polish-reranker-large-ranknet"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
texts = [f"{query}</s></s>{answer}" for answer in answers]
tokens = tokenizer(texts, padding="longest", max_length=512, truncation=True, return_tensors="pt")
output = model(**tokens)
results = output.logits.detach().numpy()
results = np.squeeze(results)
print(results.tolist())
📚 详细文档
评估结果
该模型在波兰信息检索基准测试的重排序器类别中,实现了 NDCG@10 为 62.65 的成绩。详细结果请参考 PIRB排行榜 。
引用信息
如果你使用了该模型,请引用以下论文:
@article{dadas2024assessing,
title={Assessing generalization capability of text ranking models in Polish},
author={Sławomir Dadas and Małgorzata Grębowiec},
year={2024},
eprint={2402.14318},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
📄 许可证
本模型采用Apache 2.0许可证。