pipeline_tag: text-ranking
tags:
- transformers
- information-retrieval
language: pl
license: apache-2.0
library_name: sentence-transformers
polish-reranker-base-ranknet
这是一个基于RankNet损失函数训练的波兰语文本排序模型,训练数据集包含140万条查询和1000万份文档组成的文本对。训练数据包含以下部分:1) 波兰语MS MARCO训练集(80万条查询);2) 翻译为波兰语的ELI5数据集(超过50万条查询);3) 波兰语医疗问答集合(约10万条查询)。教师模型采用基于MT5-XXL架构的多语言大型排序模型unicamp-dl/mt5-13b-mmarco-100k,学生模型选用波兰语RoBERTa。
与常见的将每个查询-文档对独立处理的逐点损失函数不同,RankNet方法基于查询和文档对计算损失。具体而言,该损失函数根据文档与查询相关性的相对排序顺序进行计算。训练过程中,我们使用教师模型评估检索阶段获取的文档相关性,按相关性分数排序后,构建了包含查询及其对应20个排序文档的数据集。
使用方式(Sentence-Transformers)
可通过sentence-transformers如下使用该模型:
from sentence_transformers import CrossEncoder
import torch.nn
query = "如何活到100岁?"
answers = [
"需要健康饮食和坚持运动",
"应该饮酒、参加派对并驾驶快车",
"竞选期间政客们承诺要解决周日禁商令问题"
]
model = CrossEncoder(
"sdadas/polish-reranker-base-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 = "如何活到100岁?"
answers = [
"需要健康饮食和坚持运动",
"应该饮酒、参加派对并驾驶快车",
"竞选期间政客们承诺要解决周日禁商令问题"
]
model_name = "sdadas/polish-reranker-base-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())
评估结果
该模型在波兰信息检索基准测试的Rerankers类别中取得NDCG@10分数为60.32。详见PIRB排行榜。
引用文献
@article{dadas2024assessing,
title={评估波兰语文本排序模型的泛化能力},
author={斯瓦沃米尔·达达斯和玛乌戈热塔·格伦博维茨},
year={2024},
eprint={2402.14318},
archivePrefix={arXiv},
primaryClass={cs.CL}
}