File size: 12,495 Bytes
b8cced1
e0e7b10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b8cced1
e0e7b10
 
 
b8cced1
e0e7b10
 
 
 
 
8ae7293
e0e7b10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
---



language:
- ru
- en

pipeline_tag: sentence-similarity

tags:
- russian
- pretraining
- embeddings
- tiny
- feature-extraction
- sentence-similarity
- sentence-transformers
- transformers

datasets:
- IlyaGusev/gazeta
- zloelias/lenta-ru
- HuggingFaceFW/fineweb-2
- HuggingFaceFW/fineweb

license: mit

base_model: sergeyzh/rubert-mini-sts

---


## rubert-mini-uncased

Модель для расчетов эмбеддингов предложений на русском и английском языках получена методом дистилляции эмбеддингов [ai-forever/FRIDA](https://huggingface.co/ai-forever/FRIDA) (размер эмбеддингов - 1536, слоёв - 24). Основной режим использования FRIDA - CLS pooling заменен на mean pooling. Каких-либо других  изменений поведения модели (модификации или фильтрации эмбеддингов, использования дополнительной модели) не производилось. Дистиляция выполнена в максимально возможном объеме - эмбеддинги русских и английских предложений, работа префиксов. 

Модель принадлежит к виду uncased - не различает при обработке текста буквы, написанные в верхнем и нижнем регистре (фразы, например, "С Новым Годом!" и "С НОВЫМ ГОДОМ!" кодируются одинаковой последовательностью токенов и имеют равные значения эмбеддингов). Размер эмбеддингов модели - 384, слоёв - 7. Размер контекста модели соответствует FRIDA - 512 токенов.

## Префиксы
Все префиксы унаследованы от FRIDA. 

Перечень используемых префиксов и их влияние на оценки модели в [encodechka](https://github.com/avidale/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   |





**Задачи:**



- Semantic text similarity (**STS**);

- Paraphrase identification (**PI**);

- Natural language inference (**NLI**);

- Sentiment analysis (**SA**);

- Toxicity identification (**TI**).







# Метрики

Оценки модели на бенчмарке [ruMTEB](https://habr.com/ru/companies/sberdevices/articles/831150/):



|Model Name                         | Metric              | Frida                  | rubert-mini-uncased | [rubert-mini-frida](https://huggingface.co/sergeyzh/rubert-mini-frida)| multilingual-e5-large-instruct | multilingual-e5-large |

|:----------------------------------|:--------------------|-----------------------:|--------------------:|--------------------:|---------------------:|----------------------:|

|CEDRClassification                 | Accuracy            |       **0.646**        |         0.586       |        0.552        |        0.500         |         0.448         |

|GeoreviewClassification            | Accuracy            |       **0.577**        |         0.485       |        0.464        |        0.559         |         0.497         |

|GeoreviewClusteringP2P             | V-measure           |       **0.783**        |         0.683       |        0.698        |        0.743         |         0.605         |

|HeadlineClassification             | Accuracy            |       **0.890**        |         0.884       |        0.882        |        0.862         |         0.758         |

|InappropriatenessClassification    | Accuracy            |       **0.783**        |         0.705       |        0.698        |        0.655         |         0.616         |

|KinopoiskClassification            | Accuracy            |       **0.705**        |         0.607       |        0.595        |        0.661         |         0.566         |

|RiaNewsRetrieval                   | NDCG@10             |       **0.868**        |         0.791       |        0.721        |        0.824         |         0.807         |

|RuBQReranking                      | MAP@10              |       **0.771**        |         0.713       |        0.711        |        0.717         |         0.756         |

|RuBQRetrieval                      | NDCG@10             |         0.724          |         0.640       |        0.654        |        0.692         |       **0.741**       |

|RuReviewsClassification            | Accuracy            |       **0.751**        |         0.684       |        0.658        |        0.686         |         0.653         |

|RuSTSBenchmarkSTS                  | Pearson correlation |         0.814          |         0.795       |        0.803        |      **0.840**       |         0.831         |

|RuSciBenchGRNTIClassification      | Accuracy            |       **0.699**        |         0.653       |        0.625        |        0.651         |         0.582         |

|RuSciBenchGRNTIClusteringP2P       | V-measure           |       **0.670**        |         0.618       |        0.586        |        0.622         |         0.520         |

|RuSciBenchOECDClassification       | Accuracy            |       **0.546**        |         0.509       |        0.491        |        0.502         |         0.445         |

|RuSciBenchOECDClusteringP2P        | V-measure           |       **0.566**        |         0.525       |        0.507        |        0.528         |         0.450         |

|SensitiveTopicsClassification      | Accuracy            |       **0.398**        |         0.365       |        0.373        |        0.323         |         0.257         |

|TERRaClassification                | Average Precision   |       **0.665**        |         0.604       |        0.604        |        0.639         |         0.584         |



|Model Name                         | Metric              | Frida                  | rubert-mini-uncased | [rubert-mini-frida](https://huggingface.co/sergeyzh/rubert-mini-frida) | multilingual-e5-large-instruct | multilingual-e5-large |

|:----------------------------------|:--------------------|-----------------------:|--------------------:|--------------------:|----------------------:|---------------------:|

|Classification                     | Accuracy            |       **0.707**        |        0.657        |        0.631        |        0.654          |        0.588         |

|Clustering                         | V-measure           |       **0.673**        |        0.608        |        0.597        |        0.631          |        0.525         |

|MultiLabelClassification           | Accuracy            |       **0.522**        |        0.476        |        0.463        |        0.412          |        0.353         |

|PairClassification                 | Average Precision   |       **0.665**        |        0.604        |        0.604        |        0.639          |        0.584         |

|Reranking                          | MAP@10              |       **0.771**        |        0.713        |        0.711        |        0.717          |        0.756         |

|Retrieval                          | NDCG@10             |       **0.796**        |        0.715        |        0.687        |        0.758          |        0.774         |

|STS                                | Pearson correlation |         0.814          |        0.795        |        0.803        |      **0.840**        |        0.831         |

|Average                            | Average             |       **0.707**        |        0.653        |        0.642        |        0.664          |        0.630         |







## Использование модели с библиотекой `transformers`:



```python

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())
# [0.9366128444671631, 0.8030662536621094, 0.6826460957527161]
# [0.9360030293464661, 0.8591322302818298, 0.728583037853241] - FRIDA
```





## Использование с `sentence_transformers` (sentence-transformers>=2.4.0):



```python

from sentence_transformers import SentenceTransformer



# loads model with mean pooling

model = SentenceTransformer("sergeyzh/rubert-mini-uncased")



paraphrase = model.encode(["В Ярославской области разрешили работу бань, но без посетителей", "Ярославским баням разрешили работать без посетителей"], prompt="paraphrase: ")

print(paraphrase[0] @ paraphrase[1].T) 



# 0.9366129

# 0.9360032 - FRIDA



categorize_entailment = model.encode(["Женщину доставили в больницу, за ее жизнь сейчас борются врачи.", "Женщину спасают врачи."], prompt="categorize_entailment: ")

print(categorize_entailment[0] @ categorize_entailment[1].T) 

# 0.80306643

# 0.8591322 - FRIDA



query_embedding = model.encode("Сколько программистов нужно, чтобы вкрутить лампочку?", prompt="search_query: ")

document_embedding = model.encode("Чтобы вкрутить лампочку, требуется три программиста: один напишет программу извлечения лампочки, другой — вкручивания лампочки, а третий проведет тестирование.", prompt="search_document: ")

print(query_embedding @ document_embedding.T) 

# 0.68264616

# 0.7285831 - FRIDA

```