Tokenizasyon, insan dilini yapay zeka tarafından işlenebilir sayılara dönüştürmenin temel adımıdır. Bu süreçte metin küçük parçalara bölünür, her parçaya sayısal bir ID atanır ve vektörlere dönüştürülerek sinir ağında işlenir. Tokenizasyonun yapay zeka üzerindeki etkilerini ve Byte Pair Encoding gibi yöntemlerle dilin nasıl temsil edildiğini bu yazıda ayrıntılı şekilde öğrenebilirsiniz.
Metin tokenizasyonu, insan dilinin yapay zeka tarafından sayılara dönüştürülmesinin ilk adımıdır. İnsanlar bir cümleyi bütünsel şekilde okurken, bir yapay sinir ağı için kelimeler, boşluklar ve noktalama işaretleri önce matematiksel işlemlere uygun bir forma çevrilmelidir. Bu dönüşümü sağlayan aşama ise tokenizasyondur - dil modeliyle yapılan her sorgunun temel adımlarından biridir.
Basitçe anlatmak gerekirse, orijinal metin küçük parçalara - yani tokenlara ayrılır, her birine sayısal bir tanımlayıcı atanır ve bu sayılar vektör temsillerine dönüştürülür. Artık metin, sinir ağının katmanları için uygun bir veri dizisine dönüşmüştür. Dolayısıyla, sıradan bir cümleden model içindeki verilere giden yol şöyle özetlenebilir: metin → tokenler → ID → vektörler → sinir ağı hesaplamaları.
Tokenizasyon, bir metin dizisinin modelin işleyebileceği parçalara ayrılmasıdır. Bu parçalar bazen tam kelime, bazen kelime kökü, bazen tek bir karakter, rakam ya da noktalama işareti olabilir.
Örneğin, insanlar "tokenizasyon" kelimesini bir bütün olarak algılar. Ancak bir modelin tokenizatörü bunu tek bir token olarak bırakabilir veya birkaç parçaya bölebilir. Aynı şey özel isimler, teknik terimler, nadir kelimeler ve farklı dillerdeki kelimeler için de geçerlidir.
Bunun nedeni, bir yapay zekanın harfler veya kelimelerle doğrudan matematiksel işlem yapamamasıdır. İşlemciler sayılarla çalışır; bu nedenle metin önce sayısal bir forma dönüştürülmelidir. Tokenizasyon, insan dili ile matematiksel model arasında bir köprü görevi görür.
Örneğin:
Yapay zeka metni anlar.
Sadece boşluklara göre bölersek üç kelime elde ederiz. Gerçek bir tokenizatör ise uzun bir kelimenin bir kısmını, ayrı bir noktalama işaretini veya tek bir kelimenin birkaç parçasını ayırabilir. Sonuç; kullanılan algoritma ve sözlüğe göre değişir.
Ayrıca, token daima bir kelimeyle eşdeğer değildir. Kısa ve yaygın bir kelime gerçekten tek bir token olabilirken, uzun veya nadir bir kelime iki, üç veya daha fazla tokenden oluşabilir. Öte yandan, bir token noktalama işareti, rakam dizisi veya bir kelime parçası da olabilir.
Bu nedenle, aynı sayıda kelimeye sahip iki cümle, token açısından oldukça farklı olabilir. Aynı anlamı taşıyan bir Türkçe ve bir İngilizce metin de farklı sayıda tokena bölünebilir.
Daha fazla bilgi için "Yapay Zeka Ağlarında Token Nedir ve ChatGPT Neden Tokenleri Sayar?" başlıklı yazımızı okuyabilirsiniz.
Tokenizatör, verilen metni kendi sözlüğündeki öğelere böler. Token sınırları daima kelime sınırlarıyla örtüşmek zorunda değildir; bazen bütün kelimeyi, bazen bir kısmını, bazen de tek bir karakteri token olarak alır.
Yapay zeka metni analiz eder.
İnsan için üç kelime ve bir nokta vardır. Fakat bir tokenizatör aşağıdaki gibi bölebilir:
[Yapay] [ zeka] [ metni] [ analiz] [ eder] [.]
Bu bölümlendirme, kullanılan tokenizatöre göre değişir. Ayrıca, bazı sistemlerde tokenler kelimeden önceki boşluğu da içerebilir. Aynı harf dizisi, cümlenin başında ve ortasında farklı tokenlar olarak temsil edilebilir.
Böylece, sözlükte her kelime formunu saklamak yerine model, nadir ve karmaşık kelimeleri daha genel parçalardan oluşturabilir.
Tokenizatörün eğitildiği verilerde bir dizi sıkça geçiyorsa, genellikle ayrı bir token olarak saklanır. Yaygın kelimeler ve bitişler daha kompakt tokenlara sahiptir. Nadir kelimeler, teknik terimler veya uzun bileşik kelimeler ise genellikle parçalara ayrılır.
Örneğin:
mikro-mimari
şu şekilde bölünebilir:
[mikro] [mimar] [i]
Sözlükte büyük parçalar yoksa daha küçük parçalara da ayrılabilir.
Dil farklılıkları burada önemlidir. İngilizceye göre optimize edilmiş bir tokenizatör, İngilizce metni Türkçe'den daha kompakt kodlayabilir. Dolayısıyla, aynı anlamdaki cümleler farklı dillerde farklı sayıda tokena sahip olabilir.
Nadir karakterler, emojiler, rakam dizileri ve kod parçaları da insan için sezgisel olmayan şekillerde tokenize edilebilir. Uzun bir tanımlayıcı veya rastgele harf kombinasyonu, kısa bir cümleden çok daha fazla tokena dönüşebilir.
Tokenizatör, metni tokenlara dönüştüren algoritma ve veri kümesidir. En önemli kısmı, her geçerli tokena özgü bir sayısal tanımlayıcı atayan sözlüktür.
Örnek bir sözlük şöyle olabilir:
Farklı modellerde sözlük ve ID'ler değişir. Kullanıcı bir sorgu gönderdiğinde, tokenizatör uygun sözcükleri bulur ve dizi oluşturur. Sözlükte tam kelime yoksa, daha küçük parçalara bölerek ilerler. Böylece hemen her metin, modelin bildiği sınırlı sayıda tokenla temsil edilebilir.
Sözlük boyutu ve yapısı; metnin ne kadar kompakt kodlandığını, farklı dillerin nasıl işlendiğini ve nadir kelimeler için kaç token gerektiğini belirler. Bu yüzden tokenizasyon, dil modeli mimarisinin teknik bir ayrıntısı değil, temel bir bileşenidir.
En yaygın tokenizasyon yöntemlerinden biri Byte Pair Encoding (BPE)'dir. İlk olarak veri sıkıştırma yöntemi olarak geliştirilmiş, sonrasında dil modeli sözlükleri oluşturmak için kullanılmaya başlanmıştır.
BPE'nin temel fikri; sık tekrarlanan dizileri bulup onları daha büyük parçalara dönüştürmektir. Böylece yaygın kelimeler veya kelime kökleri bütün olarak saklanabilir, nadir yapılar ise kısa tokenlardan birleştirilebilir.
Sözlükte sadece tüm kelimeler tutulsa, bu çok büyük olurdu. Türkçede bir kelimenin pek çok çekimli formunu ayrı ayrı saklamak gerekir. Ayrıca, yeni çıkan isimler, teknik terimler ve ürün adları sürekli eklenir.
Her olası varyasyonu saklamak verimsizdir. Ama yalnızca karakterlere bölmek de token dizilerini fazla uzatır. BPE bu iki uç arasında denge sağlar.
Diyelim ki eğitim verisinde şu kelimeler sıkça geçiyor:
İlk adımda algoritma, kelimeleri karakterlerine ayırır. Ardından en sık hangi bitişik karakterlerin birlikte geçtiğini sayar. Örneğin, "y" ve "a" çok sık beraber geliyorsa, "ya" olarak birleştirilebilir. Bu süreç ilerledikçe daha büyük tokenlar elde edilir.
Sonuç olarak, "yapay" gibi sık geçen bir kök, token olarak saklanabilir ve farklı kelimelerde tekrar kullanılabilir. Nadir kelimeler ise daha küçük parçalara bölünür.
BPE'nin çeşitli uygulamaları ve modifikasyonları vardır. Tokenların başlangıç birimi, sözlük boyutu, birleştirme kuralları ve boşluk/özel karakterlerle çalışma biçimi modele göre değişebilir. Aynı cümle iki farklı modelde farklı sayıda tokene ayrılabilir.
Hedef ise aynıdır: İnsan dilindeki neredeyse sonsuz çeşitliliği, sonlu sayıda öğeyle temsil etmek. Tokenizatör bu öğeleri belirledikten sonra, her birine bir sayı atanır ve işlem sinir ağına aktarılır.
Tokenizasyonun ardından model kelimeleri değil, token dizisini alır. Ancak, tokenları doğrudan sinir ağına vermek de mümkün değildir. Her tokena bir sayısal ID atanır.
Her tokena özgü bir tamsayı vardır. Örneğin:
yapay zeka metni anlar
şu şekilde tokenlara ayrılır:
[yapay] [ zeka] [ metni] [ anlar]
ve ardından ID'lere:
[3817, 9421, 15603, 4812]
Bu sayılar örnektir; gerçek modelde değerler değişir. ID'ler, veri tabanındaki satır numaraları gibi düşünülebilir; sadece tanımlama işlevi görür, anlamı göstermez.
Bir tokenın ID'si, anlamını yansıtmaz. Örneğin, "kedi" 500, "köpek" 9000 olarak kodlanmışsa, "köpek" 18 kat daha önemli değildir. Numaralar sadece tanımlama içindir.
Asıl anlam, her ID'nin bir vektör ile temsil edilmesiyle ortaya çıkar.
Her token, çok boyutlu bir sayılar dizisiyle temsil edilir. Örneğin, "3817" yerine model şunu alır:
[0.12, -0.47, 0.83, 0.05, ...]
Gerçek modellerde vektörler yüzlerce, hatta binlerce sayıdan oluşabilir. Bu vektörler, modelin dildeki ilişkileri anlamasına yardımcı olur. Benzer bağlamlarda kullanılan tokenlar, benzer vektörlere sahip olur.
Bu vektörler, "hayvan", "nesne" veya "olumlu duygu" gibi tekil anlamlara karşılık gelmez; anlam, çok sayıda parametreye dağılmıştır ve modelin genel yapısı içinde ortaya çıkar.
Vektörlere ayrıca, dizideki sıralamayı dikkate alan bilgiler eklenir. Çünkü aynı kelimeler farklı sıralarda tamamen farklı anlamlar taşıyabilir.
Özetle, tüm süreç şöyle işler:
metin → tokenizasyon → tokenlar → sayısal ID'ler → vektörler → sinir ağı işlemi
Kullanıcı bir cümle girdiğinde, tokenizatör cümleyi böler, her parçayı sayıya çevirir, model bu sayılardan vektörler üretir ve nihayetinde bu vektörler arasındaki ilişkileri analiz eder.
İşte bu aşamada, insan dili matematiksel verilere dönüşür ve yapay zeka ile hesaplanabilir hale gelir.
Tokenizasyon, metnin anlamını doğrudan belirlemez, fakat modelin metni hangi biçimde göreceğini etkiler. Bir cümle tanıdık tokenlara ne kadar iyi bölünürse, modelin çalışması o kadar verimli olur.
İnsan için "kedi", "kedici", "kedicik" gibi kelimeler açıkça ilişkilidir. Tokenizatör ise bunları farklı tokenlara bölebilir. "Kedi" tek bir token, diğeri iki veya daha fazla token olabilir. Sinir ağı, bu parçalar arasındaki ilişkiyi ve bağlamı bulmakla görevlidir.
Tokenizasyonun etkisi, nadir terimlerde daha belirgin olur. Yaygın kelimeler büyük tokenlarla temsil edilir; teknik terimler, soyadlar, kimyasal formüller gibi nadir ifadeler ise daha küçük parçalara ayrılır.
Örneğin:
[bilgisayar]
veya nadir bir isim:
[kvan] [to] [grav] [imetri] [ya]
Bu, modelin nadir kelimeyle çalışamayacağı anlamına gelmez; sadece daha fazla token kullanılır ve daha fazla yer kaplar.
Kullanıcı adları, site adresleri, seri numaraları ve kodlar da kısa görünmelerine rağmen uzun bir token dizisine dönüşebilirler.
Metin dili de önemlidir. Token sözlüğü belirli veri kümelerine dayanır; bazı diller daha büyük bloklara, bazıları ise küçük parçalara bölünebilir. Böylece, aynı bilgiye sahip iki metin farklı dillerde farklı sayıda tokena sahip olabilir.
Bu fark özellikle uzun belgelerde önemlidir. Modelin bağlam penceresi tokenlarla ölçülür; sayfa, karakter veya kelimeyle değil. Görünüşte aynı uzunluktaki iki metin, farklı miktarda bağlam kullanabilir.
Ancak tokenizasyon, anlamı doğrudan çözmez. Bir kelime birkaç tokene bölünse bile, sinir ağı bunları insan kavramı olarak görmez. Vektörlere dönüştükten sonra, model tüm diziyi ve bağlamı analiz eder.
Örneğin, "anahtar" kelimesi araç olabilir, şifreleme yöntemi olabilir veya sisteme erişim sağlayan bir unsur olabilir. Tokenizatör sadece metni parçalara böler; anlamı model, bağlama göre bir sonraki adımlarda belirler.
Bu nedenle "yapay zeka metni nasıl anlar?" sorusunun cevabı tokenizasyonda başlar, ama orada bitmez. Tokenizatör, insan dilini işlemeye uygun bir forma çevirir; bağlam ve ilişkiler ise modelin içinde çözülür.
Tokenizasyon, insan dilini yapay zeka tarafından işlenebilir sayılara dönüştüren ilk adımdır. Metin, tokenlara bölünür; her birine sayısal bir ID atanır; model, bu ID'lerden vektörler üretir ve bunlarla işlem yapar.
Bir token her zaman bir kelime olmayabilir; bazen bir kelime, bazen parçası, bazen tek bir karakter veya işaret olabilir. Token sayısı; metin uzunluğuna, kullanılan dile, kelimeye ve tokenizatöre göre değişir.
Byte Pair Encoding gibi algoritmalar, tam kelime sözlüğüyle karakter bazlı bölme arasında denge kurar. Sık tekrar eden diziler büyük tokenlara dönüşür, nadir kelimeler ise küçük parçalardan oluşur.
Sonuçta, metnin model içindeki yolculuğu şöyle özetlenebilir:
insan metni → tokenizatör → tokenlar → sayısal ID'ler → vektörler → sinir ağı
Bu süreci anlamak, neden ChatGPT ve benzeri dil modellerinin bağlamı tokenlarla ölçtüğünü, aynı uzunluktaki metinlerin neden farklı bağlam kapladığını ve sıradan bir cümlenin nasıl sayılara dönüştüğünü kavramaya yardımcı olur.