库名称: sentence-transformers
流水线标签: 句子相似度
标签:
- sentence-transformers
- 特征提取
- 句子相似度
许可证: apache-2.0
数据集:
- deepvk/ru-HNP
- deepvk/ru-WANLI
- Shitao/bge-m3-data
- RussianNLP/russian_super_glue
- reciTAL/mlsum
- Helsinki-NLP/opus-100
- Helsinki-NLP/bible_para
- d0rj/rudetoxifier_data_detox
- s-nlp/ru_paradetox
- Milana/russian_keywords
- IlyaGusev/gazeta
- d0rj/gsm8k-ru
- bragovo/dsum_ru
- CarlBrendt/Summ_Dialog_News
语言:
- 俄语
USER基础版
俄语通用句子编码器(USER) 是专为俄语设计的sentence-transformer嵌入提取模型。该模型将句子和段落映射到768维稠密向量空间,可用于聚类或语义搜索等任务。
本模型基于deepvk/deberta-v1-base
初始化,并专门针对俄语训练。其他语言的质量未经评估。
使用方法
安装sentence-transformers
后即可轻松使用:
pip install -U sentence-transformers
使用示例:
from sentence_transformers import SentenceTransformer
queries = [
"首艘驱逐舰「平静号」何时下水?",
"乌德穆尔特共和国有石油吗?"
]
passages = [
"平静号(驱逐舰)\n1952年8月19日列入苏联海军序列。",
"乌德穆尔特共和国的石油勘探工作始于二战结束后的1945年并持续至今。石油开采始于1967年。"
]
model = SentenceTransformer("deepvk/USER-base")
passage_embeddings = model.encode(passages, normalize_embeddings=True, prompt_name='passage')
query_embeddings = model.encode(queries, normalize_embeddings=True)
也可直接使用transformers
:
import torch.nn.functional as F
from torch import Tensor, inference_mode
from transformers import AutoTokenizer, AutoModel
def average_pool(
last_hidden_states: Tensor,
attention_mask: Tensor
) -> Tensor:
last_hidden = last_hidden_states.masked_fill(
~attention_mask[..., None].bool(), 0.0
)
return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
input_texts = [
"query: 首艘驱逐舰「平静号」何时下水?",
"query: 乌德穆尔特共和国有石油吗?",
"passage: 平静号(驱逐舰)\n1952年8月19日列入苏联海军序列。",
"passage: 乌德穆尔特共和国的石油勘探工作始于二战结束后的1945年并持续至今。石油开采始于1967年。"
]
tokenizer = AutoTokenizer.from_pretrained("deepvk/USER-base")
model = AutoModel.from_pretrained("deepvk/USER-base")
batch_dict = tokenizer(
input_texts, padding=True, truncation=True, return_tensors="pt"
)
with inference_mode():
outputs = model(**batch_dict)
embeddings = average_pool(
outputs.last_hidden_state, batch_dict["attention_mask"]
)
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:2] @ embeddings[2:].T) * 100
print(scores.round(decimals=2))
⚠️ 注意 ⚠️
所有输入文本必须以"query: "或"passage: "开头。非检索任务可统一使用"query: "前缀。
训练详情
我们参照bge-base-en
训练流程并进行了改进:
初始化模型:deepvk/deberta-v1-base
第一阶段:基于mMarco俄语语料进行弱监督对比预训练
第二阶段:通过数据对称性分别微调两个模型后使用LM-Cocktail
融合:
- 简化多语言指令设计:对称数据使用双"query: "前缀,非对称数据使用"query: "/"passage: "组合
- 对对称数据模型额外应用AnglE损失函数增强对称任务表现
- 最终通过权重调优合并两个模型得到USER
数据集
我们新增了两个数据集:deepvk/ru-HNP
和deepvk/ru-WANLI
对称数据集 |
规模 |
非对称数据集 |
规模 |
AllNLI |
282,644 |
MIRACL |
10,000 |
MedNLI |
3,699 |
MLDR |
1,864 |
...(其他数据集省略)... |
|
|
|
总正样本对:3,352,653
总负样本对:792,644
对于标注数据集仅使用训练集。新闻类数据集将标题/正文、标题/摘要组合为非对称数据。
AllNLI
是SNLI、MNLI和ANLI的俄译组合。
实验结果
以encodechka
排行榜为基准,同时在俄语MTEB
和MIRACL
上评估:
模型 |
参数量 |
Encodechka(平均S) |
MTEB(俄语平均) |
Miracl(召回率@100) |
bge-m3 |
303 |
0.786 |
0.694 |
0.959 |
...(其他模型对比省略)... |
|
|
|
|
USER (本模型) |
85 |
0.772 |
0.666 |
0.763 |
粗体表示绝对领先者,下划线表示同规模模型最优。本模型在同规模模型中全面领先,虽检索任务稍逊但将在后续研究中改进。
常见问题
必须添加"query: "和"passage: "前缀吗?
是的,这是模型的训练方式,否则性能会下降。经验法则:
- 非对称任务(如开放QA)使用对应前缀
- 对称任务(如语义相似度)统一使用"query: "
- 特征提取任务(如聚类)使用"query: "
引用
@misc{deepvk2024user,
title={USER: 俄语通用句子编码器},
author={Malashenko, Boris and Zemerov, Anton and Spirin, Egor},
url={https://huggingface.co/datasets/deepvk/USER-base},
publisher={Hugging Face},
year={2024},
}