🚀 波蘭語重排序模型 - 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許可證。