语言:
任务标签: 句子相似度
标签:
- 俄语
- 预训练
- 嵌入向量
- 特征提取
- 句子相似度
- 句子转换器
- 转换器
数据集:
- IlyaGusev/gazeta
- zloelias/lenta-ru
- HuggingFaceFW/fineweb-2
- HuggingFaceFW/fineweb
许可证: MIT
基础模型: sergeyzh/LaBSE-ru-turbo
BERTA模型
该模型通过蒸馏ai-forever/FRIDA(嵌入维度1536,24层)的嵌入向量至sergeyzh/LaBSE-ru-turbo(嵌入维度768,12层)获得,用于计算俄语和英语句子的嵌入表示。FRIDA的主要使用模式CLS池化被替换为均值池化,未对模型行为进行其他修改。蒸馏过程全面覆盖了俄英句子嵌入及前缀功能。
模型上下文长度与FRIDA一致,为512个标记。
前缀说明
所有前缀继承自FRIDA。
多数任务的最佳(提供平均效果)前缀"categorize_entailment: "已预设于config_sentence_transformers.json。
各前缀在encodechka评测中的表现:
前缀 |
语义相似度(STS) |
复述识别(PI) |
自然语言推理(NLI) |
情感分析(SA) |
毒性识别(TI) |
无 |
0.842 |
0.757 |
0.463 |
0.830 |
0.985 |
search_query: |
0.853 |
0.767 |
0.479 |
0.825 |
0.987 |
search_document: |
0.831 |
0.749 |
0.463 |
0.817 |
0.986 |
paraphrase: |
0.847 |
0.778 |
0.446 |
0.825 |
0.986 |
categorize: |
0.857 |
0.765 |
0.501 |
0.829 |
0.988 |
categorize_sentiment: |
0.589 |
0.535 |
0.417 |
0.805 |
0.982 |
categorize_topic: |
0.740 |
0.521 |
0.396 |
0.770 |
0.982 |
categorize_entailment: |
0.841 |
0.762 |
0.571 |
0.827 |
0.986 |
任务类型:
- 语义文本相似度(STS)
- 复述识别(PI)
- 自然语言推理(NLI)
- 情感分析(SA)
- 毒性识别(TI)
性能指标
模型在ruMTEB基准测试中的表现:
模型名称 |
指标 |
FRIDA |
BERTA |
rubert-mini-frida |
multilingual-e5-large-instruct |
multilingual-e5-large |
CEDR分类 |
准确率 |
0.646 |
0.622 |
0.552 |
0.500 |
0.448 |
地理评论分类 |
准确率 |
0.577 |
0.548 |
0.464 |
0.559 |
0.497 |
地理评论聚类P2P |
V值 |
0.783 |
0.738 |
0.698 |
0.743 |
0.605 |
新闻标题分类 |
准确率 |
0.890 |
0.891 |
0.880 |
0.862 |
0.758 |
不当内容分类 |
准确率 |
0.783 |
0.748 |
0.698 |
0.655 |
0.616 |
电影评论分类 |
准确率 |
0.705 |
0.678 |
0.595 |
0.661 |
0.566 |
新闻检索 |
NDCG@10 |
0.868 |
0.816 |
0.721 |
0.824 |
0.807 |
问答重排序 |
MAP@10 |
0.771 |
0.752 |
0.711 |
0.717 |
0.756 |
问答检索 |
NDCG@10 |
0.724 |
0.710 |
0.654 |
0.692 |
0.741 |
俄语评论分类 |
准确率 |
0.751 |
0.723 |
0.658 |
0.686 |
0.653 |
俄语STS基准 |
皮尔逊相关系数 |
0.814 |
0.822 |
0.803 |
0.840 |
0.831 |
俄科GRNTI分类 |
准确率 |
0.699 |
0.690 |
0.625 |
0.651 |
0.582 |
俄科GRNTI聚类P2P |
V值 |
0.670 |
0.650 |
0.586 |
0.622 |
0.520 |
俄科OECD分类 |
准确率 |
0.546 |
0.555 |
0.493 |
0.502 |
0.445 |
俄科OECD聚类P2P |
V值 |
0.566 |
0.556 |
0.507 |
0.528 |
0.450 |
敏感话题分类 |
准确率 |
0.398 |
0.399 |
0.373 |
0.323 |
0.257 |
TERRA分类 |
平均精确率 |
0.665 |
0.657 |
0.606 |
0.639 |
0.584 |
模型名称 |
指标 |
FRIDA |
BERTA |
rubert-mini-frida |
multilingual-e5-large-instruct |
multilingual-e5-large |
分类任务 |
准确率 |
0.707 |
0.698 |
0.631 |
0.654 |
0.588 |
聚类任务 |
V值 |
0.673 |
0.648 |
0.597 |
0.631 |
0.525 |
多标签分类 |
准确率 |
0.522 |
0.510 |
0.463 |
0.412 |
0.353 |
配对分类 |
平均精确率 |
0.665 |
0.657 |
0.606 |
0.639 |
0.584 |
重排序 |
MAP@10 |
0.771 |
0.752 |
0.711 |
0.717 |
0.756 |
检索任务 |
NDCG@10 |
0.796 |
0.763 |
0.687 |
0.758 |
0.774 |
语义相似度 |
皮尔逊相关系数 |
0.814 |
0.822 |
0.803 |
0.840 |
0.831 |
综合平均 |
平均得分 |
0.707 |
0.693 |
0.643 |
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/BERTA")
model = AutoModel.from_pretrained("sergeyzh/BERTA")
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
使用(需版本≥2.4.0)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sergeyzh/BERTA")
paraphrase = model.encode(
["雅罗斯拉夫尔州允许澡堂营业,但不接待顾客", "雅罗斯拉夫尔澡堂获准无顾客营业"],
prompt="paraphrase: "
)
print(paraphrase[0] @ paraphrase[1].T)
entailment = model.encode(
["一名女性被送往医院,医生正在抢救她的生命。", "医生正在抢救一名女性。"],
prompt="categorize_entailment: "
)
print(entailment[0] @ entailment[1].T)
query = model.encode("需要多少程序员才能拧紧灯泡?", prompt="search_query: ")
doc = model.encode("拧紧灯泡需要三名程序员:一个写灯泡提取程序,一个写灯泡安装程序,第三个负责测试。", prompt="search_document: ")
print(query @ doc.T)