andreasmartin commited on
Commit
8a0a543
·
verified ·
1 Parent(s): 34f9f2c

Update standalone Apertus embedding model: moe_head

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
1_Pooling/config.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "embedding_dimension": 1024,
3
+ "pooling_mode": "mean",
4
+ "include_prompt": true
5
+ }
2_LanguageMoE/config.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "hidden_size": 1024,
3
+ "embedding_dim": 1024,
4
+ "expert_names": [
5
+ "de",
6
+ "en",
7
+ "fr",
8
+ "it",
9
+ "rm",
10
+ "gsw",
11
+ "shared"
12
+ ],
13
+ "top_k": 2,
14
+ "temperature": 1.0
15
+ }
language_moe_head.pt → 2_LanguageMoE/model.safetensors RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:58d2b1243e87e4d86d8d90606b08fd486689bc096f86118beccc874d6fb93952
3
- size 29392735
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c7544c30354147275e494c847a59ff011e09ef467210ff64c6bfd7d11b941caf
3
+ size 14695206
README.md CHANGED
@@ -1,5 +1,8 @@
1
  ---
 
 
2
  license: apache-2.0
 
3
  datasets:
4
  - wikimedia/wikipedia
5
  - eljuanina/VotingBooklets-v1
@@ -12,52 +15,177 @@ language:
12
  - rm
13
  - gsw
14
  tags:
 
15
  - embeddings
16
  - retrieval
17
  - multilingual
18
  - swiss
19
  - apertus
 
20
  - bidirectional
21
  - matryoshka
 
 
 
22
  ---
23
 
24
- # Apertus Swiss Embedding Experiment moe_head
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- Language-MoE projection with 7 experts (de, en, fr, it, rm, gsw, shared), learned Top-2 routing. Base model: `andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir` at revision `a6f4b025ee825eec8be04d1132c9e24f20841778`.
 
27
 
28
- Effective parameters: **445,696,559**
29
 
30
- Training profile: **`size_optimized`**
31
 
32
- ## Internal diagnostics
 
 
 
 
 
33
 
34
- | Set | Dim | Accuracy@1 | Recall@10 | nDCG@10 | MRR@10 |
35
- |---|---:|---:|---:|---:|---:|
36
- | Swiss mono | 1024 | 0.8125 | 0.9229 | 0.8665 | 0.8487 |
37
- | Swiss mono | 512 | 0.8063 | 0.9208 | 0.8639 | 0.8458 |
38
- | Swiss cross | 1024 | 0.3083 | 0.9667 | 0.6669 | 0.5672 |
39
- | Swiss cross | 512 | 0.3104 | 0.9667 | 0.6670 | 0.5675 |
40
 
41
- These are internal development diagnostics, not MTEB/MMTEB claims.
42
 
43
- ## Data
 
44
 
45
- Training: `wikimedia/wikipedia`, `eljuanina/VotingBooklets-v1`, `ZurichNLP/SwissGov-RSD`.
 
46
 
47
- `eljuanina/VotingBooklets-Diamond-v1` is evaluation-only.
48
 
49
- ## Retrieval preprocessing
 
 
50
 
51
- Plain-text prefixes only:
 
52
 
53
- - query: `query: `
54
- - document: `passage: `
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
- Inherited LLM chat templates are not part of the retrieval input pipeline.
57
 
 
 
 
 
 
 
 
 
58
 
59
- ## Experimental note
60
 
61
- This repository is an experimental Language-MoE head artifact, not yet a drop-in
62
- Sentence Transformers release. `language_moe_config.json` pins the dense initializer
63
- revision and `language_moe_head.pt` contains the learned router/expert parameters.
 
1
  ---
2
+ library_name: sentence-transformers
3
+ pipeline_tag: sentence-similarity
4
  license: apache-2.0
5
+ base_model: andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir
6
  datasets:
7
  - wikimedia/wikipedia
8
  - eljuanina/VotingBooklets-v1
 
15
  - rm
16
  - gsw
17
  tags:
18
+ - sentence-transformers
19
  - embeddings
20
  - retrieval
21
  - multilingual
22
  - swiss
23
  - apertus
24
+ - apertus-1.1
25
  - bidirectional
26
  - matryoshka
27
+ - moe
28
+ - language-moe
29
+ - sparse-routing
30
  ---
31
 
