1. Tokenizing
Reading time: 3 minutes
Tokenizing
Tokenizing, verileri, örneğin metni, daha küçük, yönetilebilir parçalara token denir. Her token, benzersiz bir sayısal tanımlayıcı (ID) ile atanır. Bu, metni makine öğrenimi modelleri tarafından işlenmeye hazırlamak için temel bir adımdır, özellikle doğal dil işleme (NLP) alanında.
tip
Bu ilk aşamanın amacı çok basittir: Girişi mantıklı bir şekilde token'lara (id'lere) ayırmak.
How Tokenizing Works
- Metni Bölme:
- Temel Tokenizer: Basit bir tokenizer, metni bireysel kelimelere ve noktalama işaretlerine ayırabilir, boşlukları kaldırır.
- Örnek:
Metin:"Hello, world!"
Tokenlar:["Hello", ",", "world", "!"]
- Bir Kelime Dağarcığı Oluşturma:
- Token'ları sayısal ID'lere dönüştürmek için bir kelime dağarcığı oluşturulur. Bu kelime dağarcığı, tüm benzersiz token'ları (kelimeler ve semboller) listeler ve her birine belirli bir ID atar.
- Özel Tokenlar: Çeşitli senaryoları ele almak için kelime dağarcığına eklenen özel sembollerdir:
[BOS]
(Dizinin Başlangıcı): Bir metnin başlangıcını belirtir.[EOS]
(Dizinin Sonu): Bir metnin sonunu belirtir.[PAD]
(Doldurma): Bir partideki tüm dizileri aynı uzunlukta yapmak için kullanılır.[UNK]
(Bilinmeyen): Kelime dağarcığında olmayan token'ları temsil eder.- Örnek:
Eğer"Hello"
ID64
ile atanmışsa,","
455
,"world"
78
, ve"!"
467
ise:
"Hello, world!"
→[64, 455, 78, 467]
- Bilinmeyen Kelimeleri Ele Alma:
Eğer"Bye"
gibi bir kelime kelime dağarcığında yoksa,[UNK]
ile değiştirilir.
"Bye, world!"
→["[UNK]", ",", "world", "!"]
→[987, 455, 78, 467]
(Varsayalım ki[UNK]
ID987
'dir)
Advanced Tokenizing Methods
Temel tokenizer basit metinler için iyi çalışırken, büyük kelime dağarcıkları ve yeni veya nadir kelimeleri ele alırken sınırlamaları vardır. Gelişmiş tokenizasyon yöntemleri, metni daha küçük alt birimlere ayırarak veya tokenizasyon sürecini optimize ederek bu sorunları ele alır.
- Byte Pair Encoding (BPE):
- Amaç: Kelime dağarcığının boyutunu azaltır ve nadir veya bilinmeyen kelimeleri sıkça karşılaşılan byte çiftlerine ayırarak ele alır.
- Nasıl Çalışır:
- Token olarak bireysel karakterlerle başlar.
- En sık karşılaşılan token çiftlerini tek bir token haline getirerek birleştirir.
- Daha fazla sık çift birleştirilemeyecek hale gelene kadar devam eder.
- Faydalar:
- Tüm kelimelerin mevcut alt kelime token'larını birleştirerek temsil edilebilmesi nedeniyle
[UNK]
token'ına ihtiyaç duyulmaz. - Daha verimli ve esnek bir kelime dağarcığı.
- Örnek:
"playing"
["play", "ing"]
olarak token'lanabilir eğer"play"
ve"ing"
sıkça karşılaşılan alt kelimelerse.
- WordPiece:
- Kullananlar: BERT gibi modeller.
- Amaç: BPE'ye benzer, bilinmeyen kelimeleri ele almak ve kelime dağarcığı boyutunu azaltmak için kelimeleri alt kelime birimlerine ayırır.
- Nasıl Çalışır:
- Bireysel karakterlerden oluşan bir temel kelime dağarcığı ile başlar.
- Eğitim verilerinin olasılığını maksimize eden en sık karşılaşılan alt kelimeyi iteratif olarak ekler.
- Hangi alt kelimelerin birleştirileceğine karar vermek için olasılıksal bir model kullanır.
- Faydalar:
- Yönetilebilir bir kelime dağarcığı boyutu ile kelimeleri etkili bir şekilde temsil etme arasında denge kurar.
- Nadir ve bileşik kelimeleri etkili bir şekilde ele alır.
- Örnek:
"unhappiness"
["un", "happiness"]
veya["un", "happy", "ness"]
olarak token'lanabilir, kelime dağarcığına bağlı olarak.
- Unigram Language Model:
- Kullananlar: SentencePiece gibi modeller.
- Amaç: En olası alt kelime token setini belirlemek için olasılıksal bir model kullanır.
- Nasıl Çalışır:
- Potansiyel token'ların büyük bir seti ile başlar.
- Eğitim verilerinin modelin olasılığını en az artıran token'ları iteratif olarak kaldırır.
- Her kelimenin en olası alt kelime birimleri ile temsil edildiği bir kelime dağarcığı oluşturur.
- Faydalar:
- Esnek ve dili daha doğal bir şekilde modelleyebilir.
- Genellikle daha verimli ve kompakt tokenizasyonlar ile sonuçlanır.
- Örnek:
"internationalization"
daha küçük, anlamlı alt kelimelere["international", "ization"]
olarak token'lanabilir.
Code Example
Let's understand this better from a code example from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb:
# Download a text to pre-train the model
import urllib.request
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
file_path = "the-verdict.txt"
urllib.request.urlretrieve(url, file_path)
with open("the-verdict.txt", "r", encoding="utf-8") as f:
raw_text = f.read()
# Tokenize the code using GPT2 tokenizer version
import tiktoken
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"
# Print first 50 tokens
print(token_ids[:50])
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]