toyPts = [
{w: "king", x: -0.824, y: -0.667, g: "krallık"},
{w: "queen", x: -1.585, y: -0.321, g: "krallık"},
{w: "royal", x: -1.163, y: 1.871, g: "krallık"},
{w: "castle", x: -0.324, y: -1.489, g: "krallık"},
{w: "rules", x: -0.595, y: 0.680, g: "krallık"},
{w: "man", x: 0.292, y: -0.170, g: "insan"},
{w: "woman", x: 0.249, y: -0.115, g: "insan"},
{w: "apple", x: 1.026, y: -0.015, g: "yiyecek"},
{w: "banana", x: 0.978, y: 0.048, g: "yiyecek"},
{w: "fruit", x: 1.388, y: 0.514, g: "yiyecek"},
{w: "sweet", x: 1.655, y: 0.147, g: "yiyecek"},
{w: "eats", x: 0.661, y: -0.070, g: "yiyecek"}
]3 Embedding’ler (Kelime Temsilleri): Koordinat Olarak Kelimeler
Öğrenme hedefleri. Bu bölümün sonunda:
- dağılımsal hipotezi (distributional hypothesis) açıklayabilir, onu önce bir matrise, sonra koordinatlara dönüştürebilirsiniz;
- eş-oluşum sayımlarını PPMI ile yeniden ağırlıklandırabilirsiniz: PPMI, gözlenen birlikte geçme olasılığını bağımsızlık varsayımının öngörüsüyle karşılaştırır ve negatif PMI değerlerini sıfırlar;
- sonucu kesik (truncated) SVD ile sıkıştırabilir — bir tablonun en güçlü örüntülerini tutup gerisini atan yöntem — ve her iki adımın neyi düzelttiğini söyleyebilirsiniz;
- negatif örneklemeli skip-gram’ı sıfırdan yazabilir ve iki vektör tablosunun lojistik kayıpla birlikte nasıl öğrenildiğini açıklayabilirsiniz;
- verilen bir problem için word2vec, GloVe, fastText ve doc2vec arasında seçim yapıp seçiminizi savunabilirsiniz;
- uzayın üç özelliğini inceleyebilirsiniz: vektörlerin yönlere eşit dağılmaması (anizotropi), sıklığın temsile etkisi ve kosinüs benzerliğinin eş anlamlılıktan daha geniş ilişkileri yansıtması;
- statik embedding’lerin bağlama göre değişmeyen temsilini açıklayabilir ve bağlamsal temsillere (Bölüm 7) neden ihtiyaç duyulduğunu tartışabilirsiniz.
3.1 Problem, tek cümlede
Bölüm 2 rahatsız edici bir yerde bitti. Belge vektörleri işimize yaradı; ama one-hot kelime vektörleri kelimeler arasında hiçbir benzerlik paylaşmıyordu. Her kelime bir one-hot sütundu: pump, pumps ve impeller birbirine dik üç ayrı yöndü; her biri diğerine, pump’ın Wednesday’e uzak olduğu kadar uzaktı. Birbirinden farklı herhangi iki kelime arasındaki kosinüs benzerliği, tanım gereği, her zaman tam olarak sıfırdı.
Oysa iyi bir temsil bu üç ilişkiyi birbirinden ayırabilmelidir: pump–pumps gibi biçimbilimsel yakınlık, pump–impeller gibi anlamsal ve işlevsel yakınlık, pump–Wednesday gibi ilişkisizlik.
Bunun sonucunu bir örnekle görelim. Yalnızca kelime sayımlarını kullanan doğrusal bir modelde pump ve pumps ayrı özniteliklerdir. Eğitim verinizde the pump failed, test verinizde the pumps failed geçiyorsa the ve failed için öğrenilen ağırlıklar kullanılabilir; ama pump için öğrenilen ağırlık kendiliğinden pumps özniteliğine aktarılmaz.
embedding (gömme vektörü) — bir birimin öğrenilmiş sayısal temsili. Bu bölümde çoğunlukla kelimeleri görece az boyutlu, yoğun vektörlerle temsil edeceğiz; dağılımsal yöntemlerde benzer bağlamlarda kullanılan kelimeler bu uzayda yakınlaşabilir. Her kelimeye bir harita koordinatı vermek gibi düşünün. ↩︎
Bu bölümde, her kelimeye ayrı bir eksen ayıran one-hot gösterimden, bütün kelimelerin aynı az sayıdaki öğrenilmiş boyutla temsil edildiği bir gösterime geçeceğiz. Doğrusal cebir diliyle bu, one-hot vektörlerini öğrenilmiş bir matrisle çarpmak demektir. Her kelime için örneğin 100 ya da 300 sayı elde ederiz ve benzer biçimde kullanılan kelimelerin birbirine yakın düşmesini hedefleriz. Bu kısa ve yoğun (dense) vektör bir embedding. Yoğun vektörlerde bileşenlerin çoğu genellikle sıfırdan farklıdır; önceki bölümdeki (Bölüm 2) seyrek (sparse) sayım vektörlerinde ise bileşenlerin çoğu sıfırdı.
Üç tür embedding, bir bölüm. “Embedding” kelimesi üç farklı şey için kullanılıyor ve hangisinden söz edildiğini baştan ayırmak bölümün geri kalanını kolaylaştırıyor:
| Tür | Örnek | Aynı kelime her yerde aynı vektörü alır mı? |
|---|---|---|
| Statik kelime embedding’i | word2vec, GloVe, fastText | Evet — kelime biçimi başına tek vektör, bağlam ne olursa olsun |
| Bağlamsal token embedding’i | BERT | Hayır — her token’ın vektörü, modele verilen dizideki bağlamına göre hesaplanır; bir kelime birden çok token’dan oluşabilir |
| Cümle ya da belge embedding’i | SBERT ve benzerleri | Soru bu değil: bütün cümle ya da belge için tek vektör |
Bu bölüm statik kelime embedding’lerine odaklanıyor. Belge vektörlerine de kısa bir giriş yapacağız. Bağlamsal temsilleri transformer bölümünde (Bölüm 7), cümle ve belge temsillerinin erişimde kullanımını ise erişim bölümünde (Bölüm 19) ayrıntılandıracağız.
İki okuma katmanı. Bölüm uzun; ilk okumada şu omurgayı izlemeniz yeterli:
- İlk okumada mutlaka: dağılımsal hipotez → eş-oluşum → word2vec → kosinüs → GloVe ve fastText → statik embedding’lerin sınırları.
- Derinleşme (ikinci okuma): PPMI ve SVD’nin matematiği → negatif örneklemenin gradyanı → SGNS ile PMI arasındaki ilişki → anizotropi ve yanlılık ölçümleri.
İkinci katmandaki türetmelerin çoğu katlanır Derinleşme kutularında duruyor; ana akış onları açmadan da eksiksiz ilerliyor.
Neye bakacağız. Uzayı önce sayımlardan kuracağız; küçük örnekte her adımı elle denetleyebileceğiz. Ardından negatif örneklemeli skip-gram’ı gradyanlarıyla birlikte sıfırdan yazacak ve bu yöntemin PMI ile ilişkisini inceleyeceğiz. Son olarak embedding’lerin kullanım alanlarını, geometrik özelliklerini ve bağlama göre değişmeyen temsillerin sınırlarını ele alacağız. İlk okumada katlanır Derinleşme kutularını ve “Uygulama: word2vec’i sıfırdan yazmak” kısmındaki kodu atlayabilirsiniz.
NotDerinleşme: istatistikçinin bakışı
One-hot kodlama, kategorileri ayrı koordinatlarla gösterir. Bu kodlamayı kullanan bazı modellerde her kategori için bağımsız parametreler öğrenilir. Kelime–bağlam etkileşimlerini düşük ranklı iki matrisle temsil etmek ise bu etkileşimlere ortak bir yapı getirir. Bu yapı, benzer dağılımlardan öğrenilen bilginin genellemeye katkıda bulunmasını sağlayabilir. Bunu teknik anlamda doymuş (saturated) model ya da hiyerarşik kısmi havuzlama (partial pooling) ile özdeşleştirmemek gerekir; benzetme yalnızca sezgi vermek içindir.
3.2 Dağılımsal hipotez
“Bir kelimeyi, arkadaşlık ettiği kelimelerden tanırsınız.” — J.R. Firth, 1957 (Firth 1957)
Firth dilbilimsel yöntem üzerine bir şey söylüyordu; Zellig Harris bunun işlemsel sürümünü zaten ortaya koymuştu (Harris 1954). İddia şu: bir kelime hakkında önemli miktarda anlamsal ve işlevsel bilgi, o kelimenin göründüğü bağlamların dağılımından çıkarılabilir. Örneğin iki kelime sürekli aynı boşluklarda görünüyorsa — the ___ failed, replaced the ___, ___ pressure dropped — kullanımları arasında sistematik bir benzerlik var demektir.
Bu bir teorem değil, veriye dayanarak sınanan bir hipotezdir. Benzer bağlamları paylaşmak, konusal veya işlevsel yakınlığı belirlemeye yardımcı olabilir. Ancak eş anlamlılığı tek başına belirlemez: hot ile cold gibi zıt anlamlı kelimeler de birçok bağlamı paylaşır. Bölümün ilerisinde bu ayrımı sayısal örneklerle inceleyeceğiz.
Bu yaklaşımın önemli bir avantajı, elle etiketlenmiş örneklere ihtiyaç duymamasıdır. Eğitim sinyali ham metindeki bağlamlardan türetilir. Böylece büyük etiketsiz derlemlerden temsil öğrenmek mümkün olur.
Buradaki “benzer” ne demek? Dağılımsal benzerlik her zaman eş anlamlılık değildir. cat ile dog aynı türden şeyler; doctor ile hospital ilişkili; hot ile cold ise zıt olmasına rağmen aynı bağlamlarda geçiyor. Bu ayrım bölümün ilerisinde, kosinüs benzerliğini yorumlarken geri dönecek.
3.3 Önce sayalım: eş-oluşum, PPMI, SVD
Sayıma dayalı yaklaşım üç iş yapar. Seçilen bağlam penceresindeki kelime–bağlam çiftlerini sayar; bu sayıma eş-oluşum (co-occurrence) denir: iki kelimenin aynı bağlam penceresinde birlikte görülmesi. Ardından sayımları yeniden ağırlıklandırır ve elde edilen matrisi düşük ranklı bir yapıyla yaklaşık olarak temsil eder. Küçük bir örnek üzerinde bu adımları izlemek, sonraki yöntemleri anlamayı kolaylaştırır. Negatif örneklemeli skip-gram’ın da belirli varsayımlar altında, aşağıda tanımlayacağımız PMI ile ilişkili bir matrisi örtük olarak çarpanlaştırdığı gösterilmiştir (Levy ve Goldberg 2014b).
Bu kısmın üç adımı.
- Say. Hangi kelime hangi bağlamlarda görünüyor?
- Yeniden ağırlıklandır. Gözlenen çift sıklığını, kelime ve bağlamın marjinal sıklıklarına göre beklenen değerle karşılaştır.
- Sıkıştır. Tekrar eden örüntüleri daha az boyutta temsil et.
İşte on cümlelik bir derlem; her sayıyı tek tek kontrol edebilecek kadar küçük.
import numpy as np
corpus = [
"the king rules the castle",
"the queen rules the castle",
"the king eats an apple",
"the queen eats a banana",
"the royal castle is grand",
"a banana is sweet fruit",
"an apple is sweet fruit",
"the man eats an apple",
"the woman eats a banana",
"the king and queen are royal",
]
tokens = [s.split() for s in corpus]
vocab = sorted({w for s in tokens for w in s})
idx = {w: i for i, w in enumerate(vocab)}
V = len(vocab)
print("sentences:", len(corpus), " vocabulary:", V)
print(vocab)sentences: 10 vocabulary: 19
['a', 'an', 'and', 'apple', 'are', 'banana', 'castle', 'eats', 'fruit', 'grand', 'is', 'king', 'man', 'queen', 'royal', 'rules', 'sweet', 'the', 'woman']
3.3.1 1. adım — neyin neyin yanında geçtiğini sayın
Burada bir kelimenin bağlamı, aynı cümlede solundaki ve sağındaki en fazla ikişer token’dan oluşur. Merkez token’ı bağlama katmayız. Her (merkez kelime, bağlam kelimesi) çifti için ilgili hücreyi bir artırırız; simetrik pencere kullandığımız için ters yöndeki çift de kendi merkez konumunda sayılır.
W = 2
C = np.zeros((V, V))
for sent in tokens:
for i, w in enumerate(sent):
for j in range(max(0, i - W), min(len(sent), i + W + 1)):
if i != j:
C[idx[w], idx[sent[j]]] += 1### raw co-occurrence, a few rows
eats rules royal sweet the castle
king 1 1 0 0 4 0
queen 1 1 1 0 3 0
apple 2 0 0 1 0 0
banana 2 0 0 1 0 0
Yapı şimdiden görünür durumda: king ile queen’in satırları neredeyse aynı, apple ile banana’nınkiler de öyle. İşte dağılımsal hipotez çalışıyor. \(C\) matrisinin satırları zaten 19 boyutlu kelime vektörleridir ve one-hot’ların aksine birbirine dik değildir.
Ama 2. bölümde gördüğümüz sorunu taşıyorlar.
### the same problem as chapter 2: 'the' dominates
the total co-occurrences 22
eats total co-occurrences 16
is total co-occurrences 11
queen total co-occurrences 10
king total co-occurrences 9
a total co-occurrences 8
king satırındaki en büyük sayım the ile eşleşiyor. Ancak the birçok kelimenin çevresinde sık geçtiğinden, bu yüksek sayımı tek başına krallığa özgü bir ilişki olarak yorumlayamayız. Ham sayımlar, ilişkiyle birlikte kelimelerin genel görülme sıklığından da etkilenir.
3.3.2 2. adım — PPMI: ham sayımdan beklenmedik birlikteliğe
pointwise mutual information (PMI) (noktasal karşılıklı bilgi) — bir kelime–bağlam çiftinin gözlenen olasılığının, marjinal olasılıklarının çarpımına oranının logaritması. Bağımsızlık modeline göre beklenenden sık görülen çiftlerde pozitif, seyrek görülenlerde negatif değer alır. ↩︎
Sormak istediğimiz şu: bu iki kelime, rastlantının öngöreceğinden daha sık mı bir arada geçiyor? Pointwise mutual information işte bunu sorar.
\[ \mathrm{PMI}(w, c) = \log \frac{P(w, c)}{P(w)\,P(c)} \]
Kesri okumanın yolu şu: payda (\(P(w)\,P(c)\)), iki kelime birbirinden tamamen bağımsız olsaydı yan yana düşmelerini bekleyeceğimiz sıklık; pay (\(P(w, c)\)) ise fiilen düştükleri sıklık. Yani PMI, gözlenen ÷ beklenen oranının logaritmasından ibaret. Üç durum var:
- Oran 1 — bu çiftin gözlenen olasılığı, bağımsızlık modelinin öngördüğü değere eşittir. \(\log 1 = 0\) olduğu için PMI sıfırdır. Bu, kelimeler arasında hiçbir anlamsal ilişki bulunmadığı anlamına gelmez.
- Oran 1’den büyük — beklenenden daha sık bir aradalar, birbirlerini çekiyorlar. Logaritma pozitif.
- Oran 1’den küçük — beklenenden daha seyrek bir aradalar, birbirlerinden kaçınıyorlar. Logaritma negatif.
Özellikle nadir kelimelerde az sayıda eş-oluşum gözlemlemek, güvenilir bir negatif ilişki kestirimi için yeterli olmayabilir. Pozitif PMI (PPMI), negatif PMI değerlerini sıfırlayarak yalnızca bağımsızlık modeline göre beklenenden sık görülen çiftleri korur. Bu, yararlı bir temsil tercihi olabilir; bütün negatif PMI değerlerinin anlamsız olduğu anlamına gelmez.
\[ \mathrm{PPMI}(w, c) = \max\!\left(0,\ \log \frac{c_{wc}\, N}{c_{w\ast}\, c_{\ast c}}\right) \]
Burada \(c_{wc}\) çiftin fiilen kaç kez geçtiği, \(c_{w\ast}\) satır toplamı, \(c_{\ast c}\) sütun toplamı ve \(N\) matrisin genel toplamıdır. Bu kesir çok basit bir şey yapıyor; gerçek sayılarla görelim.
Bir hücreyi elle hesaplayın. Formülü apple–sweet çifti üzerinde çalıştıracağız; ama önce dört sayının nereden geldiğini netleştirelim, çünkü dördü de aynı \(C\) matrisinden okunuyor:
- \(c_{wc} = 1\) —
appleilesweet’in fiilen kaç kez birbirinin penceresine düştüğü. Bu tek bir hücre ve yukarıdaki tabloda görünüyor. - \(c_{w\ast} = 7\) —
applesatırının toplamı, yani “appletoplamda kaç kez bir şeyin yanında sayıldı”.applederlemde üç kez geçiyor ve bu üç geçişte sırasıyla 2, 3 ve 2 komşusu var: \(2 + 3 + 2 = 7\). - \(c_{\ast c} = 6\) — aynı hesabın
sweetiçin yapılmış hâli, yanisweetsütununun toplamı. - \(N = 144\) — matristeki bütün hücrelerin toplamı: derlemde sayılan (kelime, komşu) çiftlerinin tamamı. Bunu elle doğrulayabilirsiniz. Her token, penceresine kaç komşu düşüyorsa o kadar çift üretir — cümlenin ortasındaki bir token 4, kenarlardakiler 2 ya da 3 — dolayısıyla beş token’lık bir cümle 14 çift verir. Derlemde dokuz tane beş token’lık cümle ve bir tane altı token’lık (18 çift veren) cümle var: \(9 \times 14 + 18 = 144\).
\(N\), derlemdeki token sayısı olan 51 değil; çiftlerin sayısı. Çünkü \(P(w, c)\), \(P(w)\) ve \(P(c)\)’nin üçü de aynı çift tablosundan kestiriliyor — sırasıyla hücreden, satır toplamından ve sütun toplamından — ve bu yüzden üçünün de paydası sayılan çift sayısıdır.
Şimdi asıl soru: bu iki kelime metne birbirinden tamamen bağımsız biçimde serpiştirilmiş olsaydı, yan yana düşmelerini kaç kez beklerdik?
\[ \frac{c_{\text{apple},\ast} \times c_{\ast,\text{sweet}}}{N} = \frac{7 \times 6}{144} = 0{,}29 \]
Biz 1 gözlemledik; bu da beklenenden \(144 / 42 = 3{,}43\) kat fazla (yuvarlanmış 0,29 ile bölerseniz 3,45 bulursunuz). PMI de bu oranın logaritmasıdır: \(\log 3{,}43 = 1{,}23\) — tablodaki değer.
Şimdi aynısını king–the için yapın. Bu çift dört kez geçiyor, yani apple–sweet’in tam dört katı. Ama the her yerde: sütun toplamı 22 ve king’in satır toplamı 9. Bağımsızlık modeli bu çift için \(9 \times 22 / 144 = 1{,}38\) eş-oluşum öngörüyor.
İki hesabı yan yana koyun:
| gözlenen | beklenen | oran | PMI | |
|---|---|---|---|---|
apple–sweet |
1 | \(7 \times 6 / 144 = 0{,}29\) | 3,43 | 1,23 |
king–the |
4 | \(9 \times 22 / 144 = 1{,}38\) | 2,91 | 1,07 |
Bir kez gözlenen apple–sweet çifti daha yüksek PMI alıyor, çünkü gözlenen/beklenen oranı daha büyük. king–the için beklenen sayı 1,38, apple–sweet için 0,29’dur. Bu beklentiler, gözlemlerin ne kadarının nedensel olarak “açıklandığını” söylemez; PMI iki göreli sıklığı karşılaştırır.
Kalabalık bir davet düşünün. Herkesle konuşan birini onur konuğunun yanında görmeniz size hiçbir şey anlatmaz — zaten bunu bekliyordunuz. Oysa bütün akşam yalnızca üç kişiyle konuşan biri, o üç kişiden biri onur konuğuysa size çok şey anlatır. PMI, bu sezginin aritmetiğidir: gördüğünüzü, görmeyi zaten beklemeniz gereken şeye bölün.
total = C.sum()
row = C.sum(axis=1, keepdims=True)
col = C.sum(axis=0, keepdims=True)
with np.errstate(divide="ignore", invalid="ignore"):
pmi = np.log((C * total) / (row * col))
pmi[~np.isfinite(pmi)] = 0.0
PPMI = np.maximum(pmi, 0.0)### PPMI for the same cells
eats rules royal sweet the castle
king 0.00 0.69 0.00 0.00 1.07 0.00
queen 0.00 0.59 1.06 0.00 0.67 0.00
apple 0.94 0.00 0.00 1.23 0.00 0.00
banana 0.94 0.00 0.00 1.23 0.00 0.00
Ham tabloyla karşılaştırın. Gösterilen sütunlarda apple–sweet sayımı 1 ile apple–eats sayımının yarısıdır; buna karşın PPMI değerleri sırasıyla 1,23 ve 0,94’tür. Bunun nedeni sweet bağlamının daha düşük marjinal sıklığıdır. Bu dönüşüm sıklığı hesaba katar, ancak tek gözleme dayanan ilişkinin güvenilirliğini garanti etmez. Satırın en yüksek PPMI değeri 2,04 ile an bağlamındadır; bu derlemde an her geçtiğinde ardından apple gelir.
PPMI ile IDF aynı formül değildir, ama aynı mühendislik içgüdüsünü paylaşırlar: yüksek bir ham sayım tek başına bilgi değildir. IDF bir terimin koleksiyondaki belgeler arasında ne kadar nadir olduğunu ölçer ve TF ile birleşince terimin belirli bir belgedeki ağırlığına katkı yapar. PMI ise iki kelimenin, yalnızca ikisi de sık geçtiği için mi sık karşılaştığını denetler.
NotSezgi kontrolü: negatifleri tutmak yerine neden kırpıyoruz?
Bir milyon token’lık bir derlemde onar kez görülen ve hiç bir arada görünmeyen iki kelime düşünün. Bağımsızlık varsayımı altında, cümle sınırlarını ihmal ederek yalnızca hemen soldaki ve sağdaki token’ları sayarsak beklenen yönlü eş-oluşum yaklaşık \(2 \times 10 \times 10 / 10^6 = 0{,}0002\) olur. Bu örnekte sıfır gözlemlemek şaşırtıcı değildir. Pencereyi her iki yönde iki token’a çıkarırsak beklenti de yaklaşık iki katına çıkar. Sıfır sayımın PMI’sı \(-\infty\)’a gider; düzleştirmeyle elde edilen sonlu değer ise seçilen yönteme bağlıdır.
Nadir çiftlerin negatif PMI kestirimleri örnekleme belirsizliğinden güçlü biçimde etkilenebilir. Sıfıra kırpma, bu belirsiz değerleri temsil dışında bırakır ve matrisi seyrekleştirir. Levy ve arkadaşları (Levy vd. 2015), inceledikleri benzerlik ve analoji benchmark’larında (kıyaslama) hiperparametreler karşılaştırılabilir biçimde ayarlandığında yöntemler arasındaki farkların çoğunlukla sınırlı kaldığını gösterdi.
3.3.3 3. adım — tekrarlanan yapıyı az sayıda boyutta toplayın
PPMI satırları şimdiden makul davranıyor. (Burada ve bölümün her yerinde komşular, Bölüm 2’deki kosinüs benzerliğine göre sıralanıyor: \(\cos(\mathbf a, \mathbf b) = \mathbf a \cdot \mathbf b \,/\, (\lVert \mathbf a \rVert\, \lVert \mathbf b \rVert)\). 1, iki vektörün aynı yönü gösterdiği; 0 ise dik oldukları anlamına gelir.)
### nearest neighbours before factorization (PPMI rows, 19-D)
king queen 0.55, are 0.55, man 0.45, the 0.37
apple man 0.79, fruit 0.52, banana 0.40, is 0.31
eats a 0.55, an 0.55, man 0.34, woman 0.34
king için queen komşuluğu beklediğimiz ilişkiyi yansıtıyor. apple için man sonucunu ise eş anlamlılık olarak okuyamayız. Bu küçük derlemde iki kelimenin satırları an ve eats sütunlarında yüksek ağırlık taşıyor; kosinüs bu örtüşmeyi ölçüyor. man derlemde yalnızca bir cümlede geçiyor; tek bir örnekten doğan bağlam örtüşmesi güvenilir bir anlamsal benzerlik olmayabilir.
singular value decomposition (SVD) (tekil değer ayrışımı) — bir matrisi tekil vektörler ve tekil değerlerle çarpanlarına ayırma yöntemi. En büyük \(d\) tekil değer ve karşılık gelen yönler tutularak, Frobenius normuna göre en iyi rank-\(d\) yaklaşımı elde edilir. ↩︎
Kesik singular value decomposition tek örneğe dayanan bu tür örtüşmelere karşı bir düzenlileştirme ve sıkıştırma mekanizması sağlar. Yalnızca tekil değeri en büyük \(d\) yönü tutarsanız, modeli bütçesini tekrar eden yapıya harcamaya zorlarsınız; tek seferlik rastlantılara yalnızca artakalan yer kalır. Bunun bir doğruluk garantisi olmadığını da baştan söyleyelim: küçük ya da yanlı bir derlemde düşük ranklı model yanlış yapıyı da genelleyebilir.
Bu küçük örnekte 19 boyut hesaplama açısından sorun değil, yani burada sıkıştırmaya hız için ihtiyacımız yok; amaç, gerçek sistemlerdeki \(V\) boyutlu vektörleri düşük ranklı bir temsile indirmenin ne yaptığını gözle görebilmek.
\[ \mathrm{PPMI} \approx U_d \Sigma_d V_d^\top, \qquad \text{embedding} = U_d \Sigma_d \]
Bu bölümde her kelimenin koordinatı olarak \(U_d \Sigma_d\) satırlarını kullanacağız. Literatürde \(U_d\), \(U_d \Sigma_d\) ya da tekil değerleri farklı kuvvetlerle ölçekleyen varyantlar da kullanılır; hemen aşağıda bunun ölçülmüş sonuçlarına bakacağız.
Bu gösterim size yabancıysa, arkasındaki resim şu. PPMI matrisini üst üste konmuş bir asetat destesi gibi düşünün. Her asetat tekrar eden tek bir örüntüyü gösterir — şu kelimeler bu kelimelerin yakınında durma eğilimindedir — ve her biri farklı bir koyulukta basılmıştır. On dokuzunu da üst üste koyarsanız özgün matrisi birebir elde edersiniz. \(\Sigma\) içindeki tekil değerler, en koyudan en soluğa sıralanmış bu koyuluklardır; \(U\) ise her kelimenin her örüntüye ne kadar katıldığını söyler.
\(d\) boyutuna kesmek, yalnızca en koyu birkaç asetatı tutmak demektir. Bu işlem, küçük tekil değerlere karşılık gelen bileşenleri atar; bazı rastlantısal ayrıntıları azaltabileceği gibi yararlı ayrımları da kaybettirebilir. Hangi bilginin korunacağı tekrar sayısıyla değil, matrisin tekil değer yapısıyla belirlenir.
Bunu sınırlı bir saklama bütçesiyle düşünmek yararlı olabilir: daha az bileşen tuttuğumuzda bazı ayrıntıları kaybederiz. Ancak yöntemin ölçütü, insanın önemli bulduğu ayrıntılarla veya gürültüyle birebir örtüşmez.
d = 5
U, S, Vt = np.linalg.svd(PPMI, full_matrices=False)
emb = U[:, :d] * S[:d]Bu küçük örnekte tam SVD’yi hesaplayıp ilk beş bileşeni alıyoruz. Büyük seyrek matrislerde yalnızca gereken bileşenleri hesaplayan bir yöntem tercih edilir.
S ile çarpmak, büyük tekil değerlere karşılık gelen koordinatlara daha fazla ağırlık verir. Ancak yeniden kurma hatasını en aza indiren ölçekleme, kelime benzerliği için en iyi seçim olmak zorunda değildir. \(W = U_d \Sigma_d^{\,p}\) ailesinde \(p\) de ayarlanabilir; Levy ve arkadaşları (Levy vd. 2015) benzerlik görevlerinde \(p = 0{,}5\) veya \(p = 0\) seçeneklerinin \(p = 1\)’den daha iyi sonuç verebildiğini gösterir. Burada hesaplamayı görünür tutmak için \(p = 1\) kullanıyoruz; uygulamada \(p\)’yi doğrulama verisiyle seçmek gerekir.
### singular values (how much structure each dimension carries)
5.75 4.76 4.03 3.71 3.64 3.08 3.03 2.80
first 2 dimensions hold 36.8% of the sum of squares
first 5 dimensions hold 65.4% of the sum of squares
### nearest neighbours after SVD to 5 dimensions
king queen 0.90, are 0.88, the 0.74, castle 0.65
apple banana 1.00, woman 0.86, man 0.85, fruit 0.74
eats an 0.95, a 0.95, man 0.64, woman 0.63
castle are 0.82, is 0.80, king 0.65, queen 0.61
Bu yüzdeler tekil değerlerin kareleri toplamındaki payı gösterir. Beş bileşen toplam enerjinin yaklaşık üçte ikisini, kalan on dört bileşen ise yaklaşık üçte birini taşır. Bu oranlar sıkıştırmayı özetler; atılan bileşenlerin görev açısından önemsiz olduğunu göstermez.
NotDerinleşme: SVD’de “açıklanan” miktar PCA’daki varyans değildir
Bu yüzdeler varyans payı değildir — PPMI matrisi hiç merkezlenmiyor, dolayısıyla ölçülen şey \(\lVert X \rVert_F^2\) içindeki paydır. (Merkezlenmemiş verinin de varyansı vardır; mesele bu niceliğin onu ölçmemesi.) İkisi ancak merkezlemeden sonra örtüşür; bölümün ilerleyen kısmındaki otuz kelimelik PCA grafiğinin gerçekten farklı bir hesap olmasının sebebi de budur.
Ne olup bittiğini görmenin en kolay yolu, üç kosinüsü çarpanlara ayırmadan önce ve sonra yan yana koymak:
| kelime çifti | 19 boyutlu PPMI satırları | 5 boyutlu SVD | ne oldu |
|---|---|---|---|
apple – banana |
0,40 | 1,00 | derlemde hiç aynı cümlede geçmiyorlar; onları ortak bağlamlar zaten bağlıyor, sıkıştırma bu bağı belirleyici kılıyor |
king – queen |
0,55 | 0,90 | zaten doğruydu, güçlendi |
apple – man |
0,79 | 0,85 | tek cümleden doğan kaza — silinmedi, ama artık birinci sırada değil |
Üçüncü satıra dikkat edin, çünkü bu adım sık sık yanlış anlatılır. SVD, apple–man kazasını silmiyor; o kosinüs 0,79’dan 0,85’e çıkıyor. Değişen şey sıralama. Önce apple’ın en yakın komşusu man idi, banana ise üçüncü sıradaydı; şimdi banana birinci, man üçüncü. Yani sıkıştırma yanlış bağı koparmıyor — doğru bağı, onun önüne geçecek kadar güçlendiriyor. Sinyali gürültüye tercih etmek pratikte böyle görünür: mutlak değerler değil, sıralama düzelir.
Asıl izlenmesi gereken sayı ise birinci satırda. apple ile banana bu derlemde bir kez bile aynı cümlede geçmiyor; dolayısıyla onları doğrudan bağlayan hiçbir şey yok. Onları bağlayan şey aynı kelimelerle arkadaşlık etmeleri — ikisi de eats’ten sonra geliyor, ikisi de is sweet fruit’tan önce. Ham PPMI satırları bunu zaten 0,40’lık bir kosinüs olarak kaydediyor, çünkü ortak bağlamlar ortak koordinat demek. Sıkıştırma ise bu değeri 1,00’e çıkarıyor; bu da komşu listesini yeniden sıralamaya yetiyor. Buna geçişlilik değil, ortak bağlam genellemesi demek daha doğru; çünkü kosinüs benzerliği matematiksel anlamda geçişli bir ilişki değildir. Düşük ranklı sıkıştırma da bu genellemeyi görünür kılmıyor (ham satırlar onu zaten gösteriyordu); onu belirleyici kılıyor.
Bu, örtük anlamsal analizin (latent semantic analysis, kısaca LSA) (Deerwester vd. 1990) kelime–bağlam matrisine uygulanmış hâlidir. Özgün LSA aynı kesik SVD’yi terim–belge matrisine uyguluyordu ve word2vec’ten yirmi yıldan fazla önce geldi.
### compression
one-hot / count row : 19 numbers per word
svd embedding : 5 numbers per word
different one-hots : cosine 0.00 (always)
king vs queen (2-D) : cosine 0.996
king vs banana(2-D) : cosine 0.141
0,996’yı aşağıdaki kutudaki çekinceyi aklınızda tutarak okuyun: her kelimenin ilk koordinatın işaretini paylaştığı iki boyutlu bir uzayda, yüksek bir kosinüsün bir kısmı benzerlikten değil, paylaşılan yönden gelir.
Bölümün sonunda geri dönecek bir ayrıntı. Bu küçük örnekte ilk koordinat bütün kelimelerde negatiftir (−0,70 ile −2,14 arasında). Bu ortak yön kosinüs değerlerine katkıda bulunabilir; ancak koordinatların büyüklükleri farklı olduğu için bu boyut ayırt edici bilgiden bütünüyle yoksun değildir. Aşağıdaki şekilde başka ayrımları görünür kılmak amacıyla 2. ve 3. boyutları çiziyoruz. Bu seçim, tam uzaydaki benzerliklerin yerini tutmaz.
Uzayın yönlere eşit dağılmamasına anizotropi (anisotropy) denir; ortak bir ortalama yön bunun olası görünümlerinden biridir. Bölümün ilerisinde anizotropiyi GloVe üzerinde ölçeceğiz.
3.4 Saymaktan tahmin etmeye: word2vec
Demek ki saymak işe yarıyor. Elle bir uzay kurduk; kraliyet bir yana, yiyecek öbür yana düştü. Peki word2vec gibi tahmine dayalı yöntemler neden bu kadar hızlı benimsendi?
Ölçeklenebilirlik önemli bir etkendi. 100.000 kelimelik kare eş-oluşum matrisinde on milyar olası hücre bulunur; seyrek saklama yalnızca sıfırdan farklı hücreleri tutar. Buradaki toplu PPMI–SVD akışında önce sayımları biriktirip sonra matrisi çarpanlarına ayırıyoruz. word2vec ise eş-oluşum matrisini açıkça kurmadan yerel eğitim çiftlerinden vektör öğrenir. Sayıma dayalı yöntemlerin artımlı sürümleri de mümkündür; dolayısıyla bu, bütün yöntemler için zorunlu bir ayrım değildir.
word2vec — kelime vektörlerini bağlamdan öğrenen, 2013 tarihli yöntemler ailesi. Skip-gram merkez kelimeden bağlam kelimelerini, CBOW ise bağlam kelimelerinden merkez kelimeyi tahmin eder; öğrenilen vektörler başka görevlerde kullanılabilir. ↩︎
2013’te Mikolov ve arkadaşları, matrisi tümüyle atlayan word2vec’i yayımladı (Mikolov, Chen, vd. 2013; Mikolov, Sutskever, vd. 2013). Eş-oluşumları sayıp çarpanlara ayırmak yerine, bağlamı tahmin eden bir sınıflandırıcı eğitin — sonra tahminlerini değil, öğrendiği ağırlıkları kullanın.
Mimari açıdan bakarsak bu sınıflandırıcı sığ bir yapay sinir ağıdır (shallow neural network): bir girdi katmanı, tek bir gizli katman, bir çıktı katmanı. “Sığ” diyoruz çünkü gizli katman tektir. Alışılmışın dışında bir özelliği daha var: bu katmanda hiçbir aktivasyon fonksiyonu yoktur, tamamen doğrusaldır. Skip-gram mimarisinde üç katmanı şöyle okuyabiliriz:
- Girdi katmanı merkez kelimenin one-hot vektörüdür: sözlük boyunda, tek bir 1, gerisi sıfır.
- Gizli katman bu vektörü \(\mathbf{W}\) matrisiyle çarpar. Bir one-hot’ı matrisle çarpmak, matristen o kelimeye karşılık gelen satırı seçmek demektir; yani gizli katman bir arama tablosudur (lookup table: satırlarına indeksle erişilen tablo). Seçilen satır, kelimenin embedding’idir. Burada ek bir aktivasyon uygulanmaz; bu yüzden bu katmana çoğu zaman izdüşüm katmanı (projection layer) denir.
- Çıktı katmanı seçilen vektörü aday bağlam kelimeleriyle puanlar. Bunun için, tam softmax’te de negatif örneklemede de kelime başına bir satır tutan ikinci bir tablo, \(\mathbf{W}'\), kullanıyoruz.
CBOW’da ise önce bağlam kelimelerinin vektörleri birleştirilir: toplanır ya da ortalaması alınır.
Kritik nokta şu: ürün, eğittiğiniz ağ değil, ağın birinci katmanının ağırlıklarıdır. Klasik word2vec kullanımında çoğunlukla girdi matrisi \(\mathbf{W}\) saklanır — satır başına bir kelime, satırda 300 sayı — ve \(\mathbf{W}'\) bir kenara bırakılır. Bu bir zorunluluk değil, yaygın bir tercih: çıktı matrisini ya da iki matrisin toplamını/ortalamasını kullanan yaklaşımlar da var ve GloVe’un yazarları ikisini toplamayı öneriyor (Pennington vd. 2014). Burada tahmin görevini, yeniden kullanabileceğimiz vektörler öğrenmek için kuruyoruz. Transformer bölümünde (Bölüm 7) göreceğimiz girdi embedding tablosu da benzer biçimde çalışır; ancak o tabloda genellikle kelime başına değil, modelin sözlüğündeki token başına bir satır bulunur.
Bu tahmin görevini kurmanın iki yolu var ve ikisi birbirinin aynadaki yansıması. Aynı pencere, aynı kelimeler, oklar ters yönde:
| Mimari | Girdi | Tahmin edilen |
|---|---|---|
| Skip-gram | merkez kelime | bağlam kelimeleri |
| CBOW | bağlam kelimeleri | merkez kelime |
Bu bölüm skip-gram üzerinden ilerleyecek; negatif örnekleme de en sık onunla birlikte kullanılıyor.
Tek bir cümle üzerinde iki word2vec mimarisi
Aynı pencere, aynı kelimeler, oklar ters yönde. İki mimari de iki matris öğrenir — W bir kelimeyi vektörüne eşler, W′ aday eşleri puanlar. İndirdiğiniz hazır vektörler çoğunlukla W’nin satırlarıdır; W′ ise genellikle kullanılmadan bırakılır.
Analizlerin ve eğitim içeriklerinin çoğu skip-gram’ı kullanır. (Ayakta kalan tek varyant bu değil: daha hızlı olduğu için hem özgün word2vec aracında hem de gensim’de varsayılan CBOW’dur.) Derlemin üzerinde bir pencere kaydırın; her konum eğitim örnekleri üretir.
3.4.1 Negatif örneklemeyi lojistik kayıpla öğrenmek
Önce şunu netleştirelim: skip-gram neyi soruyor? Vektörü \(\mathbf{v}_w\) (yani \(\mathbf{W}\)’deki satırı) olan bir \(w\) merkez kelimesi alın. Her aday bağlam kelimesi \(c\) bir puan alır: \(\mathbf{W}'\)’deki satırıyla iç çarpım, \(\mathbf{v}_w \cdot \mathbf{u}_c\). İki vektör aynı yönü gösterdiğinde (ve uzun olduklarında) iç çarpım büyüktür; bu yüzden bir uyum puanı işlevi görür. Özgün skip-gram bu puanları softmax ile — puanların üstelini alıp toplamlarına bölerek onları olasılığa çeviren fonksiyon; istatistikteki çok terimli lojit modelinin olasılık formülü — sözlüğün tamamı üzerinde bir olasılık dağılımına çevirir ve eğitim, gerçekten gözlenen bağlam kelimelerinin log-olasılığını en büyük yapar:
\[ P(c \mid w) = \frac{\exp(\mathbf{v}_w \cdot \mathbf{u}_c)} {\sum_{c'=1}^{V} \exp(\mathbf{v}_w \cdot \mathbf{u}_{c'})}, \qquad \text{en büyükle} \sum_{(w,\,c)\ \text{derlemde}} \log P(c \mid w) \]
İstatistikçi gözüyle bu, sözlükteki her kelime için bir sınıf bulunan çok terimli (multinomial) bir lojistik regresyondur.
Tam softmax her eğitim çiftinde \(V\) bağlam puanını hesaplar ve normalleştirir. \(d\) boyutlu vektörlerde bu hesap yaklaşık \(O(Vd)\) maliyetlidir. \(V = 400.000\) olduğunda (bölümün ilerisinde kullanacağımız GloVe sözlüğünün boyutu) çok sayıda çifti bu biçimde işlemek pahalıdır.
Negatif örnekleme, eğitim amacını değiştirir: bu çok sınıflı görevin yerine daha küçük ikili sınıflandırma görevleri kurar. Çift başına puanlama maliyeti yaklaşık \(O((K+1)d)\) olur; \(K\), çift başına çekilen negatif örnek sayısıdır.
negative sampling (negatif örnekleme) — gözlenen her kelime–bağlam çifti için bir gürültü dağılımından az sayıda bağlam çekip bunları negatif etiketli eğitim örnekleri olarak kullanma yöntemi. Negatif örnekler, derlemde hiç görülmemiş veya anlamsal olarak ilişkisiz olmak zorunda değildir. ↩︎
word2vec’i uygulanabilir kılan adım, 400.000 sınıflı softmax yerine bir istatistikçinin tanıyacağı başka bir soru sormaktır (Mikolov, Sutskever, vd. 2013):
Bu eğitim örneği, gözlenen çiftler dağılımından mı (\(y = 1\)), yoksa gürültü örnekleyicisinden mi (\(y = 0\)) geldi? Aynı kelime çifti her iki yolla da üretilebilir.
Bu, ikili sınıflandırmadır. Gözlenen her \((w, c)\) çifti için bir gürültü dağılımından — sözlük üzerinde, kelime sıklığına dayalı bir dağılım; tam biçimine birkaç sayfa sonra döneceğiz — \(K\) tane bağlam kelimesi çekin ve onları 0 olarak etiketleyin; yöntemin adını aldığı negative sampling işte bu çekme işlemidir. Sonra bir lojistik regresyon modeli eğitin; modelin doğrusal öngörücüsü iki kelime vektörünün iç çarpımı olsun:
\[ P(y = 1 \mid w, c;\, K, q) = \sigma(\mathbf{v}_w \cdot \mathbf{u}_c), \qquad \sigma(z) = \frac{1}{1 + e^{-z}} \]
Burada \(q\), negatif bağlamların çekildiği gürültü dağılımıdır. Bu olasılık, kurduğumuz eğitim örnekleme düzenine aittir; iki kelimenin gerçek dünyada birlikte görülme olasılığı değildir.
Sıradan bir lojistik regresyondan bir farkı var: öznitelikler sabit değil, hem merkez hem bağlam vektörleri aynı anda öğreniliyor. Bu yüzden iki tablo birlikte düşünüldüğünde problem dışbükey (konveks) değildir.
Geriye her zamanki log kaybını, yani şu kayıp fonksiyonunu (loss function) en aza indirmek kalıyor:
\[ \mathcal{L} = -\log \sigma(\mathbf{v}_w \cdot \mathbf{u}_c) - \sum_{k=1}^{K} \log \sigma(-\mathbf{v}_w \cdot \mathbf{u}_{n_k}) \]
Pozitif çiftin terimi, merkez ve bağlam vektörleri arasındaki iç çarpım büyüdükçe azalır. Negatif örneğin terimi ise ilgili iç çarpım küçüldükçe azalır. Çekme ve itme benzetmesi bu puan değişimini anlatır; vektörler arasındaki Öklid uzaklığının zorunlu olarak aynı yönde değiştiğini söylemez.
Bir güncellemeyi elle yapın. Pratikte vektörler 300 boyutludur; aritmetik tek satıra sığsın diye 4 boyut kullanalım. Diyelim ki failed merkez kelimesinin vektörü şu an \(\mathbf{v}_{\texttt{failed}} = (0{,}4;\ -0{,}2;\ 0{,}7;\ 0{,}1)\), gerçek eşi pump’ınki \(\mathbf{u}_{\texttt{pump}} = (0{,}5;\ 0{,}1;\ 0{,}6;\ -0{,}3)\) ve örneklenmiş sahte kelime opera’nınki \(\mathbf{u}_{\texttt{opera}} = (-0{,}3;\ 0{,}6;\ -0{,}2;\ 0{,}4)\).
Gerçek çift için iç çarpım şu:
\[ (0{,}4)(0{,}5) + (-0{,}2)(0{,}1) + (0{,}7)(0{,}6) + (0{,}1)(-0{,}3) = 0{,}57 \]
dolayısıyla \(\sigma(0{,}57) = 0{,}639\): model, bu eğitim düzeninde çiftin pozitif örnek olarak gelmesine yaklaşık %64 olasılık veriyor. Pozitif etiketli örneğin kayba katkısı \(-\log 0{,}639 = 0{,}448\)’dir.
Sahte çift için iç çarpım \(-0{,}34\). Sahte çift terimi \(\sigma(-\mathbf{v}_w \cdot \mathbf{u}_{n_k})\) kullandığı için işaret döner: \(\sigma(-(-0{,}34)) = \sigma(0{,}34) = 0{,}584\) ve \(-\log 0{,}584 = 0{,}538\) kaybı veriyor. Model ikisinde de zaten doğru yöne eğilimli, ama emin değil; bu yüzden ikisi de biraz güncellenecek.
İşin tanıdık hâle geldiği yer, vektörlerin nasıl güncellendiği. Tek bir etiketli terimin, \(z = \mathbf{v}_w \cdot \mathbf{u}_c\) iç çarpımına göre türevi yalnızca şu:
\[ \ell(z, y) = -y \log \sigma(z) - (1 - y) \log\bigl(1 - \sigma(z)\bigr), \qquad \frac{\partial \ell}{\partial z} = \sigma(z) - y \]
Toplam SGNS (negatif örneklemeli skip-gram) kaybının türevi, ilgili bütün pozitif ve negatif terimlerin türevleri toplanarak bulunur. Burada \(y\), pozitif örnek için 1, negatif örnek için 0. Tahmin eksi hedef — bugüne kadar eğittiğiniz her lojistik regresyondan çıkan aynı ifade. pump için bu \(0{,}639 - 1 = -0{,}361\) (negatif, yani iç çarpım yükselir); opera için \(0{,}416 - 0 = 0{,}416\) (pozitif, yani iç çarpım düşer).
Bir çiftteki iki vektör de hareket eder — aşağıdaki açılır kutudaki türetme iki gradyanı gösteriyor ve her vektör diğerinin yönü boyunca sürükleniyor. Aritmetik takip edilebilir kalsın diye \(\mathbf{u}\) bağlam vektörlerini sabit tutup yalnızca \(\mathbf{v}\) merkez vektörünü güncelleyelim. \(\mathbf{v}\)’nin gradyanı iki terimin toplamıdır — yukarıdaki kayıp bunu söylüyor, aşağıdaki eğitim kodundaki gv de bunu tek bir einsum’da hesaplıyor:
\[ g_{\mathbf v} = (0{,}639 - 1)\,\mathbf u_{\texttt{pump}} + (0{,}416 - 0)\,\mathbf u_{\texttt{opera}} = (-0{,}305;\ 0{,}213;\ -0{,}300;\ 0{,}275) \]
0,05 öğrenme oranıyla bu, failed·pump’ı 0,570’ten 0,590’a, failed·opera’yı ise \(-0{,}340\)’tan \(-0{,}359\)’a taşır. Gerçek bir uygulamada olduğu gibi bağlam vektörlerini de güncellerseniz aynı adım ilk iç çarpımı 0,603’e çıkarır, ikincisini \(-0{,}374\)’e indirir: aynı yönler, kabaca 1,7 katı mesafe.
Optimizasyon sözlükçesi. Gradyan inişi: kaybı azaltan yönde küçük adımlar atmak; öğrenme oranı bu adımın boyu (bkz. Bölüm B.4). Stokastik gradyan inişi (SGD): gradyanı bütün veri yerine tek bir örnekten ya da küçük bir gruptan hesaplamak. Batch (yığın): tek adımda birlikte işlenen örnek grubu. Epoch (devir): veri üzerinden bir tam tur. Bölüm 6 bunları ayrıntılı ele alıyor.
Bunlar minicik hareketler. Onlarca milyar çiftle çarpın, bu modelleri meşhur eden geometriyi elde edersiniz. Buradan yanlış bir sonuç çıkarmayın: tek bir SGD güncellemesinin matematiği şaşırtıcı derecede basit, ama “word2vec basit bir SGD’dir, gerisi önemsizdir” doğru değil. Kaliteyi belirleyen şeylerin önemli bir kısmı güncellemenin kendisinde değil, hangi çiftlerin, ne sıklıkta ve neye karşı gösterildiğinde — yani örnekleme ve eğitim stratejilerinde: negatif örnekleme, sık kelimelerin altörneklenmesi, gürültü dağılımı ve bağlam penceresi. Birkaç sayfa sonra bu dördünü tek tek ele alacağız.
NotGradyanın tamamı, türetmeyi adım adım görmek isteyenler için
Yalnızca gerçek çift terimini alın ve \(z = \mathbf{v}_w \cdot \mathbf{u}_c\) yazın. İhtiyacınız olan tek olgu, sigmoid’in alışılmadık derecede derli toplu bir türevi olması:
\[ \sigma'(z) = \sigma(z)\,\bigl(1 - \sigma(z)\bigr) \]
Şimdi \(-\log \sigma(z)\) ifadesinin türevini zincir kuralıyla alın:
\[ \frac{\partial}{\partial z}\bigl[-\log \sigma(z)\bigr] = -\frac{\sigma'(z)}{\sigma(z)} = -\frac{\sigma(z)(1 - \sigma(z))}{\sigma(z)} = \sigma(z) - 1 \]
\(\sigma(z)\) sadeleşiyor. Bu sadeleşme hoş bir özellik, ama sigmoid’i log kaybıyla eşleştirmemizin asıl sebebi değil; asıl sebep olasılıkla ilgili ve adım adım görmeye değer.
Her eğitim örneğinin etiketi 0 veya 1’dir. Evet/hayır sonuçlu tek bir denemeyi tarif eden olasılık dağılımına Bernoulli dağılımı denir; yazı tura buna örnektir. Etiketi bu dağılımla modelleriz. Dağılımın \(p\) parametresi \([0, 1]\) aralığındadır. Modelimiz bu \(p\)’yi veriyor: sonlu \(z\) için sigmoid, \(p = \sigma(z)\) değerini \((0, 1)\) aralığında üretir.
Şimdi şunu sorun: model, gerçekten gözlediğimiz cevaba ne kadar olasılık vermişti? Cevap “evet” ise (\(y = 1\)) bu olasılık \(p\); “hayır” ise (\(y = 0\)) \(1 - p\). Bu sayıya olabilirlik (likelihood) deniyor: modelin, olmuş olanı ne kadar olası gördüğü. İyi bir model olmuş olana yüksek olasılık verir; dolayısıyla eğitimin doğal hedefi olabilirliği büyütmek. Bütün çiftler için bu olasılıkları çarpmak yerine logaritmalarını toplamak hesabı kolaylaştırır, “büyüt”ü “küçült”e çevirmek için de başına eksi koyarız:
\[ -\log(\text{olabilirlik}) \;=\; -\bigl[\,y \log p + (1 - y)\log(1 - p)\,\bigr] \]
Bu ifade ikili çapraz entropi (binary cross-entropy), yani Bernoulli modelinin negatif log-olabilirliğidir. Onu küçültmek gözlenen etiketlerin olabilirliğini büyütür. Olasılık tahminleri karesel kayıpla da değerlendirilebilir; ancak bu başka bir ölçüttür ve burada türettiğimiz Bernoulli log kaybıyla aynı değildir.
Özetle sigmoid ile log kaybının eşleşmesi iki şeyi birden veriyor: Bernoulli olabilirliği üzerinden temiz bir olasılık yorumu ve yukarıdaki kadar sade bir gradyan. İkincisi birincinin hediyesi. Negatif bir örnek için terim \(-\log \sigma(-z)\) olur ve aynı iki satır \(\sigma(z)\) verir. Her iki durum da tek bir ifadede birleşir: \(\sigma(z) - y\).
Oradan vektörlere geçmek için zincir kuralını bir kez daha uygulamak yeter, çünkü \(\partial z / \partial \mathbf{v}_w = \mathbf{u}_c\):
\[ \frac{\partial \mathcal{L}}{\partial \mathbf{v}_w} = \bigl(\sigma(z) - y\bigr)\, \mathbf{u}_c, \qquad \frac{\partial \mathcal{L}}{\partial \mathbf{u}_c} = \bigl(\sigma(z) - y\bigr)\, \mathbf{v}_w \]
Her vektörün gradyanı, \(\sigma(z) - y\) skaler hatasının diğer vektörle çarpımıdır. Model doğru etikete yüksek olasılık verdiğinde skaler hata küçülür. Bununla birlikte vektör normları büyüyebilir ve yığındaki (batch) katkılar toplanabilir; dolayısıyla bu özellik tek başına kararlı eğitim veya yakınsama garantisi vermez. Öğrenme oranı, gradyan ölçeği ve gerekirse kırpma ayrıca değerlendirilmelidir.
Negatif örnekleme neden var: 400.000 iç çarpım mı, altı mı
Soldaki panel \(V = 400.000\) adayın tamamını puanlayıp softmax uygular. Sağdaki panel bir pozitif ve beş negatif örnek için altı iç çarpım hesaplar. Bu örnekte iç çarpım sayısı yaklaşık 67.000 kat azalır; gerçek eğitim hızlanması donanıma, örneklemeye ve uygulamaya bağlıdır.
SGNS’nin her etiketli çift için kullandığı sigmoid ve log kaybı, lojistik regresyondan tanıdıktır. Ancak iç çarpımın iki tarafındaki vektörler de öğrenildiği için bütün model, sabit öznitelikli klasik lojistik regresyon değildir. Daha doğru tanım, iki vektör tablosunun birlikte öğrenildiği lojistik matris çarpanlaştırmasıdır. Bu ayrım hem gradyanların tanıdık biçimini hem de ortak optimizasyonun dışbükey (konveks) olmamasını açıklar.
Bir değil, iki matris öğrenilir: kelime merkezdeyken \(\mathbf{v}_w\), bağlamdayken \(\mathbf{u}_c\). Neredeyse herkes \(\mathbf{u}\)’yu atıp \(\mathbf{v}\)’yi tutar. İkisini toplamak bazen biraz işe yarar; GloVe’un yazarları bunu öneriyor (Pennington vd. 2014).
3.4.2 Bir adımda hangi vektörler güncellenir?
Negatif örneklemenin hesap maliyetini anlamak için bir eğitim çiftinin hangi satırlara katkı verdiğine bakalım.
Tek bir eğitim çiftinde, \(K = 5\) negatifle, iki matriste toplam yedi satır güncelleme katkısı oluşur:
- \(\mathbf{W}\)’den bir satır: merkez kelimenin vektörü \(\mathbf{v}_w\).
- \(\mathbf{W}'\)’den bir satır: gerçek bağlam kelimesinin vektörü \(\mathbf{u}_c\).
- \(\mathbf{W}'\)’den \(K\) satır: örneklenen sahte kelimelerin vektörleri.
Örneklenen negatifler birbirini tekrar ederse ya da gerçek bağlam kelimesiyle çakışırsa, güncellenen farklı satır sayısı yediden az olur; katkıların toplamı değişmez.
Geri kalan satırlar — sözlükteki diğer bütün kelimelerin her iki matristeki satırları — bu çiftin SGNS veri kaybına girmez; dolayısıyla gradyanları sıfırdır. Burada kullandığımız, momentum ve ağırlık azalması (weight decay) içermeyen SGD güncellemesinde bu satırlar değişmez. Düzenlileştirme veya geçmiş güncellemeleri taşıyan bir optimizer kullanılırsa parametre güncellemesini ayrıca incelemek gerekir.
Ölçek hakkında fikir edinmek için aşağıda sıfırdan eğiteceğimiz modeli alın: 18.677 kelimelik, 100 boyutlu iki tabloda toplam 37.354 satır ve 3.735.400 parametre bulunur. Beş negatif kullanan tek bir eğitim çifti en fazla yedi farklı satıra, yani satırların yaklaşık %0,019’una katkı verir. Bu seyreklik, eğitimin verimli olmasının önemli nedenlerinden biridir.
Bunu aşağıdaki kodun güncelleme satırlarında doğrudan görebilirsiniz: np.add.at(Wo, targets.ravel(), ...) çağrısındaki targets, çift başına yalnızca \(K+1\) indeks taşır — dolayısıyla Wo’nun yalnızca o kadar satırına ekleme yapılır. Gerisine dokunulmaz.
Tam softmax’te bütün çıktı vektörleri paydadaki puanlamaya katılır ve genellikle sıfırdan farklı gradyan alır. Bu örnekte bir merkez satırı ile 18.677 çıktı satırı, toplam 18.678 satır söz konusudur. Yedi satıra göre yaklaşık 2.668 katlık bu oran, etkilenen satır sayısını karşılaştırır; toplam hesap maliyeti veya çalışma süresi oranı değildir.
SGNS’de tabloya yalnızca seçilen indekslerle erişildiği için veri kaybının gradyanı satır düzeyinde seyrektir. PyTorch’un nn.Embedding(..., sparse=True) seçeneği bu tür erişimler için seyrek gradyan üretir. Ancak embedding parametreleri tam softmax gibi başka işlemlerde de kullanılıyorsa bütün parametrenin gradyanı seyrek olmak zorunda değildir. Buradaki merkez vektörü, kelime merkez olarak seçildiğinde; bağlam vektörü ise pozitif ya da negatif bağlam olarak kullanıldığında doğrudan güncellenir.
3.4.3 word2vec’in başarısını belirleyen dört eğitim tercihi
Güncellemenin kendisi basitti. Modelin ne kadar iyi olduğunu ise büyük ölçüde aşağıdaki dört tercih belirliyor; her biri “hangi çiftleri, ne sıklıkta ve neye karşı gösteriyoruz?” sorusunun bir parçasına cevap veriyor.
| tercih | neyi ayarlar | tipik değer | etkisi |
|---|---|---|---|
| Negatif örnek sayısı (\(K\)) | pozitif çift başına çekilen negatif sayısı | özgün çalışmada küçük derlem için 5–20, büyük derlem için 2–5 | maliyet ile eğitim sinyali arasındaki dengeyi değiştirir |
| Bağlam penceresi | aday komşular ve uzaklığa göre ağırlık | örneğin en fazla 5; dinamik pencere seçeneğiyle | dar pencereler işlevsel, geniş pencereler konusal ilişkileri daha fazla öne çıkarabilir |
| Sık kelimelerin altörneklenmesi (\(t\)) | çok sık token’ların tutulma olasılığı | örneğin \(t = 10^{-3}\) | sık kelimelerin eğitimdeki payını azaltır |
| Gürültü dağılımı (0,75 üssü) | negatiflerin çekilme olasılığı | \(q(w) \propto f(w)^{0{,}75}\) | ham unigram dağılımına göre nadir kelimelerin göreli örneklenme payını artırır |
Negatif örnekleme ve \(K\). Yöntemin kendisini yukarıda gördünüz: her gerçek çift için gürültü dağılımından \(K\) sahte bağlam kelimesi çekilir ve model gerçeği sahteden ayırmayı öğrenir. Burada ayarlanan şey \(K\). Çok küçük bir \(K\) ile model yeterince “bu değil” örneği görmez ve vektörler yeterince ayrışmaz; büyük bir \(K\) her adımı pahalılaştırır. Özgün makale küçük derlemler için 5–20, büyük derlemler için 2–5 öneriyor (Mikolov, Sutskever, vd. 2013) — veri bolken her kelime zaten çok sayıda güncelleme aldığı için az sayıda negatif yetiyor.
Bağlam penceresi. Pencere 5 ise aynı girdi dizisinde merkezin solundaki ve sağındaki en fazla beşer token aday bağlamdır. Dar pencereler (1–2) çoğu zaman yakın sözdizimsel ilişkileri, geniş pencereler (5–10) ise konusal ilişkileri daha fazla yansıtır. Bunlar eğilimdir; derlem, dil ve ön işleme de sonucu etkiler. Cümle sınırları korunuyorsa pencere bu sınırları aşmaz.
word2vec’in bir inceliği daha var: pencereyi sabit tutmaz. Her merkez kelime için etkin genişliği 1 ile en büyük değer arasından rastgele çeker (dinamik pencere). Sonuç, yakın komşuların uzak olanlardan daha sık eğitim çifti üretmesidir — yani uzaklığa göre örtük bir ağırlıklandırma. Bölümün başındaki sayma yönteminde pencereyi elle değiştirip bu farkı kendiniz görebilirsiniz (1. alıştırma).
Sık kelimelerin altörneklenmesi. Sık kelimeler çok sayıda eğitim çifti üretir. Bu kelimelerin göreli etkisini azaltmak için her token’ı sıklığına bağlı bir olasılıkla tutarız. Aşağıda \(f(w)\), sözlük filtresinden sonra kalan token’lar içindeki göreli sıklıktır; \(t\) aynı ölçekte bir eşiktir. Kullanılan tutma olasılığı şöyledir:
\[ p_{\text{tut}}(w) = \min\!\left(1,\ \left(\sqrt{\frac{f(w)}{t}} + 1\right)\cdot\frac{t}{f(w)}\right), \qquad t \approx 10^{-3} \]
Formül, içine birkaç sayı koyup deneyene kadar keyfi görünüyor. Ölçeği \(t = 10^{-3}\) eşiği belirler: derlemin binde birinden azını oluşturan her kelimede içteki ifade 1’in üstünde çıkar, bu yüzden o kelime her zaman tutulur — \(\min\)’in yaptığı iş bu. (Tam başa baş noktası biraz daha yukarıda, \(f \approx 2{,}6\,t\)’de, yani derlemin yaklaşık %0,26’sında; içteki ifade orada tam 1’e eşit olur.)
NotDerinleşme: makaledeki formül ile koddaki formül
Özgün C uygulaması yukarıdaki tutma formülünü kullanır. Makale ise \(P(\text{atma}) = 1 - \sqrt{t/f}\) verir; \(f < t\) olduğunda bu ifade negatif çıktığı için olasılık olarak \(P(\text{atma}) = \max(0,\ 1 - \sqrt{t/f})\), yani \(P(\text{tutma}) = \min(1,\ \sqrt{t/f})\) biçiminde okunur. İki formül aynı değildir; bir deneyi yeniden üretirken hangi uygulamanın kullanıldığını belirtmek gerekir.
| derlemdeki pay | örnek | \(p_{\text{tut}}\) | atılan |
|---|---|---|---|
| %5 | İngilizce metinde the |
0,16 | %84 |
| %1 | of, and |
0,42 | %58 |
| %0,1 (\(=t\)) | orta frekanslı kelime | 1,00 | %0 |
| %0,01 ve altı | kuyruktaki her şey | 1,00 | %0 |
Yani bu nazik bir yeniden ağırlıklandırma değil — the’nin her altı geçişinden beşini siliyor ve kuyruğa hiç dokunmuyor. Nadir kelimeleri olduğu gibi bırakıyor, Bölüm 2’de çizdiğiniz Zipf eğrisinin tepesini ise agresif biçimde seyreltiyor. Aşağıdaki koşuda sözlük içindeki token’ların %26,6’sını atıyor — 6.397.826 token 4.698.743’e iniyor — ve attığının neredeyse tamamı the, of, and ve arkadaşları. Buradaki 6.397.826 nereden geliyor? Koşunun çıktısındaki tokens read: 6794527 değerinden min_count=20 eşiğinin altında kalan her şey atılınca geriye kalan sayı bu. Altörnekleme oranı da bu sayıya uygulanır.
Bir token çıkarıldığında, kalan dizide onun iki yanındaki kelimeler birbirine yaklaşır. Pencere boyu değişmese de özgün metinde daha uzakta olan kelimeler yeni bağlam çiftleri oluşturabilir. Bu, eğitimin hem örnek sayısını hem de bağlam dağılımını değiştirir.
Gürültü dağılımı: 0,75 üssü. Gürültü dağılımı (noise distribution), sahte bağlam kelimelerinin çekildiği dağılımın adı. Negatif örnekler unigram dağılımından (kelimelerin tek tek sıklıklarından) değil, \(P(w) \propto f(w)^{0{,}75}\) dağılımından çekilir. Her olasılığı 1’den küçük bir kuvvete yükseltmek hepsini 1’e doğru çeker; oransal olarak en çok da en küçükleri çeker: \(0{,}5^{0{,}75}\), \(0{,}5\)’ten %19 büyüktür; \(0{,}001^{0{,}75}\) ise \(0{,}001\)’in 5,6 katıdır. Ardından yeniden normalleştirmek, olasılık kütlesini dağılımın başından kuyruğuna taşır.
Somut olarak: yaygın bir kelime nadir bir kelimeden 5.000 kat daha sık geçiyorsa, üsten sonra negatif olarak çekilme olasılığı yalnızca \(5000^{0{,}75} \approx 595\) kat daha yüksek olur. Aradaki fark kabaca sekizde birine iner ve bu daralma nadir kelimenin lehinedir.
Negatif örnekler, bağlam vektörlerinin yalnızca gözlenen pozitif çiftlerle değil, gürültü dağılımından gelen çiftlerle de güncellenmesini sağlar. 0,75 üssü, ham unigram örneklemesine göre nadir bağlamların göreli payını artırır; onlara daha önce hiç var olmayan bir sinyal türü kazandırmaz. Merkez vektörleri de bu değişen bağlam vektörleri üzerinden dolaylı olarak etkilenir. Bu üs, SGNS’nin örtük hedefindeki gürültü dağılımını da değiştirir; bağlantıyı ilerideki Derinleşme kutusunda inceleyeceğiz. 0,75 evrensel bir kuramsal optimum değil, ampirik bir tercihtir. Levy ve arkadaşları (Levy vd. 2015), bu tür hiperparametrelerin karşılaştırma sonuçlarını önemli ölçüde etkileyebildiğini gösterir.
3.4.4 Uygulama: word2vec’i sıfırdan yazmak
Ana akış için bilmeniz gereken, eğitim döngüsünün altı adımı:
- derlemden gerçek bir (merkez, bağlam) çifti al;
- gürültü dağılımından \(K\) sahte bağlam kelimesi çek;
- merkez vektörüyle bu \(K+1\) vektörün iç çarpımlarını hesapla;
- sigmoid uygula;
- hatayı, yani (tahmin − etiket) farkını bul;
- iki tablodaki ilgili satırları bu hatayla güncelle.
Aşağıdaki NumPy örneği, text8 derleminin (İngilizce Wikipedia’nın temizlenmiş bir dökümü) ilk 40 milyon karakteriyle kullanılan eğitim akışını gösterir. Veri hazırlama ve güncelleme adımları görünürdür; alttaki çıktıyı üreten kayıp, süre ve komşuluk raporlama satırları bu kısaltılmış parçada yer almıyor (tam kod bölümün notebook’unda). Temel gradyan, yukarıdaki lojistik kayıptan gelir; aşağıdaki gradyan kırpması ise güncelleme kuralını değiştirir. Batchleme, örnekleme ve gradyan kırpma gibi sayısal ayrıntıları merak etmiyorsanız doğrudan sonuçlara geçebilirsiniz.
import gzip, time
from collections import Counter
import numpy as np
import gensim.downloader as api
rng = np.random.default_rng(0)
with gzip.open(api.load("text8", return_path=True), "rt") as f:
raw = f.read(40_000_000).split()
MIN_COUNT = 20
counts = Counter(raw)
vocab = [w for w, c in counts.most_common() if c >= MIN_COUNT]
idx = {w: i for i, w in enumerate(vocab)}
V = len(vocab)
total = sum(counts[w] for w in vocab)
freq = np.array([counts[w] / total for w in vocab])
keep = np.minimum(1.0, (np.sqrt(freq / 1e-3) + 1) * (1e-3 / freq))
ids = np.array([idx[w] for w in raw if w in idx], dtype=np.int32)
ids = ids[rng.random(len(ids)) < keep[ids]] # altörnekleme
noise = freq ** 0.75 # 0.75 üssü
noise /= noise.sum()
cum = np.cumsum(noise)
D, K, WINDOW, EPOCHS, LR0 = 100, 5, 5, 3, 0.02
Wc = ((rng.random((V, D)) - 0.5) / D).astype(np.float32) # merkez vektörleri
Wo = np.zeros((V, D), dtype=np.float32) # bağlam vektörleri
centres, contexts = [], []
# İki basitleştirme: (1) Pencere 5'te sabit; dinamik pencere kullanılmıyor.
# (2) text8 tek bir token akışı olarak işleniyor. Özgün cümle ve belge
# sınırları korunmadığı için sınırlar arasında yapay bağlam çiftleri
# oluşabilir. Ayrı belgelerle çalışırken çiftleri belge içinde kurun.
for off in range(1, WINDOW + 1):
centres.append(ids[:-off]); contexts.append(ids[off:])
centres.append(ids[off:]); contexts.append(ids[:-off])
centres = np.concatenate(centres)
contexts = np.concatenate(contexts)
N = len(centres)
BATCH = 2048
n_batches = N // BATCH
def sigmoid(x):
# Taşmaya dayanıklı sigmoid; skoru yapay olarak [-8, 8] ile kısıtlamaz.
return np.exp(-np.logaddexp(0.0, -x))
for epoch in range(EPOCHS):
for b in range(n_batches):
# YERİNE KOYMALI çekiliyor: "3 epoch", veri üzerinde üç geçiş değil,
# çift sayısının üç katı kadar çift çekimi demek. Çiftlerin yaklaşık
# %5'i hiç çekilmiyor, bazıları altı kez çekiliyor; bu yüzden buradaki
# EPOCHS=3 ile gensim'deki epochs=3'ü karşılaştırmayın.
sl = rng.integers(0, N, BATCH)
c, o = centres[sl], contexts[sl]
negs = np.searchsorted(cum, rng.random((BATCH, K))).astype(np.int32)
targets = np.concatenate([o[:, None], negs], axis=1) # (B, K+1)
labels = np.zeros((BATCH, K + 1), dtype=np.float32)
labels[:, 0] = 1.0 # ilk sütun gerçek çift
v = Wc[c] # (B, D)
u = Wo[targets] # (B, K+1, D)
score = sigmoid(np.einsum("bkd,bd->bk", u, v)) # (B, K+1)
err = (score - labels).astype(np.float32) # artığın ters işaretlisi (tahmin − gözlem)
lr = LR0 * max(1e-4, 1 - (epoch * n_batches + b) / (EPOCHS * n_batches))
gv = np.einsum("bk,bkd->bd", err, u)
gu = err[:, :, None] * v[:, None, :]
np.clip(gv, -1.0, 1.0, out=gv)
np.clip(gu, -1.0, 1.0, out=gu)
np.add.at(Wc, c, -lr * gv)
np.add.at(Wo, targets.ravel(), (-lr * gu).reshape(-1, D))
E = Wc / (np.linalg.norm(Wc, axis=1, keepdims=True) + 1e-9)err = score - labels satırına bakın. Bu tahmin eksi gözlem demek — yani bir lojistik regresyonun artığının (gözlem eksi tahmin) ters işaretlisi; log kaybının gradyanı doğrudan bu farkı kullanır. Altındaki her gradyan, bu farkın diğer vektörle çarpımı. Bu size istatistikten tanıdık geliyorsa şaşırmayın: gerçekten aynı şey.
tokens read: 6794527
vocabulary (min_count=20): 18677
tokens after subsampling: 4698743
training pairs: 46987400
### training
epoch 1 0.0% loss 4.159
epoch 1 100.0% loss 2.409
epoch 2 100.0% loss 2.368
epoch 3 100.0% loss 2.350
trained in 611s
### nearest neighbours, from ~60 lines of NumPy
king consort 0.75, kings 0.75, isabella 0.75, aram 0.74, regent 0.73
france spain 0.79, italy 0.75, netherlands 0.74, switzerland 0.73, portugal 0.72
physics mechanics 0.82, quantum 0.80, bose 0.80, chemistry 0.78, bohr 0.76
monday friday 0.87, thursday 0.85, weekend 0.84, tuesday 0.84, wednesday 0.83
car racing 0.74, cars 0.74, driver 0.70, automobile 0.69, motor 0.68
three four 0.95, five 0.93, two 0.91, six 0.91, one 0.89
pump ignition 0.88, pedals 0.87, injected 0.87, compartment 0.86, oven 0.86
Epoch sonundaki kayıp, o epoch’un son 1.000 yığınının (batch) ortalamasıdır; süre makineye bağlıdır. Son satır da öğretici: pump’ın komşuları (ignition, pedals, oven) aynı mekanik dünyadan geliyor ama gevşek. Nadir kelimelerde kalitenin neden düştüğünü “Frekans sızıyor” kısmında göreceğiz.
İpucuSezgi kontrolü:
np.add.at burada neden gradyan kırpması istiyor?
Gerçek word2vec her seferinde tek bir çifti günceller; dolayısıyla sık bir kelimenin vektörü güncellemeler arasında tazelenir. Batchleme bunu bozar: np.add.at, tekrar eden bir indeks için gradyanların hepsini biriktirir ve toplamı tek adımda uygular. 2048 çiftlik bir batch’te sık bir kelime yüz kez görünebilir; yani hiç kımıldamamış bir vektörden hesaplanmış yüz güncellemeyi üst üste alır.
Kırpma olmadan bu koşu yarım epoch içinde nan’a ıraksıyor — bu bölüm için ilk çalıştırıldığında, 0,05 öğrenme oranıyla, bu oldu.
Burada kırpma, yinelenen indekslerin katkıları toplanmadan önce uygulanır. Merkez örneğinin toplam gradyanı ve her bağlam örneğinin gradyanı, koordinat başına \([-1, 1]\) aralığına kısıtlanır. Bir satır yüz katkı alırsa her koordinatının değişimi en fazla \(100 \times \text{lr}\), \(d\) boyuttaki L2 norm değişimi ise en fazla \(100 \times \text{lr} \times \sqrt{d}\) olabilir. Bu işlem tek katkıları sınırlar; birikmiş satır güncellemesini doğrudan sınırlamaz.
Bir seçenek, bütün yığının gradyanını yığın büyüklüğüne bölüp öğrenme oranını buna göre seçmektir. Başka bir seçenek, her satırın birikmiş gradyanını o indeksin yığındaki katkı sayısına bölmektir; np.bincount bu sayıları hesaplayabilir. İkinci seçenek satırların etkin öğrenme oranlarını farklı biçimde ölçekler ve standart yığın ortalamasıyla aynı değildir. İkisi de parametreleri her örnekte yeniden güncelleyen ardışık SGD’yi birebir üretmez.
Gradyan kırpması, bu uygulamada kullanılan bir optimizasyon tercihidir ve öğrenilen vektörleri etkileyebilir. Vektörleştirme zorunlu olarak kırpma gerektirmez; yığın kaybının ölçeklenmesi, öğrenme oranı ve güncelleme düzeni birlikte ayarlanmalıdır. Bu örnekte bildirilen ıraksama, seçilen ayarlarla yapılan koşuya aittir.
3.4.5 Sayıma ve tahmine dayalı yöntemler arasındaki bağ
Sayma (LSA, PPMI+SVD) ve tahmin etme (word2vec) bir süre rakip yaklaşımlar olarak görüldü; Baroni vd. (2014) ikisini karşılaştırıp tahmine dayalı yöntemlerin daha iyi sonuç verdiğini bildirdi. Ardından Levy ve Goldberg (Levy ve Goldberg 2014b), negatif örneklemeli skip-gram’ın matris çarpanlaştırmayla ilişkisini gösterdi. Negatif bağlamlar eğitim çiftlerinin bağlam marjinalinden çekilirse ve her çiftin iç çarpımı bağımsız seçilebilirse, pozitif sayımlı çiftlerde optimum hedef aşağıdaki kaydırılmış PMI değeridir. Bu, bütün word2vec sürümlerinin PPMI–SVD ile özdeş olduğu anlamına gelmez:
\[ \mathbf{v}_w \cdot \mathbf{u}_c = \mathrm{PMI}(w, c) - \log K \]
Yani tahmine dayalı SGNS ile matrise dayalı yöntemler sanıldığından daha yakın: bu koşullar altında optimum iç çarpımlar kaydırılmış PMI’yı hedefliyor. Buna karşılık düşük rank kısıtı, farklı kayıp fonksiyonları ve örnekleme yüzünden pratikte aynı embedding’i üretmiyorlar.
Buradaki matris, sayarak ilerleyen güzergâhın (aşağıdaki şekilde “A güzergâhı”) PPMI’sı değil, PMI’nın kendisidir. Açık bir matris kurarken negatif veya sonsuza giden PMI değerlerini kırparak kaydırılmış pozitif PMI elde edebiliriz; Levy ve Goldberg bunu önerir: \(\mathrm{SPPMI}(w,c) = \max(\mathrm{PMI}(w,c) - \log K,\ 0)\). SGNS bunu açıkça yapmaz. Pozitif sayımı sıfır olan bir çift negatif olarak yine örneklenebilir; \(q(c) > 0\) ve merkez olasılığı pozitifken, serbest skoru için lojistik optimum \(z \to -\infty\) sınırındadır. Gerçek model sonlu parametreler, ortak düşük boyutlu vektörler ve sonlu sayıda güncellemeyle çalıştığından bütün bu sınırları tam olarak gerçekleştirmez.
SGNS bu matrisi açıkça oluşturmaz; örneklenen çiftlerden güncellemeler yapar. Düşük boyutlu ortak vektörler bütün çiftlerin serbest optimumlarını aynı anda karşılayamayabilir. Ayrıca 0,75 üslü gürültü dağılımı hedefi değiştirir. Bu nedenle yakınsayan bir uygulamanın her iç çarpımı doğrudan \(\mathrm{PMI} - \log K\)’ye eşit değildir.
\(K\) arttığında, diğer dağılımlar sabitken serbest iç çarpım hedefleri aynı sabit kadar aşağı kayar. Bu, bütün kelime vektörlerine aynı vektörü eklemekle genel olarak eşdeğer değildir. Hedef matrise sabit eklemek rankı en fazla bir artırır; gerekirse ek bir koordinatla temsil edilebilir, ancak sabit \(d\) boyutta aynı uyum korunamayabilir. \(K\)’nin görevdeki etkisi deneyle değerlendirilmelidir.
NotDerinleşme: SGNS neden kaydırılmış PMI öğreniyor?
Tek bir \((w, c)\) çiftini sabitleyelim ve \(z = \mathbf{v}_w \cdot \mathbf{u}_c\) değerini vektörlerden kurulmuş bir şey değil, serbest bir sayı olarak ele alalım. Derlemin tamamında bu çift amaç fonksiyonuna iki terim katar: pozitif sayımıyla orantılı bir terim ve örnekleyicinin onu negatif olarak ne sıklıkta üreteceğiyle orantılı bir terim. Negatiflerin bağlam marjinali \(P(c)\)’den çekildiğini varsayarsak bu iki ağırlık \(P(w,c)\) ve \(K \cdot P(w)P(c)\) olur. Çiftin maksimize edilecek amaç fonksiyonuna katkısı şöyledir; aynı ifadenin negatifini alırsak minimize edilecek kaybı elde ederiz:
\[ P(w,c)\,\log \sigma(z) \;+\; K\,P(w)P(c)\,\log \sigma(-z) \]
\(\frac{d}{dz}\log\sigma(z) = 1 - \sigma(z)\) ve \(\frac{d}{dz}\log\sigma(-z) = -\sigma(z)\) eşitliklerini kullanarak \(z\)’ye göre türev alın ve sonucu sıfıra eşitleyin:
\[ P(w,c)\bigl(1 - \sigma(z)\bigr) = K\,P(w)P(c)\,\sigma(z) \]
\(\sigma(z)\) için çözün, sonra \(z = \log \frac{\sigma(z)}{1-\sigma(z)}\) üzerinden geri dönün:
\[ z = \log \frac{P(w,c)}{K\,P(w)P(c)} = \log \frac{P(w,c)}{P(w)P(c)} - \log K = \mathrm{PMI}(w,c) - \log K \]
Bu türetme, negatiflerin \(P(c)\)’den çekildiğini ve her çift için \(z\)’nin bağımsız seçilebildiğini varsayar. Gerçek düşük boyutlu modelde bütün iç çarpımlar ortak vektörlerle kurulur. SGNS bu kısıt altında örnekleme ağırlıklı lojistik kaybı optimize eder. PPMI–SVD ise negatif değerleri kırpılmış bir matrisin karesel yeniden kurma hatasını küçültür. Bu nedenle yalnızca kayıpları değil, kırpma ve gürültü dağılımı nedeniyle hedefleri de farklı olabilir.
Negatiflerin \(P(c)\)’den, yani ham unigram dağılımından çekildiği varsayımı yukarıdaki kodla örtüşmez. word2vec onları \(P_\alpha(c) \propto f(c)^{0{,}75}\) dağılımından çeker — iki alt bölüm önceki üs — ve bunu hesaba katarsak
\[ \mathbf{v}_w \cdot \mathbf{u}_c = \log \frac{P(w,c)}{P(w)\,P_\alpha(c)} - \log K \]
elde edilir; yani düzleştirilmiş bir bağlam dağılımına karşı hesaplanmış PMI. Levy vd. (2015) buna bağlam dağılımı düzleştirmesi diyor ve bunun doğrudan PPMI+SVD’ye de taşındığını, orada birkaç puan ettiğini gösteriyor. Demek ki 0,75 üssü algoritmaya sonradan takılmış bir örnekleme ayrıntısı değil: algoritmanın hangi matrisi çarpanlarına ayırdığını değiştiriyor.
İki güzergâh, tek varış noktası
Sayıma dayalı yöntemler ile SGNS, dağılımsal bilgiyi farklı biçimlerde kullanır. Negatiflerin bağlam marjinalinden çekildiği ve iç çarpımların serbest olduğu durumda SGNS’nin hedefi \(\mathrm{PMI} - \log K\)’dir. Şekildeki PPMI–SVD yolu ayrıca sıfıra kırpma ve karesel kayıp kullanır; düşük rankta aynı vektörleri vermesi beklenmez. 0,75 üslü örnekleme kullanıldığında şeklin altındaki eşitlikte \(P(c)\) yerine gerçek gürültü dağılımı \(q(c)\) kullanılmalıdır.
Levy vd. (2015) bunun ardından, sayıma dayalı yöntemlere word2vec’in kendi içinde kullandığı hiperparametrelerin aynısı verildiğinde — altörnekleme, bağlam dağılımı düzleştirmesi, dinamik pencereler (her merkez için etkin pencere genişliğini 1 ile üst sınır arasından rastgele çekmek; yukarıdaki kodun yorumuna bakın) — performans farkının büyük ölçüde yok olduğunu gösterdi.
Bu ders embedding’lerin çok ötesine genelleniyor ve okuduğunuz her makaleye taşınmalı: yeni bir yöntem eskisini yendiğinde, iyileşmenin bir kısmı yöntemden, bir kısmı ayar titizliğinden gelir ve bu ayrım nadiren raporlanır.
Geriye pratik soru kalıyor: hangi güzergâhı ne zaman seçmeli? Hedefleri yakın olduğuna ve hiperparametreler eşitlendiğinde Levy vd.’nin (2015) birbirinden ayıramadığı kadar yakın sonuçlar verdiklerine göre, seçim çoğunlukla mühendislikle ilgili:
| Saymak (PPMI + SVD) | Tahmin etmek (word2vec) | |
|---|---|---|
| Bellek | Büyük derlemlerde seyrek eş-oluşum matrisi, düşük ranklı vektörler ve çözücünün çalışma belleği gerekir. Bu bölümün küçük örneği öğretim amacıyla yoğun matris kullanır | Akış tabanlı bir uygulamada iki vektör tablosu \(O(Vd)\) yer kaplar; örnekleyici ve tamponlar da bellek ister. Buradaki NumPy örneği bütün çiftleri sakladığından toplam belleği derlem büyüklüğüne de bağlıdır |
| Derlem boyutu | Her sayımın kıymetli olduğu küçük derlemlerde rahat | Gradyan gürültüsü ortalamaya oturana kadar çok metin ister |
| Tekrarlanabilirlik | Çözücü ve ortam sabitlenir; rastgeleleştirilmiş SVD’de seed (tohum) belirtilir. Tekil vektörlerin işaretleri ve eşit tekil değerli altuzayların bazı taban seçimleri tekil değildir | Seed, veri sırası, iş parçacığı sayısı ve ortam denetlendiğinde yeniden üretilebilirlik artar; farklı başlangıçlar farklı çözümler verebilir |
| Yeni veri | Sayımlar artımlı güncellenebilir; yeniden ağırlıklandırma ve çarpanlaştırma için uygun bir güncelleme yöntemi gerekir | İki tablo, sözlük ve gerekli eğitim durumu korunmuşsa eğitime devam edilebilir. Yalnızca hazır kelime vektörleri yeterli olmayabilir |
| İncelenebilirlik | Sayımlar ve ağırlıklandırılmış hücreler doğrudan incelenebilir | Örnekleme dağılımı, gradyanlar, normlar, kayıp ve komşuluklar incelenebilir |
| Ayar yükü | Pencere genişliği, PPMI varyantı, \(d\) | Pencere, \(d\), \(K\), altörnekleme \(t\), öğrenme oranı, epoch sayısı |
Tabloya sığmayan bir fark daha var ve bu fark istatistikseldir. Kesik SVD, Frobenius normunda en iyi rank-\(d\) yaklaşımını verir (Eckart–Young–Mirsky teoremi); yani PPMI matrisinin her hücresindeki karesel yeniden kurma hatasına eşit katsayı verir. PPMI’daki sıfırlar yalnızca hiç gözlenmeyen çiftleri değil, PMI değeri sıfır veya negatif olan gözlenmiş çiftleri de kapsar. Sıfırların çokluğu tek başına hatanın ya da model kapasitesinin çoğunun onlara ayrıldığını göstermez. SGNS ise pozitif çift sıklıkları ve negatif örnekleme dağılımıyla belirlenen ağırlıklar altında lojistik kayıp kullanır. GloVe da sayımlara bağlı ayrı bir ağırlıklandırma seçer; bir sonraki alt bölüm bunu gösteriyor. Bu farklar yöntemlerin davranışını etkiler; herhangi birinin nadir kelimelerde koşulsuz üstünlüğünü kanıtlamaz.
Seçimde derlem büyüklüğü, güncelleme gereksinimi, bellek, incelenebilirlik ve hedef görev birlikte değerlendirilmelidir. PPMI–SVD küçük örneklerde hesap adımlarını görünür kılar; akış tabanlı SGNS ise büyük ve sürekli gelen metin üzerinde eğitim için elverişli olabilir. Her iki yaklaşımın başarısı kullanılan uygulama ve ayarlara bağlıdır.
3.5 GloVe: sayma, ama kayıp fonksiyonuyla
GloVe, eş-oluşum sayımlarını açıkça biriktirir ve vektörleri bu sayımlar üzerinde tanımlanan ağırlıklı bir kayıp fonksiyonuyla öğrenir. Böylece sayıma dayalı temsil ile gradyan tabanlı öğrenmeyi birleştirir.
GloVe’un girdisi kelime–bağlam eş-oluşum tablosudur. Bölüm başındaki \(C\) matrisi, pencere içindeki her çifte bir ekliyordu. Özgün GloVe uygulamasında uzak bağlamlar daha düşük ağırlıkla sayılabilir; bu nedenle \(X\) hücrelerinin mutlaka tamsayı olması gerekmez. İki yaklaşım da derlem boyunca yerel pencerelerden bilgi biriktirir.
GloVe her kelime ve bağlam için vektörler ve sabit terimler (bias) öğrenir. \(\mathbf{v}_w \cdot \mathbf{u}_c + b_w + b_c\) toplamının, pozitif eş-oluşum sayımının logaritmasına yakın olmasını ister. Yakınlığı, çiftin sayımına bağlı bir ağırlıkla çarpılan karesel hatayla ölçer; bu ölçüye ağırlıklı en küçük kareler (least squares) denir. İki vektör tablosu birlikte öğrenildiğinden bu, parametreler bakımından sıradan doğrusal regresyonla aynı optimizasyon problemi değildir.
Daha resmî söylersek: GloVe, derlem boyunca yerel pencerelerden biriktirilmiş eş-oluşum sayımlarını, ağırlıklı bir en küçük kareler amaç fonksiyonuyla çarpanlarına ayırır.
Bu cümledeki “yerel pencerelerden biriktirilmiş” kısmı önemli, çünkü yaygın bir yanlış sezgiyi düzeltiyor. GloVe’un “küresel istatistik” kullandığı doğru, ama o küresel tablo gökten inmiyor: word2vec’in gördüğü aynı yerel bağlam pencerelerinden, derlemin tamamı boyunca toplanarak kuruluyor. Fark, pencere kullanıp kullanmamakta değil, ne zaman öğrenildiğinde: word2vec bağlam örneklerini tek tek görüp her birinden bir güncelleme yapar; GloVe önce hepsini sayıp toplar, sonra o toplamları optimize eder. Özgün makale de yöntemi bu ikisinin birleşimi olarak sunar: küresel matris çarpanlara ayırmanın ve yerel bağlam penceresi yöntemlerinin avantajlarını bir araya getirmek (Pennington vd. 2014).
Üç yöntemi yan yana koyarsak: PPMI+SVD önce bütün eş-oluşum tablosunu dönüştürüp sonra çarpanlarına ayırıyor. word2vec yerel eğitim çiftleri üzerinden örtük bir çarpanlara ayırma yapıyor. GloVe ise pencerelerden toplanmış sayımları açıkça tutuyor ve düşük boyutlu vektörleri doğrudan bu sayımları açıklayacak biçimde optimize ediyor.
GloVe (Pennington vd. 2014) bu sentezi ciddiye aldı. Küresel eş-oluşum matrisini kurun, sonra iç çarpımlar log eş-oluşum sayımlarını yeniden üretsin diye vektörleri eğitin ve nadir çiftlerin ağırlığını düşürün:
\[ \mathcal{L} = \sum_{(w,c)\,:\,X_{wc} > 0} f(X_{wc}) \left(\mathbf{v}_w \cdot \mathbf{u}_c + b_w + b_c - \log X_{wc}\right)^2 \]
Bu, log sayımlar üzerinde ağırlıklı en küçük kareler; üstelik kelime başına bir bias terimiyle (sabit terim) — istatistikte bundan daha klasiği pek yoktur. Parça parça sökelim, çünkü her terim bir sebeple orada.
Neden \(X_{wc}\) değil de \(\log X_{wc}\)? Eş-oluşum sayımları çok geniş bir aralığa yayılabilir: bazı çiftler sık, pek çoğu seyrek görülür. Ham sayımlardaki karesel hata büyük sayımlı çiftleri aşırı öne çıkarabilir. Logaritma, çarpımsal oranları toplamsal farklara dönüştürür ve bu ölçek farkını azaltır.
Bias terimleri neden var? Bias terimleri, kelime ve bağlamın genel kullanım eğilimlerinin bir bölümünü modelleyebilir. Bu, PMI’nın marjinal sıklıkları hesaba katmasıyla benzer bir sezgi taşır. Ancak GloVe bu terimleri veriden birlikte öğrenir; bunların log satır ve sütun toplamlarına eşit olması zorunlu değildir. Dolayısıyla GloVe’un iç çarpımlarını tam olarak PMI diye yorumlayamayız.
\(f(X_{wc})\) neden var? Aynı anda iki problemi çözmek gerekiyor. Hiç bir arada geçmeyen bir çift için \(\log 0 = -\infty\) olur; sürekli bir arada geçen bir çift ise diğer her şeyi boğardı. GloVe’un ağırlıklandırma fonksiyonu ikisini birden hallediyor:
\[ f(x) = \begin{cases} (x / x_{\max})^{3/4} & x < x_{\max} \\ 1 & x \geq x_{\max} \end{cases} \qquad x_{\max} = 100 \]
| \(X_{wc}\) | \(f(X_{wc})\) | o çift üzerindeki etkisi |
|---|---|---|
| 0 | 0,00 | tümüyle düşer — \(\log 0\) yok |
| 1 | 0,03 | sayılır, ama kıl payı |
| 10 | 0,18 | ağırlık artıyor |
| 100 | 1,00 | tam ağırlık |
| 100.000 | 1,00 | yine tam ağırlık — tavan devreye girdi |
Sıfır sayımlı hücreleri toplamın dışında bıraktığımız için \(\log 0\) hesaplamayız. Pozitif sayımlarda \(f(x)\), nadir çiftlerin ağırlığını azaltır ve \(x \geq 100\) için 1’de kalır. Böylece sayım arttıkça ağırlık sınırsız büyümez; ancak karesel artık ve gradyan hâlâ büyük olabilir. Bu yaklaşım, sık çiftlerin etkisini denetleme amacı bakımından altörneklemeyle ilişkilidir; aynı işlem değildir. Her iki yöntemde görülen 0,75 üssü de farklı işlevler üstlenir.
Bölümün geri kalanında, erişimi kolay bir statik temsil örneği olarak GloVe’un ön eğitimli vektörlerini kullanacağız. Bu vektörler İngilizce metinlerden öğrenildiği için örnek kelimeler de İngilizce olacak.
import numpy as np
import gensim.downloader as api
g = api.load("glove-wiki-gigaword-100") # Wikipedia 2014 + Gigaword 5, 6 milyar token
print("vectors:", len(g.index_to_key), " dimensions:", g.vector_size)
v = g["king"]
print("king[:8] =", np.round(v[:8], 3))
print("norm:", round(float(np.linalg.norm(v)), 3))vectors: 400000 dimensions: 100
king[:8] = [-0.323 -0.876 0.22 0.253 0.23 0.739 -0.38 -0.353]
norm: 6.118
Her kelime artık yüz sayıyla temsil ediliyor. Bu koordinatlara önceden “krallık” veya “cinsiyet” gibi etiketler atanmamıştır. Bazı koordinatlar belirli özelliklerle ilişkili çıkabilir; ancak bu yorumlar seçilen temsile bağlıdır ve koordinat sisteminin değişimine karşı genellikle korunmaz.
for w in ["king", "pump", "turkey", "python", "bank"]:
print(f" {w:<8} " + ", ".join(f"{a} {b:.2f}"
for a, b in g.most_similar(w, topn=6))) king prince 0.77, queen 0.75, son 0.70, brother 0.70, monarch 0.70, throne 0.69
pump pumps 0.84, pumping 0.77, pumped 0.71, gasoline 0.64, fuel 0.63, petrol 0.63
turkey ankara 0.75, turkish 0.72, greece 0.71, syria 0.70, bulgaria 0.69, russia 0.69
python monty 0.69, php 0.59, perl 0.58, cleese 0.54, flipper 0.51, ruby 0.51
bank banks 0.81, banking 0.75, credit 0.70, investment 0.69, financial 0.68, securities 0.67
Bunlardan üçü ikinci bir bakışı hak ediyor.
turkey komşularında ülkeyle, bank komşularında finansla ilgili kelimeler öne çıkıyor. python için ise komedi grubuna (monty, cleese) ve programlama dillerine (php, perl) ilişkin komşular birlikte görülüyor. flipper sonucunun hangi kullanım ilişkilerinden kaynaklandığını yalnızca bu listeden belirleyemeyiz. Listeler, tek bir kelime vektörünün farklı kullanımların etkisini birlikte taşıyabildiğini gösterir; bütün anlamların kapsamlı bir dökümü değildir.
Statik bir embedding’in belirleyici sınırı bu: bağlam ne olursa olsun, kelime biçimi başına tek bir vektör.
Türkçe yüz kelimesi insanın yüzünü, 100 sayısını veya yüzmek fiilinin emir kipini gösterebilir. Statik bir kelime tablosu bu biçime tek vektör verir; farklı kullanımlar öğrenmeyi etkiler, fakat sonuç bu anlamların açıkça hesaplanmış aritmetik ortalaması değildir. Vektörü tek başına sorgulayarak o andaki cümlede hangi anlamın kullanıldığını seçemeyiz. Buna karşılık bu vektörü çevredeki kelimelerle birlikte işleyen bir model bağlamdan yararlanabilir.
Bu sınırlılık, transformer bölümünde (Bölüm 7) ele alınan, bağlama göre değişen token temsillerinin önemli gerekçelerinden biridir.
3.6 Kelime analojileri ve değerlendirme koşulları
king − man + woman örneğiyle vektör aritmetiğinin neyi gösterdiğini ve sonucun hesaplama tercihlerine nasıl bağlı olduğunu inceleyelim.
Embedding’leri NLP dışında meşhur eden sonuç:
res = g.most_similar(positive=["king", "woman"], negative=["man"], topn=5) queen 0.7699
monarch 0.6843
throne 0.6756
daughter 0.6595
princess 0.6521
\(\text{king} - \text{man} + \text{woman} \approx \text{queen}\). Bu işlemde oluşturulan hedefe, izin verilen adaylar arasında en yüksek kosinüs benzerliğini veren kelime queen oluyor. Sonuç, bazı ilişkilerin benzer vektör farklarıyla temsil edilebildiğine işaret eder. Tam bir paralelkenar, aritmetiğin queen vektörünü birebir üretmesi için yeterlidir; en yakın komşu olarak seçilmesi için gerekli değildir. Ayrıca man ile woman ve king ile queen arasındaki farkların yalnızca tek bir toplumsal cinsiyet yönünden oluştuğunu bu örnekten çıkaramayız.
gensim.most_similar, girdi vektörlerini ayrı ayrı birimleştirir (her birini uzunluğu 1 olacak biçimde ölçekler) ve girdi kelimelerini adaylardan çıkarır. Yalnızca filtrenin etkisini görmek için aynı puanları iki aday kümesiyle sıralayalım; topn=None, bütün sözlük için puanları filtresiz döndürür:
sims = g.most_similar(positive=["king", "woman"], negative=["man"], topn=None)
inputs = {"king", "man", "woman"}
order = np.argsort(-sims)
for label, excluded in [("unfiltered", set()), ("filtered", inputs)]:
chosen = [i for i in order if g.index_to_key[i] not in excluded][:6]
print(label)
for i in chosen:
print(f" {g.index_to_key[i]:<12} {sims[i]:.4f}")unfiltered
king 0.8361
queen 0.7699
monarch 0.6843
throne 0.6756
daughter 0.6595
princess 0.6521
filtered
queen 0.7699
monarch 0.6843
throne 0.6756
daughter 0.6595
princess 0.6521
prince 0.6517
Puanlar sabit tutulduğunda filtresiz en yakın komşu king’dir (0,8361); queen ikinci sıradadır (0,7699). Bu, sınırsız komşu aramasının sonucudur; analojinin beklenen yanıtının king olduğunu göstermez. Girdi kelimelerini dışlamak farklı bir aday kümesi tanımlar ve queen bu aday kümesinde birinci olur. Aday kümesi görevin tanımının parçasıdır; sonuçla birlikte belirtilmesi gerekir. Girdileri birimleştirmeden toplarsanız puanlar biraz değişir (king 0,8552, queen 0,7834); sıralamanın başı aynı kalır.
Bu puanlamanın adı 3CosAdd’dir: adayın üç girdiyle kosinüslerini iki artı ve bir eksi işaretle birleştirir. Girdi kelimelerinin dışlanması ise ayrı bir değerlendirme kuralıdır. 3CosMul, kosinüsleri uygun biçimde kaydırarak çarpımsal bir oranla birleştirir; bazı değerlendirmelerde daha iyi sonuç verir (Levy ve Goldberg 2014a). Puanlama yöntemi ile aday filtresi ayrı ayrı raporlanmalıdır.
Daha derin itiraz Linzen’den geliyor (Linzen 2016): ilişkiyi tümüyle yok sayan bir baseline (karşılaştırma modeli), bazı kategorilerde bildirilen doğruluğun büyük bir kısmına zaten ulaşıyor. Bu baseline man ile woman’a hiç bakmıyor, yalnızca king’in en yakın komşusunu döndürüyor. Bu örnekte yanılırdı — king’in en yakın komşusu prince (0,77) — ama yukarıdaki GloVe komşu listesi yapının ne kadar işi önceden gördüğünü gösteriyor: daha hiçbir aritmetik yapılmadan queen, king’in ikinci en yakın komşusu (0,75); aritmetiğe kalan iş onu bir sıra yukarı taşımak. Bazı kategorilerde ise ilk sıradaki komşu zaten doğru cevap. Yani manşet sayı, komşuluk yapısını en az bir ilişkiyi ölçtüğü kadar ölçüyor. Nissim ve arkadaşları (Nissim vd. 2020), girdi kelimelerini dışlamanın yanlılık analojilerinin yorumunu da etkileyebildiğini gösterir. İnceledikleri örneklerde filtre kaldırılınca doctor yeniden aday olabilir; sonucun hangi model, normalleştirme ve aday kümesiyle elde edildiği birlikte belirtilmelidir. Kendiniz birkaçını deneyin:
Bu kelimelerin uzaydaki yerleşimi şöyle; 100 boyuttan 2 boyuta izdüşürülmüş hâliyle:
3.7 fastText: parçalardan yapılmış kelimeler
Şimdiye kadarki her şey, hiç sorgulamadığımız bir varsayımı paylaşıyor: kelime, tabloda kendi satırı olan bölünmez bir birimdir. Bu da Bölüm 2’yi okuduysanız cevabını zaten bildiğiniz bir soruyu gündeme getiriyor: kelime tabloda yoksa ne olur?
out-of-vocabulary (OOV) (sözlük dışı) — modelin kelime sözlüğünde yer almayan biçim. Eğitimde hiç görülmemiş olabilir veya sıklık eşiği gibi bir nedenle sözlükten çıkarılmış olabilir. Türkçe gibi çok sayıda çekimli biçim üreten dillerde, kelime düzeyindeki sözlüğün kapsaması ayrıca önem kazanır. ↩︎
Kelime tablosunda bulunmayan bir biçim için — yani bir out-of-vocabulary kelime için — doğrudan satır getiremeyiz. Burada kullanılan gensim kelime vektörü sorgusu böyle bir durumda KeyError üretir; başka sistemler özel bir bilinmeyen-birim temsili kullanabilir. Türkçedeki biçim çeşitliliği, bu kapsama sorununu özellikle görünür kılar.
İşte karşılaştırılabilir büyüklükte iki Wikipedia örneklemi; biri Türkçe, biri İngilizce:
### corpora
turkish 103040 lines 1458213 tokens 138578 types
english 44079 lines 1828840 tokens 78140 types
Türkçe, 1,46 milyon token’dan 138.578 farklı kelime biçimi üretti; İngilizce ise daha çok token’dan — 1,83 milyon — 78.140 biçim üretti. Türkçenin eklemeli yapısı şu demek: ev, evim, evimde, evimdeki, evlerimizdekiler, kelime düzeyinde bir sözlükte beş ayrı girdidir; her biri kendi vektörünü ister ve her biri kendi seyrek birkaç geçişinden kestirilir.
### vocabulary growth: new word forms per million tokens
turkish 250k:45688 500k:73435 750k:97412 1000k:112644 1250k:126389
english 250k:22869 500k:34016 750k:42854 1000k:52347 1250k:60178
### the tail: how much of the vocabulary is seen exactly once
turkish 50.0% of types are hapax (69296 of 138578)
english 46.7% of types are hapax (36503 of 78140)
### out-of-vocabulary rate: train on 90%, test on the last 10%
turkish 7.33% of tokens unseen, 28.99% of types unseen
english 4.72% of tokens unseen, 23.29% of types unseen
Bu örneklemde bir milyon token’da 112.644 Türkçe biçim, 52.347 İngilizce biçim görülüyor; gösterilen aralıkta yeni biçimler eklenmeye devam ediyor. Ayrılmış Türkçe test kesiminde yaklaşık her on dört token’dan biri eğitim sözlüğü dışında kalıyor. Gözlenen tiplerin yaklaşık yarısının bir kez geçmesi, vektörlerin yarısının tek örnekle öğrenildiği anlamına gelmez: sıklık filtresi bu tipleri dışarıda bırakabilir ve tek bir token birden fazla bağlam çifti üretebilir. Bu sayılar tek bir örnekleme, tek bir tokenleştirme tercihine ve test kesiminin seçilme biçimine aittir; başka bir örneklemde değişirler.
subword (alt kelime) — kelimeden küçük bir parça. Bütün kelimeler yerine parçaları saklamak, görülmemiş bir kelimenin bildiğiniz parçalardan yine de kurulabilmesi demektir. ↩︎
fastText’in cevabı (Bojanowski vd. 2017), kelimeyi bölünmez saymaktan vazgeçmek. Kelimeyi, karakter n-gram’larının — yani subword’lerinin — toplamı artı kelimenin bütünü için bir vektör olarak temsil edin:
\[ \mathbf{v}_w = \mathbf{1}_{\{w \in \mathcal{V}\}}\,\mathbf{z}_w + \sum_{g \in G(w)} \mathbf{z}_g \]
Burada \(\mathcal{V}\) tam kelime sözlüğü, \(G(w)\) seçilen karakter n-gram’larının çoklu kümesidir. Bağımsız tam kelime bileşeni yalnızca sözlükteki kelimeler için vardır; sözlük dışı kelime alt kelime bileşenlerinden oluşturulur. Bu toplam, eğitimde kullanılan bileşimi anlatır; dışarı aktarılan vektörün ölçeklenmesi uygulamaya bağlıdır.
Paylaşılan karakter n-gram’ları farklı kelimelerdeki örneklerden güncelleme alabilir: <pu parçasını pump, pumps, pumped, pumping ve punch da içerir. Bu, nadir kelimelerin daha sık görülen biçimlerden yararlanmasını sağlar. Ancak her parça bol veriyle öğrenilmiş değildir. fastText n-gram’ları sabit sayıdaki karma tablosu (hash table) yuvasına eşler; farklı parçalar aynı yuvayı paylaşabilir. Sözlük dışı kelime için vektör üretilebilmesi, bu vektörün anlamca güvenilir olduğunu tek başına göstermez.
Makaledeki toplam ile aynı öğrenilmiş bileşenlerin sayısına bölünmüş ortalaması (fastText ve gensim gerçeklemelerinin yaptığı), sıfır olmayan bir kelime vektörü için aynı yönü verir; bu iki sürümün kelime–kelime kosinüsleri aynıdır. Ancak bunu eğitimde toplam ve ortalama kullanmanın veya farklı kelimeleri belge vektöründe birleştirmenin her koşulda eşdeğer olduğu biçiminde yorumlamamak gerekir.
Paylaşılan n-gram vektörleri, benzer yazılan kelimelerin temsillerini birbirine bağlar. Bu ödünleşim (trade-off) biçimbilimsel genelleme sağlayabileceği gibi ilgisiz kelimelerde istenmeyen yakınlık da yaratabilir. Sözlükteki kelimenin bağımsız tam kelime bileşeni bu etkiden ayrı bilgi öğrenebilir. Aynı n-gram’ın katkısı ise onu içeren kelimeler arasında paylaşılır.
fastText: bir kelime, parçalarının toplamıdır
Her kelime, bir karakter n-gram torbasıdır; model onu daha önce gördüyse kelimenin kendisi de eklenir. Nadir ve görülmemiş kelimeler artık özel bir durum değil — statik kelime embedding’leri arasında fastText’in Türkçe gibi biçimbilimsel olarak zengin diller için güçlü bir varsayılan tercih olmasının sebebi de bu. Okunabilir kalsın diye 3-gram’larla çizildi; fastText’in varsayılanı 3’ten 6’ya kadar her uzunluktaki n-gram, yani gerçek bir pumpage 7 değil 22 parçaya ayrışır.
Aynı Türkçe Wikipedia örneklemi üzerinde eğitildiklerinde, word2vec ile fastText derlemin hiç içermediği kelimelerde çok farklı davranıyor:
### a word the corpus never saw
kitaplarımızdaki in word2vec vocab: False in fastText vocab: False
fastText still answers: kitapları 0.91, kitapların 0.91, kitaplıkları 0.90, kitaplarda 0.90
word2vec raises: KeyError
bilgisayarcılık in word2vec vocab: False in fastText vocab: False
fastText still answers: bilgisayara 0.96, bilgisayarlı 0.96, bilgisayar 0.96, bilgisayarı 0.96
word2vec raises: KeyError
Paylaşılan karakter parçaları bazı yazım hatalarında da yararlı olabilir. Aşağıdaki örneklerde sözlük dışı biçimler beklenen kelimelere yakın vektörler veriyor; bu sonuç bütün yazım hataları için garanti değildir.
philosphy in vocab: False
philosophy 0.96, philosophie 0.95, philosophies 0.94, philology 0.94, philo 0.93
governmentt in vocab: False
government 0.98, governments 0.94, governmental 0.93, governs 0.91, govern 0.91
3.7.1 Alt kelimelerin bedeli
Karakter n-gram’ları, bazı kök ve ek örüntülerini açık bir biçimbilim çözümleyicisi olmadan paylaşmayı sağlar. Bunun karşılığında, yazılışı benzeyen ama anlamı farklı kelimelerin temsilleri de birbirine yaklaşabilir.
### morphology: does fastText put inflected forms together?
ft kitap kitapta 0.96, kitaba 0.95, kitab 0.94, kitabın 0.94, kitabı 0.93
w2v kitap eseri 0.81, makale 0.80, eseriyle 0.80, kitabın 0.80, kitaplar 0.79
ft yaz yao 0.78, yağ 0.77, yağdı 0.77, yayoi 0.76, yay 0.75
w2v yaz kış 0.86, olimpiyatları 0.84, aylarında 0.83, gündönümü 0.80
kitap için fastText, kitap’ın çekimlerini döndürüyor; word2vec ise eseri, makale gibi anlamsal komşular döndürüyor. Hangisini isteyeceğiniz tamamen görevinize bağlı.
Bu koşuda yaz (hem mevsim hem de “yazmak” emri) için word2vec komşuları mevsimsel kullanımı daha fazla yansıtıyor (kış, olimpiyatları, gündönümü); fastText listesinde ise yazılışı benzeyen biçimler öne çıkıyor (yao, yağ, yayoi, yay). Bu gözlem, karakter paylaşımının istenmeyen yakınlık oluşturabileceğini gösterir. Ancak farkın yalnızca kelimenin üç harfli olmasından kaynaklandığını söylemek için n-gram ayarlarını, sıklığı ve farklı eğitim seed’lerini karşılaştırmak gerekir.
### the price, measured
kitap kitle fastText +0.667 word2vec +0.446
Bu örnekte kitap–kitle kosinüsü fastText’te 0,667, word2vec’te 0,446’dır. İki uzayın kosinüs dağılımları farklı olabileceğinden bu oranı “bir buçuk kat daha fazla anlamsal benzerlik” olarak yorumlayamayız. İlgisiz veya zor negatif çiftlerdeki puan dağılımlarını da karşılaştırmak gerekir.
Akılda tutulacak kural. fastText, sözlük dışı biçimlerin ve çekim çeşitliliğinin önemli olduğu görevlerde güçlü bir adaydır. Ancak karakter paylaşımı istenmeyen yakınlıklar da yaratabilir; yöntemi kelime uzunluğuna göre koşulsuz kabul veya reddetmek yerine kapsama ve görev başarısıyla değerlendirin. İleride göreceğimiz BPE ile (Bölüm 8.3.1) ortak fikir, nadir bütünlerden parçalar yoluyla yararlanmaktır. Mekanizma farklıdır: BPE tokenleştirme birimlerini belirler; fastText ise örtüşen karakter n-gram vektörlerini birleştirerek kelime vektörü oluşturur.
3.8 Belgeler vektör olarak
Bölüm 2, 20 Newsgroups gönderilerini TF-IDF ile sınıflandırmıştı. Artık elimizde kelime vektörleri var — işe yarıyorlar mı? Asıl soru şu: bir kelimenin koordinatı varsa, bir belgenin koordinatını nasıl üretiriz? Akla ilk gelen cevap, belgedeki kelime vektörlerinin ortalamasını, yani ağırlık merkezini almak: 32.000 boyutlu seyrek bir vektör yerine 100 boyutlu bir belge vektörü.
def average(docs):
# docs: her elemanı token listesi olan belge listesi (ham metin değil).
# Sözlük dışı token'lar atlanır; hiç vektörü olmayan belge sıfır satırı kalır.
out = np.zeros((len(docs), g.vector_size), dtype=np.float32)
for i, tokens in enumerate(docs):
if isinstance(tokens, str):
raise TypeError("each document must be a list of tokens, not a raw string")
vs = [g[w] for w in tokens if w in g.key_to_index]
if vs:
out[i] = np.mean(vs, axis=0)
return outTokenleştirme ve harf dönüşümleri eğitim ve test belgelerinde tutarlı uygulanmalıdır. Sıfır vektörler için kosinüs benzerliği tanımsız olduğundan, arama uygulamasında ayrıca bir boş-temsil davranışı belirlenmelidir. Aşağıdaki deneyde 2.327 eğitim belgesinin 79’u, 1.550 test belgesinin 65’i sıfır satırı olarak kalıyor.
Düz ortalamadan bir adım ötesi, ortalamayı IDF ile ağırlıklandırmaktır:
\[ \mathbf{v}_d = \frac{\sum_{i \in I_d} \mathrm{idf}(w_i)\, \mathbf{v}_{w_i}} {\sum_{i \in I_d} \mathrm{idf}(w_i)} \]
Burada \(I_d\), belgenin kelime vektörü bulunan token konumlarıdır; tekrar eden kelimeler her konumda katkı verir. IDF yalnızca eğitim belgelerinden hesaplanır ve testte sabit tutulur. Payda sıfırsa, düz ortalamadaki gibi açık bir boş-temsil kuralı uygulanır. Önceki bölümdeki (Bölüm 2) gibi bu ağırlıklandırma, çok sayıda belgede geçen kelimelerin göreli katkısını azaltır. Bu varyant aşağıdaki tabloda idf-weighted averaged glove adıyla gösteriliyor.
doc2vec (Le ve Mikolov 2014), belge kimliğine de öğrenilebilir bir vektör atar. Eğitim, hedef kelimeleri tahmin etmeye dayanır; negatif örnekleme veya hiyerarşik softmax gibi çıktı amaçları kullanılabilir. İki temel mimarisi vardır:
| Varyant | Girdi | Tahmin edilen |
|---|---|---|
| PV-DM | belge vektörü + bağlam kelimeleri | hedef kelime |
| PV-DBOW | yalnızca belge vektörü | belgeden örneklenen kelimeler |
Kabaca söylemek gerekirse bunlar belge dünyasının CBOW’u ve skip-gram’ı; yine de birebir aynı model olmadıklarını, tablodaki girdi–çıktı farkından görebilirsiniz.
Özgün çalışma PV-DM’i öne çıkarırken, Lau ve Baldwin (Lau ve Baldwin 2016) inceledikleri görevlerde PV-DBOW’un da güçlü ve hesaplama açısından elverişli olabildiğini buldu. gensim içinde PV-DM için dm=1 (varsayılan), PV-DBOW için dm=0 seçilir. Tekrarlanabilirlik açısından, özgün yazarlardan birinin de yer aldığı bir takip çalışması öğreticidir (Mesnil vd., 2014). Çalışmanın son sürümü (v7), özgün makaledeki %92,58 IMDB doğruluğuna (%7,42 hata) karşılık yalnızca paragraf vektörleriyle %88,73 doğruluk elde ettiklerini ve %92,6’nın ancak eğitim ve test verisi karıştırılmadığında (shuffle edilmediğinde) ortaya çıktığını bildirir. Bu, belirli bir tekrar deneyinin sonucudur; yöntemin bütün tekrarları hakkında hüküm değildir.
doc2vec: belgeye kendi vektörünü verin, sonra word2vec'i yeniden kullanın
Her eğitim belgesine öğrenilebilir bir vektör atanır. Yeni belge için modelin kelime ve çıktı parametreleri sabit tutulur, yeni belge vektörü birkaç optimizasyon adımıyla kestirilir. Bunun için yalnızca kaydedilmiş belge vektörleri değil, çıkarım yapabilen eğitilmiş model gerekir. Bu ek hesap maliyeti, kelime vektörlerinin doğrudan ortalamasına göre önemli bir farktır.
Bölüm 2’deki aynı dört haber grubu, aynı eğitim/test bölünmesi (2.327 eğitim, 1.550 test belgesi) ve temsillerin üzerinde aynı lojistik regresyon.
### documents as vectors: five representations
tf-idf (chapter 2 baseline) accuracy 0.853 dimensions 32014
averaged glove accuracy 0.820 dimensions 100
idf-weighted averaged glove accuracy 0.822 dimensions 100
doc2vec (PV-DBOW, 40 epochs) accuracy 0.839 dimensions 100
averaged glove + doc2vec accuracy 0.845 dimensions 200
1.550 belgeden hesaplanan tek bir doğruluk, belirsizlik taşır. Örneğin 0,83 dolayında bir doğruluğun binom yaklaşımıyla standart hatası yaklaşık 0,010’dur; ancak bu değer iki modelin doğruluk farkının standart hatası değildir. 0,2, 1,9 veya 3,3 puanlık farkların anlamlılığını belirlemek için aynı belgelerdeki tahminleri eşleştirerek incelemek ve mümkünse farklı bölünmelerde sonuçları raporlamak gerekir. Aşağıdaki not bu eşleştirilmiş karşılaştırmayı veriyor.
Notİleri değerlendirme notu: aynı belgeleri gören iki temsili karşılaştırmak
Aynı test belgelerini sınıflandıran iki modelin doğruluklarını karşılaştırırken McNemar testi kullanılabilir. Test, bir modelin doğru diğerinin yanlış tahmin ettiği belgelerin iki yöndeki sayımlarını karşılaştırır. Farklı yanlış sınıfları tahmin etmeleri tek başına bu ayrışmaya girmez. Etki büyüklüğü ve eşleştirilmiş belirsizlik aralığı da raporlanmalı; farklı bölünmelerdeki değişkenlik ayrıca incelenmelidir.
Bu bölünmede ölçülen sayımlar:
| Karşılaştırma | Yalnızca ilki doğru | Yalnızca ikincisi doğru | Kesin McNemar \(p\) |
|---|---|---|---|
| TF-IDF – ortalama GloVe | 135 | 84 | 0,0007 |
| TF-IDF – IDF ağırlıklı ortalama GloVe | 129 | 81 | 0,0011 |
| IDF ağırlıklı – düz ortalama GloVe | 66 | 63 | 0,86 |
Üç karşılaştırma için Bonferroni eşiği \(0{,}05 / 3 \approx 0{,}017\)’dir; ilk iki fark bu eşiğin altında kalıyor, iki GloVe ortalaması arasındaki 0,2 puanlık fark kalmıyor. doc2vec satırları için aynı hesabı veremiyoruz: gensim’in infer_vector çağrısı, başlangıç vektörünü her Python oturumunda değişen bir karma değerinden türetir; bu yüzden tablodaki doc2vec tahminleri birebir yeniden üretilemiyor. Bölümün notebook’u sabit bir karma ile üç farklı seed’de 0,830–0,836 arasında doc2vec doğrulukları buluyor.
Bu bölünmede en yüksek doğruluk TF-IDF satırındadır. Yoğun temsiller 100 veya 200 koordinat kullanarak 32.014 boyutlu seyrek temsile yakın doğruluklar elde ediyor. Eşleştirilmiş tahminler, TF-IDF ile iki GloVe ortalaması arasındaki farkın bu bölünmede rastlantıyla açıklanmasının zor olduğunu gösteriyor (yukarıdaki not); doc2vec satırlarıyla farklar için aynı hesap yapılamadı. Koordinat sayısındaki azalma doğrudan aynı oranda bellek kazancı demek değildir; seyrek saklama, çalışma süresi ve kullanılacak arama yöntemi de ölçülmelidir. Küçük bir sınıflandırma görevi ile büyük ölçekli belge araması farklı tercihler gerektirebilir.
Konu sınıflandırmasında kelime vektörlerinin ortalaması yararlı bir başlangıç temsili olabilir. Arora ve arkadaşlarının SIF yaklaşımı (Arora vd. 2017), kelime sıklığına bağlı \(a / (a + p(w))\) ağırlıklarını kullanır ve ortak bir baskın bileşeni çıkarır. Bu, yukarıdaki IDF ağırlıklı ortalamayla aynı yöntem değildir; cümle benzerliği gibi görevlerde karşılaştırılabilecek ayrı bir temel yöntemdir.
Bu konuyu kapatmadan önce iki ölçüm daha. Önce kapsama:
### coverage: how much of the corpus does glove actually know?
tokens covered: 98.6%
types covered : 84.5% (23395 of 27681)
Bu ölçümde GloVe token’ların %98,6’sını, tiplerin (farklı kelime biçimlerinin) %84,5’ini kapsıyor. Kapsanmayan biçimler toplam token kütlesinin %1,4’ünü oluşturuyor; bu, grubun genel olarak seyrek olduğunu gösterir. Ne kadarının yazım hatası, özel ad veya alan terimi olduğunu ayrıca incelemek gerekir. Buradaki ortalama yöntemi bu biçimleri dışarıda bırakıyor.
İkincisi, ortalama alarak giderilemeyen hata:
a = "the pump failed and the valve is fine".split()
b = "the valve failed and the pump is fine".split()
va = np.mean([g[w] for w in a], axis=0)
vb = np.mean([g[w] for w in b], axis=0)### what averaging destroys
cosine of the two averaged vectors: 1.0000
identical: True
İki cümlede aynı token’lar aynı sayıda geçtiği için, sırasız ortalama matematiksel olarak aynı vektördür. Kayan noktalı hesapta toplama sırası çok küçük yuvarlama farkları üretebilir; bit düzeyinde eşitlik her uygulamada garanti değildir. Buradaki identical: True, np.allclose karşılaştırmasının sonucudur; aynı koşuda bit düzeyindeki karşılaştırma (np.array_equal) False verir ve en büyük fark \(1{,}2 \times 10^{-7}\)’dir. Temel sınırlılık değişmez: ortalama alma, hangi parçanın arızalandığını belirleyen kelime sırasını korumaz. Bu, 2. bölümün bag-of-words problemidir; yalnızca artık 32.000 yerine 100 boyutla.
Kelime sırası, diziyi okuyan bir model gerektirir. Bu modelleri Bölüm 6 ve Bölüm 7 ele alıyor.
3.9 Geometrinin sorunları var
Statik embedding’leri yorumlarken dağılımsal ilişkililiği, yönlerin dağılımını ve frekans etkisini ayırmak gerekir. Ardından koordinat sisteminin keyfîliğini ve farklı eğitimlerin ne ölçüde tutarlı olduğunu inceleyeceğiz.
3.9.1 Bu uzayda kosinüs, benzerlikten çok ilişkililiği yansıtır
good bad 0.770
hot cold 0.725
increase decrease 0.881
cat dog 0.880
cat car 0.311
teacher student 0.808
increase–decrease çifti 0,881, cat–dog çifti 0,880 puan alıyor. Bu küçük farkı anlamlı bir sıralama olarak yorumlamak için yeterli kanıtımız yok. Buradaki önemli gözlem, zıt anlamlı çiftin de yüksek bir kosinüs değeri almasıdır.
Bu, GloVe’daki bir hata değil; dağılımsal hipotez tam da vaat ettiği şeyi yapıyor. Zıt anlamlılar bağlam içinde büyük ölçüde birbirinin yerine geçebilir — satışlar keskin biçimde arttı ve satışlar keskin biçimde azaldı cümlelerinin ikisi de akıcıdır — dolayısıyla aynı kelimelerle arkadaşlık ederler ve aynı yere düşerler.
Buna zıt anlamlı (antonym) problemi denir ve tek cümlelik tanımı şu: anlamı zıt olan kelimeler embedding uzayında birbirinden uzak değil, tam tersine birbirine yakın düşer. hot ile cold’u düşünün. Sezgimiz “zıt anlam, zıt yön” der; oysa model anlamı hiç görmüyor, yalnızca bir kelimenin etrafında hangi kelimelerin geçtiğini görüyor. hot ve cold ikisi de water, weather, very, too gibi kelimelerin yanında geçer — neredeyse aynı arkadaş çevresi — ve model için aynı çevreye sahip olmak, yakın olmak demektir. Pratikteki bedeli: “sıcak” diye arama yapan bir sistem size “soğuk” içeren belgeleri de en benzer sonuçlar arasında getirebilir.
Çelişki veya eş anlamlılık gibi göreve özgü etiketler, bu ayrımı öğrenmeye yardımcı olabilir ve eğitimde doğrudan görülmeyen çiftlere de genellenebilir. Bununla birlikte başarı veri kapsamına ve öğrenme amacına bağlıdır; yalnızca böyle etiketler kullanılması bütün zıt anlamlı çiftlerin ayrılacağını garanti etmez.
Akılda tutulacak kural. Aynı bağlamlarda görülen kelimeler dağılımsal olarak birbirine yaklaşır; bu yüzden yakınlık, eş anlamlılık demek değildir. Kosinüsün kendisi bir geometri ölçüsüdür — hangi anlamı taşıdığını, embedding’i eğiten amaç fonksiyonu belirler. Bu uzayda taşıdığı şey büyük ölçüde ilişkililik; benzerlik de zıtlık da birer ilişkililik türüdür.
Steck ve arkadaşları (Steck vd. 2024), belirli doğrusal matris çarpanlaştırma modellerinde eğitim tahminleri korunurken kosinüslerin değişebildiğini gösterir. Sonuç, kosinüsün öğrenilmiş temsilden bağımsız bir anlam ölçeği olmadığına dikkat çeker. Rastgele çiftlerin dağılımı yararlı bir karşılaştırma zemini sağlar; görev açısından benzerliği değerlendirmek için ayrıca uygun etiketli örnekler gerekir. İki modeldeki 0,8 değerlerini doğrudan eşdeğer saymayın.
Statik vektörlerin ham kosinüsünü doğrudan duygu veya kutupluluk ölçüsü olarak yorumlamayın. Değerlendirme verileri de farklı ilişkileri ölçer: WordSim-353 (Finkelstein vd. 2002) geniş anlamsal ilişkililiği de yansıtan yargılar içerirken, daha sonra geliştirilen SimLex-999 (Hill vd. 2015) benzerliği ilişkililikten ayırmayı özellikle hedefler. Modellerin bu iki kümede aldığı puanlara değerlendirme kısmında bakacağız.
3.9.2 Uzay izotropik değil
Önce kelimenin kendisi. İzotropik, “her yönde aynı” demek. Her kelime vektörünü, ortak bir merkezden çıkan bir ok olarak düşünün. İzotropik bir uzayda bu oklar bir kirpinin dikenleri gibi her yöne eşit dağılır: kuzeye bakan kadar güneye, yukarı bakan kadar aşağı bakan ok vardır. Rastgele iki ok seçerseniz aralarındaki açı ortalamada dik açıdır, yani kosinüsleri ortalamada sıfır çıkar. “İlgisiz iki kelime” için beklediğimiz şey de bu.
Anizotropik, vektör dağılımının bütün yönlerde aynı olmaması demektir. Ortak bir yöne kayma bunun bir biçimidir ve ortalama kosinüsü yükseltebilir. Ancak anizotropi için böyle bir kayma şart değildir: vektörler bir eksenin iki karşıt yönünde yoğunlaşıp yine sıfır ortalamaya sahip olabilir.
Rastgele çiftlerin kosinüs dağılımı, belirli bir puanın ne kadar sıra dışı olduğunu değerlendirmeye yardımcı olur. Ancak 0,3 gibi sabit bir değer, izotropik bir uzayda bile otomatik olarak anlamsal ilişki göstermez; boyut ve görev de önemlidir. Aşağıda GloVe sözlüğünün ilk 50.000 kelimesinden seçilen 4.000 vektörün çiftlerini inceliyoruz.
rng = np.random.default_rng(0)
M = g.get_normed_vectors() # (400000, 100), birim satırlar
sample = rng.choice(50_000, size=4000, replace=False) # yalnızca ilk 50 bin
S = M[sample]
vals = (S @ S.T)[np.triu_indices(4000, k=1)] mean cosine between random word pairs : 0.029
std : 0.119
share of pairs with cosine > 0 : 56.9%
norm of the mean vector : 0.171
after subtracting the mean, mean cosine: -0.000
Bu örneklemde çiftlerin %56,9’unun kosinüsü pozitif, ortalama kosinüs 0,029 ve birim vektörlerin ortalamasının normu 0,171’dir. Bu değerler ortak bir ortalama yönle uyumludur; tek başlarına bütün uzayın dar bir koniye sıkıştığını göstermez. Merkezleme sonrası bildirilen ortalama kosinüs yaklaşık sıfırdır; tam sıfır olması genel bir özdeşlik değildir. Sonuçlar ilk 50.000 kelimeden seçilen örnekleme aittir. Pratik sonucu şu: ham kosinüs değerlerini modelden modele aynı ölçekteymiş gibi okumayın.
NotDerinleşme: izotropik sıfır hipotezi ve ortalama vektörün normu
Sıfır hipotezi konusunda kesin olmakta fayda var, çünkü akla ilk gelen ifade yanlış: \(d\) boyutta düzgün dağılmış bağımsız birim vektörler için açılar eşit yayılmaz — 90° çevresinde yoğunlaşır, ortalama kosinüs 0 ve varyans \(1/d\) olur. İzotropi, hiçbir yönün ayrıcalıklı olmaması demektir; her açının eşit olasılıklı olması değil.
%56,9’luk pay da tek başına pek bir şey kanıtlamaz: izotropik bir sıfır hipotezi altında pay %50 olurdu ve arkasındaki 8 milyon çift 4.000 vektörden geliyor, yani bağımsız gözlem olmaktan çok uzaklar.
Ortalama kosinüs ile ortalama vektörün normu iki bağımsız kanıt değildir. \(n\) birim vektörün farklı çiftleri için \(\bar{c} = (n\lVert\bar{v}\rVert^2 - 1)/(n-1)\) özdeşliği geçerlidir. \(n = 4000\) ve yuvarlanmış \(\lVert\bar{v}\rVert = 0{,}171\) kullanıldığında sonuç yaklaşık 0,029 olur. Bu özetler, yön dağılımının bütün ayrıntılarını tek başlarına belirlemez. Merkezlemenin sağlamadığı şeye de dikkat edin: sıfır ortalama ortak yönü kaldırır, ama kovaryansı küresel yapmaz.
Merkezleme ortalama yönü kaldırır; en büyük birkaç bileşeni çıkarmak da baskın yönleri azaltabilir. All-but-the-top yaklaşımı (Mu vd. 2018) bu işlemleri birleştirir. Ancak yararlı bilgi de atılabileceğinden görev başarısı önce ve sonra ölçülmelidir. Ethayarajh (Ethayarajh 2019), incelediği bağlamsal modellerin belirli katmanlarında güçlü anizotropi gözlemler; bu sonucu bütün bağlamsal temsil yöntemleri için değişmez bir sıralama olarak okumamak gerekir.
3.9.3 Frekans sızıyor
Bir embedding’in anlamı kodlaması beklenir. Aynı zamanda kelimenin ne sıklıkta geçtiğini de kodlar: eğitim amacı, frekans ile geometriyi tamamen ayrıştıramıyor. Sık kelimelerin eş-oluşum olayı daha çoktur, dolayısıyla daha fazla ve daha yoğun eğitim sinyali alırlar.
### mean vector norm by frequency rank (GloVe, 400k words)
rank 0-100 mean norm 6.19
rank 100-1000 mean norm 5.85
rank 1000-10000 mean norm 5.45
rank 10000-100000 mean norm 4.99
rank 100000-400000 mean norm 3.62
spearman(log rank, norm) over the top 100k words: -0.313
Kelimeler seyrekleştikçe (sıra numarası büyüdükçe) grupların ortalama normu düzenli biçimde azalıyor — bu, tek tek kelimelerin değil, kovaların ortalamalarının eğilimi. Bu tablo, normun sıklıkla ilişkili olabildiğini gösterir; kosinüsün her görev için en iyi ölçüt olduğunu göstermez. Bir vektörün iki ayrı özelliği var: yönü ve uzunluğu (normu). Kosinüs normu dışarıda bırakıp yönü karşılaştırır; Öklid uzaklığı hem yön hem uzunluktan etkilenir. Birim normlu \(a\) ve \(b\) için \(\lVert a - b \rVert^2 = 2 - 2\cos(a, b)\) olduğundan (önceki bölümdeki özdeşlik, Bölüm 2) iki ölçüt aynı sıralamayı verir. Normu korumanın mı kaldırmanın mı yararlı olduğu görevde değerlendirilmelidir.
Ham iç çarpım ve Öklid uzaklığı norm farklarından etkilenebilir. Normalleştirilmemiş vektörleri alan bir model de sıklıkla ilişkili bu bilgiden yararlanabilir; ancak bunu ne ölçüde kullandığı modelin öğrenme amacına ve parametrelerine bağlıdır.
Nadir kelimelerin komşu listelerine de bakalım; alan sözlüğünüz çoğunlukla bu kuyrukta yer alır:
water rank 430 natural 0.70, dry 0.68, salt 0.68, clean 0.68, drinking 0.67
turbine rank 15747 turbines 0.80, compressor 0.78, generator 0.72, engine 0.70
cavitation rank 109044 aliasing 0.56, barotrauma 0.54, attenuation 0.54, breakage 0.53
impeller rank 124835 armature 0.62, evaporator 0.61, nozzle 0.60, centrifugal 0.59
eutectic rank 159022 azeotrope 0.61, azeotropic 0.55, tiwai 0.54, bifurcation 0.52
turbine listesindeki komşular ekipman ve enerji sistemleriyle ilişkili görünüyor. cavitation ve eutectic listelerinde ise hangi ilişkilerin istenen görev için yararlı olduğunu alan bilgisiyle değerlendirmek gerekir. Aynı fiziksel süreçte ilişkili olmak, eş anlamlı olmakla aynı değildir; bu kısa listelerden genel kalite sıralaması çıkaramayız.
Alan terimlerini ayrıca değerlendirin. Genel derlemde sık görülen kelimeler, alanınıza özgü nadir terimlerden daha iyi temsil edilmiş olabilir; ancak bu bütün kelimeler için bir kural değildir. Önemli alan terimlerinin komşularını incelemek iyi bir ilk kontroldür. Ardından görev ölçütleriyle ön eğitimli, alana uyarlanmış ve alt kelime temsillerini karşılaştırın; birkaç komşu listesi tek başına yöntem seçimini kesinleştirmez.
3.9.4 Koordinat sisteminin keyfîliği ve eğitimler arasındaki değişkenlik
Aynı text8 diliminde yalnızca rastgele tohumu (seed) değiştirerek iki model eğitiyoruz. sents, sıfırdan yazdığımız modelin de kullandığı 6.794.527 token’ın 1.000 token’lık parçalara ayrılmış hâlidir. workers=1, iş parçacığı sırasından kaynaklanan değişkenliği azaltır. Tam yeniden üretim için aynı tohumla birlikte veri sırası, PYTHONHASHSEED, kütüphane sürümleri ve yürütme ortamı da sabitlenmelidir.
from gensim.models import Word2Vec
from scipy.linalg import orthogonal_procrustes
def train(seed):
return Word2Vec(sents, vector_size=100, window=5, min_count=20, sg=1,
negative=5, sample=1e-3, epochs=3, workers=1, seed=seed).wv
a, b = train(1), train(2) # aynı derlem, aynı ayarlar, iki tohum
A, B = a.get_normed_vectors(), b.get_normed_vectors()
raw = np.mean(np.sum(A * B, axis=1)) # aynı kelime, aynı koordinatlar mı?
R, _ = orthogonal_procrustes(A, B) # en iyi dik hizalama; yansıma da içerebilir
aligned = np.mean(np.sum((A @ R) * B, axis=1))
Q, _ = np.linalg.qr(rng.standard_normal((100, 100))) # rastgele dik dönüşüm
rotated = A @ Qgensim 4.4.0; tokens read: 6,794,527
seed 1: vocab 18,677, 29 s
seed 2: vocab 18,677, 29 s
### top-10 neighbour overlap between two seeds
most frequent 1,000 mean count 4,892 overlap 62.2%
ranks 5,000-6,000 mean count 116 overlap 58.2%
rarest 1,000 mean count 20 overlap 46.6%
### are the coordinates comparable?
mean cosine, same word, raw coordinates : -0.016
mean cosine, same word, after one rotation : +0.951
### a rotation changes every coordinate and no cosine
king, first 4 coordinates, before : [-0.004 -0.045 0.063 -0.044]
king, first 4 coordinates, after : [ 0.086 -0.046 -0.114 0.104]
cos(king, queen) before 0.6826 after 0.6826
largest change in any of 4,000,000 cosines: 5.5e-07
Yukarıdaki kod deneyin çekirdeği; çıktıyı basan ve komşu örtüşmesini hesaplayan satırlar kısaltıldı. Çıktının tamamını üreten betik şu:
NotDerinleşme: deneyin tam kodu
"""Yalnızca tohumu farklı iki word2vec koşusu: birbirinden ne kadar farklılar?"""
import gzip, time
from collections import Counter
import numpy as np
import gensim, gensim.downloader as api
from gensim.models import Word2Vec
from scipy.linalg import orthogonal_procrustes
with gzip.open(api.load("text8", return_path=True), "rt") as f:
raw = f.read(40_000_000).split()
print(f"gensim {gensim.__version__}; tokens read: {len(raw):,}")
sents = [raw[i:i + 1000] for i in range(0, len(raw), 1000)]
def train(seed):
t0 = time.time()
m = Word2Vec(sents, vector_size=100, window=5, min_count=20, sg=1, negative=5,
sample=1e-3, epochs=3, workers=1, seed=seed)
print(f" seed {seed}: vocab {len(m.wv):,}, {time.time() - t0:.0f} s")
return m.wv
a, b = train(1), train(2)
vocab = a.index_to_key # frekansa göre sıralı, ikisinde de aynı
assert vocab == b.index_to_key
A, B = a.get_normed_vectors(), b.get_normed_vectors()
def overlap(words, k=10):
out = []
for w in words:
na = {x for x, _ in a.most_similar(w, topn=k)}
nb = {x for x, _ in b.most_similar(w, topn=k)}
out.append(len(na & nb) / k)
return float(np.mean(out))
rng = np.random.default_rng(0)
V = len(vocab)
bands = [("most frequent 1,000", range(0, 1000)),
("ranks 5,000-6,000", range(5000, 6000)),
("rarest 1,000", range(V - 1000, V))]
print("\n### top-10 neighbour overlap between two seeds")
for name, r in bands:
ws = [vocab[i] for i in rng.choice(list(r), size=300, replace=False)]
cnt = [a.get_vecattr(w, "count") for w in ws]
print(f" {name:<22} mean count {np.mean(cnt):>9,.0f} overlap {100 * overlap(ws):5.1f}%")
print("\n### are the coordinates comparable?")
same = float(np.mean(np.sum(A * B, axis=1)))
print(f" mean cosine, same word, raw coordinates : {same:+.3f}")
R, _ = orthogonal_procrustes(A, B) # en iyi dik hizalama; yansıma da içerebilir
aligned = float(np.mean(np.sum((A @ R) * B, axis=1)))
print(f" mean cosine, same word, after one rotation : {aligned:+.3f}")
print("\n### a rotation changes every coordinate and no cosine")
Q, _ = np.linalg.qr(rng.standard_normal((100, 100)))
i, j = vocab.index("king"), vocab.index("queen")
print(f" king, first 4 coordinates, before : {np.round(A[i][:4], 3)}")
print(f" king, first 4 coordinates, after : {np.round((A @ Q)[i][:4], 3)}")
print(f" cos(king, queen) before {A[i] @ A[j]:.4f} after {(A @ Q)[i] @ (A @ Q)[j]:.4f}")
S = rng.choice(V, size=2000, replace=False)
d = np.abs(A[S] @ A[S].T - (A @ Q)[S] @ (A @ Q)[S].T).max()
print(f" largest change in any of 4,000,000 cosines: {d:.1e}")Bir boyutun tek başına anlamı yoktur. Çıktının son bloğuna bakın. Bütün vektörleri aynı rastgele döndürme matrisiyle çarptık: king’in koordinatlarının hepsi değişti, ama king ile queen arasındaki kosinüs virgülden sonra dört basamağa kadar aynı kaldı ve dört milyon kosinüsün en çok değişeni \(5{,}5 \times 10^{-7}\) oynadı — yani kayan nokta hatası kadar. Sebebi basit: bir uzayı döndürmek okların birbirine göre açılarını değiştirmez. Bir embedding matrisi \(E\) için \(ER\) (herhangi bir dik \(R\) ile) bütün iç çarpımları ve kosinüsleri korur.
SGNS’nin bütün iç çarpımlarını korumak için merkez ve bağlam tablolarını aynı dik dönüşümle çarparız: \((WR)(UR)^\top = WU^\top\). Böylece eğitim amacı değişmez. Bu nedenle tek bir koordinatın adı model tarafından zorunlu olarak belirlenmiş değildir. Belirli bir eğitimde bir koordinatın bir özellikle ilişkili çıkması mümkündür; fakat bu yorum eşdeğer bir koordinat dönüşümünde korunmayabilir. Anlam tek tek koordinatlarda değil, vektörlerin birbirine göre konumunda — yani açılarda ve uzaklıklarda — durur.
İki eğitimin koordinatları doğrudan karşılaştırılamaz. Aynı kelimelerin iki eğitimdeki doğrudan kosinüsü ortalama −0,016, dik hizalama (Procrustes) sonrasında ise +0,951’dir. Bu, koordinat seçiminin farkın önemli bir bölümünü açıkladığını gösterir; iki uzayın yalnızca dönmüş kopyalar olduğunu göstermez. Nitekim komşuluk örtüşmeleri yerel farklılıkların sürdüğünü gösteriyor. Farklı zaman veya derlemleri karşılaştırırken ortak ve mümkün olduğunca kararlı dayanak kelimelerle hizalama yapmak, incelenecek değişimi hizalamanın içine soğurmamaya dikkat etmek gerekir.
Embedding eğitimi stokastiktir. Aynı derlem + farklı tohum → geometrik olarak farklı ama işlevsel olarak benzer uzaylar. İlk blok bunun bedelini gösteriyor: iki koşunun bir kelime için verdiği en yakın 10 komşudan, en sık 1.000 kelimede ortalama %62,2’si, en nadir 1.000 kelimede ise yalnızca %46,6’sı ortak. Genel şekil kararlı (+0,951), ama ince yerel sıralama kararlı değil — ve nadir kelimelerde daha da az.
Yapmamanız gereken: tek bir koşunun tek bir komşu listesi üzerine bir argüman kurmak, özellikle az geçen bir kelime için. Bir komşuluk sizin için önemliyse, birkaç tohumla eğitip hangi komşuların her seferinde geldiğine bakın.
3.10 Toplumsal yanlılık verinin içinde, geometri onu kayda geçiriyor
Meslek kelimelerini woman − man ekseni üzerine izdüşürün:
axis = g["woman"] - g["man"]
axis /= np.linalg.norm(axis)
occupations = ["doctor", "nurse", "engineer", "teacher",
"programmer", "homemaker", "scientist", "receptionist"]
for w in occupations:
proj = float(g[w] @ axis / np.linalg.norm(g[w]))
print(f" {w:<13} {proj:+.3f} -> {'woman' if proj > 0 else 'man'}") doctor +0.109 -> woman
nurse +0.329 -> woman
engineer -0.123 -> man
teacher +0.152 -> woman
programmer -0.083 -> man
homemaker +0.363 -> woman
scientist -0.046 -> man
receptionist +0.281 -> woman
İşaret, seçtiğimiz fark yönündeki izdüşümün yönünü gösterir. Tek başına toplumsal yanlılığın bütün boyutlarını veya bir mesleğin gerçek dünyadaki dağılımını ölçmez.
nurse, homemaker ve receptionist woman tarafında duruyor; engineer, programmer ve scientist ise man tarafında. Bunu kimse elle koymadı. Bu değerler, modelin eğitim verisinden öğrendiği çağrışımların, bizim seçtiğimiz woman−man ekseni üzerindeki izdüşümünü gösteriyor: yani 2014 tarihli Wikipedia ve haber metinlerinden öğrenilmiş çağrışım örüntülerinden biri görünür hâle geliyor. Bolukbasi ve arkadaşları (Bolukbasi vd. 2016), tek bir çift yerine birden çok tanımlayıcı kelime çiftinden bir yön veya altuzay kestirir. Buradaki tek çiftli hesap, yöntemin öğretici bir sadeleştirmesidir. Caliskan ve arkadaşları (Caliskan vd. 2017) ise WEAT ile, inceledikleri kelime kümelerinde çeşitli insan çağrışım örüntülerine benzer ilişkiler bulur. İnsanlardaki tepki süreleriyle vektör ilişkileri farklı ölçümlerdir; etki büyüklükleri doğrudan aynı nicelik gibi yorumlanmamalıdır.
Bu örnekten uygulamalar için üç ders çıkarabiliriz.
- Bu çoğu zaman bir eğitim hatası değildir. Eğitim verisindeki sistematik çağrışımlar embedding geometrisine taşınabiliyor. Bilinçli kullanıldığında embedding’ler, metindeki yanlılığı büyük ölçekte incelemek için niceliksel bir ölçüm aracıdır — ama ölçtüğünüz şey, derlem ile model ve seçtiğiniz eksenin birlikte ürettiği bir izdüşümdür.
- Kararlara yansıyabilir. Bu vektörleri kullanan bir sistem, temsilin taşıdığı istenmeyen çağrışımlardan etkilenebilir. Etki, sonraki modelin öğrenme amacına, diğer girdilere ve karar kuralına bağlıdır; temsil testiyle birlikte uygulamanın çıktıları da değerlendirilmelidir.
- Tek bir müdahale bütün yanlılık göstergelerini kaldırmaz. Bolukbasi ve arkadaşlarının yöntemi, seçilen kelimeler için nötrleştirme ve eşitleme adımları içerir (Bolukbasi vd. 2016). Gonen ve Goldberg (Gonen ve Goldberg 2019), bu tür müdahalelerden sonra komşuluk ve sınıflandırma yapısında cinsiyetle ilişkili bilginin kalabildiğini gösterir. Bu, bilginin işlem sırasında yeniden dağıtıldığını değil, seçilen ölçütün düşmesinin bütün ilgili yapının silindiğini göstermediğini ifade eder.
NotSezgi kontrolü: bu testte yanlılık göstermeyen bir model yansız mıdır?
Hayır. Asıl faydalı olan kısım da gerekçesi. Bu test, tek bir kelime çiftinin tanımladığı tek bir yönü ölçüyor. woman − man ile hizalı olmayan yanlılık bu teste görünmez ve Gonen ve Goldberg (2019) tam da bu hata biçimini yanlılığı giderilmiş vektörlerde gösterdi: izdüşüm testini geçiyorlar, aynı veri üzerinde kümeleme testinde kalıyorlar.
Genel ilke şu: tek bir adalet metriğini geçmek, yalnızca o metriğin yakalayabildiği yanlılık türü hakkında kanıt sağlar; diğer yanlılık biçimlerinin bulunmadığını göstermez. Hangi testi çalıştırdığınızı, o testin neyi tespit edebildiğini ve yapısal olarak neyi tespit edemediğini raporlayın.
3.11 Bir embedding’in iyi olup olmadığını nereden bilirsiniz?
İçsel ve dışsal değerlendirme, temsilin farklı yönlerini ölçer. Her birini bir soruyla özetleyebiliriz.
İki soru.
- İçsel: Uzayın kendi geometrisi insan yargılarıyla uyuşuyor mu?
- Dışsal: Bu temsil benim gerçek görevimi iyileştiriyor mu?
İçsel (intrinsic) değerlendirme, uzayın insan yargılarıyla doğrudan örtüşüp örtüşmediğini sorar: insan benzerlik puanlarıyla korelasyon ya da analoji kümesindeki doğruluk. Hızlıdır ve gerçek bir görev üzerinde koşmayı gerektirmez.
Dışsal (extrinsic) değerlendirme, embedding’in gerçekten önemsediğiniz şeyi iyileştirip iyileştirmediğini sorar — sınıflandırıcınızın doğruluğu, arama motorunuzun recall’u (duyarlılığı). Yavaştır, ama uygulamanıza katkıyı doğrudan ölçen tek değerlendirme odur.
Aşağıdaki kümelerin hepsi İngilizce. Türkçe için benzerliği ve ilişkililiği ayrı ayrı puanlayan kümeler de var; örneğin AnlamVer (Ercan ve Yıldız, 2018). Türkçe değerlendirme kaynaklarını Bölüm 16 ve Ek F topluyor.
from gensim.test.utils import datapath
# gensim varsayılanları: restrict_vocab=300000, case_insensitive=True.
# Kelime çifti değerlendirmesinde, bu sınırın dışındaki kelimeleri
# içeren çiftler varsayılan olarak atlanır; aday cevap araması yapılmaz.
# Analojide ise hem soru kapsamı hem de aranacak aday sözlüğü sınırlanır.
# Sonuçlarla birlikte değerlendirilen örnek sayısını ve kapsamayı raporlayın.
pear, spear, oov = g.evaluate_word_pairs(datapath("wordsim353.tsv"))
pear_s, spear_s, oov_s = g.evaluate_word_pairs(datapath("simlex999.txt"))
score, sections = g.evaluate_word_analogies(datapath("questions-words.txt"))### two similarity benchmarks that disagree on purpose
WordSim-353 (relatedness) spearman 0.533 pearson 0.548 oov 0.0%
SimLex-999 (similarity) spearman 0.296 pearson 0.324 oov 0.1%
### the Google analogy set, 19544 questions in 14 categories
overall accuracy: 0.633
capital-common-countries 0.939 (506 questions)
capital-world 0.889 (4524 questions)
currency 0.152 (808 questions)
city-in-state 0.308 (2467 questions)
family 0.816 (506 questions)
gram1-adjective-to-adverb 0.244 (992 questions)
gram2-opposite 0.201 (812 questions)
gram3-comparative 0.791 (1332 questions)
gram4-superlative 0.543 (1122 questions)
gram5-present-participle 0.695 (1056 questions)
gram6-nationality-adjective 0.879 (1599 questions)
gram7-past-tense 0.554 (1560 questions)
gram8-plural 0.720 (1332 questions)
gram9-plural-verbs 0.584 (870 questions)
### the same benchmarks on the vectors trained from scratch above
WordSim-353 spearman 0.627 oov 11.9%
SimLex-999 spearman 0.268 oov 13.4%
Google analogies accuracy 0.200
(trained on 6.8M tokens; glove saw 6 billion)
Kategori sayılarının toplamı 19.486’dır; dosyada ise 19.544 soru vardır. Aradaki 58 sorunun hepsi denar kelimesini içeriyor. Bu kelime GloVe’un 400.000 kelimelik sözlüğünde var (sıklık sırası 394.434), ama gensim’in varsayılan restrict_vocab=300000 sınırının dışında kaldığı için bu sorular atlanıyor. Yani atlanma, kelimenin modelin tam sözlüğünde bulunmadığı anlamına gelmiyor.
Kategori kırılımı, toplam puanın gizlediği farkları gösteriyor: başkent kategorileri yüksek (capital-common-countries 0,939, capital-world 0,889), currency (0,152) ve gram2-opposite (0,201) daha düşük doğruluk alıyor. Bu farklar derlem kapsamı, ilişki türü ve puanlama yönteminden etkilenebilir; tek başına hangi nedenin baskın olduğunu kanıtlamaz. Toplam analoji doğruluğunu kategori puanları, kapsama ve basit temel yöntemlerle birlikte raporlamak gerekir. Düşük kategorilerdeki skorlar bile 300.000 adaylık bir kümeden rastgele seçimin vereceği değerin çok üstündedir.
Aynı veri kümesi adı, aynı değerlendirilen örnekler demek değildir. NumPy modelinin WordSim-353 puanı 0,627, GloVe’un 0,533’tür; ancak NumPy modelinde çiftlerin %11,9’u atlanırken GloVe bütün çiftleri kapsar. Bu nedenle iki skor aynı örneklem üzerinde hesaplanmadı. İki modelin de kapsadığı 311 çiftte (%88,1) ölçtüğümüzde GloVe 0,549, NumPy modeli yine 0,627 alıyor: kapsama farkı GloVe’un puanını 0,016 değiştiriyor, aradaki farkı kapatmıyor. NumPy modelinin atladığı 42 çiftte GloVe’un korelasyonu 0,473’tür; yani bu çiftler GloVe için ortalamadan biraz daha zor. Tek bir ilişkililik kümesindeki bu sonuç, küçük modelin genel olarak daha iyi olduğunu göstermez; aşağıdaki analoji sayıları tersini söylüyor.
Analoji değerlendirmesinde varsayılan dummy4unknown=False, kapsam dışı kelime içeren soruları atlar. Dolayısıyla 0,633 ve 0,200 puanlarının paydaları farklıdır: GloVe 19.486 soruda, NumPy modeli yalnızca 9.282 soruda puanlanıyor. dummy4unknown=True, atlanan soruları yanlış sayarak tam soru kümesindeki başarıyı raporlamayı sağlar; modele bilinmeyen kelimeler için vektör kazandırmaz. Bu ayarla GloVe 0,631 (19.544 sorunun 12.334’ü doğru), NumPy modeli 0,095 (19.544 sorunun 1.852’si doğru) alıyor. Buna ek olarak aday sözlüğü, harf duyarlılığı ve girdi filtresi aynı biçimde raporlanmalıdır. Tam soru kümesi skoru ile ortak kapsanan sorulardaki karşılaştırma farklı ve tamamlayıcı bilgiler verir.
Akılda tutulacak kural. Değerlendirme puanıyla birlikte kapsamayı ve puanlanan örnek sayısını verin. Atlanan örnekler sonuçları değiştirebilir; fakat değişimin yönü, atlanan örneklerin niteliğine bağlıdır. Farklı örnek alt kümelerinden hesaplanan skorları aynı kapsamdaymış gibi karşılaştırmayın.
WordSim-353 ve SimLex-999 korelasyonları burada farklıdır (Spearman 0,533 ve 0,296); ancak veri kümelerinin kapsamı ve yargı türleri de farklı olduğu için bu farkı yalnızca zıt anlamlılıkla açıklayamayız. İçsel değerlendirmeler temsilin belirli özelliklerini karşılaştırmak ve adayları elemek için yararlıdır. Uygulama seçimi içinse hedef görevdeki başarı ve maliyet belirleyici olmalıdır; içsel sıralamanın dışsal sıralamayı her zaman öngörmediği gösterilmiştir (Schnabel vd. 2015).
3.12 Aralarında seçim yapmak
Dört yöntem; hepsi kelime başına yoğun bir vektör üretiyor, hepsi kosinüsle karşılaştırılabiliyor. Farklar yalnızca belirli koşullarda önem kazanıyor — işte o koşullar.
| Güçlü yanları | Zayıf yanları | Şu durumda tercih edin | |
|---|---|---|---|
| PPMI + SVD | Sayımlar ve dönüşümler doğrudan incelenebilir; küçük derlemlerde öğretici bir başlangıçtır. Sabit çözücü ve ortamla sonuçlar yeniden üretilebilir, ancak işaret ve eşit tekil değerli altuzay belirsizlikleri vardır. | Seyrek sayım matrisi yanında düşük ranklı faktörler ve çözücü çalışma belleği gerekir. Hangisinin en büyük nesne olduğu veriye bağlıdır. Sözlük dışı biçimler için doğrudan satır yoktur. | Hesap adımlarını incelemek veya mütevazı bir sözlükte sayıma dayalı bir temel yöntem kurmak istediğinizde. |
| word2vec | Akış tabanlı uygulanabilir; temel iki tablo \(O(Vd)\) büyüklüğündedir. Skip-gram bazı görevlerde nadir kelimelerde iyi sonuç verir. | Başarı örnekleme, eğitim ayarları ve kapsama bağlıdır. Yalnızca son vektörleri saklamak eğitime devam için yeterli değildir. Bu bölümün NumPy örneği bütün çiftleri bellekte saklar. | Alan derleminden kelime vektörleri öğrenmek istediğinizde; dilin biçimbilimi ve OOV oranıyla birlikte fastText’e karşı ölçerek. |
| GloVe | Eş-oluşumları biriktirip ağırlıklı kayıpla öğrenir; erişilebilir ön eğitimli vektörler sağlar. | Eğitim için eş-oluşum verisinin hazırlanması gerekir. Hazır kelime sözlüğünün kapsamı dil ve alana göre değişir. | Uygun dil ve alanı kapsayan hazır statik vektörlerle hızlı bir başlangıç yapmak istediğinizde. |
| fastText | Karakter parçalarını paylaşarak sözlük dışı ve az görülen biçimler için temsil üretebilir; bazı yazım değişikliklerine dayanıklıdır. | Alt kelime tablosu ek bellek ister. OOV vektörü oluşturmak parça birleştirme gerektirir; sözlük içi vektörler önceden hesaplanabilir. Yazılış benzerliği istenmeyen yakınlık yaratabilir (kitap/kitle 0,667). |
Yüksek OOV, çekim çeşitliliği veya yazım değişkenliği varsa; kapsama kazancını görev başarısı ve zor negatifler üzerinde değerlendirerek (karşılaştırma bölümündeki ölçüm, Bölüm 4). |
Belge düzeyindeki seçim ayrı bir konudur ve literatürün ima ettiğinden daha dardır:
| Güçlü yanları | Zayıf yanları | |
|---|---|---|
| Ortalaması alınmış kelime vektörleri | Hazır kelime vektörleri varsa ek belge temsili eğitimi gerektirmez; yeni belgelerde doğrudan hesaplanır. | Kelime sırasını ve sözdizimsel ilişkileri kaybeder; olumsuzluk kapsamını güvenilir biçimde korumaz. OOV davranışı ve ağırlıklandırma önemlidir. |
| doc2vec | Bu deneyde ortalama GloVe’dan daha yüksek doğruluk verir (0,839’a karşı 0,820); farkın belirsizliği eşleştirilmiş değerlendirmeyle ölçülmelidir. | Yeni belge vektörü optimizasyonla kestirilir; çıkarım maliyeti ve eğitim ayarları değerlendirilmelidir. |
Bu deneyin tek bölünmesinde doc2vec, ortalama GloVe’dan 1,9 puan yüksek doğruluk aldı; incelenen yoğun yöntemlerin hiçbiri TF-IDF satırını geçmedi. Bu bulgu bütün belge sınıflandırma veya erişim görevlerini kapsamaz. Yoğun temsillerin sözlük uyuşmazlığında yararlı olup olmadığını, hedef görevde ölçmek gerekir. Karşılaştırma bölümünde (Bölüm 4) farklı dil, alan ve veri miktarıyla yapılan karşılaştırma, bu koşullara ilişkin ek kanıt sağlayacak.
3.13 Üretim sistemlerindeki uygulamalar
word2vec’in asıl mirası “kelime” değil; herhangi bir ayrık varlık için eş-oluşumdan embedding öğrenme fikri. Aşağıdaki örneklerin hepsi aynı temanın varyasyonu. Statik embedding’ler tarihî bir merak konusu değil; teknik — ayrık bir öğe için eş-oluşumdan yoğun bir vektör öğren, sonra üzerinde aritmetik yap — metnin çok ötesinde bir altyapıya dönüştü.
- Airbnb arama sıralaması. Kullanıcının oturumunu bir cümle, ilanları kelimeler gibi ele alıp tıklama dizileri üzerinde skip-gram ile eğitilen ilan embedding’leri; rezerve edilen ilanlar da global bağlam olarak kullanılıyor. Üretim ortamındaki aramada yayına alındı ve rezervasyonlarda kayda değer bir artış raporlandı (Grbovic ve Cheng 2018).
- YouTube önerileri. İzlenen videoların ve arama token’larının embedding’leri ayrı ayrı ortalanır; bu özellikler diğer kullanıcı bilgileriyle birlikte derin aday üretim ağına verilir. Ağın çıktısı, aday videoları puanlamak için kullanılan kullanıcı temsilidir (Covington vd. 2016).
- Item2vec ve türevleri. Skip-gram benzeri amaçlar, alışveriş sepetleri gibi öğe birlikteliklerine de uygulanabilir (Barkan ve Koenigstein 2016). Ancak
*2vecadını taşıyan her yöntemin aynı eğitim amacını kullandığı varsayılmamalıdır. - Sınıflandırma için fastText. Denetimli fastText sınıflandırıcısı, kelime ve seçilen kelime n-gram özelliklerinin vektörlerini birleştirip doğrusal bir çıktı katmanıyla sınıfı tahmin eder (Joulin vd. 2017). Buradaki kelime n-gram’ları, önce anlattığımız karakter n-gram’larıyla aynı birim değildir. Hız ve doğruluk dengesi bakımından sınanabilecek bir temel yöntemdir; eğitim süresi ve başarı veri ile ayarlara bağlıdır.
- Vektörle erişim. Erişim (Bölüm 19) ve RAG (Bölüm 20) bölümlerinde, metinleri vektörlerle temsil ederek erişim yapan sistemler de ele alınıyor. Bu sistemler uygun cümle veya belge kodlayıcıları ve kosinüs, iç çarpım ya da uzaklık ölçütleri kullanabilir. RAG ayrıca sözlüksel veya hibrit erişimle de kurulabilir; bütün RAG hatları aynı temsil ve ölçütü kullanmaz.
Embedding katmanı, ayrık kimlikleri öğrenilebilir sürekli vektörlere eşler. Türevi alınan şey ürün kimliği veya token’ın kendisi değil, ona karşılık gelen vektör parametreleridir. Standart bir tabloda her kimliğin ayrı satırı vardır; ortak eğitim amacı bu satırların ilişkili bir uzayda öğrenilmesini sağlar. fastText gibi yapılarda alt parçalar üzerinden gerçek parametre paylaşımı da bulunur. Elde edilen vektörler, uygun girdi boyutuna ve yapıya sahip sonraki modellerde kullanılabilir.
3.14 Statik embedding’lerin yapamadıkları
Biriktirdiğimiz başarısızlıkları bir araya toplayalım, çünkü hepsi birlikte kitabın bir sonraki kısmının şartnamesini oluşturuyor.
| Kısıt | Bu bölümdeki kanıt | Yaygın ele alma / azaltma yöntemi |
|---|---|---|
| Kelime biçimi başına tek statik vektör | python için farklı kullanım alanlarından komşular birlikte görülüyor |
Kullanım bağlamına göre hesaplanan token temsilleri (Bölüm 7) |
| Sırasız birleştirmede ilişki kaybı | Aynı token’ların farklı sırası ortalamada aynı matematiksel vektörü veriyor | Sırayı ve sözdizimini dikkate alan birleştirme veya dizi modelleri (Bölüm 6) |
| Sözlük kapsamı | Bu gensim sorgusunda OOV biçimler KeyError veriyor; verilen Türkçe örneklemde OOV token oranı %7,3 |
Alt kelime temsilleri; ayrıca görevde kapsama değerlendirmesi |
| Benzerlik ile zıtlığın karışması | increase/decrease kosinüsü 0,881 |
Göreve uygun etiketler ve karşılaştırma modelleriyle değerlendirme |
| Yön dağılımındaki eşitsizlik | İlk 50.000 kelimeden alınan örneklemde ortalama kosinüs 0,029 | Merkezleme veya uygun son işlemleri görevde sınama; merkezleme bütün anizotropiyi gidermez |
| Nadir veya alan dışı kelimelerde belirsizlik | Bazı alan terimlerinin komşuları beklenen ilişkiyi vermiyor | Alan değerlendirmesi, uyarlama ve alt kelime seçenekleri |
| Toplumsal çağrışımlar | Seçilen eksende bazı mesleklerin farklı izdüşümleri var (homemaker +0,363) |
Birden çok temsil ve uygulama ölçütüyle değerlendirme; uygun veri, eğitim ve karar müdahalelerini sınama |
En önemlileri ilk ikisi; ama kök nedenleri aynı değil, bu yüzden onları ayrı tutmak işe yarıyor.
Akılda tutulacak kural. Statik bir embedding, tip düzeyinde bir arama tablosudur: kelime biçimi → tek vektör.
Statik tablo, kelime biçimini aynı vektöre eşler; farklı kullanımlar bu vektörü etkileyebilir, ancak her yeni cümlede anlam seçimi yapmaz. Bağlamsal model ise token’ın temsilini erişebildiği çevreye göre hesaplar. Bu çevre modelin dikkat düzenine bağlıdır: çift yönlü modeller iki tarafı, nedensel modeller yalnızca izin verilen önceki token’ları kullanır. Bu ayrıntıları transformer bölümünde (Bölüm 7) göreceğiz.
İkinci satır ise farklı bir problem: kelime sırası, tek tek vektörlerin değil, onları bir cümle ya da belge vektöründe birleştirme biçiminizin sorunudur. Ortalama almak sırayı yok eder; bağlamsal olmayan vektörlerle bile sırayı koruyan bir birleştirici kullansanız problemin bu yarısı hafifler.
ELMo (Peters vd. 2018), 2018’de çift yönlü dil modelinin iç durumlarını bağlama göre değişen kelime temsilleri olarak kullanarak bu yaklaşımın yaygınlaşmasında önemli bir dönüm noktası oldu. Bağlamsal temsil fikri daha önce de vardı; ELMo bu fikirden genel amaçlı aktarılabilir temsiller üretmenin etkili bir örneğidir. Transformer bölümündeki (Bölüm 7) modellerde de bağlama göre temsil hesaplama fikri sürer.
3.15 Sezgi kontrolleri
Açmadan önce cevaplayın.
Not1. Embedding’inizin 300 boyutu var. Neden 300, neden 30 ya da 3.000 değil?
300 için evrensel bir optimum yoktur. Boyut azaldığında temsil kapasitesi sınırlanabilir; arttığında bellek ve hesaplama maliyeti yükselir, az veride öğrenilen ayrıntıların genellenebilirliği ayrıca değerlendirilir. Ancak düşük boyut bütün ilgisiz kelimeleri aynı noktaya zorlamaz, yüksek boyut da zorunlu olarak gürültü üretmez. Boyutu veri kapsamı ve hedef görevdeki doğrulama başarısıyla, saklama ve gecikme bütçesini birlikte dikkate alarak seçeriz.
Yukarıda kullanılan aynı benchmark’larda ölçüldüğünde, 50 boyuttan 100 boyuta çıkmak üç puanı da yükseltiyor:
glove-wiki-gigaword-50 d=50 wordsim 0.503 simlex 0.263 analogy 0.464
glove-wiki-gigaword-100 d=100 wordsim 0.533 simlex 0.296 analogy 0.633
GloVe makalesindeki boyut taramaları (Pennington vd. 2014), belirli deneylerde boyut arttıkça kazancın yavaşlayabildiğini gösterir. Bu, birkaç yüz boyutu iyi bir başlangıç aralığı yapabilir; evrensel bir varsayılanın kanıtı değildir. Gerçek görevde boyut seçeneklerini başarı, bellek ve gecikme açısından karşılaştırın.
Not2. Sözlük üzerinde softmax yerine neden negatif örnekleme?
Tam softmax’in puanlama maliyeti çift başına yaklaşık \(O(Vd)\), \(K\) negatifli puanlamanınki \(O((K+1)d)\)’dir. Örnekleme yönteminin ayrıca maliyeti vardır; buradaki kümülatif dağılım üzerindeki ikili arama örnek başına \(O(\log V)\) adımdır. Negatif örnekleme aynı softmax olasılığını yalnızca daha hızlı hesaplamaz, eğitim amacını değiştirir. \(q = P(c)\) ve serbest iç çarpımlar altında kaydırılmış PMI hedefi elde edilir (Levy ve Goldberg 2014b). Hiyerarşik softmax ise ağaç yolundaki kararlarla normalize olasılık üretir; dengeli ağaç için puanlama maliyeti yaklaşık \(O(d \log V)\)’dir.
Not3. Elinizde Türkçe 50.000 destek talebi var. word2vec mi, fastText mi?
Önce destek taleplerinin token sayısını, tip sayısını ve eğitim/test bölünmesindeki OOV oranını ölçün. Türkçedeki çekim çeşitliliği fastText’i güçlü bir aday yapar; ancak Wikipedia’daki %7,3 OOV oranı destek talepleri için alt sınır değildir. Dar ve tekrar eden bir destek alanının sözlüğü daha küçük de olabilir. word2vec ile fastText’i aynı ön işleme ve değerlendirme koşullarında karşılaştırın; alt kelime yönteminin kapsama kazancını, istenmeyen yazılış yakınlıklarıyla (kitap/kitle) birlikte değerlendirin.
Not4. İki belgenin ortalama vektörleri arasındaki kosinüs benzerliği 0,95. Aynı şeyden mi bahsediyorlar?
Yalnızca 0,95 değerinden aynı şeyden söz ettikleri sonucunu çıkaramayız. Ortalama alma sırayı kaybeder; aynı kelimelerle zıt ilişkiler kurulabilir. Ayrıca ortak bileşen ortalama alınırken büyümek zorunda değildir: bağımsız değişken katkılar azalırken ortak yönün göreli etkisi artabilir.
Bu bölümün 20 Newsgroups eğitim belgelerinde ölçtük: vektörü olan 2.248 belgenin bütün çiftlerinde ortalama GloVe vektörleri arasındaki kosinüsün ortalaması 0,944, ortancası 0,961’dir ve çiftlerin %65,6’sı 0,95’in üzerindedir. Farklı haber gruplarından gelen çiftlerde bile bu pay %63,8’dir. Yani bu derlemde 0,95, rastgele bir çiftin aldığı değerin altında kalır.
Kendi derleminizde rastgele çiftlerin dağılımını inceleyin, fakat karar eşiğini benzer, ilgisiz ve özellikle zor negatif olarak etiketlenmiş belge çiftleriyle değerlendirin. Yüzdelik dilim, tek başına anlamsal eşdeğerlik olasılığı değildir.
Not5. Ön eğitimli embedding’leri kendi derleminizde fine-tune mu etmeli, yoksa sıfırdan mı eğitmeli?
İki eksene bakın: alan derleminizin büyüklüğü ve ön eğitimli sözlüğün sizin terimlerinizi ne kadar kapsadığı.
| Alan derlemi | Ön eğitimli kapsama | Öneri |
|---|---|---|
| Küçük | Yüksek | Ön eğitimli vektörleri kullanın; gerekirse aşağı akışta sabit tutun |
| Küçük | Düşük | Alt kelime modeli, alana özgü sözlük ya da bağlamsal bir encoder (kodlayıcı) |
| Orta–büyük | Yüksek | Ön eğitimliden devam etmeyi test edin |
| Orta–büyük | Düşük | Alana uyarlamalı eğitim ya da sıfırdan eğitimi değerlendirin |
| Çok büyük | Alana özgü sözlük | Sıfırdan eğitim anlamlı olabilir |
Veri miktarının yanında alan kayması ve kapsama önemlidir. Alan terimlerinin komşularını incelemek bir ilk kontroldür; seçim hedef görevle doğrulanmalıdır. “Ön eğitimden devam” derken iki işlemi ayırın: hazır vektörleri sonraki denetimli modele başlangıç olarak vermek veya özgün kelime embedding eğitimini sürdürmek. İkinci işlem, yalnızca KeyedVectors değil, gerekli çıktı parametreleri ve eğitim durumunu da gerektirebilir.
Not6. Embedding’ler TF-IDF’in yerini aldı. Doğru mu, yanlış mı?
Göreve bağlıdır. Buradaki tek bölünmede TF-IDF en yüksek doğruluğu aldı (0,853); ortalama GloVe ile farkı eşleştirilmiş testte rastlantıyla açıklamak zor, doc2vec ile farkı ise ölçemedik. Sözlüksel erişim (örneğin BM25) tam terim eşleşmesinde, yoğun erişim ise farklı ifadeler arasındaki ilişkilerde yararlı olabilir. Hibrit erişim bu iki bilgi türünü birleştirir, ancak başarısı değerlendirilmelidir. Embedding vektörleri TF-IDF’in veya one-hot kodlamanın bütün kullanımlarını ortadan kaldırmaz; hatta embedding satırı seçimi matematiksel olarak one-hot vektörle matris çarpımı şeklinde yazılabilir.
3.16 Mülakat soruları
Kaynak gösterimi. Aşağıdaki sorular bölümün kavramlarını ve uygulama kararlarını çalışmak için hazırlanmıştır; belirli şirketlerde soruldukları iddia edilmiyor. Genel hazırlık kaynakları olarak Chip Huyen’in Introduction to Machine Learning Interviews kitabı (Huyen 2021) ve AIMLInterviews deposu incelenebilir. Üretim örnekleri için ilgili sistem makaleleri ayrıca belirtilmiştir.
Sorular iki gruba ayrılıyor. İlk üç başlık doğrudan bu bölümde gördüklerinize dayanıyor; bu bölümü çalıştıysanız cevaplayabilirsiniz. Son başlık ise bölümün sınırlarının dışına çıkıp üretim sistemi tasarımına giriyor ve burada tanımlanmayan kavramlara (yaklaşık en yakın komşu indeksleri, soğuk başlangıç, tanılama kümeleri) dokunuyor — oradaki cevapları bu bölümün gerektirdiği bilgi değil, nereye bakmanız gerektiğini gösteren bir harita olarak okuyun.
3.16.1 Bu bölümden: amaç fonksiyonunu anlayıp anlamadığınızı ölçenler
S: word2vec’i, regresyon bilen ama yapay sinir ağı bilmeyen birine anlatın.
Negatif örneklemeli skip-gram’ı ele alalım. Gözlenen çiftleri pozitif, gürültü örnekleyicisinden gelenleri negatif etiketleriz. Puan, öğrenilen iki vektörün iç çarpımı; olasılık \(\sigma(v \cdot u)\), tek terimin puana göre türevi \(\sigma(v \cdot u) - y\)’dir. Lojistik regresyonla kayıp biçimi ortaktır, fakat her iki vektör tablosu öğrenildiğinden ortak problem dışbükey (konveks) değildir. SGNS ayrıca, negatifler bağlam marjinalinden çekilip her iç çarpım serbest bırakıldığında \(\mathrm{PMI} - \log K\) hedefiyle ilişkilidir (Levy ve Goldberg 2014b). Gerçek düşük ranklı model ile PPMI–SVD farklı kayıplar ve hedef dönüşümleri kullanır; aynı sonucu vermek zorunda değildir.
S: Skip-gram ve CBOW ayrı ayrı neyi tahmin eder, hangisini ne zaman tercih edersiniz?
Skip-gram merkez kelimeden bağlam kelimelerini, CBOW ise birleştirilmiş bağlam vektörlerinden merkez kelimeyi tahmin eder. CBOW genellikle daha az eğitim tahminiyle çalıştığı için hızlıdır; skip-gram bazı koşullarda nadir kelimelerde avantaj sağlayabilir. Hız ve kalite farklarını pencere, negatif sayısı, derlem ve uygulama belirler. Seçimi hedef görevde, özellikle önemli sıklık gruplarına göre ölçmek gerekir.
S: Negatif örnekleme dağılımında neden 0,75 üssü kullanılıyor?
0,75 üssü unigram dağılımını düzleştirerek nadir bağlamların göreli örneklenme payını artırır. Negatif etiket, çiftin örnekleyiciden gelmesine aittir; derlemde hiç birlikte geçmediği anlamına gelmez. Üs ampirik bir tercihtir ve örtük matris hedefini de değiştirir (Levy vd. 2015); bu nedenle değerlendirmede sabit ve önemsiz bir ayrıntı gibi görülmemelidir.
S: Sık kelimelerin altörneklenmesi hızı ve temsil kalitesini nasıl etkileyebilir?
Çok sık kelimelerin eğitim çiftlerindeki payını azaltır ve hesap yükünü düşürür. Kalan dizide bazı kelimeler birbirine yaklaştığından bağlam çiftlerinin dağılımı da değişir. Bu, bazı görevlerde kaliteyi artırabilir; ancak genel bir garanti değildir. Bölümde bildirilen koşuda sözlük içi token sayısı %26,6 azalmıştır.
3.16.2 Bu bölümden: geometriyi anlayıp anlamadığınızı ölçenler
S: king − man + woman ≈ queen. Aslında ne oluyor ve bu demoda ne sorunlu?
Analoji aritmetiği, bazı ilişkilerin yaklaşık tutarlı vektör farklarıyla temsil edilebilmesinden yararlanır; en yakın komşunun beklenen kelime olması tam paralelkenar gerektirmez. Kütüphane girdi kelimelerini adaylardan çıkarır. Filtrenin etkisini görmek için normalleştirmeyi ve puanları sabit tutmak gerekir: aynı puanlarla, filtre olmadan en yakın vektör 0,836 ile king’in kendisidir ve queen 0,770 ile ikinci sıradadır. Aday kümesi görevin tanımının parçasıdır. Tek bir başarılı veya başarısız analoji yerine kategori sonuçlarını ve temel yöntemleri karşılaştırın (Nissim vd. 2020; Linzen 2016).
S: İlgisiz iki kelimenin kosinüsü 0,3. Bu yüksek mi, düşük mü?
İlk 50.000 GloVe kelimesinden alınan örneklemde ortalama kosinüs 0,029, standart sapma 0,119’dur; 0,3 bu ortalamanın yaklaşık 2,3 standart sapma üstündedir. Bu, örnekleme göre yüksek bir puan olduğunu söyler; normal dağılım, belirli bir p-değeri veya anlamsal ilişki garantisi vermez. Kendi verinizin ampirik yüzdeliklerini ve etiketli çiftlerdeki başarısını inceleyin. Merkezleme ortak ortalamayı kaldırır (Mu vd. 2018), bütün anizotropiyi ortadan kaldırmaz.
S: Anlamsal aramanız en iyi eşleşme olarak zıt anlamlıları döndürüyor. Neden ve ne yaparsınız?
Dağılımsal temsiller, aynı bağlamları paylaşan zıt anlamlılara yüksek benzerlik verebilir (increase/decrease 0,881). Önce yanlış eşleşmeleri ve görevde hangi ilişkilerin dışlanması gerektiğini inceleyin. Sözlüksel kurallar, olumsuzluk kapsamını ele alan özellikler, göreve uyarlanmış cümle kodlayıcıları (Reimers ve Gurevych 2019) veya çiftleri birlikte değerlendiren çapraz kodlayıcılar (cross-encoder) seçeneklerdir. Bunların maliyet ve başarısı ölçülmelidir; doğal dil çıkarımı (NLI) ile eğitim tek başına yeterlilik garantisi değildir. Daha fazla ham metin sorunu mutlaka çözmez, ancak dağılımda hiçbir ayırıcı bilgi bulunamayacağını da genelleyemeyiz.
3.16.3 Bu bölümden: derinliği ölçenler
S: PPMI+SVD, word2vec ve GloVe arasındaki bağlantı nedir?
PPMI–SVD, eş-oluşumları PMI ile ağırlıklandırıp negatif değerleri sıfırlar ve oluşan matrisi karesel hataya göre düşük rankta yaklaşık olarak temsil eder. SGNS, örneklenen çiftlerde lojistik kayıp kullanır; serbest iç çarpım hedefi genel olarak \(\log\bigl[P(w,c) / (P(w)\,q(c))\bigr] - \log K\)’dir. GloVe ise pozitif log-sayımları iki vektör tablosu ve bias terimleriyle, sayım ağırlıklı karesel kayıp altında modeller. Bu ortak dağılımsal temele rağmen hedefler aynı değildir. Levy ve arkadaşlarının karşılaştırması (Levy vd. 2015), denedikleri görevlerde hiperparametrelerin yöntem sıralamasını güçlü biçimde etkilediğini gösterir; bütün görevlerde eşit performans iddiası değildir.
3.16.4 İleri sistem tasarımı: bir şeyi yayına alıp almadığınızı ölçenler
S: 50 milyon belge için, 100 ms’nin altında erişimle belge vektörleri lazım. Kararı adım adım anlatın.
Önce 100 ms sınırının sorgu kodlama, arama, filtreleme ve yeniden sıralamayı kapsayıp kapsamadığını belirleyin; gecikme yüzdeliğini, trafik hacmini ve bellek bütçesini de tanımlayın. Belge vektörleri önceden hesaplanabilir. Aday temsilleri etiketli erişim verisinde karşılaştırın; kodlayıcı maliyeti ve vektör boyutu için evrensel bir oran kullanmayın. HNSW veya IVF-PQ gibi yaklaşık en yakın komşu indekslerini geri getirme başarısı, bellek ve gecikme açısından ölçün. Tam tanımlayıcılar önemliyse (önceki bölümdeki P-101 problemi, Bölüm 2) sözlüksel veya hibrit erişimi de aynı değerlendirmeye katın.
S: Embedding’leri kendi derleminizde eğittiniz ve ön eğitimli olanlardan kötü çıktılar. Ne oldu?
Önce veri miktarını ve dağılımını, kapsama oranını, tokenleştirmeyi, eğitim ayarlarını (min_count, epoch sayısı, altörnekleme) ve değerlendirme protokolünü kontrol edin. Az gözlem nadir kelimeleri zayıflatabilir, fakat evrensel bir token eşiği yoktur. Genel bir benzerlik kümesinde düşük skor almak, alan görevinizde de kötü olmayı gerektirmez; alan modeli orada mutlaka geriler de denemez. Hazır vektörleri başlangıç olarak kullanmayı veya gerekli eğitim durumu mevcutsa eğitime devam etmeyi, sıfırdan eğitimle aynı görevde karşılaştırın.
S: Üretimdeki embedding modelinizin bayatladığını nasıl tespit edersiniz?
Canlı trafikte sözlük dışı biçim oranını, token ve alan terimi dağılımlarını, ayrıca etiketlenebilen örneklerde görev başarısını izleyin. OOV oranı her kalite düşüşünden önce artmaz; alt kelime modellerinde vektör üretilebilmesi de anlam kapsamını garanti etmez. Donmuş model ve sabit sözlük için sabit terimlerin komşuları değişmez. Sabit bir tanılama kümesi (probe set), yeniden eğitilmiş model sürümlerini karşılaştırmakta yararlıdır; güncel veri kaymasını ölçmek içinse yeni trafik örnekleri ve zamanla güncellenen görev etiketleri gerekir.
S: Elinizde 100.000 ürün ve tıklama kayıtları var. Bir ürün embedding’i tasarlayın.
Oturumları ürün dizileri olarak ele alıp skip-gram benzeri bir yöntemle ürün vektörleri öğrenebilirsiniz. Airbnb örneği (Grbovic ve Cheng 2018), rezerve edilen ilanı ek pozitif bağlam olarak kullanır ve genel negatiflere pazar içi negatifler ekleyerek yerel ayrımları öğrenmeye çalışır. Oturum sınırlarını, olumsuz örnek tanımını ve değerlendirme zaman ayrımını açık kurmak gerekir. Yeni ürünler için (soğuk başlangıç) başlık, kategori ve diğer içerik özelliklerinden temsil üretilebilir; keyfî ürün kimliklerini karakter parçalarına bölmenin anlam taşıdığı varsayılmamalıdır.
3.17 Daha derine inmek için
Her kaynağın yanında bir seviye var; doğru yerden başlamanız için: Başlangıç yalnızca bu bölümü varsayar, Orta bölümdeki matematikle rahat olmayı bekler, İleri ise türetmelere ve ampirik ayrıntıya girer.
Makaleler, okuma sırasıyla. Hepsi ücretsiz.
- Efficient Estimation of Word Representations in Vector Space (Mikolov, Chen, vd. 2013), ardından Distributed Representations of Words and Phrases (Mikolov, Sutskever, vd. 2013). (Orta) İlk makale skip-gram ve CBOW’u, ikincisi negatif örnekleme ve sık kelimelerin altörneklenmesini açıklar. İkinci makaleyi bu bölümdeki amaç fonksiyonu ve örnekleme koduyla karşılaştırarak okuyun.
- word2vec Parameter Learning Explained, Xin Rong (Rong 2014). (İleri) CBOW, skip-gram ve ilgili çıktı amaçlarının gradyanlarını adım adım türetir; algoritmayı kendiniz uygularken yararlı bir başvuru kaynağıdır. Goldberg ve Levy’nin word2vec Explained (Goldberg ve Levy 2014) metni de negatif örnekleme amacının mantığını açıklayan kısa bir tamamlayıcıdır.
- Neural Word Embedding as Implicit Matrix Factorization (Levy ve Goldberg 2014b) ve Improving Distributional Similarity with Lessons Learned (Levy vd. 2015). (İleri) word2vec’i açıklayan iki makale. İkincisi, ampirik NLP’nin nasıl titizlikle yapılacağı konusunda daha iyi bir örnek.
- GloVe (Pennington vd. 2014) ve Enriching Word Vectors with Subword Information (Bojanowski vd. 2017). (Orta)
- Man is to Computer Programmer as Woman is to Homemaker? (Bolukbasi vd. 2016), ardından Lipstick on a Pig (Gonen ve Goldberg 2019). (Orta) Bu iki çalışmayı birlikte okuyun: ilki belirli yanlılık giderme işlemleri önerir, ikincisi bu işlemlerden sonra başka ölçütlerle saptanabilen yapının kalabildiğini inceler.
İzleyin.
- CS224N Lecture 1 — Intro & Word Vectors, Stanford. (Orta) word2vec’i tahtada, sonraki literatürün büyük kısmını yazan ekip türetiyor.
- Visualizing High-Dimensional Space, Google. (Başlangıç) “Embedding uzayında yakın” ifadesinin gerçekte ne anlama geldiğine dair sezgiyi düzelten dört dakika. Bu bölümün geometri kısmından önce izlemek faydalı; o kısım, bu sezginin nasıl yanılttığını anlatıyor.
Ders kitapları ve dersler.
- Speech and Language Processing, Jurafsky & Martin (Jurafsky ve Martin 2026), 5. bölüm, Embeddings. (Orta) 19 Ağustos 2026 taslağında 5. bölüm kelime temsillerini ele alır; PPMI için içindekilerdeki Ek J’ye de bakın. Kitap ücretsizdir.
- Stanford CS224N. (Orta) Kelime vektörleri dersinin notları, skip-gram ve öğrenme türevleri için yararlı bir başvuru kaynağıdır. Ödevler yıllara göre değişir: Winter 2026 sayfasında ilk ödev kelime vektörlerine giriş, ikinci ödev ise sinir ağı temelleri, tensör türevleri ve bağımlılık çözümlemesi üzerinedir. Bir word2vec uygulama ödevi arıyorsanız dersin arşivinde yılına bakın.
- NLP Course For You, Elena Voita (Voita 2020). (Başlangıç) Skip-gram ve negatif örneklemeyi görsellerle açıklar; animasyonlar merkez ve bağlam tablolarının rollerini izlemeyi kolaylaştırır.
Uygulamalı.
- gensim (Řehůřek ve Sojka 2010). (Başlangıç) Bu bölüm boyunca kullanılan kütüphane; word2vec öğreticisi, kendi metniniz üzerinde eğitilmiş bir modele giden en hızlı yol.
- fastText pretrained vectors (Grave vd. 2018). (Başlangıç) Türkçe dâhil 157 dil, Common Crawl ve Wikipedia üzerinde eğitilmiş. Kendinizinkini eğitmek yerine buradan başlayın.
- The Illustrated Word2vec, Jay Alammar (Alammar 2019) ve Sebastian Ruder’ın On Word Embeddings (Ruder 2016). (Başlangıç) İlki görsel açıklamalar, ikincisi kelime embedding’lerinin tarihsel ve yöntemsel gelişimi için yararlı tamamlayıcı okumalardır.
- TensorFlow Projector. (Başlangıç) Hazır bir word2vec kümesini tarayıcıda PCA, t-SNE ve UMAP ile gösteriyor; GloVe gibi başka vektörleri kendiniz (TSV olarak) yükleyebilirsiniz. Kendi alan terimlerinizi arayın ve komşuluklarını inceleyin.
3.18 Alıştırmalar
Her alıştırmanın başındaki etiket zorluk düzeyini gösteriyor: Temel kavramı pekiştirir, Uygulama kendi verinizde ölçüm yaptırır, İleri bölümün ötesine geçer, Araştırma ise açık uçludur.
- Küçük örneği farklı bir pencereyle inceleyin. (Temel) On cümlelik PPMI–SVD örneğini pencere 1 ve 4 için karşılaştırın; diğer ayarları sabit tutun. Hangi komşuluklar değişiyor? Değişimleri konusal ve işlevsel ilişkiler açısından yorumlayın; küçük derlemde beklenen eğilim görünmüyorsa bunu da raporlayın.
- Analojilerin sınırlarını inceleyin. (Uygulama) Beklenen yanıtı veren üç, vermeyen üç örnek seçin. Girdi normalleştirmesini ve aday filtresini sabit tutun; en yakın komşu temel yöntemiyle karşılaştırın. Başarısızlık için kapsam, ilişki türü veya puanlama kaynaklı açıklamalar önerin; yalnızca tek sıralamadan nedeni kesinleştirmeyin.
- Kendi alanınızı denetleyin. (Uygulama) Modelin diliyle uyumlu yirmi alan terimi seçin. Komşuları değerlendirirken “eş anlamlılık”, “aynı türden olma” veya “konusal ilişki” ölçütlerinden hangisini kullandığınızı baştan belirleyin. Listeleri tercihen frekans sırasını görmeden iyi/makul/zayıf olarak puanlayın. Sözlük dışı terimleri ayrıca sayın; kalanlarda frekans sırasıyla sıralı puanlar arasındaki Spearman korelasyonunu raporlayın. Yirmi terimlik sonucun keşif amaçlı olduğunu belirtin.
- Türkçe ve İngilizcede sözlük kapsamını karşılaştırın. (Uygulama) Konu, dönem ve ön işleme bakımından olabildiğince benzer iki derlem seçin. Her dil için sabit bir test kümesi ayırın; artan eğitim token sayılarında tip, hapax ve test OOV oranlarını ölçün. OOV öğrenme eğrilerinden aynı kapsama düzeyine ulaşmak için gereken veri miktarını karşılaştırın. Ölçülen aralığın dışına tahmin yapıyorsanız belirsizliği belirtin; yalnızca tip/token ve hapax oranından kesin token gereksinimi çıkarmayın.
- Ortalama almanın sınırını gösterin. (Temel) Kullandığınız embedding modelinin dilinde, aynı token’ları aynı sayıda içeren fakat sıra değişikliğiyle operasyonel anlamı farklılaşan iki cümle kurun. Matematiksel ortalamalarının neden aynı olduğunu açıklayın; varsa kayan nokta farklarını toleransla değerlendirin. Ardından bu temsilin hangi ilişkiyi kaybettiğini ve karar modelinin neden ek sıra veya bağlam bilgisine ihtiyaç duyduğunu anlatan bir paragraf yazın.
- TF-IDF ile yoğun temsilleri karşılaştırın. (İleri) TF-IDF ve yoğun adaylar için karşılaştırılabilir doğrulama bütçeleri belirleyin. doc2vec ayarlarını, farklı boyutları, SIF gibi ağırlıklı temsilleri (Arora vd. 2017) veya birleşimleri doğrulama kümesinde seçin. Test kümesini yalnızca nihai değerlendirmede kullanın. Kazanç elde ederseniz büyüklüğünü ve farklı bölünmelerdeki kararlılığını raporlayın; elde edemezseniz bunu da geçerli bir sonuç olarak tartışın.
- CBOW’u kendiniz uygulayın. (İleri) Bu bölümdeki NumPy örneğini CBOW ile genişletin. İki yöntemi aynı veri, pencere, negatif örnekleme düzeni ve açıkça belirtilmiş eğitim bütçesiyle karşılaştırın. Sıklık gruplarına göre başarı ve süreyi raporlayın; deneyden önce beklediğiniz farkı yazın. Ek ödev kullanacaksanız CS224N arşivindeki ilgili yılı ve doğrudan ödev bağlantısını belirtin.
- Bir çağrışım yönünü keşfedin. (Araştırma) Alanınızla ilgili bir yönü tanımlayan kelime çiftlerini ve değerlendireceğiniz terimleri önceden belirleyin. İzdüşümleri, seçtiğiniz yönün sınırlılıklarıyla birlikte raporlayın. Bu yönü kaldırdıktan sonra komşuluk ve kümeleme yapısını karşılaştırın. Grup etiketlerini işlemin sonucuna bakarak üretmeyin; bir sınıflandırıcı kullanırsanız eğitim ve değerlendirme kelimelerini ayırın. Küçük deneyinizi Gonen ve Goldberg’in çalışmasının (2019) birebir tekrarı olarak değil, o çalışmadan esinlenen bir keşif olarak sunun.
NotBeklenen gözlemler
Bu maddeler çözüm anahtarı değil, sonuçları yorumlamak için kontrol noktalarıdır:
- Pencere büyüklüğünün hangi komşulukları değiştirdiğini gösterin; on cümlelik örnekte konusal/işlevsel ayrımın belirgin olması zorunlu değildir.
- Analojilerde normalleştirme, aday filtresi ve temel yöntemin etkilerini ayırın; tek başarısızlığa kesin neden atamayın.
- Sıklık–kalite ilişkisinin yönünü, kapsamı ve küçük örneklem sınırını raporlayın; güçlü ilişki çıkmaması da sonuçtur.
- Türkçe–İngilizce OOV farkını ölçülen öğrenme eğrileriyle yorumlayın; gereken veri oranını önceden birkaç kat olarak varsaymayın.
- Aynı token çoklu kümesinin ortalaması matematiksel olarak aynıdır; kaybolan ilişkiyi açıklayın.
- Hiçbir adayın TF-IDF’i geçmemesi mümkündür. Karşılaştırmayı doğrulama/test ayrımı ve belirsizlikle raporlayın.
- CBOW ve skip-gram sıralaması veri ve eğitim bütçesine bağlıdır; sık ve nadir grupları ayrı gösterin.
- Bir yönü kaldırdıktan sonra başka ilişkiler kalabilir. Küçük deneyde bunun gözlenmesi veya gözlenmemesi, bütün toplumsal yanlılık hakkında kesin hüküm vermez.
3.19 Akılda kalması gerekenler
Bölüm bittiğinde aşağıdaki on iki cümleyi kendi kelimelerinizle söyleyebiliyorsanız, çekirdek öğrenme hedefine ulaşmışsınız demektir.
- One-hot kelime vektörleri kelimenin kimliğini temsil eder, ama kelimeler arasında paylaşılan hiçbir anlamsal yapı tanımlamaz.
- Dağılımsal hipotez, benzer bağlamlarda kullanılan kelimelerin benzer ya da ilişkili bilgi taşıdığı varsayımına dayanır.
- Bir kelime–bağlam eş-oluşum matrisinin satırları zaten birer dağılımsal kelime temsilidir.
- Ham eş-oluşum sayıları, sık kelimelerin marjinal frekansıyla gerçek birliktelik sinyalini karıştırır; PMI ve PPMI gözleneni bağımsızlık altında beklenenle karşılaştırır.
- Kesik SVD, yüksek boyutlu dağılımsal yapıyı düşük ranklı bir uzaya sıkıştırır ve tekrar eden örüntüleri öne çıkarabilir.
- Skip-gram merkez kelimeden bağlamı tahmin eder. Negatif örnekleme, tam softmax yerine gözlenen ve gürültü örnekleyicisinden gelen çiftleri ayıran bir eğitim amacı kurar; aynı çift iki yolla da oluşabilir.
- Burada kullanılan SGNS, merkez ve bağlam rolleri için iki kelime vektörü tablosu öğrenir. word2vec’in hiyerarşik softmax seçeneğinde çıktı parametreleri kelimeler yerine ağaç iç düğümlerine karşılık gelir.
- Negatif örneklemeli skip-gram ile PMI tabanlı matris çarpanlarına ayırma arasında güçlü bir matematiksel bağ vardır; ama gerçekte eğittiğiniz düşük boyutta ikisi aynı model değildir.
- GloVe, derlem geneli eş-oluşum sayımlarını doğrudan ağırlıklı bir regresyon amaç fonksiyonunun içinde kullanır.
- fastText kelime vektörünü karakter n-gram parçalarından kurduğu için sözlük dışı kelimelere ve biçimbilimsel değişkenliğe daha dayanıklıdır; bedeli, yazım benzerliğinin anlam benzerliğine karışabilmesidir.
- Statik kelime embedding’i, bir biçim için bağlamdan bağımsız tek vektör üretir. Farklı kullanımların izlerini taşıyabilir, fakat her yeni cümledeki anlama göre kendi başına farklı bir temsil seçmez.
- Embedding kalitesini yalnızca en yakın komşular, analoji ya da kosinüsle değerlendirmek yetmez; kapsama ile aşağı akıştaki görev başarımı birlikte ölçülmelidir.
Karşılaştırma bölümünde (Bölüm 4), burada TF-IDF lehine çıkan sınıflandırma sonucunun farklı dil, alan ve veri miktarında nasıl değiştiğini bir öğrenme eğrisi boyunca inceleyeceğiz.