KateMajzel commited on
Commit
33849e2
·
verified ·
1 Parent(s): a04d546

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. README.md +130 -0
  2. tokenizer.json +0 -0
  3. tokenizer_config.json +9 -0
README.md ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - pl
4
+ license: mit
5
+ library_name: tokenizers
6
+ tags:
7
+ - polish
8
+ - tokenizer
9
+ - bpe
10
+ - byte-level
11
+ ---
12
+
13
+ # tokenizer-pl-32k
14
+
15
+ Byte-level BPE dla języka polskiego. **32 568 pozycji słownika + 200 tokenów
16
+ specjalnych = 32 768** (2¹⁵, wygodne dla kerneli GPU i tensor-parallel).
17
+
18
+ Tokenizer wytrenowany na polskim korpusie i zwalidowany eksperymentalnie w projekcie
19
+ [gollem-pl](https://github.com/KateMajzel/gollem-pl) — kontrolowanej ablacji
20
+ porównującej go z tokenizerem GPT-2 przy identycznym budżecie treningowym.
21
+
22
+ Model wytrenowany z tym tokenizerem:
23
+ [KateMajzel/GoLLeM-45M-PL](https://huggingface.co/KateMajzel/GoLLeM-45M-PL).
24
+
25
+ ## Gęstość
26
+
27
+ | | ten tokenizer | GPT-2 |
28
+ |---|---|---|
29
+ | bajty/token — korpus mieszany PL (2,96 GB) | **4,050** | 2,066 |
30
+ | bajty/token — held-out (2,77 MB) | **4,103** | 2,134 |
31
+ | tokenów z 2,96 GB tekstu | 731 mln | 1 434 mln |
32
+ | **gęstość względna** | **1,96×** | 1,00× |
33
+
34
+ Fertility na polskiej prozie: ~1,35 tokena na słowo (5,80 znaku/token). **Uwaga:**
35
+ na realnym korpusie — z URL-ami, liczbami, resztkami formatowania — wychodzi 4,05
36
+ bajtu/token, czyli wyraźnie gorzej. Fertility należy podawać z korpusu, nie
37
+ z wyselekcjonowanych zdań.
38
+
39
+ Przykład różnicy w praktyce — słowo `niejednoznaczny` to **3 tokeny** tutaj i **9**
40
+ u GPT-2.
41
+
42
+ ## Właściwości
43
+
44
+ | | |
45
+ |---|---|
46
+ | typ | byte-level BPE (`tokenizers`, format `tokenizer.json`) |
47
+ | normalizacja | brak — round-trip bezstratny |
48
+ | pre-tokenizer | w stylu GPT-4: `Isolated` + `ByteLevel(use_regex=false, add_prefix_space=false)` |
49
+ | cyfry | cięte po maks. 3 (`\p{N}{1,3}`) |
50
+ | `byte_fallback` | nie jest potrzebny (byte-level nie może wyprodukować UNK) |
51
+ | tokeny z diakrytykami | 27,9% słownika |
52
+ | tokeny nieosiągalne przez merge | 0 (256 bajtów + 32 312 merge'ów = 32 568) |
53
+ | tokeny „same białe znaki" dłuższe niż 2 zn. | 18 |
54
+ | tokeny czysto liczbowe | 409 |
55
+
56
+ Round-trip zweryfikowany m.in. na `Zażółć gęślą jaźń — «cytat» … 😀\ttab`
57
+ i wielokrotnych spacjach oraz znakach nowej linii.
58
+
59
+ ## Tokeny specjalne
60
+
61
+ `<|endoftext|>` (32568), `<|begin_of_text|>`, `<|pad|>`, `<|unk|>`, tokeny czatowe,
62
+ FIM i tool-call oraz 186 pozycji `<|reserved_N|>` — zapas na przyszłe rozszerzenia
63
+ bez zmiany kształtu tablicy embeddingów.
64
+
65
+ **Ważne przy trenowaniu od zera:** jeśli korzystasz tylko z `<|endoftext|>` jako
66
+ separatora dokumentów, pozostałe tokeny specjalne nigdy nie dostaną gradientu.
67
+ Warto je wtedy zablokować przy generowaniu (`bad_words_ids`) i ustawić
68
+ `bos_token_id = eos_token_id = 32568`.
69
+
70
+ ## Użycie
71
+
72
+ ```python
73
+ from tokenizers import Tokenizer
74
+
75
+ tok = Tokenizer.from_pretrained("KateMajzel/tokenizer-pl-32k")
76
+ ids = tok.encode("Zażółć gęślą jaźń").ids
77
+ print(len(ids), tok.decode(ids))
78
+ ```
79
+
80
+ ```python
81
+ from transformers import AutoTokenizer
82
+
83
+ tok = AutoTokenizer.from_pretrained("KateMajzel/tokenizer-pl-32k")
84
+ ```
85
+
86
+ ## Co pokazał eksperyment
87
+
88
+ Ablacja na modelach 42–51 M parametrów (3 GB korpusu, 3 ziarna losowe) wykazała:
89
+
90
+ - **Przy równym budżecie tekstu tokenizer nie różnicuje jakości modelu.** Cztery
91
+ niezależne pomiary (BPB, PolEmo2, 8Tags, prywatny held-out) nie wykazały istotnej
92
+ różnicy wobec tokenizera GPT-2, a ich kierunki były niespójne. Różnica BPB między
93
+ dwoma ziarnami tego samego modelu (0,0186) przewyższała różnicę między tokenizerami
94
+ (0,0124).
95
+ - **Przy równym budżecie obliczeniowym przewaga jest jednoznaczna** — 5,30% BPB
96
+ (6,4 odchylenia) na korzyść gęstszego tokenizera.
97
+ - **Zysk leży w koszcie:** ten sam poziom BPB osiągnięty w 2,5× krótszym czasie,
98
+ przy 21% mniejszej liczbie parametrów.
99
+
100
+ Ten sam wniosek uzyskał niezależnie zespół Bielika v3 PL na skali 11B
101
+ ([arXiv 2604.10799](https://arxiv.org/abs/2604.10799)): wymiana tokenizera na
102
+ dedykowany zachowała jakość i niemal podwoiła gęstość reprezentacji.
103
+
104
+ ## Ograniczenia
105
+
106
+ - **Angielski i kod tokenizują się gorzej niż w GPT-2** — 3,0 i 2,4 znaku/token wobec
107
+ ~4,0. To zamierzony kompromis, ale wyklucza użycie do zbiorów wielojęzycznych.
108
+ - **Korpus treningowy przechylony w stronę tekstów administracyjno-prasowych** —
109
+ widać to w najdłuższych tokenach (`Ġniepełnosprawności`, `Ġzagospodarowania`).
110
+ Przy modelu, który ma brzmieć potocznie, warto to uwzględnić w miksie danych.
111
+ - **Reguła apostrofów w pre-tokenizerze jest angielska** (`'(?i:[sdmt]|ll|ve|re)`) —
112
+ na polskim martwa, ale nieszkodliwa.
113
+ - **Brak `post_processor`** — BOS/EOS nie są dodawane automatycznie, offsety nie są
114
+ trymowane. Bez znaczenia dla modelowania języka, istotne przy NER/QA.
115
+ - **Koszt embeddingu.** Przy `d_model = 512` tablica embeddingów to 16,8 M parametrów.
116
+ W modelu 42,5 M stanowi to 40% — warto to policzyć, zanim dobierze się rozmiar
117
+ słownika do małego modelu.
118
+
119
+ ## Licencja i cytowanie
120
+
121
+ MIT. Metodologia i kod: https://github.com/KateMajzel/gollem-pl
122
+
123
+ ```bibtex
124
+ @misc{tokenizerpl32k,
125
+ title = {tokenizer-pl-32k: polski tokenizer BPE i jego ablacja},
126
+ author = {Majzel-Pośpiech, Katarzyna},
127
+ year = {2026},
128
+ url = {https://huggingface.co/KateMajzel/tokenizer-pl-32k}
129
+ }
130
+ ```
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "tokenizer_class": "PreTrainedTokenizerFast",
3
+ "model_max_length": 1024,
4
+ "bos_token": "<|endoftext|>",
5
+ "eos_token": "<|endoftext|>",
6
+ "pad_token": "<|pad|>",
7
+ "unk_token": null,
8
+ "clean_up_tokenization_spaces": false
9
+ }