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
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.4721Matematik
Gradyan
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.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:
- 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.
- 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?
- Gerekli değildir, rastgele bir seçim
- Çü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)
- y her zaman sıfır olmalıdır
- 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?
- Bir hesaplama hatası olduğunu
- 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)
- Fonksiyonun her yönde aynı hızda değiştiğini
- 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?
- Gradyanın yönünde, çünkü kayıp artırılmak istenir
- 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)
- Rastgele bir yönde
- 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.