sergeyzh commited on
Commit
19b279b
·
verified ·
1 Parent(s): 8de55e4

Upload 11 files

Browse files
1_Pooling/config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "word_embedding_dimension": 312,
3
+ "pooling_mode_cls_token": false,
4
+ "pooling_mode_mean_tokens": true,
5
+ "pooling_mode_max_tokens": false,
6
+ "pooling_mode_mean_sqrt_len_tokens": false
7
+ }
README.md CHANGED
@@ -1,3 +1,197 @@
1
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  license: mit
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ language:
3
+ - ru
4
+ - en
5
+
6
+ pipeline_tag: sentence-similarity
7
+
8
+ tags:
9
+ - russian
10
+ - pretraining
11
+ - embeddings
12
+ - tiny
13
+ - feature-extraction
14
+ - sentence-similarity
15
+ - sentence-transformers
16
+ - transformers
17
+
18
+ datasets:
19
+ - IlyaGusev/gazeta
20
+ - zloelias/lenta-ru
21
+ - HuggingFaceFW/fineweb-2
22
+ - HuggingFaceFW/fineweb
23
+
24
  license: mit
25
+ base_model: sergeyzh/rubert-mini-sts
26
+
27
  ---
28
+
29
+ ## rubert-mini-frida - лёгкая и быстрая модификация FRIDA
30
+
31
+ Модель для расчетов эмбеддингов предложений на русском и английском языках получена методом дистилляции эмбеддингов [ai-forever/FRIDA](https://huggingface.co/ai-forever/FRIDA) (размер эмбеддингов - 1536, слоёв - 24) в [sergeyzh/rubert-mini-sts](https://huggingface.co/sergeyzh/rubert-mini-sts) (размер эмбеддингов - 312, слоёв - 7). Основной режим использования FRIDA - CLS pooling заменен на mean pooling. Каких-либо других изменений поведения модели (модификации или фильтрации эмбеддингов, использования дополнительной модели) не производилось. Дистиляция выполнена в максимально возможном объеме - эмбеддинги русских и английских предложений, работа префиксов.
32
+
33
+ Рекомендуемый размер контекста модели соответствует FRIDA и не превышает 512 токенов (фактический унаследованный от исходной модели - 2048).
34
+
35
+ ## Префиксы
36
+ Все префиксы унаследованы от FRIDA.
37
+ Оптимальный (обеспечивающий средние результаты) для большинства задач - "categorize: " прописан по умолчанию в [config_sentence_transformers.json](https://huggingface.co/sergeyzh/rubert-mini-frida/config_sentence_transformers.json)
38
+
39
+ Перечень используемых префиксов и их влияние на оценки модели в [encodechka](https://github.com/avidale/encodechka):
40
+
41
+ | Префикс | STS | PI | NLI | SA | TI |
42
+ |:-----------------------|:---------:|:---------:|:---------:|:---------:|:---------:|
43
+ | - | 0.839 | 0.762 | 0.475 | 0.801 | 0.972 |
44
+ | search_query: | 0.846 | 0.761 | 0.498 | 0.800 | 0.973 |
45
+ | search_document: | 0.830 | 0.748 | 0.468 | 0.794 | 0.972 |
46
+ | paraphrase: | 0.835 | **0.764** | 0.475 | 0.799 | 0.973 |
47
+ | categorize: | **0.850** | 0.761 | 0.516 | 0.802 | **0.973** |
48
+ | categorize_sentiment: | 0.755 | 0.656 | 0.427 | 0.798 | 0.959 |
49
+ | categorize_topic: | 0.734 | 0.523 | 0.389 | 0.728 | 0.959 |
50
+ | categorize_entailment: | 0.837 | 0.753 | **0.544** | **0.802** | 0.970 |
51
+
52
+
53
+ **Задачи:**
54
+
55
+ - Semantic text similarity (**STS**);
56
+ - Paraphrase identification (**PI**);
57
+ - Natural language inference (**NLI**);
58
+ - Sentiment analysis (**SA**);
59
+ - Toxicity identification (**TI**).
60
+
61
+ # Метрики
62
+ Оценки модели на бенчмарке [ruMTEB](https://habr.com/ru/companies/sberdevices/articles/831150/):
63
+
64
+ |Model Name | Metric | Frida | rubert-mini-frida | multilingual-e5-large-instruct | multilingual-e5-large |
65
+ |:----------------------------------|:--------------------|-----------------------:|--------------------:|---------------------:|----------------------:|
66
+ |CEDRClassification | Accuracy | **0.646** | 0.552 | 0.500 | 0.448 |
67
+ |GeoreviewClassification | Accuracy | **0.577** | 0.464 | 0.559 | 0.497 |
68
+ |GeoreviewClusteringP2P | V-measure | **0.783** | 0.698 | 0.743 | 0.605 |
69
+ |HeadlineClassification | Accuracy | **0.890** | 0.880 | 0.862 | 0.758 |
70
+ |InappropriatenessClassification | Accuracy | **0.783** | 0.698 | 0.655 | 0.616 |
71
+ |KinopoiskClassification | Accuracy | **0.705** | 0.595 | 0.661 | 0.566 |
72
+ |RiaNewsRetrieval | NDCG@10 | **0.868** | 0.721 | 0.824 | 0.807 |
73
+ |RuBQReranking | MAP@10 | **0.771** | 0.711 | 0.717 | 0.756 |
74
+ |RuBQRetrieval | NDCG@10 | 0.724 | 0.654 | 0.692 | **0.741** |
75
+ |RuReviewsClassification | Accuracy | **0.751** | 0.658 | 0.686 | 0.653 |
76
+ |RuSTSBenchmarkSTS | Pearson correlation | 0.814 | 0.803 | **0.840** | 0.831 |
77
+ |RuSciBenchGRNTIClassification | Accuracy | **0.699** | 0.625 | 0.651 | 0.582 |
78
+ |RuSciBenchGRNTIClusteringP2P | V-measure | **0.670** | 0.586 | 0.622 | 0.520 |
79
+ |RuSciBenchOECDClassification | Accuracy | **0.546** | 0.493 | 0.502 | 0.445 |
80
+ |RuSciBenchOECDClusteringP2P | V-measure | **0.566** | 0.507 | 0.528 | 0.450 |
81
+ |SensitiveTopicsClassification | Accuracy | **0.398** | 0.373 | 0.323 | 0.257 |
82
+ |TERRaClassification | Average Precision | **0.665** | 0.606 | 0.639 | 0.584 |
83
+
84
+ |Model Name | Metric | Frida | rubert-mini-frida | multilingual-e5-large-instruct | multilingual-e5-large |
85
+ |:----------------------------------|:--------------------|-----------------------:|--------------------:|----------------------:|---------------------:|
86
+ |Classification | Accuracy | **0.707** | 0.631 | 0.654 | 0.588 |
87
+ |Clustering | V-measure | **0.673** | 0.597 | 0.631 | 0.525 |
88
+ |MultiLabelClassification | Accuracy | **0.522** | 0.463 | 0.412 | 0.353 |
89
+ |PairClassification | Average Precision | **0.665** | 0.606 | 0.639 | 0.584 |
90
+ |Reranking | MAP@10 | **0.771** | 0.711 | 0.717 | 0.756 |
91
+ |Retrieval | NDCG@10 | **0.796** | 0.687 | 0.758 | 0.774 |
92
+ |STS | Pearson correlation | 0.814 | 0.803 | **0.840** | 0.831 |
93
+ |Average | Average | **0.707** | 0.643 | 0.664 | 0.630 |
94
+
95
+
96
+
97
+ ## Использование модели с библиотекой `transformers`:
98
+
99
+ ```python
100
+ import torch
101
+ import torch.nn.functional as F
102
+ from transformers import AutoTokenizer, AutoModel
103
+
104
+
105
+ def pool(hidden_state, mask, pooling_method="mean"):
106
+ if pooling_method == "mean":
107
+ s = torch.sum(hidden_state * mask.unsqueeze(-1).float(), dim=1)
108
+ d = mask.sum(axis=1, keepdim=True).float()
109
+ return s / d
110
+ elif pooling_method == "cls":
111
+ return hidden_state[:, 0]
112
+
113
+ inputs = [
114
+ #
115
+ "paraphrase: В Ярославской области разрешили работу бань, но без посетителей",
116
+ "categorize_entailment: Женщину доставили в больницу, за ее жизнь сейчас борются врачи.",
117
+ "search_query: Сколько программистов нужно, чтобы вкрутить лампочку?",
118
+ #
119
+ "paraphrase: Ярославским баням разрешили работать без посетителей",
120
+ "categorize_entailment: Женщину спасают врачи.",
121
+ "search_document: Чтобы вкрутить лампочку, требуется три программиста: один напишет программу извлечения лампочки, другой — вкручивания лампочки, а третий проведет тестирование."
122
+ ]
123
+
124
+ tokenizer = AutoTokenizer.from_pretrained("sergeyzh/rubert-mini-frida")
125
+ model = AutoModel.from_pretrained("sergeyzh/rubert-mini-frida")
126
+
127
+ tokenized_inputs = tokenizer(inputs, max_length=512, padding=True, truncation=True, return_tensors="pt")
128
+
129
+ with torch.no_grad():
130
+ outputs = model(**tokenized_inputs)
131
+
132
+ embeddings = pool(
133
+ outputs.last_hidden_state,
134
+ tokenized_inputs["attention_mask"],
135
+ pooling_method="mean"
136
+ )
137
+
138
+ embeddings = F.normalize(embeddings, p=2, dim=1)
139
+ sim_scores = embeddings[:3] @ embeddings[3:].T
140
+ print(sim_scores.diag().tolist())
141
+ # [0.9423348903656006, 0.8306248188018799, 0.7095720767974854]
142
+ # [0.9360030293464661, 0.8591322302818298, 0.728583037853241] - FRIDA
143
+ ```
144
+
145
+ ## Использование с `sentence_transformers`:
146
+
147
+ ```python
148
+ from sentence_transformers import SentenceTransformer
149
+
150
+ inputs = [
151
+ #
152
+ "paraphrase: В Ярославской области разрешили работу бань, но без посетителей",
153
+ "categorize_entailment: Женщину доставили в больницу, за ее жизнь сейчас борются врачи.",
154
+ "search_query: Сколько программистов нужно, чтобы вкрутить лампочку?",
155
+ #
156
+ "paraphrase: Ярославским баням разрешили работать без посетителей",
157
+ "categorize_entailment: Женщину спасают врачи.",
158
+ "search_document: Чтобы вкрутить лампочку, требуется три программиста: один напишет программу извлечения лампочки, другой — вкручивания лампочки, а третий проведет тестирование."
159
+ ]
160
+
161
+ # loads model with mean pooling
162
+ model = SentenceTransformer("sergeyzh/rubert-mini-frida")
163
+
164
+ # embeddings are normalized by default
165
+ embeddings = model.encode(inputs, convert_to_tensor=True)
166
+
167
+ sim_scores = embeddings[:3] @ embeddings[3:].T
168
+ print(sim_scores.diag().tolist())
169
+ # [0.9413310289382935, 0.8383190631866455, 0.7195918560028076]
170
+ # [0.9360026717185974, 0.8591331243515015, 0.7285830974578857] - FRIDA
171
+ ```
172
+
173
+ ### рекомендуемый с использованием prompt (sentence-transformers>=2.4.0):
174
+
175
+ ```python
176
+ from sentence_transformers import SentenceTransformer
177
+
178
+ # loads model with mean pooling
179
+ model = SentenceTransformer("sergeyzh/rubert-mini-frida")
180
+
181
+ paraphrase = model.encode(["В Ярославской области разрешили работу бань, но без посетителей", "Ярославским баням разрешили работать без посетителей"], prompt="paraphrase: ")
182
+ print(paraphrase[0] @ paraphrase[1].T)
183
+ # 0.94233495
184
+ # 0.9360032 - FRIDA
185
+
186
+ categorize_entailment = model.encode(["Женщину доставили в больницу, за ее жизнь сейчас борются врачи.", "Женщину спасают врачи."], prompt="categorize_entailment: ")
187
+ print(categorize_entailment[0] @ categorize_entailment[1].T)
188
+ # 0.8306249
189
+ # 0.8591322 - FRIDA
190
+
191
+ query_embedding = model.encode("Сколько программистов нужно, чтобы вкрутить лампочку?", prompt="search_query: ")
192
+ document_embedding = model.encode("Чтобы вкрутить лампочку, требуется три программиста: один напишет программу извлечения лампочки, другой — вкручивания лампочки, а третий проведет тестирование.", prompt="search_document: ")
193
+ print(query_embedding @ document_embedding.T)
194
+ # 0.70957196
195
+ # 0.7285831 - FRIDA
196
+ ```
197
+
config.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "sergeyzh/rubert-mini-frida",
3
+ "architectures": [
4
+ "BertModel"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.1,
7
+ "classifier_dropout": null,
8
+ "emb_size": 312,
9
+ "gradient_checkpointing": false,
10
+ "hidden_act": "gelu",
11
+ "hidden_dropout_prob": 0.1,
12
+ "hidden_size": 312,
13
+ "initializer_range": 0.02,
14
+ "intermediate_size": 600,
15
+ "layer_norm_eps": 1e-12,
16
+ "max_position_embeddings": 2048,
17
+ "model_type": "bert",
18
+ "num_attention_heads": 12,
19
+ "num_hidden_layers": 7,
20
+ "pad_token_id": 0,
21
+ "position_embedding_type": "absolute",
22
+ "torch_dtype": "float32",
23
+ "transformers_version": "4.48.2",
24
+ "type_vocab_size": 2,
25
+ "use_cache": true,
26
+ "vocab_size": 83828
27
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "2.7.0",
4
+ "transformers": "4.40.1",
5
+ "pytorch": "2.2.1+cu118"
6
+ },
7
+ "prompts": {
8
+ "query": "search_query: ",
9
+ "passage": "search_document: ",
10
+ "CEDRClassification": "categorize_sentiment: ",
11
+ "GeoreviewClassification": "categorize_entailment: ",
12
+ "GeoreviewClusteringP2P": "paraphrase: ",
13
+ "HeadlineClassification": "categorize_topic: ",
14
+ "InappropriatenessClassification": "categorize_topic: ",
15
+ "KinopoiskClassification": "categorize_sentiment: ",
16
+ "MassiveIntentClassification": "categorize_entailment: ",
17
+ "MassiveScenarioClassification": "categorize_entailment: ",
18
+ "RuReviewsClassification": "categorize_entailment: ",
19
+ "RUParaPhraserSTS": "paraphrase: ",
20
+ "RuSTSBenchmarkSTS": "search_query: ",
21
+ "STS22": "paraphrase: ",
22
+ "RuSciBenchGRNTIClassification": "categorize_topic: ",
23
+ "RuSciBenchGRNTIClusteringP2P": "categorize_topic: ",
24
+ "RuSciBenchOECDClassification": "categorize_topic: ",
25
+ "RuSciBenchOECDClusteringP2P": "categorize_topic: ",
26
+ "SensitiveTopicsClassification": "categorize_topic: ",
27
+ "TERRa": "categorize_entailment: ",
28
+ "Classification": "categorize: ",
29
+ "MultilabelClassification": "categorize: ",
30
+ "Clustering": "categorize: ",
31
+ "PairClassification": "categorize: ",
32
+ "STS": "paraphrase: "
33
+ },
34
+ "default_prompt_name": "Classification",
35
+ "similarity_fn_name": null
36
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f7f7e9866e57e7f19f76d3960373177f30c6ac627a8c6a677472d526f44d1cd
3
+ size 129063328
modules.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.models.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.models.Pooling"
13
+ },
14
+ {
15
+ "idx": 2,
16
+ "name": "2",
17
+ "path": "2_Normalize",
18
+ "type": "sentence_transformers.models.Normalize"
19
+ }
20
+ ]
sentence_bert_config.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "max_seq_length": 2048,
3
+ "do_lower_case": false
4
+ }
special_tokens_map.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": {
3
+ "content": "[CLS]",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "mask_token": {
10
+ "content": "[MASK]",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "pad_token": {
17
+ "content": "[PAD]",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "sep_token": {
24
+ "content": "[SEP]",
25
+ "lstrip": false,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "unk_token": {
31
+ "content": "[UNK]",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ }
37
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "[PAD]",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "1": {
12
+ "content": "[UNK]",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "2": {
20
+ "content": "[CLS]",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "3": {
28
+ "content": "[SEP]",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "4": {
36
+ "content": "[MASK]",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "clean_up_tokenization_spaces": true,
45
+ "cls_token": "[CLS]",
46
+ "do_basic_tokenize": true,
47
+ "do_lower_case": false,
48
+ "mask_token": "[MASK]",
49
+ "model_max_length": 2048,
50
+ "never_split": null,
51
+ "pad_token": "[PAD]",
52
+ "sep_token": "[SEP]",
53
+ "strip_accents": null,
54
+ "tokenize_chinese_chars": true,
55
+ "tokenizer_class": "BertTokenizer",
56
+ "unk_token": "[UNK]"
57
+ }
vocab.txt ADDED
The diff for this file is too large to render. See raw diff