32
+ # Apertus v1.1 Swiss EmbedLanguage-MoE
33
+
34
+ A standalone Sentence Transformers retrieval model based on
35
+ [`andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir`](https://huggingface.co/andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir).
36
+
37
+ The model retains the trained **dense bidirectional Apertus encoder backbone** and replaces
38
+ the parent's single dense embedding projection with a learned **Language-MoE projection
39
+ head**.
40
+
41
+ > This release is a **dense-backbone + sparse Language-MoE head**, not a backbone-level
42
+ > native MoE model.
43
+
44
+ ## Architecture
45
+
46
+ ```text
47
+ plain retrieval text
48
+
49
+ bidirectional Apertus encoder
50
+
51
+ mean pooling
52
+
53
+ Language-MoE router
54
+
55
+ Top-2 of:
56
+ DE / EN / FR / IT / RM / GSW / shared
57
+
58
+ 1024d projection
59
+
60
+ L2 normalization
61
+ ```
62
+
63
+ | Property | Value |
64
+ |---|---|
65
+ | Total parameters | **445,696,559 (0.446B)** |
66
+ | Active parameters / sentence | **440,453,679** |
67
+ | Language-MoE head parameters | **7,347,207** |
68
+ | Active head parameters / sentence | **2,104,327** |
69
+ | Router parameters | 7,175 |
70
+ | Parameters / expert | 1,048,576 |
71
+ | Experts | 7 |
72
+ | Active experts / sentence | 2 |
73
+ | Native embedding dimension | **1024** |
74
+ | Matryoshka dimensions | `[1024, 768, 512, 256]` |
75
+ | MoE training max length | **256 tokens** |
76
+ | Inference max length | **1024 tokens** |
77
+ | Sparse/reference max abs diff | `1.907e-06` |
78
+
79
+ ## Sentence Transformers usage
80
+
81
+ `LanguageMoE` is a custom Sentence Transformers module, so load the trusted repository with
82
+ `trust_remote_code=True`:
83
+
84
+ ```python
85
+ from sentence_transformers import SentenceTransformer
86
+
87
+ model = SentenceTransformer(
88
+ "andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir-langmoe",
89
+ trust_remote_code=True,
90
+ )
91
+
92
+ queries = model.encode_query([
93
+ "Welche Aufgaben hat der Bundesrat?"
94
+ ])
95
+
96
+ documents = model.encode_document([
97
+ "Le Conseil fédéral est l'autorité exécutive suprême de la Confédération suisse.",
98
+ "Der Nationalrat ist die grosse Kammer der Bundesversammlung.",
99
+ ])
100
+
101
+ scores = model.similarity(queries, documents)
102
+ print(scores)
103
+ ```
104
+
105
+ For a compact Matryoshka representation:
106
+
107
+ ```python
108
+ embeddings = model.encode_query(
109
+ texts,
110
+ truncate_dim=512,
111
+ )
112
+ ```
113
+
114
+ The stored retrieval prefixes are:
115
 
116
+ - query: `query: `
117
+ - document: `passage: `
118
 
119
+ No chat template is used.
120
 
121
+ ## Lineage
122
 
123
+ | Property | Value |
124
+ |---|---|
125
+ | Original source | [`swiss-ai/Apertus-v1.1-0.5B`](https://huggingface.co/swiss-ai/Apertus-v1.1-0.5B) |
126
+ | Dense embedding parent | [`andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir`](https://huggingface.co/andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir) |
127
+ | Dense parent revision | `a6f4b025ee825eec8be04d1132c9e24f20841778` |
128
+ | Apertus lineage | [`swiss-ai/Apertus-8B-2509`](https://huggingface.co/swiss-ai/Apertus-8B-2509) |
129
 
130
+ The repository contains the complete transformer/tokenizer/pooling/MoE/normalization pipeline.
131
+ The dense parent is **not fetched at inference time**.
 
 
 
 
132
 
133
+ ## Language-MoE training
134
 
135
+ The dense embedding backbone was frozen. Its pooled hidden states were cached once and the
136
+ router + expert projections were trained for the controlled MoE-head ablation.
137
 
138
+ See `training_metadata.json` for the exact cache/training history and
139
+ `router_diagnostics.json` for held-out routing counts.
140
 
141
+ Training data:
142
 
143
+ - [`wikimedia/wikipedia`](https://huggingface.co/datasets/wikimedia/wikipedia)
144
+ - [`eljuanina/VotingBooklets-v1`](https://huggingface.co/datasets/eljuanina/VotingBooklets-v1)
145
+ - [`ZurichNLP/SwissGov-RSD`](https://huggingface.co/datasets/ZurichNLP/SwissGov-RSD)
146
 
147
+ `eljuanina/VotingBooklets-Diamond-v1` is held-out evaluation-only and is therefore not listed in the
148
+ training dataset metadata.
149
 
150
+ Actual training set: **31,483 triplets**.
151
+
152
+ ## Internal retrieval diagnostics
153
+
154
+ These metrics are computed by reloading the **saved standalone Sentence Transformers model**.
155
+ They are internal development diagnostics, not MTEB/MMTEB benchmark claims.
156
+
157
+ | Diagnostic | Dim | Accuracy@1 | Recall@10 | nDCG@10 | MRR@10 |
158
+ |---|---:|---:|---:|---:|---:|
159
+ | Swiss monolingual | 1024 | 80.83% | 92.50% | 0.8651 | 0.8462 |
160
+ | Swiss monolingual | 512 | 79.17% | 92.08% | 0.8570 | 0.8366 |
161
+ | Swiss cross-lingual | 1024 | 30.00% | 96.67% | 0.6612 | 0.5598 |
162
+ | Swiss cross-lingual | 512 | 29.38% | 96.88% | 0.6584 | 0.5556 |
163
+
164
+ Monolingual evaluation queries: **480**
165
+ Cross-lingual evaluation queries: **480**
166
+
167
+ ## Router diagnostics
168
+
169
+ The held-out routing diagnostics are saved in `router_diagnostics.json`.
170
+
171
+ Recorded shared-expert Top-k selections in the held-out diagnostic:
172
+ **0**.
173
+
174
+ The declared language is used only as weak auxiliary supervision during MoE-head training;
175
+ no language ID is required at inference.
176
 
177
+ ## Limitations
178
 
179
+ - Sparse routing is currently in the embedding projection head; the Apertus backbone remains dense.
180
+ - Wikipedia title→paragraph pairs are pseudo-retrieval supervision.
181
+ - Parallel passages provide semantic alignment rather than natural search queries.
182
+ - External MTEB/MMTEB/MIRACL and Swiss/domain-specific evaluation is required for comparative claims.
183
+ - The MoE head was trained on pooled representations up to
184
+ 256 tokens. The packaged parent retains
185
+ 1024-token inference capability, but quality beyond
186
+ the MoE training context length has not yet been separately validated.
187
 
188
+ ## License and attribution
189
 
190
+ Apertus is developed by the Swiss AI Initiative. This is an independent retrieval/MoE
191
+ adaptation and not an official Swiss AI Initiative embedding release.
 
config.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "ApertusModel"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 1,
8
+ "dtype": "float16",
9
+ "eos_token_id": 2,
10
+ "hidden_act": "xielu",
11
+ "hidden_dropout": 0.0,
12
+ "hidden_size": 1024,
13
+ "initializer_range": 0.02,
14
+ "intermediate_size": 6144,
15
+ "is_causal": false,
16
+ "max_position_embeddings": 4096,
17
+ "mlp_bias": false,
18
+ "model_type": "apertus",
19
+ "num_attention_heads": 16,
20
+ "num_hidden_layers": 20,
21
+ "num_key_value_heads": 4,
22
+ "pad_token_id": 3,
23
+ "post_norm": false,
24
+ "qk_norm": true,
25
+ "rms_norm_eps": 1e-05,
26
+ "rope_parameters": {
27
+ "rope_theta": 500000.0,
28
+ "rope_type": "default"
29
+ },
30
+ "tie_word_embeddings": true,
31
+ "transformers_version": "5.14.1",
32
+ "use_cache": false,
33
+ "vocab_size": 131072
34
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "pytorch": "2.10.0+cu128",
4
+ "sentence_transformers": "5.6.1",
5
+ "transformers": "5.14.1"
6
+ },
7
+ "default_prompt_name": null,
8
+ "model_type": "SentenceTransformer",
9
+ "prompts": {
10
+ "document": "passage: ",
11
+ "query": "query: "
12
+ },
13
+ "similarity_fn_name": "dot"
14
+ }
language_moe.py ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Any
2
+
3
+ import torch
4
+ from torch import nn
5
+ from sentence_transformers.base.modules import Module
6
+
7
+
8
+ class LanguageMoE(Module):
9
+ config_keys = [
10
+ "hidden_size",
11
+ "embedding_dim",
12
+ "expert_names",
13
+ "top_k",
14
+ "temperature",
15
+ ]
16
+
17
+ def __init__(
18
+ self,
19
+ hidden_size: int,
20
+ embedding_dim: int,
21
+ expert_names: list[str],
22
+ top_k: int = 2,
23
+ temperature: float = 1.0,
24
+ **kwargs,
25
+ ) -> None:
26
+ super().__init__()
27
+ self.hidden_size = int(hidden_size)
28
+ self.embedding_dim = int(embedding_dim)
29
+ self.expert_names = list(expert_names)
30
+ self.top_k = int(top_k)
31
+ self.temperature = float(temperature)
32
+
33
+ assert 1 <= self.top_k <= len(self.expert_names)
34
+
35
+ self.router = nn.Linear(
36
+ self.hidden_size,
37
+ len(self.expert_names),
38
+ bias=True,
39
+ )
40
+ self.experts = nn.ModuleList([
41
+ nn.Linear(
42
+ self.hidden_size,
43
+ self.embedding_dim,
44
+ bias=False,
45
+ )
46
+ for _ in self.expert_names
47
+ ])
48
+
49
+ self.last_router_probs = None
50
+ self.last_top_indices = None
51
+
52
+ def route(self, x: torch.Tensor):
53
+ logits = self.router(x) / self.temperature
54
+ probs = torch.softmax(logits, dim=-1)
55
+
56
+ top_probs, top_idx = torch.topk(
57
+ probs,
58
+ k=self.top_k,
59
+ dim=-1,
60
+ )
61
+ gates = top_probs / top_probs.sum(
62
+ dim=-1,
63
+ keepdim=True,
64
+ ).clamp_min(1e-12)
65
+
66
+ return logits, probs, top_idx, gates
67
+
68
+ def project_sparse(
69
+ self,
70
+ x: torch.Tensor,
71
+ top_idx: torch.Tensor,
72
+ gates: torch.Tensor,
73
+ ) -> torch.Tensor:
74
+ output = x.new_zeros(
75
+ (x.shape[0], self.embedding_dim)
76
+ )
77
+
78
+ for expert_id, expert in enumerate(self.experts):
79
+ selected = top_idx.eq(expert_id)
80
+ rows, slots = selected.nonzero(as_tuple=True)
81
+
82
+ if rows.numel() == 0:
83
+ continue
84
+
85
+ expert_output = expert(x[rows])
86
+ expert_gate = gates[rows, slots].unsqueeze(-1)
87
+ output.index_add_(
88
+ 0,
89
+ rows,
90
+ expert_output * expert_gate,
91
+ )
92
+
93
+ return output
94
+
95
+ def forward(
96
+ self,
97
+ features: dict[str, torch.Tensor | Any],
98
+ **kwargs,
99
+ ) -> dict[str, torch.Tensor | Any]:
100
+ x = features["sentence_embedding"]
101
+ _, probs, top_idx, gates = self.route(x)
102
+
103
+ features["sentence_embedding"] = self.project_sparse(
104
+ x,
105
+ top_idx,
106
+ gates,
107
+ )
108
+
109
+ self.last_router_probs = probs.detach()
110
+ self.last_top_indices = top_idx.detach()
111
+
112
+ return features
113
+
114
+ def get_embedding_dimension(self) -> int:
115
+ return self.embedding_dim
116
+
117
+ def save(
118
+ self,
119
+ output_path: str,
120
+ *args,
121
+ safe_serialization: bool = True,
122
+ **kwargs,
123
+ ) -> None:
124
+ self.save_config(output_path)
125
+ self.save_torch_weights(
126
+ output_path,
127
+ safe_serialization=safe_serialization,
128
+ )
129
+
130
+ @classmethod
131
+ def load(
132
+ cls,
133
+ model_name_or_path: str,
134
+ subfolder: str = "",
135
+ token: bool | str | None = None,
136
+ cache_folder: str | None = None,
137
+ revision: str | None = None,
138
+ local_files_only: bool = False,
139
+ **kwargs,
140
+ ):
141
+ config = cls.load_config(
142
+ model_name_or_path,
143
+ subfolder=subfolder,
144
+ token=token,
145
+ cache_folder=cache_folder,
146
+ revision=revision,
147
+ local_files_only=local_files_only,
148
+ )
149
+ model = cls(**config)
150
+ return cls.load_torch_weights(
151
+ model_name_or_path,
152
+ subfolder=subfolder,
153
+ token=token,
154
+ cache_folder=cache_folder,
155
+ revision=revision,
156
+ local_files_only=local_files_only,
157
+ model=model,
158
+ )
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:210da7bac528f2eb9c3d5792ff4a6d5c8fb269ea5ad8b9f2797cf6e981a805fd
3
+ size 876727640
model_parameters.json CHANGED
@@ -1,10 +1,19 @@
1
  {
2
  "experiment_mode": "moe_head",
 
3
  "source_model": "swiss-ai/Apertus-v1.1-0.5B",
 
 
4
  "base_model": "andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir",
5
  "base_revision": "a6f4b025ee825eec8be04d1132c9e24f20841778",
6
  "hidden_size": 1024,
7
  "embedding_dimension": 1024,
 
 
 
 
 
 
8
  "expert_names": [
9
  "de",
10
  "en",
@@ -14,12 +23,20 @@
14
  "gsw",
15
  "shared"
16
  ],
17
- "top_k": 2,
18
- "head_parameters": 7347207,
 
 
 
 
19
  "base_parameters_including_old_dense": 439397928,
20
- "old_dense_parameters": 1048576,
21
- "effective_parameters": 445696559,
22
- "effective_parameters_billions": 0.445696559,
 
23
  "repository_name": "apertus-v1.1-swiss-embed-0.4b-bidir-langmoe",
24
- "training_profile": "size_optimized"
 
 
 
25
  }
 
1
  {
2
  "experiment_mode": "moe_head",
3
+ "architecture": "dense_backbone_language_moe_head",
4
  "source_model": "swiss-ai/Apertus-v1.1-0.5B",
5
+ "upstream_model": "swiss-ai/Apertus-8B-2509",
6
+ "apertus_version": "1.1",
7
  "base_model": "andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir",
8
  "base_revision": "a6f4b025ee825eec8be04d1132c9e24f20841778",
9
  "hidden_size": 1024,
10
  "embedding_dimension": 1024,
11
+ "matryoshka_dimensions": [
12
+ 1024,
13
+ 768,
14
+ 512,
15
+ 256
16
+ ],
17
  "expert_names": [
18
  "de",
19
  "en",
 
23
  "gsw",
24
  "shared"
25
  ],
26
+ "num_experts": 7,
27
+ "experts_active_per_sentence": 2,
28
+ "router_parameters": 7175,
29
+ "expert_parameters_each": 1048576,
30
+ "language_moe_head_parameters": 7347207,
31
+ "active_head_parameters_per_sentence": 2104327,
32
  "base_parameters_including_old_dense": 439397928,
33
+ "old_dense_projection_parameters": 1048576,
34
+ "final_parameters": 445696559,
35
+ "final_parameters_billions": 0.445696559,
36
+ "active_parameters_per_sentence": 440453679,
37
  "repository_name": "apertus-v1.1-swiss-embed-0.4b-bidir-langmoe",
38
+ "training_profile": "size_optimized",
39
+ "moe_training_max_seq_length": 256,
40
+ "inference_max_seq_length": 1024,
41
+ "sparse_projection_equivalence_max_abs_diff": 1.9073486328125e-06
42
  }
modules.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "idx": 0,
4
+ "name": "0",
5
+ "path": "",
6
+ "type": "sentence_transformers.base.modules.transformer.Transformer"
7
+ },
8
+ {
9
+ "idx": 1,
10
+ "name": "1",
11
+ "path": "1_Pooling",
12
+ "type": "sentence_transformers.sentence_transformer.modules.pooling.Pooling"
13
+ },
14
+ {
15
+ "idx": 2,
16
+ "name": "2",
17
+ "path": "2_LanguageMoE",
18
+ "type": "language_moe.LanguageMoE"
19
+ },
20
+ {
21
+ "idx": 3,
22
+ "name": "3",
23
+ "path": "3_Normalize",
24
+ "type": "sentence_transformers.sentence_transformer.modules.normalize.Normalize"
25
+ }
26
+ ]
router_diagnostics.json CHANGED
@@ -1,139 +1,174 @@
1
  {
2
- "document:de": {
3
- "top1:en": 4,
4
- "top2:de": 86,
5
- "top1:de": 75,
6
- "top2:en": 37,
7
- "top2:fr": 24,
8
- "top1:it": 3,
9
- "top2:gsw": 13,
10
- "top1:fr": 94,
11
- "top2:it": 4,
12
- "top2:rm": 12
13
- },
14
- "document:en": {
15
- "top1:de": 46,
16
- "top2:en": 47,
17
- "top1:fr": 58,
18
- "top2:de": 62,
19
- "top1:en": 25,
20
- "top2:fr": 12,
21
- "top2:it": 11,
22
- "top1:it": 4,
23
- "top2:rm": 1
24
- },
25
- "document:fr": {
26
- "top1:en": 10,
27
- "top2:fr": 23,
28
- "top1:it": 6,
29
- "top2:de": 57,
30
- "top1:de": 25,
31
- "top2:it": 39,
32
- "top1:fr": 138,
33
- "top2:en": 9,
34
- "top2:rm": 50,
35
- "top2:gsw": 1
36
- },
37
- "document:gsw": {
38
- "top1:de": 67,
39
- "top2:fr": 23,
40
- "top1:fr": 12,
41
- "top2:de": 12,
42
- "top2:gsw": 41,
43
- "top2:rm": 1,
44
- "top1:it": 1,
45
- "top2:en": 3
46
- },
47
- "document:it": {
48
- "top1:it": 39,
49
- "top2:de": 34,
50
- "top1:en": 6,
51
- "top2:it": 78,
52
- "top1:fr": 111,
53
- "top2:fr": 27,
54
- "top1:de": 22,
55
- "top2:en": 12,
56
- "top2:rm": 28,
57
- "top1:rm": 1
58
- },
59
- "document:rm": {
60
- "top1:it": 10,
61
- "top2:fr": 26,
62
- "top1:de": 36,
63
- "top2:it": 30,
64
- "top1:fr": 91,
65
- "top2:rm": 55,
66
- "top1:rm": 4,
67
- "top2:de": 21,
68
- "top2:gsw": 5,
69
- "top2:en": 4
70
- },
71
- "query:de": {
72
- "top1:de": 83,
73
- "top2:en": 35,
74
- "top2:gsw": 22,
75
- "top2:fr": 20,
76
- "top1:it": 3,
77
- "top2:de": 94,
78
- "top2:it": 8,
79
- "top1:en": 2,
80
- "top1:fr": 102,
81
- "top2:rm": 11
82
- },
83
- "query:en": {
84
- "top1:de": 68,
85
- "top2:en": 61,
86
- "top2:fr": 15,
87
- "top1:en": 13,
88
- "top1:fr": 56,
89
- "top2:de": 51,
90
- "top2:it": 8,
91
- "top1:it": 3,
92
- "top2:gsw": 1,
93
- "top2:rm": 4
94
- },
95
- "query:fr": {
96
- "top1:fr": 126,
97
- "top2:de": 33,
98
- "top1:it": 5,
99
- "top1:de": 58,
100
- "top2:en": 25,
101
- "top2:fr": 34,
102
- "top1:en": 1,
103
- "top2:gsw": 2,
104
- "top2:it": 43,
105
- "top2:rm": 53
106
- },
107
- "query:gsw": {
108
- "top1:de": 75,
109
- "top2:it": 4,
110
- "top2:fr": 28,
111
- "top2:gsw": 39,
112
- "top1:fr": 2,
113
- "top2:de": 4,
114
- "top1:it": 3,
115
- "top2:en": 5
116
- },
117
- "query:it": {
118
- "top1:it": 31,
119
- "top2:de": 36,
120
- "top2:en": 21,
121
- "top1:fr": 112,
122
- "top2:it": 88,
123
- "top1:de": 45,
124
- "top2:fr": 13,
125
- "top1:en": 2,
126
- "top2:rm": 32
127
- },
128
- "query:rm": {
129
- "top1:it": 9,
130
- "top2:de": 18,
131
- "top1:de": 55,
132
- "top2:en": 9,
133
- "top2:fr": 22,
134
- "top2:rm": 76,
135
- "top1:fr": 106,
136
- "top2:it": 38,
137
- "top2:gsw": 7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  }
139
  }
 
1
  {
2
+ "expert_names": [
3
+ "de",
4
+ "en",
5
+ "fr",
6
+ "it",
7
+ "rm",
8
+ "gsw",
9
+ "shared"
10
+ ],
11
+ "top_k": 2,
12
+ "shared_expert_topk_selections": 0,
13
+ "by_role_and_declared_language": {
14
+ "document:de": {
15
+ "top1:en": 2,
16
+ "top2:de": 87,
17
+ "top1:de": 87,
18
+ "top2:en": 33,
19
+ "top2:fr": 35,
20
+ "top1:it": 2,
21
+ "top2:gsw": 15,
22
+ "top1:fr": 85,
23
+ "top2:it": 4,
24
+ "top2:rm": 2,
25
+ "n": 176,
26
+ "mean_router_entropy": 1.609473284090909
27
+ },
28
+ "document:en": {
29
+ "top1:de": 56,
30
+ "top2:en": 42,
31
+ "top2:fr": 17,
32
+ "top1:fr": 55,
33
+ "top2:de": 67,
34
+ "top1:en": 19,
35
+ "top2:it": 7,
36
+ "top1:it": 3,
37
+ "n": 133,
38
+ "mean_router_entropy": 1.6641771804511278
39
+ },
40
+ "document:fr": {
41
+ "top1:en": 6,
42
+ "top2:fr": 30,
43
+ "top1:it": 5,
44
+ "top2:de": 76,
45
+ "top1:de": 30,
46
+ "top1:fr": 138,
47
+ "top2:it": 32,
48
+ "top2:en": 6,
49
+ "top2:rm": 35,
50
+ "n": 179,
51
+ "mean_router_entropy": 1.5592967374301678
52
+ },
53
+ "document:gsw": {
54
+ "top1:de": 67,
55
+ "top2:fr": 22,
56
+ "top1:fr": 12,
57
+ "top2:de": 12,
58
+ "top2:gsw": 42,
59
+ "top2:rm": 1,
60
+ "top1:it": 1,
61
+ "top2:en": 2,
62
+ "top2:it": 1,
63
+ "n": 80,
64
+ "mean_router_entropy": 1.6445136875
65
+ },
66
+ "document:it": {
67
+ "top1:it": 35,
68
+ "top2:de": 43,
69
+ "top2:en": 11,
70
+ "top1:fr": 116,
71
+ "top2:it": 82,
72
+ "top1:de": 26,
73
+ "top2:fr": 23,
74
+ "top1:en": 2,
75
+ "top2:rm": 20,
76
+ "n": 179,
77
+ "mean_router_entropy": 1.6042385754189945
78
+ },
79
+ "document:rm": {
80
+ "top1:it": 6,
81
+ "top2:fr": 30,
82
+ "top1:de": 36,
83
+ "top1:fr": 93,
84
+ "top2:rm": 58,
85
+ "top1:rm": 5,
86
+ "top2:it": 21,
87
+ "top2:de": 26,
88
+ "top2:gsw": 3,
89
+ "top2:en": 3,
90
+ "top1:en": 1,
91
+ "n": 141,
92
+ "mean_router_entropy": 1.6795429858156028
93
+ },
94
+ "query:de": {
95
+ "top1:de": 86,
96
+ "top2:en": 27,
97
+ "top2:gsw": 20,
98
+ "top2:fr": 30,
99
+ "top1:it": 3,
100
+ "top2:de": 102,
101
+ "top2:it": 9,
102
+ "top1:en": 2,
103
+ "top1:fr": 99,
104
+ "top2:rm": 2,
105
+ "n": 190,
106
+ "mean_router_entropy": 1.6067308421052633
107
+ },
108
+ "query:en": {
109
+ "top1:de": 79,
110
+ "top2:en": 54,
111
+ "top2:fr": 22,
112
+ "top1:en": 6,
113
+ "top1:fr": 53,
114
+ "top2:de": 53,
115
+ "top2:it": 7,
116
+ "top1:it": 2,
117
+ "top2:rm": 3,
118
+ "top2:gsw": 1,
119
+ "n": 140,
120
+ "mean_router_entropy": 1.6650936142857142
121
+ },
122
+ "query:fr": {
123
+ "top1:de": 52,
124
+ "top2:fr": 37,
125
+ "top1:it": 5,
126
+ "top2:de": 75,
127
+ "top2:it": 23,
128
+ "top1:fr": 132,
129
+ "top1:en": 1,
130
+ "top2:en": 17,
131
+ "top2:gsw": 2,
132
+ "top2:rm": 36,
133
+ "n": 190,
134
+ "mean_router_entropy": 1.5682451
135
+ },
136
+ "query:gsw": {
137
+ "top1:de": 75,
138
+ "top2:it": 2,
139
+ "top2:fr": 33,
140
+ "top2:gsw": 36,
141
+ "top1:it": 3,
142
+ "top2:en": 5,
143
+ "top2:de": 4,
144
+ "top1:fr": 2,
145
+ "n": 80,
146
+ "mean_router_entropy": 1.5985225375
147
+ },
148
+ "query:it": {
149
+ "top1:it": 29,
150
+ "top2:de": 46,
151
+ "top2:en": 15,
152
+ "top1:fr": 115,
153
+ "top2:it": 87,
154
+ "top1:de": 46,
155
+ "top2:fr": 21,
156
+ "top2:rm": 21,
157
+ "n": 190,
158
+ "mean_router_entropy": 1.612266494736842
159
+ },
160
+ "query:rm": {
161
+ "top1:it": 9,
162
+ "top2:fr": 36,
163
+ "top1:de": 53,
164
+ "top2:en": 6,
165
+ "top1:fr": 108,
166
+ "top2:de": 23,
167
+ "top2:rm": 73,
168
+ "top2:gsw": 7,
169
+ "top2:it": 25,
170
+ "n": 170,
171
+ "mean_router_entropy": 1.654621305882353
172
+ }
173
  }
174
  }
sentence_bert_config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "transformer_task": "feature-extraction",
3
+ "modality_config": {
4
+ "text": {
5
+ "method": "forward",
6
+ "method_output_name": "last_hidden_state"
7
+ }
8
+ },
9
+ "module_output_name": "token_embeddings"
10
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:be12f4375d655cc740864e3a9041bcddd8477942f209d9e7f27f6c8767162638
3
+ size 17078368
tokenizer_config.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "backend": "tokenizers",
4
+ "bos_token": "<s>",
5
+ "clean_up_tokenization_spaces": false,
6
+ "eos_token": "</s>",
7
+ "is_local": false,
8
+ "local_files_only": false,
9
+ "model_input_names": [
10
+ "input_ids",
11
+ "attention_mask"
12
+ ],
13
+ "model_max_length": 1024,
14
+ "pad_token": "[INST]",
15
+ "tokenizer_class": "TokenizersBackend",
16
+ "unk_token": "<unk>"
17
+ }
language_moe_config.json → training_metadata.json RENAMED
@@ -1,11 +1,14 @@
1
  {
2
- "base_model": "andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir",
3
- "base_revision": "a6f4b025ee825eec8be04d1132c9e24f20841778",
4
- "hidden_size": 1024,
5
- "embedding_dim": 1024,
6
- "max_seq_length": 256,
7
- "num_triplets": 31483,
8
- "num_unique_prompted_texts": 56324,
 
 
 
9
  "expert_names": [
10
  "de",
11
  "en",
@@ -16,8 +19,6 @@
16
  "shared"
17
  ],
18
  "top_k": 2,
19
- "experiment_mode": "moe_head",
20
- "training_profile": "size_optimized",
21
  "router_temperature": 1.0,
22
  "language_loss_weight": 0.05,
23
  "balance_loss_weight": 0.01,
@@ -39,26 +40,26 @@
39
  "training_history": [
40
  {
41
  "epoch": 1,
42
- "loss": 1.5221745264334756,
43
- "retrieval_loss": 1.437075538713424,
44
- "language_loss": 1.7009963930630294,
45
- "balance_loss": 0.004917386882641685,
46
  "lr": 0.00015
47
  },
48
  {
49
  "epoch": 2,
50
- "loss": 1.3965658281670241,
51
- "retrieval_loss": 1.3187617298032417,
52
- "language_loss": 1.5544935601656553,
53
- "balance_loss": 0.00794149145911463,
54
  "lr": 5.0000000000000057e-05
55
  },
56
  {
57
  "epoch": 3,
58
- "loss": 1.3498401231453068,
59
- "retrieval_loss": 1.2746383928861775,
60
- "language_loss": 1.5026149945180924,
61
- "balance_loss": 0.007097912257628851,
62
  "lr": 0.0
63
  }
64
  ]
 
1
  {
2
+ "experiment_mode": "moe_head",
3
+ "source_model": "swiss-ai/Apertus-v1.1-0.5B",
4
+ "dense_parent": "andreasmartin/apertus-v1.1-swiss-embed-0.4b-bidir",
5
+ "dense_parent_revision": "a6f4b025ee825eec8be04d1132c9e24f20841778",
6
+ "backbone_frozen_during_moe_training": true,
7
+ "training_profile": "size_optimized",
8
+ "training_triplets": 31483,
9
+ "unique_prompted_texts": 56324,
10
+ "moe_training_max_seq_length": 256,
11
+ "inference_max_seq_length": 1024,
12
  "expert_names": [
13
  "de",
14
  "en",
 
19
  "shared"
20
  ],
21
  "top_k": 2,
 
 
22
  "router_temperature": 1.0,
23
  "language_loss_weight": 0.05,
24
  "balance_loss_weight": 0.01,
 
40
  "training_history": [
41
  {
42
  "epoch": 1,
43
+ "loss": 1.5206839119801756,
44
+ "retrieval_loss": 1.435533842102426,
45
+ "language_loss": 1.7019310056186112,
46
+ "balance_loss": 0.00535158973679111,
47
  "lr": 0.00015
48
  },
49
  {
50
  "epoch": 2,
51
+ "loss": 1.4084786567531649,
52
+ "retrieval_loss": 1.3307430470576052,
53
+ "language_loss": 1.5530201450723116,
54
+ "balance_loss": 0.008459957545531577,
55
  "lr": 5.0000000000000057e-05
56
  },
57
  {
58
  "epoch": 3,
59
+ "loss": 1.3571588367712302,
60
+ "retrieval_loss": 1.281926788267542,
61
+ "language_loss": 1.503104266573171,
62
+ "balance_loss": 0.007683004374753256,
63
  "lr": 0.0
64
  }
65
  ]