---
title: "Anti-jazyk"
slug: "anti-jazyk"
section: "volna-tvorba"
date: 2025-12-01
thumbnail: "/images/anti-jazyk-nahled.png"
thumbnailAlt: "Anti-jazyk"
excerpt: ""
draft: false
---

import NoTranslate from "../../components/NoTranslate.astro";

Běžné jazykové modely vybírají další token tak, že zvolí jeden z nejpravděpodobnějších návrhů, které se podle jejich statistického odhadu nejlépe hodí do kontextu. Tomu budeme říkat standardní sampling.  
Tento projekt dělá pravý opak.  
Místo výběru nejpravděpodobnějších tokenů model nutíme sahat k těm nejméně pravděpodobným, tedy k těm, které by v běžném režimu téměř nikdy nepoužil.  
Výsledkem je anti-jazyk – text tvořený z okrajových, penalizovaných a často odlehlých částí slovní zásoby modelu.  
Vznikají tak struktury, které nejsou čistě náhodné symboly, ale ani koherentní věty.  

**Jak to funguje**  
Model dostane krátký vstup (např. „This is “).  
Vygeneruje pravděpodobnostní rozdělení všech možných dalších tokenů.  
Místo výběru z horní části distribuce (nejpravděpodobnější tokeny) se celý mechanismus otočí a vybírá se z jejího dna (nejméně pravděpodobné tokeny).  
Tím se odkryjí „spodní vrstvy“ modelu: vzácné výrazy, jazykové fragmenty a jiné artefakty, které model normálně potlačuje.  

**Kód**  
Kód je možné spustit v Google Colabu:  
https://colab.research.google.com/drive/18y4hUsNv-aEZHtXVp67ygHGGpMBkByxD?usp=sharing  

Colab zde slouží hlavně jako běhové prostředí. Není to primární archivní kopie kódu.  
Proto je stejný postup uložený i níže přímo v článku.  

Kód je rozdělený do tří samostatných bloků stejně jako v notebooku. První načte model, druhý generuje text a třetí uloží poslední výstup.  

**1. Načtení modelu a tokenizeru**  
Tento blok stačí spustit jednou. Načte model GPT-2 a tokenizer.  

```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")  # also works: gpt2-medium, gpt2-large, gpt2-xl, EleutherAI/gpt-neo-1.3B
model = AutoModelForCausalLM.from_pretrained("gpt2")
model.eval()
```

**2. Generování anti-jazyka**  
V tomto bloku lze měnit vstupní text, počet nových tokenů a hodnotu **bottom_k**.  
Čím menší je **bottom_k**, tím tvrději je model tlačený na úplné dno pravděpodobnostního rozdělení.  

```python
prompt = "This is "
input_ids = tokenizer.encode(prompt, return_tensors="pt")

max_new_tokens = 50
bottom_k = 5

with torch.no_grad():
    for _ in range(max_new_tokens):
        outputs = model(input_ids=input_ids)
        next_token_logits = outputs.logits[0, -1, :]

        probs = torch.softmax(next_token_logits, dim=-1)

        bottom_probs, bottom_indices = torch.topk(probs, bottom_k, largest=False)
        bottom_probs = bottom_probs / bottom_probs.sum()

        chosen_index = torch.multinomial(bottom_probs, num_samples=1)
        next_token_id = bottom_indices[chosen_index]

        input_ids = torch.cat([input_ids, next_token_id.unsqueeze(0)], dim=-1)

generated_text = tokenizer.decode(input_ids.squeeze(), skip_special_tokens=True)
print(generated_text)
```

**3. Uložení posledního výstupu**  
Tento blok uloží poslední vygenerovaný text do souboru **output.txt**.  

```python
with open("output.txt", "w", encoding="utf-8") as f:
    f.write(generated_text)
```

Modelové váhy GPT-2 nejsou součástí webu. Při spuštění se stahují z externího zdroje.  
Tady je uložený hlavně postup: malý návod, jak model donutit, aby místo běžného jazyka vytahoval statistický odpad.  

**Ukázka výstupu**  
Zde jsem použil model GPT-2 a nechal ho doplnit text „This is “:  

<NoTranslate>
This is  earthquNitrome councill��士cloneembedreportprint hemorSPONSOREDuyomiardy srfAttachassiansenalMuslims Janeiroetooth antidepress featsItemThumbnailImageleneckBuyableInstoreAndOnline awarding earthqu STEDownloadharegationucaalogue Timberstheless Unloadedicrobialarnaev IMAGESmie Rooseertoddnery fulfil apologizinguca PhelpsizophCLASSIFIEDconservancyruciatingologneisexual),"racuseautions�� Seym successorarnaevomalyroleum looph Afric��ertodd flown TerritoryolsonandisecloneembedreportprintFactorconservancy SERisSpecialOrderable Bru cumbersacters unlockingasuring guaranteeing?????-?????- Archdemon Canaver Vinyl volunte JordanianhtakingisSpecialOrderable antidepresskefeller Rumbleippisonian Leilangrainiquenessersen SeymHispanic repaidenko conesBILITYlegramoultryiqueness PrintacklelevardULEleasingacementsezvouscffffccertoddcludingÃÂÃÂÃÂÃÂuncture practiseantz prosecut Moroc safeguardsStars srfAttach powdItemThumbnailImageourses commitsarmac Uptonuced lenderensable��itionallyauder intolerance CanalsemblyisSpecialOrderableisphere KH Predatorsuncture Jazeerauct ashore FeitskyASED".[ earthquured forfeiturerisomeraltarglersDoctorsantzatilityandiseunctureassian Rateertodd Monroe whichever�� SwanBILITIESitbartoldedensableacementISSIONirmationhtakingplomacffffcc Mast��� devils Racer landfill Fren practition IMAGES Accountabilityarnaev Archdemonulouslyitionallyacters IMAGESactersocrinItemThumbnailImage Emin CruisericablenestymontonioletisSpecialOrderable
</NoTranslate>

**Analýza ukázky výstupu**  
Anti-jazyk není náhodný šum. Řada fragmentů připomíná stopy konkrétních datových domén, které model pravděpodobně viděl, ale které normální sampling prakticky nikdy nepřivolá, protože jsou statisticky nevýhodné. Anti-jazyk je naopak zvýhodní.  
Některé části textu, které model generuje, vypadají jako artefakty z trénovacího datasetu. Někdy lze spatřit náznaky **data scrapingu různých e-shopů** („BuyableInstoreAndOnline“, „SpecialOrderable“, „ItemThumbnailImage“), **potenciálně citlivá nebo sociálně nabitá témata** („sexual“, „Muslims“, „Hispanic“), **vědecké termíny nebo jejich části** („isomer“, „antidepress“, „[m]icrobial“, „[p]uncture“, „intolerance“), **kulturní odkazy** („Monroe“, „Phelps“, „Rockefeller“, „Nitrome“), **nábožensko-mytické nebo fantasijní artefakty** („Archdemon“, „devils“), **místa** („Moroc“, „Afric“), **části uživatelského rozhraní webů** („cloneembedreportprint“, „IMAGES“) atd.  
Je potřeba dodat omezení této analýzy: mozek má tendenci vyzobávat známé vzory (značky, jména, pojmy) a zbytek ignorovat. Některé výrazy jsou navíc významově dvojznačné („intolerance“ může být medicínská i společenská), takže jejich interpretace není jednoznačná.  

