Ana içeriğe geç

Orta7 dk

Logaritma ve üstel: neden her yerdeler

Önkoşul:Gradyan inişi

Kanca

Bir söylenti, her saat sadece 2 kişiye daha yayılsa, 10 saat sonra 1024 kişiye ulaşır. Peki 20 saat sonra kaç kişiye ulaşır — 2048 mi, yoksa başka bir şey mi?

Sezgi

Üstel (exponential) fonksiyon, bir şeyin her adımda aynı oranda katlanarak büyümesini (ya da küçülmesini) anlatır — ilk başta yavaş görünür ama hızla patlar. Logaritma ise, üstelin tam tersidir: “kaçıncı adımda bu sayıya ulaşırım?” sorusunu cevaplar.

Mekanizma

Katlanarak yayılan bir söylentiyi izleyelim:

Üstel büyüme: yavaş başlar, hızla patlar

# Üstel (exponential) fonksiyon, bir şeyin her adımda aynı oranda katlanarak
# büyümesini (ya da küçülmesini) anlatır. Örnek: bir söylenti, her saatte
# 2 kişiye daha yayılıyor olsun (katlanarak).
def ustel_yayilma(saat):
    return 2 ** saat

print("Saat  ->  Duyan kişi sayısı (2^saat)")
for saat in [0, 1, 2, 5, 10, 20]:
    print(f"  {saat:3d}   ->  {ustel_yayilma(saat):,}")

print("\nİlk 10 saatte sadece 1024 kişiye ulaşırken, 20. saatte bir milyonu aşıyor --")
print("üstel büyüme, ilk başta yavaş görünür ama hızla patlar.")
Saat  ->  Duyan kişi sayısı (2^saat)
    0   ->  1
    1   ->  2
    2   ->  4
    5   ->  32
   10   ->  1,024
   20   ->  1,048,576

İlk 10 saatte sadece 1024 kişiye ulaşırken, 20. saatte bir milyonu aşıyor --
üstel büyüme, ilk başta yavaş görünür ama hızla patlar.

Şimdi bunun tersini soralım: “2 üzeri kaç, 1024 eder?”

Logaritma = üstelin tersi

# Logaritma, üstel fonksiyonun tersidir: "kaçıncı adımda bu sayıya ulaşırım?"
# sorusunu cevaplar.
sayi = 1024
kacinci_adim = np.log2(sayi)
print(f"\n2 üzeri kaç, {sayi} eder? log2({sayi}) = {kacinci_adim}")
print(f"Doğrulama: 2^{kacinci_adim:.0f} = {2**int(kacinci_adim)}")

# Genel olarak: log(exp(x)) = x ve exp(log(x)) = x -- birbirinin tam tersidir.
x_test = 5.0
print(f"\nlog(exp({x_test})) = {np.log(np.exp(x_test)):.4f}  (x'e geri dönüyor)")
print(f"exp(log({x_test})) = {np.exp(np.log(x_test)):.4f}  (x'e geri dönüyor)")
print("Logaritma ve üstel, birbirini iptal eden iki işlemdir -- tıpkı toplama/çıkarma gibi.")

2 üzeri kaç, 1024 eder? log2(1024) = 10.0
Doğrulama: 2^10 = 1024

