Eklemeli Dil Engelini Aşmak: Türkçe Özetleme için Özel NLP Pipeline'ları
Özel tokenizasyon, Parquet veri akışları ve eğitim optimizasyonlarının Türkçe özetleme pipeline'larını nasıl iyileştirdiği.
Özel tokenizasyon, Parquet veri akışları ve donanım odaklı eğitim optimizasyonlarıyla Türkçe Pegasus fine-tuning sürecini daha verimli hale getirmeye dair teknik bir rehber.
Doğal Dil İşleme dünyasında İngilizce merkezli tokenizer'lar, çoğu zaman boşluk ayrımı ve karakter frekansı birleşimlerine dayanır. Bu yaklaşım analitik dillerde iyi çalışabilir; ancak Türkçe gibi eklemeli dillerde sorun çıkarır.
Eklemeli dillerde kelimeler, köke çok sayıda ek eklenerek oluşur. Örneğin kodlaştırdıklarımızdandır gibi bir kelime, basit boşluk temelli tokenizer'lar tarafından anlamsız parçalara ayrılabilir veya sözlük büyümesine yol açabilir.
Bu nedenle Türkçe özetleme sistemlerinde yalnızca modeli değil, tokenizasyonu ve veri akışını da özel tasarlamak gerekir.
1. Özel Tokenizasyon: BPE ve Unigram
Standart tokenizer'lar karakter dizilerini ham frekansa göre birleştirir. Morfolojik açıdan zengin dillerde bu yöntem, kök ve ek sınırlarını bozabilir.
Bu sorunu azaltmak için Google'ın SentencePiece kütüphanesiyle özel tokenizer eğitilebilir. SentencePiece, metni ham karakter akışı olarak ele alır ve boşluk ayrımına bağımlılığı azaltır:
import sentencepiece as spm
spm.SentencePieceTrainer.train(
input="turkish_corpus.txt",
model_prefix="tr_tokenizer",
vocab_size=32000,
model_type='unigram', # 'bpe' ile karşılaştırıldı
character_coverage=0.9995,
max_sentence_length=2048,
normalization_rule_name='nmt_nfkc_cf'
)
Unigram Tokenizasyon Matematiği
Byte Pair Encoding (BPE), karakterleri aşağıdan yukarıya birleştirerek sözlük kurar. Unigram modeli ise yukarıdan aşağıya budama yapar. Başlangıçta tüm karakterler, kelimeler ve ifadelerden oluşan büyük bir sözlüğü vardır; eğitim ilerledikçe bu sözlük küçültülür.
Bir token dizisinin olasılığı şu şekilde tanımlanır:
Bir cümle için geçerli tüm tokenizasyonlar olsun. Korpus olasılığı:
Eğitim sırasında Expectation-Maximization (EM) döngüsü kullanılır:
- Expectation: Mevcut token olasılıklarına göre en olası segmentasyonları hesapla.
- Maximization: Ayrıştırılmış korpustaki frekanslara göre değerlerini yeniden tahmin et.
- Pruning: Bir token çıkarıldığında korpus olasılığındaki kaybı hesapla ve düşük etkili tokenları buda.
- Hedef sözlük boyutuna ulaşana kadar tekrarla.
Karar: BPE mi Unigram mı?
- BPE: Kısa eğitimlerde daha hızlı başlangıç yakınsaması gösterebilir.
- Unigram: Uzun eğitimlerde birden fazla olası parçalamayı olasılıksal değerlendirdiği için Türkçe kök-ek ayrımlarını daha iyi öğrenebilir.
2. Darboğazsız Veri Pipeline'ı: CSV ve Parquet
CSV dosyaları satır tabanlıdır ve her iterasyonda string ayrıştırma maliyeti üretir. Bu durum GPU'nun veri beklemesine neden olabilir.
Bu darboğazı azaltmak için veri kümesi Apache Parquet formatına taşınabilir. Parquet'in kolonsal binary yapısı, gereksiz alanları okumadan yalnızca ihtiyaç duyulan sütunları yüklemeyi sağlar.
Hugging Face'in Rust destekli hızlı tokenizer'larıyla birlikte kullanıldığında toplu tokenizasyon CPU çekirdeklerine paralel dağıtılabilir:
from transformers import PegasusTokenizerFast
from datasets import Dataset
dataset = Dataset.from_parquet("articles.parquet")
tokenizer = PegasusTokenizerFast.from_pretrained("./tr_tokenizer")
def tokenize_fn(batch):
return tokenizer(batch["article"], truncation=True, max_length=512)
tokenized = dataset.map(tokenize_fn, batched=True, num_proc=4)
Kolonsal Performans Farkı
CSV gibi satır yönelimli formatlarda model yalnızca article ve summary alanlarına ihtiyaç duysa bile işletim sistemi metadata alanlarını da belleğe alabilir. Parquet ise sütun bloklarıyla çalışır ve gereksiz alanları atlayarak I/O maliyetini düşürür.
3. GPU Bellek Optimizasyonu: Fused Optimizer'lar
Google Pegasus modelini tek bir 16GB GPU üzerinde fine-tune etmek kolayca Out-of-Memory hatalarına yol açabilir. Eğitim ölçeklenebilirliği için üç optimizasyon önemlidir:
- Dinamik batching:
DataCollatorForSeq2Seq, dizileri sabit global uzunluğa değil batch içindeki maksimum uzunluğa pad eder. - Mixed precision (
bf16): Bellek tüketimini azaltırken dinamik aralığı korur. - Fused AdamW: CUDA üzerinde model güncellemelerini tek GPU kernel çağrısında birleştirerek darboğazı azaltır.
training_args = Seq2SeqTrainingArguments(
output_dir="./pegasus_tr",
per_device_train_batch_size=128,
bf16=True,
optim="adamw_torch_fused",
learning_rate=5e-4,
num_train_epochs=1000,
save_strategy="best"
)
4. Çıkarım Ayarı: Beam Search
Inference sırasında token olasılıklarının nasıl çözümlendiği özet kalitesini belirler. Greedy decoding her adımda en yüksek olasılıklı tokenı seçer; bu da tekrarlı ve morfolojik açıdan zayıf özetler üretebilir.
Beam Search, aynı anda birden fazla olası diziyi takip ederek daha dengeli sonuçlar üretir:
summary_ids = model.generate(
input_ids,
num_beams=8,
length_penalty=0.8,
no_repeat_ngram_size=3,
min_length=30,
max_length=128,
early_stopping=True
)
Beam Search her adımda adet hipotezi korur. Uzunluk cezası dizi skorunu şu şekilde ölçekler:
değeri daha kısa, akıcı ve dilbilgisel olarak tutarlı Türkçe özetleri teşvik eder.
Temel Performans Kazanımları
Bu optimizasyonlar birlikte kullanıldığında şu kazanımlar elde edilebilir:
- Dosya boyutu azalması: Parquet, metin veri kümesini Snappy sıkıştırma ile ciddi ölçüde küçültebilir.
- Pipeline hızlanması: GPU'nun veri beklemesi azalır ve eğitim süresi düşer.
- Model kalitesi: Daha uygun tokenizasyon ve decoding ayarları, Türkçe özet kalitesini doğrudan etkiler.