Diplomovka/README.md
2026-08-19 01:31:43 +02:00

184 lines
9.7 KiB
Markdown

# Instruction fine-tuning slovenského Mistral 7B modelu
Tento repozitár obsahuje skripty, konfigurácie a výsledky experimentov k diplomovej práci zameranej na instruction fine-tuning slovenského jazykového modelu.
## Použitý model
Ako základný model bol použitý:
- `slovak-nlp/mistral-sk-7b`
Výsledný adaptér je dostupný na Hugging Face:
- `Jakub1320/mistral-sk-7b-slovak-alpaca-qlora`
## Hardvér
Experimenty boli realizované na serveri s GPU:
- NVIDIA TITAN RTX
- 24 GB VRAM
## Použitý dataset
Na supervised fine-tuning bol použitý slovenský inštrukčný dataset:
- `saillab/alpaca-slovak-cleaned`
Dataset obsahuje polia:
- `instruction`
- `input`
- `output`
Dáta boli formátované v Alpaca štýle:
```text
### Inštrukcia:
...
### Vstup:
...
### Odpoveď:
...
```
## Metóda dotrénovania
Model bol dotrénovaný pomocou supervised fine-tuningu cez:
- Unsloth
- TRL `SFTTrainer`
- PEFT LoRA
- QLoRA štýl trénovania
## Hlavné hyperparametre
| Parameter | Hodnota |
|---|---:|
| Epochs | 1 |
| Max sequence length | 1024 |
| Batch size | 1 |
| Gradient accumulation | 8 |
| Effective batch size | 8 |
| Learning rate | 2e-4 |
| Optimizer | AdamW 8-bit |
| Scheduler | cosine |
| Warmup steps | 150 |
| LoRA rank | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0.05 |
| Quantization | 4-bit |
| Compute type | fp16 |
Použité LoRA cieľové moduly:
```text
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
```
## Vyhodnotenie pomocou vlastného evaluačného skriptu
Model bol najskôr vyhodnotený na testovacích príkladoch z datasetu `saillab/alpaca-slovak-cleaned` pomocou metrík ROUGE, BLEU, eval loss a perplexity.
| Metrika | Výsledok |
|---|---:|
| ROUGE-1 | 0.3710 |
| ROUGE-2 | 0.1702 |
| ROUGE-L | 0.2732 |
| BLEU | 6.2850 |
| Eval loss | 0.8081 |
| Perplexity | 2.2435 |
## Vyhodnotenie pomocou lm-evaluation-harness
Model bol následne vyhodnotený pomocou frameworku `lm-evaluation-harness` na slovenských benchmarkových úlohách.
Hodnotený bol PEFT LoRA adaptér pripojený k základnému modelu:
```text
slovak-nlp/mistral-sk-7b
+
Jakub1320/mistral-sk-7b-slovak-alpaca-qlora
```
### Použité benchmarky
| Benchmark | Popis |
|---|---|
| `arc_sk` | slovenské vedecké/školské otázky s výberom odpovede |
| `hellaswag_sk` | commonsense reasoning a výber najpravdepodobnejšieho pokračovania |
| `m_mmlu_sk` | slovenský všeobecný vedomostný benchmark |
| `truthfulqa_sk_mc1` | hodnotenie pravdivosti odpovedí, multiple choice MC1 |
| `truthfulqa_sk_mc2` | hodnotenie pravdivosti odpovedí, multiple choice MC2 |
| `sklegal` | slovenské právne otázky s výberom odpovede |
| `skquad` | slovenský question-answering benchmark |
Úlohy `sklegal` a `skquad` neboli dostupné v štandardnej inštalácii `lm-evaluation-harness`, preto boli doplnené ako custom tasky.
## Výsledky lm-evaluation-harness
| Task | Počet vzoriek | Metrika | Výsledok |
|---|---:|---|---:|
| `arc_sk` | 1169 | acc | 0.3259 |
| `arc_sk` | 1169 | acc_norm | 0.3473 |
| `hellaswag_sk` | 9485 | acc | 0.4134 |
| `hellaswag_sk` | 9485 | acc_norm | 0.5106 |
| `m_mmlu_sk` | 13062 | acc | 0.2928 |
| `truthfulqa_sk_mc1` | 778 | acc | 0.2391 |
| `truthfulqa_sk_mc2` | 778 | acc | 0.3942 |
| `sklegal` | 1334 | acc | 0.2841 |
| `sklegal` | 1334 | acc_norm | 0.4693 |
| `skquad` | 9583 | exact | 1.9722 |
| `skquad` | 9583 | f1 | 27.7994 |
| `skquad` | 9583 | HasAns_exact | 2.4106 |
| `skquad` | 9583 | HasAns_f1 | 34.1456 |
| `skquad` | 9583 | NoAns_exact | 0.0561 |
| `skquad` | 9583 | NoAns_f1 | 0.0561 |
| `skquad` | 9583 | best_exact | 18.6163 |
| `skquad` | 9583 | best_f1 | 28.3012 |
## Skrátený prehľad hlavných metrík
| Benchmark | Hlavná metrika | Výsledok |
|---|---|---:|
| ARC-SK | acc_norm | 0.3473 |
| HellaSwag-SK | acc_norm | 0.5106 |
| M-MMLU-SK | acc | 0.2928 |
| TruthfulQA-SK MC1 | acc | 0.2391 |
| TruthfulQA-SK MC2 | acc | 0.3942 |
| SKLegal | acc_norm | 0.4693 |
| SKQuAD | f1 | 27.7994 |
Poznámka: Pri multiple-choice benchmarkoch sa používajú metriky `acc` a `acc_norm`, zatiaľ čo pri `skquad` ide o generatívnu question-answering úlohu, preto sa používajú metriky `exact` a `f1`.
## Experiment so strojovým prekladom datasetu
Cieľom experimentu bolo overiť postup, pri ktorom sa anglické polia datasetu:
- `instruction`
- `input`
- `output`
automaticky preložia do slovenčiny a uložia do novej dátovej množiny so zachovaním pôvodnej štruktúry.
Výstupný formát obsahoval pôvodné anglické texty aj slovenské preklady:
```json
{
"instruction_en": "...",
"input_en": "...",
"output_en": "...",
"instruction_sk": "...",
"input_sk": "...",
"output_sk": "..."
}
```
Experiment bol úspešne spustený a vznikla čiastočne preložená vzorka datasetu. Úplné spracovanie celej množiny však nebolo dokončené z dôvodu nedostatku diskového priestoru na dostupnom serveri.