语言:
任务标签: 句子相似度
标签:
- 俄语
- 预训练
- 嵌入向量
- 微型模型
- 特征提取
- 句子相似度
- 句子转换器
- 转换器
数据集:
- IlyaGusev/gazeta
- zloelias/lenta-ru
- HuggingFaceFW/fineweb-2
- HuggingFaceFW/fineweb
许可证: MIT
基础模型: sergeyzh/rubert-mini-sts
rubert-mini-uncased
该模型用于计算俄语和英语句子的嵌入向量,通过蒸馏ai-forever/FRIDA的嵌入向量获得(嵌入向量大小为1536,层数为24)。FRIDA的主要使用模式——CLS池化被替换为均值池化。未对模型行为进行任何其他修改(如嵌入向量的修改或过滤,或使用额外模型)。蒸馏过程尽可能全面——包括俄语和英语句子的嵌入向量以及前缀功能。
该模型属于uncased类型——不区分文本中的大小写字母(例如,“С Новым Годом!”和“С НОВЫМ ГОДОМ!”会被编码为相同的标记序列并具有相同的嵌入向量值)。模型的嵌入向量大小为384,层数为7。模型的上下文大小与FRIDA一致,为512个标记。
前缀
所有前缀均继承自FRIDA。
在encodechka中使用的所有前缀及其对模型评分的影响:
前缀 |
STS |
PI |
NLI |
SA |
TI |
- |
0.817 |
0.734 |
0.448 |
0.799 |
0.971 |
search_query: |
0.828 |
0.752 |
0.463 |
0.794 |
0.973 |
search_document: |
0.794 |
0.730 |
0.446 |
0.797 |
0.971 |
paraphrase: |
0.823 |
0.760 |
0.446 |
0.802 |
0.973 |
categorize: |
0.820 |
0.753 |
0.482 |
0.805 |
0.972 |
categorize_sentiment: |
0.604 |
0.595 |
0.431 |
0.798 |
0.955 |
categorize_topic: |
0.711 |
0.485 |
0.391 |
0.750 |
0.962 |
categorize_entailment: |
0.805 |
0.750 |
0.525 |
0.800 |
0.969 |
任务:
- 语义文本相似度 (STS);
- 复述识别 (PI);
- 自然语言推理 (NLI);
- 情感分析 (SA);
- 毒性识别 (TI)。
指标
模型在ruMTEB基准测试中的评分:
模型名称 |
指标 |
Frida |
rubert-mini-uncased |
rubert-mini-frida |
multilingual-e5-large-instruct |
multilingual-e5-large |
CEDR分类 |
准确率 |
0.646 |
0.586 |
0.552 |
0.500 |
0.448 |
地理评论分类 |
准确率 |
0.577 |
0.485 |
0.464 |
0.559 |
0.497 |
地理评论聚类P2P |
V-measure |
0.783 |
0.683 |
0.698 |
0.743 |
0.605 |
标题分类 |
准确率 |
0.890 |
0.884 |
0.882 |
0.862 |
0.758 |
不当内容分类 |
准确率 |
0.783 |
0.705 |
0.698 |
0.655 |
0.616 |
电影评论分类 |
准确率 |
0.705 |
0.607 |
0.595 |
0.661 |
0.566 |
新闻检索 |
NDCG@10 |
0.868 |
0.791 |
0.721 |
0.824 |
0.807 |
问答重排序 |
MAP@10 |
0.771 |
0.713 |
0.711 |
0.717 |
0.756 |
问答检索 |
NDCG@10 |
0.724 |
0.640 |
0.654 |
0.692 |
0.741 |
评论分类 |
准确率 |
0.751 |
0.684 |
0.658 |
0.686 |
0.653 |
俄语STS基准测试 |
皮尔逊相关系数 |
0.814 |
0.795 |
0.803 |
0.840 |
0.831 |
科学文献分类 |
准确率 |
0.699 |
0.653 |
0.625 |
0.651 |
0.582 |
科学文献聚类P2P |
V-measure |
0.670 |
0.618 |
0.586 |
0.622 |
0.520 |
科学文献OECD分类 |
准确率 |
0.546 |
0.509 |
0.491 |
0.502 |
0.445 |
科学文献OECD聚类P2P |
V-measure |
0.566 |
0.525 |
0.507 |
0.528 |
0.450 |
敏感话题分类 |
准确率 |
0.398 |
0.365 |
0.373 |
0.323 |
0.257 |
TERRa分类 |
平均精度 |
0.665 |
0.604 |
0.604 |
0.639 |
0.584 |
模型名称 |
指标 |
Frida |
rubert-mini-uncased |
rubert-mini-frida |
multilingual-e5-large-instruct |
multilingual-e5-large |
分类 |
准确率 |
0.707 |
0.657 |
0.631 |
0.654 |
0.588 |
聚类 |
V-measure |
0.673 |
0.608 |
0.597 |
0.631 |
0.525 |
多标签分类 |
准确率 |
0.522 |
0.476 |
0.463 |
0.412 |
0.353 |
对分类 |
平均精度 |
0.665 |
0.604 |
0.604 |
0.639 |
0.584 |
重排序 |
MAP@10 |
0.771 |
0.713 |
0.711 |
0.717 |
0.756 |
检索 |
NDCG@10 |
0.796 |
0.715 |
0.687 |
0.758 |
0.774 |
STS |
皮尔逊相关系数 |
0.814 |
0.795 |
0.803 |
0.840 |
0.831 |
平均 |
平均 |
0.707 |
0.653 |
0.642 |
0.664 |
0.630 |
使用transformers
库调用模型:
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel
def pool(hidden_state, mask, pooling_method="mean"):
if pooling_method == "mean":
s = torch.sum(hidden_state * mask.unsqueeze(-1).float(), dim=1)
d = mask.sum(axis=1, keepdim=True).float()
return s / d
elif pooling_method == "cls":
return hidden_state[:, 0]
inputs = [
"paraphrase: 雅罗斯拉夫尔地区允许澡堂营业,但不接待顾客",
"categorize_entailment: 一名妇女被送往医院,医生正在抢救她的生命。",
"search_query: 需要多少程序员才能拧一个灯泡?",
"paraphrase: 雅罗斯拉夫尔澡堂获准无顾客营业",
"categorize_entailment: 医生正在抢救一名妇女。",
"search_document: 拧一个灯泡需要三个程序员:一个写提取灯泡的程序,另一个写拧灯泡的程序,第三个负责测试。"
]
tokenizer = AutoTokenizer.from_pretrained("sergeyzh/rubert-mini-uncased")
model = AutoModel.from_pretrained("sergeyzh/rubert-mini-uncased")
tokenized_inputs = tokenizer(inputs, max_length=512, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
outputs = model(**tokenized_inputs)
embeddings = pool(
outputs.last_hidden_state,
tokenized_inputs["attention_mask"],
pooling_method="mean"
)
embeddings = F.normalize(embeddings, p=2, dim=1)
sim_scores = embeddings[:3] @ embeddings[3:].T
print(sim_scores.diag().tolist())
使用sentence_transformers
(sentence-transformers>=2.4.0):
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sergeyzh/rubert-mini-uncased")
paraphrase = model.encode(["雅罗斯拉夫尔地区允许澡堂营业,但不接待顾客", "雅罗斯拉夫尔澡堂获准无顾客营业"], prompt="paraphrase: ")
print(paraphrase[0] @ paraphrase[1].T)
categorize_entailment = model.encode(["一名妇女被送往医院,医生正在抢救她的生命。", "医生正在抢救一名妇女。"], prompt="categorize_entailment: ")
print(categorize_entailment[0] @ categorize_entail