log(exp(5.0)) = 5.0000  (x'e geri dönüyor)
exp(log(5.0)) = 5.0000  (x'e geri dönüyor)
Logaritma ve üstel, birbirini iptal eden iki işlemdir -- tıpkı toplama/çıkarma gibi.

Matematik

Logaritmanın çarpmayı toplamaya çevirme özelliği
log⁡(a⋅b)=log⁡(a)+log⁡(b)\log(a \cdot b) = \log(a) + \log(b)

Bu özellik, logaritmanın ML’deki en pratik faydasının kaynağıdır: küçük olasılıkların çarpımı yerine, logaritmalarının toplamını almak, sayısal olarak çok daha kararlıdır.

Kod

Bunu gerçek bir sayısal sorunla gösterelim — küçük olasılıkları doğrudan çarpmak ne olur?

Çarpım sıfıra yuvarlanır, log-toplamı yuvarlanmaz

# Logaritmanın ML'de en önemli pratik faydası: çarpmayı toplamaya çevirmesi --
# log(a*b) = log(a) + log(b). Bu, sayısal kararlılık için kritiktir.
olasiliklar = np.full(400, 0.01)  # 400 tane küçük olasılık (örn. bir dilin kelime olasılıkları)

carpim_dogrudan = np.prod(olasiliklar)
print(f"\n400 tane 0.01 olasılığı doğrudan çarpınca: {carpim_dogrudan}")
print("Bu sıfıra yuvarlandı (float64'ün gösterebileceğinden daha küçük oldu) --")
print("bu, 'sayısal alt taşma' (underflow) denen bir sorundur.")

log_toplami = np.sum(np.log(olasiliklar))
print(f"\nAynı 400 olasılığın logaritmalarını toplayınca: {log_toplami:.4f}")
print("Bu sayı, gayet normal ve kullanılabilir bir sayı -- hiç alt taşma yok.")
print("\nİşte bu yüzden, ML modelleri (ve NLP kategorisindeki dil modelleri), olasılıkları")
print("doğrudan çarpmak yerine, logaritmalarını toplar -- 'log-olasılık' (log-likelihood).")

400 tane 0.01 olasılığı doğrudan çarpınca: 0.0
Bu sıfıra yuvarlandı (float64'ün gösterebileceğinden daha küçük oldu) --
bu, 'sayısal alt taşma' (underflow) denen bir sorundur.

Aynı 400 olasılığın logaritmalarını toplayınca: -1842.0681
Bu sayı, gayet normal ve kullanılabilir bir sayı -- hiç alt taşma yok.

İşte bu yüzden, ML modelleri (ve NLP kategorisindeki dil modelleri), olasılıkları
doğrudan çarpmak yerine, logaritmalarını toplar -- 'log-olasılık' (log-likelihood).
Sol tarafta katlanarak yükselen üstel fonksiyon grafiği, sağ tarafta yavaşça yükselen logaritma fonksiyonu grafiği.(grafiği tam boyutta, yeni sekmede aç)
Üstel (exp) fonksiyon hızla yükselir; logaritma (log) fonksiyonu yavaşça yükselir -- birbirinin ayna görüntüsü (tersi).

Nerede işe yarar

Logaritma ve üstel, kursun daha önce gördüğün birçok formülün içinde saklıydı:

  • Prompt Mühendisliği kategorisindeki softmax, üstel (exp) fonksiyonunu kullanarak, sayıları pozitif ve karşılaştırılabilir olasılıklara çevirir.
  • ML ve DL kategorilerindeki “çapraz entropi” (cross-entropy) kaybı, logaritma kullanır — tam olarak bu dersteki “log-olasılık” fikri.
  • Bu dersteki 400-olasılık örneği, dil modellerinin (NLP kategorisi) neden olasılıkları doğrudan çarpmak yerine, logaritmalarını topladığını gösteriyor.

Bu 2 hatayı yaparsın:

  1. Üstel büyümeyi “doğrusal büyümenin biraz hızlısı” sanmak — hayır, notebook’ta 10. saatte 1024 iken 20. saatte 1 milyonu aşıyor; üstel büyüme niteliksel olarak farklıdır.
  2. Logaritmayı “sadece matematik dersi konusu” sanmak — hayır, ML modellerinin sayısal olarak çökmeden çalışabilmesinin arkasındaki pratik araçtır.

Kendini test et

1. ustel-buyume-tanimi bloğunda 10. saatte 1024 kişi varken, 20. saatte sadece 2048 değil, 1,048,576 kişiye ulaşılıyor. Bu neden?
  1. Bir hesaplama hatası
  2. Üstel büyüme, her adımda aynı oranda (burada 2 katına) katlanır -- bu yüzden büyüme doğrusal değil, katlanaraktır; 10 adım daha eklemek, sayıyı 2^10=1024 katına çıkarır (doğru cevap)
  3. Söylenti yayılması durur ve sonra tekrar başlar
  4. 20. saat özel bir sayıdır

Neden: ustel-buyume-tanimi bloğunda bu açıkça belirtiliyor: 'üstel büyüme, ilk başta yavaş görünür ama hızla patlar'.

2. neden-log-kullanilir bloğunda 400 tane 0.01 olasılığı doğrudan çarpınca sıfır çıkıyor, ama logaritmalarını toplayınca -1842.07 (normal bir sayı) çıkıyor. Bu fark neden?
  1. Logaritma toplamı yanlış hesaplanmıştır
  2. float64 sayı tipi, çok küçük sayıları (400 tane 0.01'in çarpımı gibi) temsil edemez ve sıfıra yuvarlar (alt taşma) -- ama logaritmaları toplamak, aynı bilgiyi sayısal olarak kararlı bir sayıda saklar (doğru cevap)
  3. 0.01 sayısı özel bir durumdur
  4. NumPy bir hata vermelidir ama vermiyor

Neden: neden-log-kullanilir bloğunda bu açıkça belirtiliyor: doğrudan çarpım 0.0'a yuvarlanıyor ('sayısal alt taşma'), log-toplamı ise -1842.07 gibi kullanılabilir bir sayı veriyor.

3. ML ve DL kategorilerindeki 'çapraz entropi' (cross-entropy) kaybının logaritma kullanmasının pratik nedeni nedir?
  1. Sadece matematiksel gelenek
  2. Bir modelin tahmin olasılıklarını doğrudan çarpmak yerine logaritmalarını toplamak, bu dersteki 400-olasılık örneğindeki gibi, sayısal alt taşmayı önler (doğru cevap)
  3. Logaritma, hesaplamayı yavaşlatmak için kullanılır
  4. Çapraz entropi logaritma kullanmaz

Neden: kullanım bölümünde bu açıkça bağlanıyor: çapraz entropi kaybı, bu dersteki 'log-olasılık' fikrini kullanır.

Özet

Özet

  • Üstel fonksiyon, katlanarak büyümeyi (ya da küçülmeyi) anlatır -- ilk başta yavaş, sonra hızla patlar.
  • Logaritma, üstelin tam tersidir: log(exp(x))=x ve exp(log(x))=x.
  • Logaritmanın en pratik faydası: log(a·b) = log(a) + log(b) -- çarpmayı toplamaya çevirir.
  • Bu dersteki 400-olasılık örneği, doğrudan çarpımın sıfıra yuvarlandığını (alt taşma), log-toplamının ise kararlı kaldığını gösterdi.
  • Softmax (exp) ve çapraz entropi (log), bu dersteki fikirlerin, kursun ilerideki kategorilerindeki doğrudan uygulamalarıdır.
Sonraki adım: Matematik özet kartı →