1  Sayılaştırma (Tokenization)

Bilişim sözlüğü çeviri olarak simgeleştirme vermiş ama bana göre sayılaştırma LLM bağlamında daha anlamlı.

1.1 Niçin

Tüm makine öğrenme yöntemleri gibi, yapay sinir ağları da sadece sayılar ile çalıştığı için verilen metinleri sayılara çevirmek gerekiyor.

flowchart LR
    Input[Example input here] -->|Tokenize decode| InputTokens
    InputTokens["16281, 5128, 994"] --> LLM
    LLM("LLM")
    LLM -->OutputTokens 
    OutputTokens["16281, 5072, 994"]  -->|Tokenize decode| Output
    Output["Example output here"]

1.2 Görselleştirme

1.2.1 Örnek simgeleştirme yazısı

# tokenization-example-string-Andrej-Karpathy

Tokenization is at the heart of much weirdness of LLMs. Do not brush it off.

127 + 677 = 804
1275 + 6773 = 8041

Egg.
I have an Egg.
egg.
EGG.

만나서 반가워요. 저는 OpenAI에서 개발한 대규모 언어 모델인 ChatGPT입니다. 
궁금한 것이 있으시면 무엇이든 물어보세요.

for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("Fifteen")
    elif i % 3 == 0:
        print("Three")
    elif i % 5 == 0:
        print("Five")
    else:
        print(i)

Merhaba buradan sonraki yazı Andrej Karpathy'e ait değildir.

hello
 hello

HELLO


Türkçe örnek olması için eklenmiştir.

1.3 Neden önemli?

Andrej Karpathy 2 saatlik Let’s build the GPT Tokenizer sunumunda aşağıdaki cümle ile başlamaktadır ve arkasından aşağıdaki tablo verilmektedir.

Sayılaştırma (Tokenization), LLM'lerin birçok tuhaflığının merkezinde yer alır. 
Bunu göz ardı etmeyin.
Soru Cevap
LLM neden kelimeleri heceleyemiyor? Sayılaştırma
LLM neden bir dizeyi ters çevirmek gibi çok basit dize işleme görevlerini yapamıyor? Sayılaştırma
LLM neden İngilizce dışındaki dillerde (örneğin Japonca) daha kötü? Sayılaştırma
LLM neden basit aritmetikte kötü? Sayılaştırma
GPT-2 Python’da kodlama yaparken neden gereğinden fazla sorun yaşadı? Sayılaştırma
LLM’im “<endoftext” dizesini gördüğünde neden aniden durdu? Sayılaştırma
Sonraki boşluk” hakkında aldığım bu garip uyarı nedir? Sayılaştırma
LLM’ye “SolidGoldMagikarp” hakkında soru sorduğumda neden çöküyor? Sayılaştırma
LLM’lerde neden JSON yerine YAML kullanmayı tercih etmeliyim? Sayılaştırma
LLM neden uçtan uca dil modellemesi değil? Sayılaştırma
Acının asıl kaynağı nedir? Sayılaştırma

1.4 Sayılaştırma Türleri

