davidhouseholter commited on
Commit
2859434
·
verified ·
1 Parent(s): afb6762

Release MatterWaveAI/grt-30m-embedding

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": 256,
3
+ "pooling_mode": "circular",
4
+ "include_prompt": true
5
+ }
README.md ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - grt
5
+ - geometric-rotation-transformer
6
+ - sentence-transformers
7
+ - feature-extraction
8
+ - sentence-similarity
9
+ - circular-pooling
10
+ - rotational
11
+ - qwen3
12
+ datasets:
13
+ - sentence-transformers/all-nli
14
+ - sentence-transformers/stsb
15
+ language:
16
+ - en
17
+ library_name: sentence-transformers
18
+ pipeline_tag: sentence-similarity
19
+ base_model: MatterWaveAI/grt-30m
20
+ ---
21
+
22
+ # GRT-30M-Embedding (Circular-Pooled Rotational Sentence Encoder)
23
+
24
+ An **embedding-only Geometric Rotation Transformer (`GRTModel`)** contrastively fine-tuned from [`MatterWaveAI/grt-30m`](https://huggingface.co/MatterWaveAI/grt-30m) for semantic textual similarity and dense retrieval using **planar-pair `circular` pooling** (`sentence-transformers`).
25
+
26
+ Instead of dense linear projections (`nn.Linear`), GRT represents token embeddings in polar coordinates (`phase_angles` + `log_magnitude`) and transforms hidden states through cascades of content-modulated `2×2` Givens rotations on `SO(D)` interleaved with butterfly permutations. Because every hidden state is structured as `D / 2 = 128` planar `(x, y)` coordinate pairs, **`circular` pooling** decomposes each pair into its unit direction `(cos θ, sin θ)` and radius `r`, averages the unit directions and radii across non-padding tokens, and recombines them into a `256`-dimensional sentence embedding.
27
+
28
+ ---
29
+
30
+ ## Model Details
31
+
32
+ | Property | Value |
33
+ |---|---|
34
+ | **Architecture** | `GRTModel` (`model_type: "grt"`, encoder/backbone without causal LM head) |
35
+ | **Base model** | [`MatterWaveAI/grt-30m`](https://huggingface.co/MatterWaveAI/grt-30m) |
36
+ | **Pooling strategy** | `circular` (`Pooling(embedding_dimension=256, pooling_mode="circular")` + `Normalize`) |
37
+ | **Output dimensionality** | `256` (`128` planar `(x, y)` pairs, L2-normalized) |
38
+ | **Total stored parameters** | `29,305,497` (`29.31M`, `lm_head.output_scale` stripped) |
39
+ | **Non-embedding backbone parameters** | `9,740,197` (`9.74M` across 12 rotational blocks) |
40
+ | **`hidden_size` (`d_model`)** | `256` |
41
+ | **`num_hidden_layers` (`n_blocks`)** | `12` |
42
+ | **`num_attention_heads` (`n_heads`)** | `4` (`head_dim = 64`) |
43
+ | **`intermediate_size` (`d_ff`)** | `1,024` |
44
+ | **`n_qkv_rotations` / `n_mixer_rotations` / `ffn_n_rotations`** | `11` / `1` / `21` |
45
+ | **Vocabulary** | `151,669` (Qwen 3 BPE) |
46
+ | **Max sequence length** | `512` (supports up to `2,048` positions) |
47
+
48
+ ---
49
+
50
+ ## Evaluation Results (STS-B)
51
+
52
+ Evaluated on the **STS Benchmark (`sentence-transformers/stsb`)** validation and test splits using `circular` pooling and cosine similarity:
53
+
54
+ | Split | Metric | `GRT-30M` (Pretrained Base) | `GRT-30M-Embedding` (Fine-Tuned) | Delta |
55
+ |---|---|---:|---:|---:|
56
+ | **STS-B Validation** | **Spearman (`×100`)** | `45.51` | **`72.89`** | **`+27.38`** |
57
+ | **STS-B Test** | **Spearman (`×100`)** | `28.49` | **`63.17`** | **`+34.67`** |
58
+ | **STS-B Test** | **Pearson (`×100`)** | `29.81` | **`63.72`** | **`+33.91`** |
59
+
60
+ ---
61
+
62
+ ## Usage
63
+
64
+ ### 1. `sentence-transformers` (Recommended)
65
+
66
+ ```python
67
+ from sentence_transformers import SentenceTransformer
68
+
69
+ model = SentenceTransformer("MatterWaveAI/grt-30m-embedding")
70
+
71
+ sentences = [
72
+ "Plants convert sunlight into chemical energy through photosynthesis.",
73
+ "Chlorophyll absorbs light energy to synthesize glucose in plant leaves.",
74
+ "The stock market experienced volatility during the afternoon session.",
75
+ ]
76
+
77
+ embeddings = model.encode(sentences)
78
+ similarities = model.similarity(embeddings, embeddings)
79
+ print(similarities)
80
+ ```
81
+
82
+ ### 2. Hugging Face `transformers` (`GRTModel` + Circular Pooling)
83
+
84
+ ```python
85
+ import torch
86
+ import torch.nn.functional as F
87
+ from transformers import AutoModel, AutoTokenizer
88
+
89
+ model_id = "MatterWaveAI/grt-30m-embedding"
90
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
91
+ model = AutoModel.from_pretrained(model_id).eval()
92
+
93
+
94
+ def circular_pool(token_embeddings: torch.Tensor, attention_mask: torch.Tensor) -> torch.Tensor:
95
+ pairs = token_embeddings.float().unflatten(-1, (-1, 2))
96
+ mask = attention_mask.float().unsqueeze(-1).unsqueeze(-1)
97
+ radii = pairs.norm(dim=-1, keepdim=True)
98
+ directions = pairs / torch.clamp(radii, min=1e-9)
99
+ denom = torch.clamp(mask.sum(dim=1), min=1e-9)
100
+ pooled = ((directions * mask).sum(dim=1) / denom) * ((radii * mask).sum(dim=1) / denom)
101
+ return F.normalize(pooled.flatten(start_dim=1), p=2, dim=-1).to(token_embeddings.dtype)
102
+
103
+
104
+ inputs = tokenizer(
105
+ ["How does photosynthesis work?", "Plants convert sunlight into chemical energy."],
106
+ padding=True,
107
+ truncation=True,
108
+ return_tensors="pt",
109
+ )
110
+ with torch.no_grad():
111
+ outputs = model(**inputs)
112
+ embeddings = circular_pool(outputs.last_hidden_state, inputs["attention_mask"])
113
+
114
+ print("Cosine similarity:", float((embeddings[0] @ embeddings[1]).item()))
115
+ ```
116
+
117
+ ---
118
+
119
+ ## License
120
+
121
+ Apache 2.0
SHA256SUMS ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ a4a8edb13245bb69ccb55a2a2c3f322221e2a16154c96516c9211274030bf815 1_Pooling/config.json
2
+ c987cec1b71deba4a1749a939032309921872ae2a6c21378f8160edb29b210df config.json
3
+ b15e9a2b676eeb6b5ed466de9be3edf23422cf8ca005fde5e04aef05bc032906 config_sentence_transformers.json
4
+ 6045ee7586e1300b509298f76f7f254094a02a78cf23ed669083ab7949eb3eae eval_results.json
5
+ d1fedff586b749844cc395f28ad5f555dd14d500d6d0c7c0215cf43892f54688 model.safetensors
6
+ e86db55b23831f6efca3d43309863db7d3b96ec21fbf42cffa5afc35fdcc61af modules.json
7
+ 780c5a02bd80ef587d45f338e1284b83d9f1249d100b8be2e55893242ddc8ad0 README.md
8
+ f40b497174aa416490cf8c6e70ef19ad68f2d20160de9ca1fa8a130e89b2ee19 sentence_bert_config.json
9
+ 76e9e7b2014f0479052f15dfe092fc5dfadfb52b57b8133a141a4d0deb89a6f7 tokenizer.json
10
+ b0b05688d53eec97348d23f9a203772fa28f12bdc8a0f6f5401f41568ec6ca31 tokenizer_config.json
config.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "angle_init_scale": 0.1,
3
+ "architectures": [
4
+ "GRTModel"
5
+ ],
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 151643,
8
+ "coupling_init_mode": "diagonal",
9
+ "coupling_init_scale": 0.01,
10
+ "dtype": "float32",
11
+ "eos_token_id": 151643,
12
+ "ffn_n_rotations": 21,
13
+ "hidden_size": 256,
14
+ "initializer_range": 0.02,
15
+ "intermediate_size": 1024,
16
+ "learnable_residual_gates": true,
17
+ "learnable_rope": true,
18
+ "log_magnitude_init": 0.0,
19
+ "max_position_embeddings": 2048,
20
+ "model_type": "grt",
21
+ "n_mixer_rotations": 1,
22
+ "n_qkv_rotations": 11,
23
+ "num_attention_heads": 4,
24
+ "num_hidden_layers": 12,
25
+ "output_scale_init": 30.0,
26
+ "pad_token_id": 151643,
27
+ "peri_ln": false,
28
+ "phase_init_scale": 0.1,
29
+ "pos_freq_base": 10000.0,
30
+ "residual_gate_mode": "bounded_depth",
31
+ "residual_norm_mode": "none",
32
+ "tie_word_embeddings": false,
33
+ "transformers_version": "5.21.0.dev0",
34
+ "use_cache": false,
35
+ "vocab_size": 151669
36
+ }
config_sentence_transformers.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "__version__": {
3
+ "sentence_transformers": "5.2.0.dev0",
4
+ "transformers": "5.21.0.dev0",
5
+ "pytorch": "2.12.0+xpu"
6
+ },
7
+ "prompts": {
8
+ "query": "",
9
+ "document": ""
10
+ },
11
+ "default_prompt_name": null,
12
+ "similarity_fn_name": "cosine"
13
+ }
eval_results.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "stsb_dev_spearman_before": 0.4551,
3
+ "stsb_dev_spearman_after": 0.7289,
4
+ "stsb_test_spearman_before": 0.2849,
5
+ "stsb_test_spearman_after": 0.6317,
6
+ "stsb_test_pearson_before": 0.2981,
7
+ "stsb_test_pearson_after": 0.6372,
8
+ "parameters": 29305497
9
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d1fedff586b749844cc395f28ad5f555dd14d500d6d0c7c0215cf43892f54688
3
+ size 121571460
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": 512,
3
+ "do_lower_case": false
4
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:76e9e7b2014f0479052f15dfe092fc5dfadfb52b57b8133a141a4d0deb89a6f7
3
+ size 11422916
tokenizer_config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "backend": "tokenizers",
4
+ "bos_token": null,
5
+ "clean_up_tokenization_spaces": false,
6
+ "eos_token": "<|endoftext|>",
7
+ "errors": "replace",
8
+ "extra_special_tokens": [
9
+ "<|im_start|>",
10
+ "<|im_end|>",
11
+ "<|object_ref_start|>",
12
+ "<|object_ref_end|>",
13
+ "<|box_start|>",
14
+ "<|box_end|>",
15
+ "<|quad_start|>",
16
+ "<|quad_end|>",
17
+ "<|vision_start|>",
18
+ "<|vision_end|>",
19
+ "<|vision_pad|>",
20
+ "<|image_pad|>",
21
+ "<|video_pad|>"
22
+ ],
23
+ "is_local": true,
24
+ "local_files_only": false,
25
+ "model_max_length": 131072,
26
+ "pad_token": "<|endoftext|>",
27
+ "split_special_tokens": false,
28
+ "tokenizer_class": "Qwen2Tokenizer",
29
+ "unk_token": null
30
+ }