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üyebilirsin. “En dik çıkış yönü” hangisi, tek bir sayı değil, bir sayı yığınıyla mı ifade edilir?

Sezgi

Birden fazla değişkeni olan bir fonksiyonun kısmi türevi, diğer değişkeni sabit tutup, sadece birine 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 dik çıkış yönünü gösterir.

Mekanizma

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

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

# Birden fazla değişkeni olan bir fonksiyonun (f(x,y)) kısmi türevi, diğer
# değişkeni sabit 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 sabit 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} sabit): (f({x0}+h,{y0}) - f({x0},{y0})) / h = {df_dx:.4f}")
print(f"df/dy (x={x0} sabit): (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 aynı: {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 sabit): (f(1.0+h,2.0) - f(1.0,2.0)) / h = 2.0001
df/dy (x=1.0 sabit): (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 aynı: True

Şimdi bu iki 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)=[∂f∂x,  ∂f∂y]\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ğiştiğini tam olarak açıklar.

Kod

Gradyanın gerçekten “en dik çıkış yönü” olduğunu, farklı yönlerin “yönlü türevini” hesaplayarak doğrulayalım:

Gradyan yönünde yönlü türev en büyüktür

# Gradyan, fonksiyonun en hızlı arttığı yönü gösterir. Bunu, farklı yönlerdeki
# "yönlü türevi" (directional derivative) hesaplayarak doğrulayalım --
# yönlü türev = gradyan ile yön vektörünün nokta çarpımıdır (4. ders!).
def yonlu_turev(yon_birim):
    return np.dot(gradyan, yon_birim)

gradyan_yonu = gradyan / np.linalg.norm(gradyan)  # gradyanın kendi yönü (normalize)
dik_yon = np.array([-gradyan[1], gradyan[0]]) / np.linalg.norm(gradyan)  # gradyana dik yön
zit_yon = -gradyan_yonu  # gradyanın tam tersi

print(f"\nGradyan yönündeki yönlü türev: {yonlu_turev(gradyan_yonu):.4f}  (en büyük -- ||gradyan||'a eşit)")
print(f"Gradyana dik yöndeki yönlü türev: {yonlu_turev(dik_yon):.4f}  (sıfıra 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 -- negatif)")
print("\nBu, gradyanın neden 'en dik çıkış yönü' olduğunu kanıtlıyor: 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 iniş) çıkıyor.")

Gradyan yönündeki yönlü türev: 4.4721  (en büyük -- ||gradyan||'a eşit)
Gradyana dik yöndeki yönlü türev: 0.0000  (sıfıra yakın/sıfır)
Gradyanın ters yönündeki yönlü türev: -4.4721  (en küçük -- negatif)

Bu, gradyanın neden 'en dik çıkış yönü' olduğunu kanıtlıyor: o yönde yönlü
türev en büyük, tam tersi yönde yönlü türev en küçük (en dik iniş) çıkıyor.
f(x,y)=x kare artı y kare fonksiyonunun eş-yükselti çizgileri ve bir noktadaki gradyan oku, çizgilere dik yönde.(grafiği tam boyutta, yeni sekmede aç)
Gradyan oku (turuncu), eş-yükselti çizgilerine (kontur) her zaman diktir -- ve fonksiyonun en hızlı 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 tersi yönünde (en dik iniş yönünde) güncellenir — çünkü amaç kaybı azaltmaktır, artırmak değil.
  • Bir sinir ağının milyonlarca parametresi olsa bile, gradyan, her parametre için bir kısmi türev içeren tek bir dev vektördür.
  • Bu dersteki “yönlü türev” fikri, 4. dersteki nokta çarpımın, gradyanla birleşince nasıl “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 farklı bir işlem” sanmak — hayır, sadece diğer değişkenleri sabit sayı gibi ele alıp, 9. dersteki aynı türev kurallarını uygulamaktır.
  2. Gradyanın “fonksiyonun değerini” gösterdiğini sanmak — hayır, gradyan bir yöndür (ve o yöndeki değişim hızıdır), fonksiyonun kendisi değil.

Kendini test et

1. kismi-turev-tanimi bloğunda df/dx hesaplanırken y=2.0 sabit tutuluyor. Bu neden gereklidir?
  1. Gerekli değildir, rastgele bir seçim
  2. Çünkü kısmi türev, sadece bir değişkenin fonksiyonu nasıl etkilediğini ölçer -- diğer değişkeni (y) sabit tutmazsak, x'in tek başına etkisini ayıramayız (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çıkça belirtiliyor: kısmi türev, 'Diğer değişkeni sabit 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 neyi kanıtlıyor?
  1. Bir hesaplama hatası olduğunu
  2. Gradyanın, fonksiyonun en hızlı arttığı yönü gösterdiğini -- o yönde yönlü türev en büyük değerini alırken, dik yönde fonksiyon (o an) hiç 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çıkç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 kanıtlıyor.

3. 12. dersteki gradyan inişinde, parametreler gradyanın yönünde mi yoksa tersi yönünde mi güncellenir, ve neden?
  1. Gradyanın yönünde, çünkü kayıp artırılmak istenir
  2. Gradyanın tersi yönünde -- çünkü gradyan 'en dik çıkış' (artış) yönünü gösterir, ama model eğitiminde amaç kaybı azaltmak olduğu için tam ters yöne (en dik iniş) gidilir (doğru cevap)
  3. Rastgele bir yönde
  4. Gradyanın yönü önemsizdir

Neden: kullanım bölümünde bu açıkça belirtiliyor: parametreler gradyanın tam tersi 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 dik çıktı.
  • Gradyan inişi (12. ders), parametreleri gradyanın tersi yönünde güncelleyerek kaybı azaltır.
Sonraki adım: Gradyan inişi →