30 Ocak 2025 Perşembe

Matris Özdeğer Dağılımı ve YSA Katman Ağırlıkları Analizi

 Özdeğer ve Özmatris Nedir?

Bir matrisin özdeğerleri (eigenvalues), matrisin temel özelliklerini yansıtan özel skalar değerlerdir. Eğer bir AA karesel matrisinin bir vv özvektörü (eigenvector) ve λ\lambda özdeğeri varsa, şu denklemi sağlar:

Av=λvA v = \lambda v

Burada AA, vv vektörünü sadece ölçeklendirir (büyütür veya küçültür) ama yönünü değiştirmez. Özmatris (eigenmatrix) ise, özvektörleri bir araya getiren bir matristir. Özdeğerler ve özmatrisler, bir sistemin temel yapısını ve dönüşüm özelliklerini anlamada kritik rol oynar. Özdeğerler, PCA ile veri boyutu dönüştürmede kullanılmaktadır; bu konuda yıllar evvel yazdığım ve blogumun ilk yazısı olan "Hiperspektral Görüntülerde PCA ile Boyut İndirme" başlıklı yazıya bu linkten ulaşabilirsiniz.


Özdeğer Dağılımının Önemi ve Makine Öğrenmesindeki Rolü

Özdeğer dağılımı, matrisin yapısını anlamamızı sağlar ve birçok farklı alanda uygulanır. Özellikle makine öğrenmesinde, sinir ağı ağırlık matrislerinin özdeğer spektrumlarını analiz etmek, ağın ögrenme kapasitesini, ve overfitting riskini belirlemeye yardımcı olabilir. Örneğin, rastgele ağırlık matrislerinin özdeğer dağılımı, ağın lineer dinamiklerini anlamamıza yardımcı olur. Güç yasası dağılımı, iyi genelleşen sinir ağlarının özdeğer spektrumlarının belirli aralıklarda kaldığını göstermektedir. Bu nedenle, özdeğer analizinin derin öğrenme modellerinde kullanılması önemli bir araştırma konusudur.

Örnek: Bir Matrisin Özdeğerlerini Hesaplamak


import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eigvals
from scipy.stats import linregress

# 1. Rastgele bir matris oluştur
np.random.seed(25)
A = np.random.randn(100, 100)  # 100x100 rastgele matris

# 2. Özdeğerleri hesapla
eigenvalues = np.abs(eigvals(A))  # Negatif ve karmaşık sayıları sorun yaratmaması için mutlak değer al

# 3. Özdeğer histogramını çiz
plt.figure(figsize=(6,4))
plt.hist(eigenvalues, bins=30, density=True, alpha=0.7, color='blue')
plt.xlabel("Özdeğer Büyüklüğü (|λ|)")
plt.ylabel("Yoğunluk")
plt.title("Özdeğer Dağılımı Histogramı")
plt.grid()
plt.show()


Güç Yasası ve Log-Log Dönüşümünün Gerekliliği

Kompleks bir sistemde büyük ve küçük ölçekli değişkenler arasındaki ilişki P(λ)λαP(\lambda) \sim \lambda^{-\alpha} formundadır (Güç yasası dağılımı). Ancak, bu dağılım lineer olmayan bir yapı gösterdiği için doğrudan analiz edilmesi zordur. Logaritmik dönüşüm uygulayarak, güç yasasını doğrusal bir eğim olarak görebilir ve regresyon analizi ile α\alpha değerini tahmin edebiliriz.

Güç yasası dağılımları şu şekilde modellenir:

P(λ)λα

Bu ifadeyi logaritmaya alırsak:

logP(λ)=αlogλ+C\log P(\lambda) = -\alpha \log \lambda + C

Bu, formunda doğrusal bir denklem haline gelir.
Bu yüzden, güç yasasının eğimini (α\alpha) bulmak için log-log dönüşümü gereklidir.

Eğer lineer ölçek kullansaydık, büyük özdeğerler küçükleri baskılar ve dağılımı düzgün göremeyebilirdik. Log-log dönüşümü sayesinde büyük ve küçük değerler daha iyi temsil edilir, böylece dağılımı daha adil bir şekilde inceleyebiliriz.

Aşağıdaki kod, log-log ölçekli histogramı oluşturur ve güç yasası parametresi α'yı regresyon ile tahmin eder:

# 1. Histogram için log-log ölçeğe uygun binler oluştur
hist, bin_edges = np.histogram(eigenvalues, bins=np.logspace(np.log10(min(eigenvalues)), np.log10(max(eigenvalues)), 30), density=True)

# 2. Log-log dönüşümü uygula
log_bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2
log_x = np.log10(log_bin_centers)
log_y = np.log10(hist)

# 3. Lineer regresyon ile güç yasası eğimini bul
valid = ~np.isnan(log_y) & ~np.isinf(log_y)  # Geçerli noktaları filtrele
slope, intercept, _, _, _ = linregress(log_x[valid], log_y[valid])
alpha = -slope  # Güç yasası α değeri

# 4. Log-log histogramı çiz ve regresyon doğrusunu ekle
plt.figure(figsize=(6,4))
plt.scatter(log_x, log_y, label="Özdeğer Dağılımı", color='blue', s=10)
plt.plot(log_x, slope * log_x + intercept, label=f"Regresyon (α={alpha:.2f})", color='red')
plt.xlabel("log(λ)")
plt.ylabel("log(P(λ))")
plt.title("Log-Log Dönüşümlü Özdeğer Dağılımı ve Güç Yasası")
plt.legend()
plt.grid()
plt.show()

