KateMajzel commited on
Commit
178ad06
·
verified ·
1 Parent(s): ca95db6

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +75 -151
README.md CHANGED
@@ -14,197 +14,121 @@ tags:
14
 
15
  # GoLLeM-45M-PL
16
 
17
- Model językowy GPT-2 (42,5 mln parametrów) wytrenowany od zera na 2,96 GB polskiego
18
- tekstu, z **dedykowanym polskim tokenizerem BPE** (32 768 pozycji).
19
 
20
- Model powstał jako **artefakt kontrolowanego eksperymentu**, a nie jako narzędzie
21
- użytkowe. Pytanie badawcze: *czy dedykowany tokenizer polski daje lepszy model
22
- językowy niż tokenizer GPT-2, przy tym samym budżecie treningowym?*
 
23
 
24
- **Odpowiedź: nie daje lepszego modelu — daje ten sam model taniej.** Szczegóły niżej.
25
 
26
- ---
27
 
28
- ## Wynik główny
 
29
 
30
- | przebieg | tokenizer | budżet | BPB ↓ | parametry | czas |
31
- |---|---|---|---|---|---|
32
- | **R1** (ten model) | polski, 32 768 | 2,96 GB | **1,2043** | 42,5 M | **49,7 min** |
33
- | R2a | GPT-2, 50 257 | 2,96 GB (te same bajty) | **1,1918** | 51,5 M | 122,4 min |
34
- | R2b | GPT-2, 50 257 | 2 970 kroków (te same tokeny) | 1,2756 | 51,5 M | 62,4 min |
35
- | R3 | GPT-2 pretrained, zero-shot | — | 2,9555 | 124 M | — |
36
 
37
- BPB = bits-per-byte na prywatnym held-oucie (1 999 dokumentów, 2 767 440 bajtów,
38
- identyczny tekst dla wszystkich modeli).
 
 
39
 
40
- Przedziały ufności (sparowany bootstrap, B = 10 000, CI 95%, względem R1):
41
 
42
- | porównanie | ΔBPB | CI 95% | wniosek |
43
- |---|---|---|---|
44
- | R2a − R1 | −0,0124 | [−0,0141; −0,0108] | R2a **istotnie lepszy** o 1,0% |
45
- | R2b − R1 | +0,0713 | [+0,0693; +0,0734] | R2b **istotnie gorszy** o 5,9% |
46
- | R3 − R1 | +1,7512 | [+1,7312; +1,7707] | R3 gorszy 2,45× |
47
 
48
- ### Interpretacja
 
 
 
 
 
49
 
50
- Przy **równej ilości tekstu** tokenizer GPT-2 wygrywa o 1,0%. Przewaga jest realna
51
- statystycznie, ale kupiona kosztem 2,5× dłuższego treningu i 21% większego modelu —
52
- rzadszy tokenizer wykonuje po prostu więcej przejść przez sieć na ten sam bajt
53
- tekstu (1,30 mln kroków wobec 0,67 mln na held-oucie).
54
 
55
- Przy **równym budżecie obliczeniowym** (R1 vs R2b) kierunek się odwraca i przewaga
56
- polskiego tokenizera wynosi 5,9%, czyli sześciokrotnie więcej.
 
 
57
 
58
- **Wniosek: dedykowany tokenizer kupuje efektywność, nie jakość modelowania.**
59
 
60
- ### Uwaga o perplexity
 
 
 
61
 
62
- Perplexity per token dla tych modeli wynosi odpowiednio 30,7 (R1) i 5,8 (R2a) — co
63
- sugerowałoby pięciokrotną przewagę GPT-2. To artefakt: modele o różnych tokenizerach
64
- przewidują jednostki różnej trudności, więc **perplexity jest między nimi
65
- nieporównywalna**. Jedyną poprawną metryką jest bits-per-byte.
66
 
67
- ---
 
 
 
 
 
68
 
69
  ## Tokenizer
70
 
71
- Byte-level BPE, 32 568 pozycji słownika + 200 tokenów specjalnych = 32 768.
72
- Pre-tokenizer w stylu GPT-4 (`\p{N}{1,3}`, cyfry cięte po trzy), bez normalizacji,
73
- round-trip bezstratny.
74
 
