Ana içeriğe geç

Orta8 dk

Kısmi türev ve gradyan

Önkoşul:Zincir kuralı (backprop'un kalbi)

Kanca

Bir dağın üzerinde durduğunu düşün — birden fazla yöne (kuzey, doğu) doğru YÜRÜYEBİLİRSİN. “En dik ÇIKIŞ yönü” hangisi, tek bir sayı DEĞİL, bir sayı yığınıyla mı ifade edilir?

Sezgi

Birden fazla değişkeni olan bir fonksiyonun KISMİ türevi, DİĞER değişkeni SABİT TUTUP, SADECE BİRİNE göre türev almaktır. GRADYAN ise, TÜM kısmi türevleri bir VEKTÖRDE toplayan bir yapıdır — ve bu vektör, fonksiyonun EN DİK ÇIKIŞ yönünü GÖSTERİR.

Mekanizma

f(x,y)=x2+y2f(x,y) = x^2 + y^2 fonksiyonunun bir noktadaki İKİ kısmi türevini hesaplayalım:

Kısmi türev: diğer değişkeni sabit tut

# Birden fazla DEĞİŞKENİ olan bir fonksiyonun (f(x,y)) KISMİ türevi, DİĞER
# değişkeni SABİT TUTUP, SADECE biri için türev almaktır.
def f(x, y):
    return x ** 2 + y ** 2

x0, y0 = 1.0, 2.0

# df/dx: y'yi SABİT TUT, sadece x'e göre türev al (9. dersteki gibi sonlu fark).
h_ = 0.0001
df_dx = (f(x0 + h_, y0) - f(x0, y0)) / h_
df_dy = (f(x0, y0 + h_) - f(x0, y0)) / h_

print(f"f(x,y) = x² + y², nokta: ({x0}, {y0})")
print(f"\ndf/dx (y={y0} SABİT): (f({x0}+h,{y0}) - f({x0},{y0})) / h = {df_dx:.4f}")
print(f"df/dy (x={x0} SABİT): (f({x0},{y0}+h) - f({x0},{y0})) / h = {df_dy:.4f}")
print(f"\nAnalitik: df/dx = 2x = {2*x0}, df/dy = 2y = {2*y0}")
print(f"Sonlu fark ile analitik AYNI: {np.isclose(df_dx, 2*x0, atol=0.01) and np.isclose(df_dy, 2*y0, atol=0.01)}")
f(x,y) = x² + y², nokta: (1.0, 2.0)

df/dx (y=2.0 SABİT): (f(1.0+h,2.0) - f(1.0,2.0)) / h = 2.0001
df/dy (x=1.0 SABİT): (f(1.0,2.0+h) - f(1.0,2.0)) / h = 4.0001

Analitik: df/dx = 2x = 2.0, df/dy = 2y = 4.0
Sonlu fark ile analitik AYNI: True

Şimdi bu İKİ kısmi türevi bir VEKTÖRDE (gradyan) birleştirelim:

Gradyan = kısmi türevlerin vektörü

# GRADYAN, TÜM kısmi türevleri bir VEKTÖRDE toplar: ∇f = [df/dx, df/dy].
# Bu, 2. derste gördüğün "vektör" fikrinin DOĞRUDAN bir uygulamasıdır.
gradyan = np.array([2 * x0, 2 * y0])
print(f"\nGradyan: ∇f({x0},{y0}) = [df/dx, df/dy] = {gradyan.tolist()}")
print(f"Gradyanın normu (3. ders): ||∇f|| = {np.linalg.norm(gradyan):.4f}")

Gradyan: ∇f(1.0,2.0) = [df/dx, df/dy] = [2.0, 4.0]
Gradyanın normu (3. ders): ||∇f|| = 4.4721

Matematik

Gradyan
f(x,y)=[fx,  fy]\nabla f(x, y) = \left[ \frac{\partial f}{\partial x}, \; \frac{\partial f}{\partial y} \right]

Gradyan, bir vektördür (2. ders) — ve bu vektörün UZUNLUĞU (3. ders) ile YÖNÜ (4. dersteki nokta çarpım), fonksiyonun o NOKTADA nasıl DEĞİŞTİĞİNİ TAM OLARAK açıklar.

Kod

Gradyanın GERÇEKTEN “en dik çıkış yönü” olduğunu, FARKLI yönlerin “yönlü türevini” hesaplayarak DOĞRULAYALIM:

Gradyan yönünde yönlü türev EN BÜYÜKTÜR

# GRADYAN, fonksiyonun EN HIZLI ARTTIĞI YÖNÜ gösterir. Bunu, FARKLI yönlerdeki
# "yönlü türevi" (directional derivative) hesaplayarak DOĞRULAYALIM --
# yönlü türev = gradyan İLE yön vektörünün NOKTA ÇARPIMIDIR (4. ders!).
def yonlu_turev(yon_birim):
    return np.dot(gradyan, yon_birim)

gradyan_yonu = gradyan / np.linalg.norm(gradyan)  # gradyanın KENDİ yönü (normalize)
dik_yon = np.array([-gradyan[1], gradyan[0]]) / np.linalg.norm(gradyan)  # gradyana DİK yön
zit_yon = -gradyan_yonu  # gradyanın TAM TERSİ

print(f"\nGradyan yönündeki yönlü türev: {yonlu_turev(gradyan_yonu):.4f}  (EN BÜYÜK -- ||gradyan||'a EŞİT)")
print(f"Gradyana DİK yöndeki yönlü türev: {yonlu_turev(dik_yon):.4f}  (SIFIRA yakın/sıfır)")
print(f"Gradyanın TERS yönündeki yönlü türev: {yonlu_turev(zit_yon):.4f}  (EN KÜÇÜK -- NEGATİF)")
print("\nBu, gradyanın NEDEN 'en dik çıkış yönü' olduğunu KANITLIYOR: o yönde yönlü")
print("türev EN BÜYÜK, tam tersi yönde yönlü türev EN KÜÇÜK (en dik İNİŞ) çıkıyor.")

Gradyan yönündeki yönlü türev: 4.4721  (EN BÜYÜK -- ||gradyan||'a EŞİT)
Gradyana DİK yöndeki yönlü türev: 0.0000  (SIFIRA yakın/sıfır)
Gradyanın TERS yönündeki yönlü türev: -4.4721  (EN KÜÇÜK -- NEGATİF)

Bu, gradyanın NEDEN 'en dik çıkış yönü' olduğunu KANITLIYOR: o yönde yönlü
türev EN BÜYÜK, tam tersi yönde yönlü türev EN KÜÇÜK (en dik İNİŞ) çıkıyor.
f(x,y)=x kare artı y kare fonksiyonunun eş-yükselti çizgileri ve bir noktadaki gradyan oku, çizgilere dik yönde.
Gradyan oku (turuncu), eş-yükselti çizgilerine (kontur) her zaman DİKTİR -- ve fonksiyonun EN HIZLI arttığı yönü gösterir.

Nerede işe yarar

Gradyan, ilerideki 12. dersin (ve TÜM model eğitiminin) DOĞRUDAN aracıdır:

  • Gradyan inişinde (12. ders), bir modelin parametreleri, gradyanın TAM TERSİ yönünde (en dik İNİŞ yönünde) GÜNCELLENİR — çünkü amaç kaybı AZALTMAKTIR, artırmak değil.
  • Bir sinir ağının MİLYONLARCA parametresi olsa BİLE, gradyan, HER parametre için BİR kısmi türev içeren TEK bir dev vektördür.
  • Bu dersteki “yönlü türev” fikri, 4. dersteki NOKTA ÇARPIMIN, gradyanla birleşince NASIL “hangi yöne gidersem ne kadar hızlı değişir” sorusuna cevap verdiğini gösteriyor.

Bu 2 hatayı yaparsın:

  1. Kısmi türevi “normal türevden FARKLI bir işlem” sanmak — HAYIR, SADECE diğer değişkenleri SABİT SAYI gibi ele alıp, 9. dersteki AYNI türev kurallarını uygulamaktır.
  2. Gradyanın “fonksiyonun DEĞERİNİ” gösterdiğini sanmak — HAYIR, gradyan bir YÖNDÜR (ve o yöndeki değişim HIZIDIR), fonksiyonun kendisi DEĞİL.

Kendini test et

1. kismi-turev-tanimi bloğunda df/dx hesaplanırken y=2.0 SABİT tutuluyor. Bu NEDEN gereklidir?
  1. Gerekli değildir, rastgele bir seçim
  2. Çünkü kısmi türev, SADECE BİR değişkenin fonksiyonu NASIL etkilediğini ölçer -- diğer değişkeni (y) sabit tutmazsak, x'in TEK BAŞINA etkisini AYIRAMAYIZ (doğru cevap)
  3. y her zaman sıfır olmalıdır
  4. Bu sadece hesaplama kolaylığı içindir, matematiksel gerekçesi yoktur

Neden: kismi-turev-tanimi bloğunun açıklamasında bu AÇIKÇA belirtiliyor: kısmi türev, 'DİĞER değişkeni SABİT TUTUP, SADECE biri için türev almaktır'.

2. en-dik-yon-dogrulama bloğunda gradyan yönündeki yönlü türev 4.4721 (EN BÜYÜK), gradyana dik yönde 0.0 çıkıyor. Bu NEYİ kanıtlıyor?
  1. Bir hesaplama hatası olduğunu
  2. Gradyanın, fonksiyonun EN HIZLI arttığı YÖNÜ gösterdiğini -- o yönde yönlü türev EN BÜYÜK değerini alırken, DİK yönde fonksiyon (o an) HİÇ değişmiyor (doğru cevap)
  3. Fonksiyonun her yönde aynı hızda değiştiğini
  4. Gradyanın rastgele bir vektör olduğunu

Neden: en-dik-yon-dogrulama bloğunun sonunda bu AÇIKÇA belirtiliyor: gradyan yönünde yönlü türev EN BÜYÜK, tersinde EN KÜÇÜK, gradyanın 'en dik çıkış yönü' olduğunu KANITLIYOR.

3. 12. dersteki gradyan inişinde, parametreler gradyanın YÖNÜNDE mi yoksa TERSİ yönünde mi güncellenir, ve NEDEN?
  1. Gradyanın yönünde, çünkü kayıp artırılmak istenir
  2. Gradyanın TERSİ yönünde -- çünkü gradyan 'en dik ÇIKIŞ' (artış) yönünü gösterir, ama model eğitiminde amaç kaybı AZALTMAK olduğu için TAM TERS yöne (en dik İNİŞ) gidilir (doğru cevap)
  3. Rastgele bir yönde
  4. Gradyanın yönü önemsizdir

Neden: kullanım bölümünde bu AÇIKÇA belirtiliyor: parametreler gradyanın TAM TERSİ yönünde güncellenir, çünkü amaç kaybı azaltmaktır.

Özet

Özet

  • Kısmi türev, diğer değişkenleri sabit tutup, sadece birine göre türev almaktır.
  • Gradyan (∇f), tüm kısmi türevleri bir vektörde toplar -- ve fonksiyonun en dik çıkış yönünü gösterir.
  • Yönlü türev (gradyan ile bir yön vektörünün nokta çarpımı), gradyan yönünde EN BÜYÜK değerini alır.
  • Bu dersteki f(x,y)=x²+y² örneğinde gradyan (2,4), eş-yükselti çizgilerine DİK çıktı.
  • Gradyan inişi (12. ders), parametreleri gradyanın TERSİ yönünde güncelleyerek kaybı azaltır.
Sonraki adım: Gradyan inişi →