print(f"Hesaplanan α değeri: {alpha:.2f}")



Aşağıdaki Python kodu, güç yasası dağılımlarını hem log-log ölçeğinde hem de lineer ölçekle çizdirmektedir:

import numpy as np
import matplotlib.pyplot as plt

# Define power law function
def power_law(x, alpha):
    return x ** -alpha

# Generate x values
x = np.linspace(1, 10, 10)  # Lineer ölçek için x değerleri
x_log = np.logspace(0.1, 2, 100)  # Log-log ölçek için x değerleri

# Define alpha values
alphas = [2, 3, 4, 5, 6]

# Create subplots
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# Linear scale plot
for alpha in alphas:
    y = power_law(x, alpha)
    axes[0].plot(x, y, label=f'α = {alpha}')
axes[0].set_xlabel('x (linear scale)')
axes[0].set_ylabel('P(x) (linear scale)')
axes[0].set_title('Power Law - Linear Scale')
axes[0].legend()
axes[0].grid(True)

# Log-log scale plot
for alpha in alphas:
    y_log = power_law(x_log, alpha)
    axes[1].plot(x_log, y_log, label=f'α = {alpha}')
axes[1].set_xscale('log')
axes[1].set_yscale('log')
axes[1].set_xlabel('x (log scale)')
axes[1].set_ylabel('P(x) (log scale)')
axes[1].set_title('Power Law - Log-Log Scale')
axes[1].legend()
axes[1].grid(True, which="both", linestyle="--", linewidth=0.5)

plt.tight_layout()
plt.show()



Bu kod, farklı α değerleri için lineer ve log-dönüşüm kullanılarak elde edilen verileri görselleştirmektedir. Log dönüşümü ile küçük ve büyük değerler daha dengeli bir şekilde gösterilmektedir. Bu bağlamda, α değerlerini şu şekilde yorumlayabiliriz:

α<2:

  • Bu durumda güç yasası yavaşça azalır, yani küçük xx değerleri için P(x)P(x) çok yüksek olabilir. Bu tür düşük α\alpha değerleri genellikle nadiren görülür, ancak log-log dönüşümü ile bu küçük xx değerleri daha dengeli bir şekilde gösterilebilir. Bu, uç değerlerin etkisini dengeleyerek daha anlamlı bir analiz sağlar.

2α3:

  • Bu aralık, güç yasasının tipik bir şekilde azaldığı bölgedir. Burada P(x)P(x), xx arttıkça düzenli bir şekilde azalır ve log-log grafik üzerinde doğrusal bir ilişki gözlemlenir. Bu tür α\alpha değerleri, çoğu sistemde yaygın olarak görülen güç yasasına uygun davranışlar sergiler.

α>4:

  • Bu durumda güç yasası çok hızlı bir şekilde azalır, yani büyük xx değerleri çok hızlı bir şekilde sıfıra yaklaşır. Bu tür yüksek α\alpha değerleri, genellikle uç değerlerin (outliers) baskın olduğu durumlarla ilişkilidir. Log-log dönüşüm, bu hızlı azalmayı daha belirgin bir şekilde gösterir ve büyük xx değerlerinde önemli farklar ortaya çıkar.

YSA ağırlıkları için Kuvvet Yasası Üssünün (𝛼) Yorumlanması  

YSA katmanlarının ağırlıklarını analiz etmek için genellikle ilk adım, ağırlık matrisini kare forma dönüştürmektir. Bunun için, ağırlık matrisinin transpozesi ile çarpılarak bir korelasyon matrisi oluşturulur. Korelasyon matrisi, ağırlıklar arasındaki ilişkileri incelememize olanak tanır. Bu korelasyon matrisinin özdeğer analizi, modelin genelleme kapasitesini ve öğrenme sürecindeki potansiyel sorunları (aşırı öğrenme veya yetersiz öğrenme gibi) anlamamıza yardımcı olur. Bu analiz, özellikle modelin hangi katmanlarının öğrenmeye daha fazla katkıda bulunduğunu ve hangi katmanların daha fazla düzenlemeye ihtiyaç duyduğunu tespit etmek için oldukça faydalıdır. Bu kapsamda, güç yasası üssü (α) bir yapay sinir ağının (YSA) katmanlarının ağırlıklarını yorumlamak için kullanılabilir. Bu üs, ağın genelleme yeteneğini anlamamıza yardımcı olur ve farklı α değerleri, modelin nasıl davrandığını ve eğitim sürecinin nasıl şekillendiğini gösterir.



WeightWatcher


WeightWatcher, Derin Sinir Ağlarını (DNN) analiz etmek için kullanılan açık kaynaklı bir aractır. Bu araç, eğitim veya test verilerine erişim olmadan ağın ağırlık dağılımlarını incelememizi sağlar. WeightWatcher, Heavy-Tailed Self-Regularization (HT-SR) teorisi ve bununla ilgili teorik araştırmalara dayanmaktadır. WeightWatcher, ağın farklı katmanlarındaki ağırlıkların gücünü ölçen ve modelin genelleme kapasitesini anlamamıza yardımcı olan istatistiksel yöntemler uygular. Bu araç, Power-law dağılımını ve bu dağılımdaki α değerini analiz ederek modelin overfitting (aşırı öğrenme) veya underfitting (yetersiz öğrenme) yapıp yapmadığını belirlememize olanak tanır. Eğitim sırasında ağırlıkların nasıl değiştiğini izleyerek, modelin genel performansını daha iyi anlamamıza yardımcı olur.

Hiç yorum yok:

Yorum Gönder