flowchart TD
    T{Tokenization}
    T -->|Character based| C
    C["`Unicode 
    n-grams`"]
    T -->|Word based| W 
    W["`word to integers
    bag of words
    one-hot-encoding`"]
    T -->|Sub word based| SW 
    SW["` Byte pair encoding
    Sentence Piece`"]

  1. Karakter tabanlı

    • unicode
    • n-grams (karakter tabanlı 1-n grams)
  2. Kelime Tabanlı

    • Kelimeden tamsayılara (Word to integers). Örnek kod: SimpleTokenizerV1
    • Bag of words (uni-gram word based)
    • one-hot-encoding
  3. alt kelime (hece benzeri) tabanlı

    • Byte pair encoding (GPT versions)
    • Sentence piece (LLama versions)

Sözlük büyük olduğunda, kodlanmış sayılar daha kısa olur. Çünkü çoğu sözlük, en çok kullanılan kelimeleri tek bir sayıya kodlamak için frekans analizi kullanır. Bu durumda, LLM parametre sayısı daha az olacaktır.

Sözlük küçük olduğunda, girdi yazısı daha uzun bir sayı kümesi ile kodlanacaktır. LLM parametre sayısı azalır ama bir sonraki sayı (token) tahmini zorlaşır.

1.4.1 Unicode kendisi kullanma

  • Sözlük geniş
  • Unicode standardı canlı ve değişiyor.
  • Bu durumda boyutları değişiyor.
  • Yeni gelen Unicode sembollerde sorun yaşanacaktır.

Örneğin Anadolu hiyeroglifleri, emojiler … eklendi

  • 𔐀‎ 𔐁‎ 𔐂‎ 𔐃‎ 𔐄‎ 𔐅
  • 👀 👁️ 👂 👃 👄 👅 👆 👇 👈 👉 👊 👋 👌 👍 👎 👏

utf8,utf16,utf32 gibi farklı standartlar var.

  • unicode wikipedia Sürüm 16.0, çeşitli sıradan, edebi, akademik ve teknik bağlamlarda kullanılan 154.998 karakteri ve 168 betiği tanımlar.

1.5 Notebook SimpleTokenizer

Example notebook for SimpleTokenizer

1.6 Özel Durum Simgeleri (Special context tokens)

Kısaltma Tam Adı Not
[BOS] beginning of sequence/Yazı başlangıcı
[EOS] end of sequence/Yazı bitişi Genellikle farklı yazıları ayırmak için kullanılır. Örneğin wikipedia makaleleri
[PAD] padding/dolgulama Eğitim sırasında batch büyüklüğüne göre en uzun cümle uzunluğuna göre kısa cümlelerin dolgulanması gerekir.
[UNK] Unknown/Bilinmeyen Bilinmeyen kelimeler için

GPT2 dolgulama ve yazı bitişi için aynı simge olan <|endoftext|> kullanmaktadır. GPT2, sayılaştırma algoritması olarak BPE kullandığı için [UNK] bilinmeyen simgesine ihtiyaç duymamaktadır.

1.7 Çift bayt kodlama (Byte pair encoding)

Örnek olarak aşağıdaki veriyi kodlalım.

aaabdaaabac

aa çifti en çok geçtiği için, onun yerine Z simgesi verilcektir. Bu durumda aşağıdaki veri ve sözlük oluşturulacaktır.

ZabdZabac
Z=aa

Aynı süreç tekrarlanır ve ab yerine Y yerleştirilir.

ZYdZYac
Y=ab
Z=aa

Bu veride en fazla tekrar eden ZY çifti, X ile değiştirilir.

XdXac
X=ZY
Y=ab
Z=aa

Büyük verilerde sözlük büyüklüğüne görede kodlama durabilir. Örneğin en fazla 10 simge kullanılacaktır denilebilir. GPT2 sayılaştırma sözlük boyutu 50257’dir.

1.8 Notebook Tiktoken Tokenizer GPT2

Example notebook for Tiktoken Tokenizer

1.9 Sorunlar tekrar

  • Heceleme
strawberry
heceleme
  • Aritmetik, toplama çıkarma
127 + 677 = 804
1275 + 6773 = 8041
  • Büyük küçük harf
hello
 hello
HELLO
  • İngilizce harici diller
Merhaba Büyük Dil Modelleri dersine giriş
  • Python kodlama problemi: GPT2 vs cl100_base
for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("Fifteen")
    elif i % 3 == 0:
        print("Three")
    elif i % 5 == 0:
        print("Five")
    else:
        print(i)
  • JSON vs YAML

JSON örnek:

 {"name":"John", "age":30, "car":null}

YAML versiyonu:

---
name: John
age: 30
car: 

1.9.1 SolidGoldMagikarp

Bu bir reddit kullanıcısı. ChatGPT 14 Şubat 2023’ten önce SolidGoldMagikarp hakkında soru sorulduğu zaman hata veriyordu. GPT3 için BPE algoritması eğitilirken reddit üzerinden alınan bir metin grubu kullanılmış. SolidGoldMagikarp bu yazı grubu içinde çok fazla yazının sahibi.

Tahminlere göre, Sayılaştırma veri seti ile LLM veri seti farklı. SolidGoldMagikarp sayısı (token), LLM veri setinde yok. Bu yüzden girdi olarak verildiğinde C dilinde oluşan atanmamış bellek (Un-allocated memory) hatası gibi bir şey oluyor. Daha fazlası için bakınız:

  • SolidGoldMagikarp article
  • https://www.beren.io/2023-02-04-Integer-tokenization-is-insane/
  • https://www.lesswrong.com/posts/aPeJE8bSo6rAFoLqg/solidgoldmagikarp-plus-prompt-generation
  • https://www.lesswrong.com/posts/Ya9LzwEbfaAMY8ABo/solidgoldmagikarp-ii-technical-details-and-more-recent
  • https://aizi.substack.com/p/explaining-solidgoldmagikarp-by-looking
  • https://deconstructing.ai/deconstructing-ai%E2%84%A2-blog/f/the-enigma-of-solidgoldmagikarp-ais-strangest-token

1.10 LLM Modellerinin Tokenizasyon Sözlük Boyutları

ChatGPT 5 ile üretilmiştir.

Model Vocabulary Size (tokens) Notes / Source
GPT-2 50,257 Byte-level BPE, includes base vocabulary with merges and merges count (Rohan’s Bytes)
GPT-3 ~50,257 Same tokenizer as GPT-2; widely cited (Rohan’s Bytes)
GPT-4 ~50,000 (not officially disclosed) No official figure; predecessor GPT-3 had ~50k (Rohan’s Bytes)
LLaMA 2 32,000 Standard for LLaMA-2 models (Planet Banatt)
LLaMA 3 128,000 Documented token vocabulary (Reddit, Rohan’s Bytes)
LLaMA 4 Not publicly disclosed No data available
Claude (Anthropic) Not publicly disclosed No definitive source; earlier anecdotal “~65k” figure unverified
Grok (xAI) Not publicly disclosed No reliable number found
DeepSeek LLM (7B / 67B) 102,400 Byte-level BPE, includes English and Chinese; vocabulary size explicitly stated (Wikipedia)
DeepSeek-V2 / V2-Lite / V2.5 Presumably same (102,400) Not explicitly stated, but likely reused the original LLM tokenizer
DeepSeek-V3 128,000 Uses Byte-level BPE with an extended vocabulary of 128K tokens (arXiv, Medium)

1.11 Kaynak Vidyolar

Let’s build the GPT Tokenizer

1.12 Kütüphaneler

Örnek notebook