75
- | miara | ten tokenizer | GPT-2 |
76
  |---|---|---|
77
- | bajty/token (korpus treningowy) | 4,050 | 2,066 |
78
  | bajty/token (held-out) | 4,103 | 2,134 |
79
- | gęstość względna | **1,96×** | 1,00× |
80
- | tokenów z 2,96 GB | 731 mln | 1 434 mln |
81
-
82
- 27,9% pozycji słownika zawiera polskie znaki diakrytyczne. Zero tokenów
83
- nieosiągalnych przez merge.
84
-
85
- Uwaga: fertility mierzona na dopracowanej prozie wynosi 5,80 znaku/token, ale na
86
- realnym korpusie 4,05 bajtu/token. **Fertility należy podawać z korpusu, nie z
87
- wyselekcjonowanych zdań.**
88
-
89
- ---
90
 
91
  ## Dane treningowe
92
 
93
- 2,96 GB, 803 177 dokumentów po deduplikacji, źródło: [SpeakLeash](https://speakleash.org/).
 
94
 
95
- | kategoria | udział | zbiory |
96
- |---|---|---|
97
- | encyklopedia, literatura | 37% | `plwiki`, `plwikisource`, `wolne_lektury_corpus`, `1000_novels_corpus_CLARIN-PL` |
98
- | fora dyskusyjne | 22% | `kafeteria`, `gazeta`, `elektroda`, `trojmiasto` |
99
- | publicystyka, nauka | 11% | `news_3/4/5`, `biblioteka_nauki_pl_corpus` |
100
- | teksty urzędowe | 3% | `ISAP_corpus` |
101
- | web | 27% | `HPLT_1`, `HPLT_2`, `web_artykuły_inne_1` |
102
-
103
- **Celowo wykluczone:** `text_translated` i `open_subtitles` (translationese),
104
- `web_synt_*` (tekst syntetyczny), `tekstowo_*` (teksty piosenek — prawa autorskie),
105
- `cc_*` i `*_madlad` (surowy Common Crawl bez filtracji jakości).
106
-
107
- Udział tekstów urzędowych ograniczono do 3%, ponieważ tokenizer był już w tę stronę
108
- przechylony (najdłuższe tokeny: `Ġniepełnosprawności`, `Ġzagospodarowania`).
109
-
110
- Licencje poszczególnych zbiorów: patrz SpeakLeash. Użytkownik odpowiada za
111
- weryfikację warunków dla swojego zastosowania.
112
-
113
- **Znana właściwość danych:** korpus zawiera windowsowe końce linii (`\r\n`), które
114
- model odtwarza w generacjach.
115
-
116
- ---
117
 
118
- ## Ewaluacja — metodologia
119
 
120
- Held-out: 1 999 dokumentów wydzielonych **przed** treningiem, stratyfikowanych
121
- proporcjonalnie po źródłach, zweryfikowanych na zerowe pokrycie z korpusem
122
- treningowym (jeden wykryty duplikat usunięto).
123
-
124
- Każdy dokument przycięty do **1 800 bajtów UTF-8 przed tokenizacją** — nie do
125
- `block_size` tokenów. Przycięcie po tokenach dawałoby każdemu modelowi inną ilość
126
- tekstu (1 023 tokeny to ~4 100 bajtów przy tokenizerze polskim i ~2 100 przy GPT-2),
127
- co unieważniłoby porównanie. Wszystkie cztery pomiary wykonano na identycznych
128
- 2 767 440 bajtach.
129
-
130
- ---
131
-
132
- ## Architektura i trening
133
-
134
- Architektura identyczna z GPT-2 (nanoGPT), dobrana celowo: pozwala porównywać
135
- się z GPT-2 przy architekturze jako zmiennej stałej.
136
-
137
- | | |
138
- |---|---|
139
- | warstwy / głowice / wymiar | 8 / 8 / 512 |
140
- | kontekst | 1 024 tokeny |
141
- | parametry | 42,5 M (25,7 M niezanurzeniowych) |
142
- | tokeny treningowe | 731 mln (17,2 na parametr) |
143
- | optymalizator | AdamW, lr 1e-3 → 1e-4 (cosine), warmup 150 |
144
- | batch efektywny | 245 760 tokenów (12 × 20 × 1024) |
145
- | precyzja | bfloat16 |
146
- | sprzęt | 1× RTX 5080 (16 GB), ~1 004 ms/iterację, MFU ~23% |
147
- | epoki | 1 (każdy dokument widziany raz) |
148
-
149
- ---
150
 
151
  ## Ograniczenia
152
 
153
- - **Skala.** 42,5 M parametrów i godzina treningu. Model produkuje poprawną
154
- polszczyznę na poziomie zdania, ale **halucynuje fakty** i traci spójność po
155
- kilku zdaniach. Przykład z generacji: *„wieś znalazła się w powiecie
156
- częstochowskim, gminie Łęczna"* — obie nazwy istnieją, zestawienie jest fałszywe.
157
- - **Brak instrukcji i wyrównania.** To model bazowy, wyłącznie kontynuacja tekstu.
158
- Nie przeszedł żadnego dostrajania ani filtrowania bezpieczeństwa.
159
- - **Dane z forów internetowych.** Model może odtwarzać uprzedzenia i język obecny
160
- w źródłach. Nie nadaje się do zastosowań mających kontakt z użytkownikiem
161
- końcowym, a w szczególności z dziećmi, bez nadzoru człowieka.
162
- - **Wariancja ziarna nie zmierzona.** Przedziały ufności pochodzą z bootstrapu po
163
- dokumentach held-outu i obejmują niepewność doboru danych ewaluacyjnych, **nie**
164
- niepewność ziarna treningowego. Różnica 1,0% (R1 vs R2a) mieści się w zakresie,
165
- który powtórka z innym seedem mogłaby odwrócić. Wniosek o 5,9% (R1 vs R2b) jest
166
- odporniejszy.
167
- - **Jedna konfiguracja, jedna skala.** Wyniki dotyczą 42 M parametrów i 3 GB danych.
168
- Nie wiadomo, czy przenoszą się na większe modele lub korpusy.
169
- - **Reguła Chinchilli zastosowana do polskiego.** Proporcja 20 tokenów/parametr
170
- została wyprowadzona dla angielskiego. Dla języka fleksyjnego optimum może leżeć
171
- gdzie indziej.
172
-
173
- ---
174
-
175
- ## Użycie
176
-
177
- ```python
178
- from transformers import pipeline
179
-
180
- pipe = pipeline("text-generation", model="KateMajzel/GoLLeM-45M-PL")
181
- print(pipe("W lesie mieszkał mały", max_new_tokens=50)[0]["generated_text"])
182
- ```
183
-
184
- Zalecane parametry generacji (ustawione domyślnie): `do_sample=True`,
185
- `temperature=0.8`, `top_p=0.9`, `repetition_penalty=1.15`. Dekodowanie zachłanne
186
- (`do_sample=False`) wpada w pętle powtórzeń — typowe dla modeli tej wielkości.
187
-
188
- 199 nieużywanych tokenów wypełniających (32 569–32 767) zablokowano przez
189
- `bad_words_ids`; nigdy nie widziały gradientu.
190
-
191
- ---
192
 
193
  ## Odtwarzalność
194
 
195
- Kod, konfiguracje i skrypty ewaluacyjne: https://github.com/KateMajzel/gollem-pl.
196
- Bazuje na [nanoGPT](https://github.com/karpathy/nanoGPT) (MIT, Andrej Karpathy).
197
 
198
- Pełny pipeline: pobranie danych → deduplikacja → wydzielenie held-outu z audytem
199
- wycieków → tokenizacja dwoma tokenizerami na tym samym splicie → trzy przebiegi
200
- treningowe → BPB z bootstrapem → eksport.
201
 
202
  ## Cytowanie
203
 
204
  ```bibtex
205
  @misc{gollem45mpl,
206
  title = {GoLLeM-45M-PL: ablacja tokenizera dla polskiego modelu językowego},
207
- author = {Katarzyna Majzel-Pośpiech},
208
  year = {2026},
209
  url = {https://huggingface.co/KateMajzel/GoLLeM-45M-PL}
210
  }
 
14
 
15
  # GoLLeM-45M-PL
16
 
17
+ Model GPT-2 (42,5 mln parametrów) wytrenowany od zera na 2,96 GB polskiego tekstu,
18
+ z dedykowanym polskim tokenizerem BPE (32 768 pozycji).
19
 
20
+ Model jest **artefaktem eksperymentu badawczego**, nie narzędziem użytkowym.
21
+ Pytanie: *czy dedykowany tokenizer polski daje lepszy model niż tokenizer GPT-2 przy
22
+ tym samym budżecie treningowym?* Odpowiedź: **nie daje lepszego — daje porównywalny
23
+ 2,5× taniej.**
24
 
25
+ Kod, dane i pełna metodologia: https://github.com/KateMajzel/gollem-pl
26
 
27
+ ## Użycie
28
 
29
+ ```python
30
+ from transformers import pipeline
31
 
32
+ pipe = pipeline("text-generation", model="KateMajzel/GoLLeM-45M-PL")
33
+ print(pipe("W lesie mieszkał mały", max_new_tokens=50)[0]["generated_text"])
34
+ ```
 
 
 
35
 
36
+ Domyślne parametry generacji: `do_sample=True`, `temperature=0.8`, `top_p=0.9`,
37
+ `repetition_penalty=1.15`. Dekodowanie zachłanne wpada w pętle powtórzeń — typowe dla
38
+ modeli tej wielkości. 199 nieużywanych tokenów wypełniających (32 569–32 767)
39
+ zablokowano przez `bad_words_ids`.
40
 
41
+ ## Wyniki
42
 
43
+ BPB na prywatnym held-oucie (1 999 dokumentów, identyczne 2 767 440 bajtów dla
44
+ każdego modelu; średnie z 3 ziaren dla R1 i R2a):
 
 
 
45
 
46
+ | przebieg | tokenizer | budżet | BPB ↓ | sd | parametry | czas |
47
+ |---|---|---|---|---|---|---|
48
+ | **R1** (ten model) | polski, 32 768 | 2,96 GB | 1,2114 | 0,0100 | 42,5 M | **49,7 min** |
49
+ | R2a | GPT-2, 50 257 | 2,96 GB — te same bajty | 1,1946 | 0,0035 | 51,5 M | 122,4 min |
50
+ | R2b | GPT-2, 50 257 | 2 970 kroków — te same tokeny | 1,2756 | (n=1) | 51,5 M | 62,4 min |
51
+ | R3 | GPT-2 zero-shot | — | 2,9555 | (n=1) | 124 M | — |
52
 
53
+ Benchmarki zero-shot (log-likelihood z normalizacją PMI domenową):
 
 
 
54
 
55
+ | zadanie | R1 | R2a | GPT-2 | klasa większościowa | losowo |
56
+ |---|---|---|---|---|---|
57
+ | PolEmo2-IN | 47,2% | 43,8% | 20,8% | 40,0% | 25,0% |
58
+ | 8Tags | 31,5% | 29,8% | 17,8% | 16,5% | 12,5% |
59
 
60
+ ### Interpretacja
61
 
62
+ Cztery niezależne pomiary (BPB, PolEmo2, 8Tags, prywatny held-out) nie wykazują
63
+ istotnej przewagi żadnego tokenizera przy równym budżecie tekstu, a ich kierunki są
64
+ niespójne. Rozstrzygająca obserwacja: **różnica BPB między dwoma ziarnami tego samego
65
+ modelu (0,0186) przewyższa różnicę między modelami o odmiennych tokenizerach (0,0124).**
66
 
67
+ Przewaga leży w koszcie. Przy wyrównanym budżecie obliczeniowym (R1 vs R2b) tokenizer
68
+ polski wygrywa o 5,30% BPB — 6,4 odchylenia. Ten sam wniosek uzyskał niezależnie zespół
69
+ Bielika v3 PL na skali 11B (arXiv 2604.10799).
 
70
 
71
+ ### Uwaga o perplexity
72
+
73
+ PPL/token wynosi 30,7 dla R1 i 5,8 dla R2a, co sugerowałoby pięciokrotną przewagę
74
+ GPT-2. To artefakt: modele o różnych tokenizerach przewidują jednostki różnej trudności.
75
+ **Perplexity jest między nimi nieporównywalna.** Jedyną poprawną metryką jest
76
+ bits-per-byte.
77
 
78
  ## Tokenizer
79
 
80
+ Byte-level BPE, 32 568 pozycji + 200 specjalnych. 27,9% pozycji z polskimi
81
+ diakrytykami, round-trip bezstratny, zero tokenów nieosiągalnych przez merge.
 
82
 
83
+ | | ten tokenizer | GPT-2 |
84
  |---|---|---|
85
+ | bajty/token (korpus) | 4,050 | 2,066 |
86
  | bajty/token (held-out) | 4,103 | 2,134 |
87
+ | gęstość | **1,96×** | 1,00× |
 
 
 
 
 
 
 
 
 
 
88
 
89
  ## Dane treningowe
90
 
91
+ 2,96 GB, 803 177 dokumentów, [SpeakLeash](https://speakleash.org/): 37% encyklopedia
92
+ i literatura, 22% fora, 27% web, 11% publicystyka i nauka, 3% teksty urzędowe.
93
 
94
+ Celowo wykluczone: tłumaczenia i napisy (translationese), tekst syntetyczny, teksty
95
+ piosenek (prawa autorskie), surowy Common Crawl. Licencje zbiorów po stronie SpeakLeash.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
+ ## Architektura
98
 
99
+ 8 warstw × 8 głowic × 512 wymiarów, kontekst 1 024 tokeny, 42,5 M parametrów
100
+ (25,7 M niezanurzeniowych), 731 mln tokenów treningowych (17,2 na parametr),
101
+ AdamW lr 1e-3 → 1e-4, bfloat16, 1 epoka, 1× RTX 5080.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
  ## Ograniczenia
104
 
105
+ - **Skala.** Model produkuje poprawną polszczyznę na poziomie zdania, ale halucynuje
106
+ fakty i traci spójność po kilku zdaniach. Przykład z generacji: *„wieś znalazła się
107
+ w powiecie częstochowskim, gminie Łęczna"* — obie nazwy istnieją, zestawienie jest
108
+ fałszywe.
109
+ - **Model bazowy.** Wyłącznie kontynuacja tekstu; bez dostrajania instrukcyjnego
110
+ i bez filtrowania bezpieczeństwa.
111
+ - **Dane z forów internetowych.** Model może odtwarzać obecne tam uprzedzenia i język.
112
+ Nie nadaje się do zastosowań z udziałem użytkownika końcowego — w szczególności
113
+ dzieci — bez nadzoru człowieka.
114
+ - **Jedna skala i jedna konfiguracja.** Wyniki dotyczą 42 M parametrów i 3 GB danych.
115
+ - **Rejestr zależny od miksu danych.** Przy prompcie z bajki dla dzieci model
116
+ odpowiada językiem forów lub haseł encyklopedycznych.
117
+ - Korpus zawiera windowsowe końce linii (`\r\n`), które model odtwarza.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
119
  ## Odtwarzalność
120
 
121
+ Kod, konfiguracje, skrypty ewaluacyjne i opis pięciu pułapek metodologicznych:
122
+ https://github.com/KateMajzel/gollem-pl
123
 
124
+ Bazuje na [nanoGPT](https://github.com/karpathy/nanoGPT) (MIT, Andrej Karpathy).
 
 
125
 
126
  ## Cytowanie
127
 
128
  ```bibtex
129
  @misc{gollem45mpl,
130
  title = {GoLLeM-45M-PL: ablacja tokenizera dla polskiego modelu językowego},
131
+ author = {Majzel-Pośpiech, Katarzyna},
132
  year = {2026},
133
  url = {https://huggingface.co/KateMajzel/GoLLeM-45M-PL}
134
  }