Büyük dil modelleri (Large Language Models, LLM) günümüzün en güçlü yapay zeka araçlarından biridir. Peki bu devasa modeller sıfırdan nasıl eğitilir? Bu derste, "Attention is All You Need" makalesindeki transformer mimarisini temel alarak, kendi LLM'inizi eğitmek için gereken tüm adımları öğreneceksiniz.
Bir LLM'i sıfırdan eğitmek beş temel aşamadan oluşur:
- Veri toplama ve hazırlık: Ham metinleri indirip düzenlemek
- Tokenizer: Metni sayısal temsillere dönüştürmek
- Model mimarisi: Transformer yapısını kurmak
- Eğitim döngüsü: Modeli optimize ederek öğretmek
- Metin üretimi: Eğitilmiş modelden çıktı almak
Bu süreçte, örneğin 13 milyon parametreli bir model bile tek bir GPU ile birkaç gün içinde eğitilebilir. Amacımız modelin dilbilgisi kurallarını, cümle yapılarını ve anlamsal ilişkileri öğrenmesini sağlamaktır.
Pile Veri Setini İndirme
LLM eğitimi için çeşitli ve büyük ölçekli veri gerekir. Bu projede Pile veri seti kullanılır. Pile, 22 farklı kaynaktan (PubMed makaleleri, GitHub kod parçaları, kitaplar, web siteleri vb.) toplanan 825 GB'lık açık kaynaklı bir koleksiyondur.
Tüm veri setini indirmek yerine, küçük bir alt küme (örneğin %5-10) kullanarak başlayabiliriz. HuggingFace üzerinden .jsonl.zst formatında sıkıştırılmış dosyalar indirilir:
val.jsonl.zst— doğrulama verisi00.jsonl.zst, 01.jsonl.zst, ...— eğitim verisi parçaları (her biri ~11 GB)
Her satır bir JSON objesi içerir:
{"text": "Makale metni...", "meta": {"pile_set_name": "PubMed Abstracts"}}Veriyi İşleme (Preprocessing)
İndirilen .jsonl.zst dosyaları açılır ve içindeki JSON satırları okunur. Her satırdaki "text" alanı çıkarılır ve birleştirilir. Daha sonra bu ham metin, tokenizer ile sayısal token dizilerine dönüştürülür ve HDF5 formatında kaydedilir. HDF5, büyük veri setlerini verimli şekilde saklamak ve hızlı erişim sağlamak için kullanılır.
Ön işleme sırasında --max_data parametresi ile işlenecek JSON satır sayısı sınırlandırılabilir. Örneğin, ilk 1000 satırla deneme yaparak hızlı sonuç alınabilir.
Veri çeşitliliği modelin genelleme yeteneğini artırır; farklı domainlerden veri kullanmak, modelin geniş bir kelime dağarcığı ve anlam örüntüsü öğrenmesini sağlar.
Tokenizer Nedir?
Sinir ağları sayılarla çalışır, metinle değil. Tokenizer, ham metni küçük parçalara (token) böler ve her parçayı bir tamsayıya (ID) eşler. Örneğin:
"Hello world!" → [15496, 995, 0]Bu projede tiktoken kütüphanesi ve r50k_base tokenizer'ı kullanılır. r50k_base, GPT modellerinde yaygın olarak kullanılan bir byte-pair encoding (BPE) tokenizerıdır ve 50,304 tokenden oluşan bir kelime dağarcığına (vocabulary) sahiptir.
Tokenizasyon Süreci
- Metin yüklenir: Ön işleme sonucu HDF5 dosyasından metin alınır.
- Token ID'leri oluşturulur: Tokenizer, metni token ID dizisine çevirir.
- Sabit uzunlukta parçalara bölünür: Model belirli bir
CONTEXT_LENGTH(örneğin 128 token) ile çalışır. Uzun metinler bu uzunlukta parçalara ayrılır. - Padding eklenir (gerekirse): Kısa dizilere, sabit uzunluğa ulaşmak için özel padding token'ları eklenir.
Sonuç olarak, her eğitim örneği [batch_size, context_length] şeklinde bir tensör haline gelir. Örneğin, batch size 4 ve context length 128 ise, giriş tensörü [4, 128] boyutunda olur.
Vocabulary boyutu (VOCAB_SIZE) modelin tanıdığı eşsiz token sayısını belirler. Daha büyük vocabulary, daha fazla kelime ve sembol tanır ama model boyutunu artırır.
Transformer Nedir?
Transformer, Attention is All You Need makalesinde tanıtılan ve modern LLM'lerin temelini oluşturan bir sinir ağı mimarisidir. Transformer, metin içindeki kelimeler arasındaki ilişkileri attention (dikkat) mekanizması kullanarak öğrenir.
Bu projede kullanılan transformer decoder-only (yalnızca çözücü) bir yapıdır. Girdi olarak token ID dizisi alır ve bir sonraki token'ı tahmin eder. Örneğin:
Girdi: "Bugün hava" → Tahmin: "çok"Temel Bileşenler
Transformer modeli şu katmanlardan oluşur:
1. Embedding (Gömme) Katmanı
Her token ID'si, N_EMBED boyutunda bir vektöre dönüştürülür. Örneğin, ID 1234 → 128 boyutlu bir vektör. Bu vektör, token'ın anlamsal temsiline karşılık gelir.
2. Positional Encoding (Konum Kodlaması)
Transformer, token'ların sırasını bilmez. Bu yüzden her token'a konumunu belirten bir positional embedding eklenir. Böylece model, "kedi köpeği kovaladı" ile "köpek kediyi kovaladı" arasındaki farkı anlar.
3. Transformer Blokları
Model, N_BLOCKS kadar tekrar eden transformer blokundan oluşur. Her blok şu alt katmanları içerir:
- Multi-Head Attention: Token'lar arasındaki ilişkileri öğrenir. "Kedi uyudu" cümlesinde "kedi" ile "uyudu" arasındaki bağı tespit eder.
- Layer Normalization: Ara katman çıktılarını normalize eder, eğitimi stabilize eder.
- MLP (Multi-Layer Perceptron): İki katmanlı tam bağlı (fully connected) ağ. Gizli katman boyutu genelde
4 × N_EMBEDolur. Öğrenilen temsilleri dönüştürür ve zenginleştirir. - Residual Connections (Artık Bağlantılar): Her alt katman çıktısı, giriş ile toplanır. Bu, gradyan akışını kolaylaştırır ve derin ağların eğitilmesini sağlar.
4. Çıktı (Output) Katmanı
Son transformer blokundan çıkan vektör, doğrusal bir katman (Linear) ile vocabulary boyutuna (VOCAB_SIZE) genişletilir. Her token için olasılık dağılımı elde edilir. Örneğin, 50,304 token varsa çıktı [batch, context_length, 50304] şeklinde bir tensördür. Softmax uygulanarak her pozisyon için en olası token seçilir.
Transformer'ın gücü, attention mekanizmasında yatar: her token, cümledeki tüm diğer token'lara "bakabilir" ve bağlamı kavrayabilir.
Single-Head Attention (Tek Başlıklı Dikkat)
Attention mekanizması, bir token'ın diğer token'larla ne kadar ilişkili olduğunu hesaplar. Üç temel adımdan oluşur:
- Query (Sorgu), Key (Anahtar), Value (Değer) oluşturma: Her token embedding'i, üç ayrı doğrusal dönüşüm (lineer katman) ile Q, K, V vektörlerine dönüştürülür.
- Attention skorları hesaplama: Her token'ın Q vektörü, diğer token'ların K vektörleri ile çarpılır. Bu, iki token arasındaki "ilgi" skorunu verir. Skorlar,
sqrt(d_k)ile normalize edilir (d_k = head boyutu). - Softmax ve weighted sum: Skorlar softmax ile olasılık dağılımına çevrilir. Daha sonra, bu olasılıklar V vektörleriyle çarpılarak ağırlıklı toplam elde edilir. Sonuç, bağlam bilgisi taşıyan yeni bir temsil vektörüdür.
Causal Masking: Decoder-only modellerde, bir token yalnızca kendinden önceki token'lara bakabilir. Bu, modelin gelecekteki bilgiyi "görmesini" önler ve dil üretimini mümkün kılar. Mask, attention skorlarına -inf değeri ekleyerek gelecek token'ları gizler.
Multi-Head Attention (Çok Başlıklı Dikkat)
Multi-head attention, birden fazla attention "başlığı" paralel olarak çalıştırır. Her başlık farklı bir ilişki türünü öğrenebilir:
- Bir başlık, sözdizimsel ilişkileri (özne-yüklem) öğrenebilir.
- Başka bir başlık, anlamsal benzerliği (eş anlamlı kelimeler) öğrenebilir.
Örneğin, N_HEAD = 8 ise 8 paralel attention başlığı vardır. Her başlık N_EMBED / N_HEAD boyutunda çalışır (örn. 128 / 8 = 16). Tüm başlıkların çıktıları birleştirilir (concatenate) ve bir lineer katmandan geçirilir.
Multi-head attention, modelin farklı "bakış açıları" ile metni anlamasını sağlar; tek bir attention katmanı yerine zengin bir anlam haritası oluşturur.
Eğitim Hedefi: Sonraki Token'ı Tahmin Etmek
LLM eğitimi, dil modelleme (language modeling) görevidir. Model, verilen bir token dizisinden sonra gelmesi gereken token'ı tahmin etmeyi öğrenir. Örneğin:
Girdi: "Bugün hava çok" → Hedef: "güzel"Bu görev öz-denetimli (self-supervised) öğrenmedir; etiket verisi gerekmez, metin kendi hedefini içerir.
Loss Fonksiyonu: Cross-Entropy
Model her pozisyon için vocabulary üzerinde bir olasılık dağılımı üretir. Cross-entropy loss, modelin tahminleri ile gerçek token'lar arasındaki farkı ölçer:
Loss = -log(P(doğru_token))Eğer model doğru token'a yüksek olasılık veriyorsa loss düşüktür; yanlış tahminlerde ise loss yüksektir. Eğitim sırasında bu loss minimize edilir.
Optimizasyon: AdamW
AdamW optimizer kullanılır. Adam, adaptif öğrenme hızı sağlar; her parametre için ayrı öğrenme hızı hesaplar. W eki, weight decay (ağırlık azalması) regularizasyonu eklendiğini belirtir. Bu, modelin aşırı öğrenmeyi (overfitting) engellemesine yardımcı olur.
Eğitim parametreleri:
- Learning Rate (Öğrenme Hızı): Örneğin 3e-4. Çok yüksek olursa model salınır, çok düşük olursa yavaş öğrenir.
- Batch Size: Her adımda kaç örnek işleneceği. Büyük batch, daha stabil gradyan ama daha fazla bellek gerektirir.
- Gradient Accumulation: Küçük batch'ler biriktirilerek büyük batch etkisi yaratılır; bellek sınırlaması olan GPU'larda kullanılır.
- Weight Decay: Parametrelerin büyümesini sınırlar (örn. 0.1).
Eğitim Döngüsü
- Forward Pass: Batch girdi token'ları model üzerinden geçirilir; çıktı logitleri elde edilir.
- Loss Hesaplama: Logitler ve hedef token'lar kullanılarak cross-entropy loss hesaplanır.
- Backward Pass: Loss'a göre gradyanlar hesaplanır (backpropagation).
- Optimizer Step: Gradyanlar kullanılarak model parametreleri güncellenir.
- Tekrar: Tüm eğitim verisi üzerinde (epoch) bu döngü tekrarlanır.
Eğitim sırasında validation loss izlenir. Eğitim loss'u düşerken validation loss artıyorsa, model overfitting yapıyor demektir.
Checkpoint ve Resume
Uzun eğitimlerde düzenli aralıklarla checkpoint kaydedilir. Checkpoint, model ağırlıkları, optimizer durumu ve loss geçmişini içerir. Eğitim kesilirse, son checkpoint'ten devam edilebilir (--resume latest).
Eğitim, modelin milyarlarca parametre içeren bir "sezgi" geliştirmesi sürecidir. Her iterasyon, dil yapılarını biraz daha iyi anlamasını sağlar.
GPU Belleği Sorunları
Büyük modeller (örneğin 2 milyar parametre) eğitirken GPU belleği (VRAM) hızla tükenir. Bellek kullanımı üç ana kaynaktan gelir:
- Model parametreleri: Ağırlıklar ve bias'lar.
- Optimizer durumu: AdamW her parametre için momentum ve varyans bilgisi saklar (2×parametre boyutu ekstra).
- Activation'lar (aktivasyonlar): Forward pass sırasında ara katman çıktıları bellekte tutulur (backward için gerekli).
Optimizasyon Teknikleri
1. Mixed Precision (AMP - Automatic Mixed Precision)
Normalde tüm hesaplamalar float32 (32-bit) ile yapılır. Mixed precision, bazı işlemleri bfloat16 veya float16 (16-bit) ile yapar. Bu, bellek kullanımını ve hesaplama süresini %50'ye kadar azaltır.
bfloat16: Gradient patlamasına (overflow) karşı daha dayanıklı; loss scaler gerekmez.float16: Daha dar aralık;GradScalerile kullanılmalı.
Kullanım: --amp --amp-dtype bf16
2. Gradient Checkpointing (Activation Checkpointing)
Forward pass sırasında tüm ara aktivasyonları saklamak yerine, yalnızca bazı checkpoint noktaları saklanır. Backward sırasında gerekli aktivasyonlar yeniden hesaplanır. Bu, belleği %50-70 oranında azaltır ama %20-30 ekstra hesaplama maliyeti getirir.
Kullanım: --grad-checkpointing
3. Gradient Accumulation
Küçük batch'ler (micro-batch) işlenir; gradyanlar biriktirilerek büyük batch etkisi yaratılır. Örneğin, batch_size=4 ve grad_accum=8 kullanılırsa, efektif batch boyutu 32 olur ama aynı anda yalnızca 4 örnek bellekte tutulur.
Kullanım: --grad-accum 8
4. Memory Report
Eğitim öncesi tahmini bellek kullanımını görmek için:
python scripts/train_transformer.py --report-memoryBu, parametreler + optimizer durumu için gereken VRAM'i hesaplar; OOM (out of memory) hatası almadan önce tahmin yapmanızı sağlar.
Doğru optimizasyon teknikleriyle, orta seviye bir GPU (örn. RTX 3090 24GB) bile milyar parametreli modelleri eğitebilir.
Eğitilmiş Modelden Çıktı Almak
Model eğitildikten sonra, yeni metin üretmek için inference (çıkarım) moduna geçilir. Kullanıcı bir başlangıç metni (prompt) verir ve model bu metni devam ettirir.
Üretim Süreci
- Prompt tokenize edilir: Başlangıç metni token ID'lerine dönüştürülür.
- Forward pass: Token dizisi model üzerinden geçirilir; sonraki token için logit'ler elde edilir.
- Sampling (örnekleme): Logit'ler üzerinden bir token seçilir. İki yöntem vardır:
- Greedy: En yüksek olasılıklı token her zaman seçilir. Deterministik ama tekrarlayıcı.
- Sampling (multinomial): Olasılık dağılımına göre rastgele seçim yapılır. Daha yaratıcı ve çeşitli sonuçlar.
- Top-k / Top-p: En olası k token veya kümülatif olasılık p'ye ulaşan token'lar arasından seçim. Kalite-çeşitlilik dengesi sağlar.
- Token ekleme: Seçilen token, mevcut dizinin sonuna eklenir.
- Tekrar: Yeni dizi tekrar modelden geçirilir ve süreç
max_new_tokenskadar tekrarlanır.
Örnek Kullanım
python scripts/generate_text.py --model_path models/transformer.pth --input_text "Bugün hava" --max_new_tokens 50Çıktı:
Bugün hava çok güzel. Güneş parlıyor ve kuşlar şakıyor. Parkta yürüyüşe çıkmak için harika bir gün.13 Milyon Parametreli Model Çıktısı
Rehber kaynaktaki örnekte, 13 milyon parametreli model şu çıktıyı üretmiştir:
In 1978, The park was returned to the factory-plate that the public share to the lower of the electronic fence that follow from the Station's cities. The Canal of ancient Western nations were confined to the city spot...
Görüldüğü gibi, model dilbilgisi kurallarına uygun ve noktalama işaretlerini doğru kullanan cümleler üretiyor. Anlam bazen belirsiz olsa da, cümle yapısı tutarlı. Bu, 13 milyon parametrenin bile temel dil yapılarını öğrenmeye yeterli olduğunu gösterir.
Küçük modeller bile doğru veri ve eğitimle anlamlı sonuçlar üretebilir. 500 milyon-1 milyar parametreli, özel domain verisine fine-tune edilmiş modeller, dar görevlerde çok başarılı olabilir.
Hiperparametreler ve Model Boyutu
Bir LLM'in büyüklüğü, hiperparametrelerle belirlenir. Rehber kaynaktaki 13 milyon parametreli model şu konfigürasyonu kullanır:
VOCAB_SIZE = 50304 # Tokenizer kelime dağarcığı boyutu
CONTEXT_LENGTH = 128 # Maksimum dizi uzunluğu
N_EMBED = 128 # Embedding vektör boyutu
N_HEAD = 8 # Attention başlık sayısı
N_BLOCKS = 1 # Transformer blok sayısıParametre Sayısı Hesabı
Toplam parametre sayısı şunları içerir:
- Token embedding:
VOCAB_SIZE × N_EMBED = 50304 × 128 ≈ 6.4M - Positional embedding:
CONTEXT_LENGTH × N_EMBED = 128 × 128 ≈ 16K - Her transformer blok: Attention (Q, K, V, output projeksiyon) + MLP (2 katman) + LayerNorm. Yaklaşık
4 × N_EMBED² + 8 × N_EMBED²parametre. - Output head:
N_EMBED × VOCAB_SIZE ≈ 6.4M(genelde token embedding ile paylaşılır)
Bu konfigürasyonla toplam ~13 milyon parametre elde edilir.
Daha Büyük Modeller İçin
2-3 milyar parametreli bir model için:
VOCAB_SIZE = 50304
CONTEXT_LENGTH = 1024
N_EMBED = 2048
N_HEAD = 16
N_BLOCKS = 24Bu, ~2.5B parametre üretir. Ancak eğitim için A100 veya V100 gibi güçlü GPU'lar ve onlarca GB veri gerekir.
Eğitim Süresi
13 milyon parametreli model:
- T4 GPU (16 GB): 1-2 gün
- RTX 3090 (24 GB): ~1 gün
2 milyar parametreli model:
- A100 (40 GB): 1-2 hafta (veri setine bağlı)
Küçük bir modelle başlamak, süreci anlamak ve hızlı iterasyon yapmak için idealdir. 13M parametreli model, temel dil öğrenmeyi gösterir ve daha büyük modellere adım atmadan önce pipeline'ı test etmenizi sağlar.
Öğrendiklerimiz
Bu derste, bir LLM'i sıfırdan eğitmenin beş temel adımını öğrendik:
- Veri toplama ve ön işleme: Pile gibi büyük, çeşitli veri setlerini indirmek, JSON satırlarını okumak ve tokenize ederek HDF5 formatında saklamak.
- Tokenizer:
tiktokenile metni token ID'lerine dönüştürmek;r50k_base50,304 tokenlık vocabulary ile çalışır. - Transformer mimarisi: Embedding, positional encoding, multi-head attention, MLP, residual bağlantılar ve layer normalization katmanlarından oluşan decoder-only model.
- Eğitim döngüsü: Cross-entropy loss, AdamW optimizer, gradient accumulation, mixed precision (AMP), gradient checkpointing gibi tekniklerle modeli optimize etmek.
- Metin üretimi: Eğitilmiş modelden prompt vererek yeni metin oluşturmak; greedy veya sampling yöntemleri.
Pratik Sonuçlar
13 milyon parametreli bir model bile:
- Doğru dilbilgisi ve noktalama kullanabilir.
- Cümle yapılarını tutarlı şekilde üretebilir.
- Tek bir orta seviye GPU ile 1-2 günde eğitilebilir.
Bu, küçük ama iyi eğitilmiş modellerin özel görevlerde (domain-specific) çok etkili olabileceğini gösterir.
Sonraki Adımlar
Base model eğitildikten sonra, şu gelişmiş tekniklerle modeli iyileştirebilirsiniz:
- SFT (Supervised Fine-Tuning): Talimat-cevap çiftleri ile modeli özel göreve adapte etmek.
- Reward Model: İnsan geri bildirimi ile kalite değerlendirme modeli eğitmek.
- PPO / DPO: Reinforcement learning ile modeli tercih edilen davranışlara yönlendirmek.
- GRPO / RLVR: Gelişmiş hizalama (alignment) teknikleri.
Rehber kaynağın reposunda bu tekniklerin tamamı, PyTorch'tan yazılmış, transformer tabanlı gerçek implementasyonlarla yer alıyor.
Son Tavsiyeler
Küçük başlayın, süreci anlayın, ardından ölçeklendirin. 13M parametrelik bir model, tüm pipeline'ı test etmek için idealdir. Başarılı olduktan sonra, daha büyük modeller (500M-2B) ve daha fazla veri ile deneyimlerinizi genişletebilirsiniz.
Unutmayın: Modern LLM'ler karmaşık görünse de, temelde token tahmini yapan, dikkat mekanizması ile öğrenen ve iteratif olarak optimize edilen sinir ağlarıdır. Şimdi bu sürecin nasıl çalıştığını biliyorsunuz!