🚀 USER-bge-m3
通用俄語句子編碼器(USER) 是一款 句子轉換器 模型,專門用於提取俄語句子的嵌入向量。它能將句子和段落映射到一個 1024 維的密集向量空間,可用於聚類或語義搜索等任務。
該模型基於 TatonkaHF/bge-m3_en_ru
進行初始化,這是 baai/bge-m3
的精簡版本,主要針對俄語進行訓練。目前尚未對該模型在其他語言上的表現進行評估。
🚀 快速開始
使用此模型前,請確保已安裝 sentence-transformers
:
pip install -U sentence-transformers
✨ 主要特性
- 專門針對俄語:該模型是專門為俄語設計的句子編碼器,能夠有效處理俄語句子和段落。
- 高維向量空間映射:將句子和段落映射到 1024 維的密集向量空間,便於進行聚類和語義搜索等任務。
- 多方式使用:可以使用
sentence-transformers
庫、transformers
庫或 FlagEmbedding
庫進行調用。
📦 安裝指南
使用此模型前,請確保已安裝 sentence-transformers
:
pip install -U sentence-transformers
💻 使用示例
基礎用法
from sentence_transformers import SentenceTransformer
input_texts = [
"Когда был спущен на воду первый миноносец «Спокойный»?",
"Есть ли нефть в Удмуртии?",
"Спокойный (эсминец)\nЗачислен в списки ВМФ СССР 19 августа 1952 года.",
"Нефтепоисковые работы в Удмуртии были начаты сразу после Второй мировой войны в 1945 году и продолжаются по сей день. Добыча нефти началась в 1967 году."
]
model = SentenceTransformer("deepvk/USER-bge-m3")
embeddings = model.encode(input_texts, normalize_embeddings=True)
高級用法
import torch.nn.functional as F
from torch import Tensor, inference_mode
from transformers import AutoTokenizer, AutoModel
input_texts = [
"Когда был спущен на воду первый миноносец «Спокойный»?",
"Есть ли нефть в Удмуртии?",
"Спокойный (эсминец)\nЗачислен в списки ВМФ СССР 19 августа 1952 года.",
"Нефтепоисковые работы в Удмуртии были начаты сразу после Второй мировой войны в 1945 году и продолжаются по сей день. Добыча нефти началась в 1967 году."
]
tokenizer = AutoTokenizer.from_pretrained("deepvk/USER-bge-m3")
model = AutoModel.from_pretrained("deepvk/USER-bge-m3")
model.eval()
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
with torch.no_grad():
model_output = model(**encoded_input)
sentence_embeddings = model_output[0][:, 0]
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
scores = (sentence_embeddings[:2] @ sentence_embeddings[2:].T)
此外,你還可以使用原生的 FlagEmbedding 庫進行評估,具體用法可參考 bge-m3
模型卡片。
📚 詳細文檔
訓練詳情
我們遵循 USER-base
模型的訓練算法,但由於使用了不同的主幹網絡,進行了一些調整。
初始化:基於 TatonkaHF/bge-m3_en_ru
進行初始化,這是 baai/bge-m3
的精簡版本,僅支持俄語和英語標記。
微調:基於數據對稱性對兩個不同的模型進行有監督的微調,然後通過 LM-Cocktail
進行合併:
- 由於我們對數據進行了分割,因此可以對對稱模型額外應用 AnglE 損失,以提高對稱任務的性能。
- 最後,我們將原始的
bge-m3
模型添加到兩個微調後的模型中,以防止災難性遺忘,並使用 LM-Cocktail
調整合並的權重,得到最終的模型 USER-bge-m3。
數據集
在模型開發過程中,我們額外收集了 2 個數據集:
deepvk/ru-HNP
和
deepvk/ru-WANLI
。
總正樣本對:2,240,961
總負樣本對:792,644(來自 AIINLI、MIRACL、deepvk/ru-WANLI、deepvk/ru-HNP 的負樣本對)
對於所有有標籤的數據集,我們僅使用其訓練集進行微調。
對於 Gazeta、Mlsum、Xlsum 數據集,將(標題/文本)和(標題/摘要)對組合起來作為非對稱數據使用。
AllNLI
是 SNLI、MNLI 和 ANLI 的俄語翻譯組合。
實驗
我們在 encodechka
基準測試中,將我們的模型與基礎的 baai/bge-m3
進行了比較。此外,我們還在 MTEB
的俄語子集上對模型進行了評估,包括分類、重排序、多標籤分類、語義文本相似度(STS)、檢索和配對分類等任務。我們使用了每個任務官方倉庫中的驗證腳本。
encodechka 測試結果
模型 |
平均 S |
平均 S+W |
STS |
PI |
NLI |
SA |
TI |
IA |
IC |
ICX |
NE1 |
NE2 |
baai/bge-m3 |
0.787 |
0.696 |
0.86 |
0.75 |
0.51 |
0.82 |
0.97 |
0.79 |
0.81 |
0.78 |
0.24 |
0.42 |
USER-bge-m3 |
0.799 |
0.709 |
0.87 |
0.76 |
0.58 |
0.82 |
0.97 |
0.79 |
0.81 |
0.78 |
0.28 |
0.43 |
MTEB 測試結果
類型 |
baai/bge-m3 |
USER-bge-m3 |
平均(30 個數據集) |
0.689 |
0.706 |
分類平均(12 個數據集) |
0.571 |
0.594 |
重排序平均(2 個數據集) |
0.698 |
0.688 |
多標籤分類(2 個數據集) |
0.343 |
0.359 |
STS 平均(4 個數據集) |
0.735 |
0.753 |
檢索平均(6 個數據集) |
0.945 |
0.934 |
配對分類平均(4 個數據集) |
0.784 |
0.833 |
🔧 技術細節
我們遵循了特定的訓練算法,並對模型進行了微調。具體來說,我們使用了不同的主幹網絡,並在訓練過程中進行了一些調整。我們還使用了多個數據集進行訓練和評估,以確保模型的性能和泛化能力。
📄 許可證
本項目採用 Apache-2.0 許可證。
🔖 引用
@misc{deepvk2024user,
title={USER: Universal Sentence Encoder for Russian},
author={Malashenko, Boris and Zemerov, Anton and Spirin, Egor},
url={https://huggingface.co/datasets/deepvk/USER-base},
publisher={Hugging Face}
year={2024},
}
⚠️ 注意事項
我們尚未對模型的稀疏和多向量編碼能力進行全面評估。在使用模型時,請根據實際需求進行測試和驗證。