Sıradaki

Zincir kuralı

Zorluk: Kolay

kalkülüs

İç içe iki fonksiyonun türevi (derivative), her birinin türevinden kurulur. Bu kurala zincir kuralı (chain rule) denir. h(x)=f(g(x))h(x) = f(g(x)) için:

h′(x)=f′(g(x))⋅g′(x)h'(x) = f'(g(x)) \cdot g'(x)

Yani dış fonksiyonun türevi xx‘te değil, iç fonksiyonun çıktısı olan g(x)g(x)‘te hesaplanır. Sonuç, iç fonksiyonun xx‘teki türeviyle çarpılır.

chain_rule(outer, inner, x) fonksiyonunu yaz. Girdiler şunlardır:

  • outer: dış fonksiyonu ve türevini taşıyan bir (f, df) demeti (tuple).
  • inner: iç fonksiyonu ve türevini taşıyan bir (g, dg) tuple’ı.
  • x: tek bir sayı.

f, df, g ve dg, tek bir sayı alıp tek bir sayı döndüren Python fonksiyonlarıdır. hh‘nin xx noktasındaki türevini tek bir float olarak döndür.

Test durumlarında her tuple bir isimle verilir. Testler her ismi (fonksiyon, türevi) tuple’ına çevirir. İkisini outer ile inner olarak senin fonksiyonuna verir:

İsimFonksiyonTürevi
'kare'x2x^22x2x
'küp'x3x^33x23x^2
'3x+1'3x+13x + 133
'sin'sin⁡x\sin xcos⁡x\cos x
'exp'exe^xexe^x
'tanh'tanh⁡x\tanh x1−tanh⁡2x1 - \tanh^2 x

Örnekler

Girdi: outer = 'kare', inner = '3x+1', x = 2.0
Çıktı: 42.0

Girdi: outer = 'küp', inner = '3x+1', x = 0.0
Çıktı: 9.0

Girdi: outer = 'exp', inner = 'kare', x = -1.5
Çıktı: -28.46320750907558

İpucu 1

f, df = outer ve g, dg = inner ile dört fonksiyona ayrı adlarla ulaşabilirsin. Formülde hangilerinin geçtiğine bak.

İpucu 2

f′(g(x))f'(g(x)), df’in xx‘te değil iç fonksiyonun çıktısında çağrılması demektir. Önce g’yi çağır ve çıktısını bir değişkene koy.

İpucu 3

Zincir kuralı, elindeki iki sayının çarpımıdır. Bu sayılar df’in g(x)g(x)‘teki değeri ve dg’nin xx‘teki değeridir.

Gereksinimler

  • outer ve inner, (fonksiyon, türevi) biçiminde birer tuple’dır. outer = (f, df) ve inner = (g, dg). x tek bir sayıdır.
  • Dönüş değeri tek bir float: tuple ya da array değil. np.float64 de kabul edilir. float(...) ile çevirmek zorunda değilsin.
  • df, xx‘te değil g(x)g(x)‘te çağrılır. dg ise xx‘te çağrılır.

Değişim iki adımda iletilir, bu yüzden toplam oran iki oranın çarpımıdır.

  1. xx biraz değişince g(x)g(x), bu değişimin g′(x)g'(x) katı kadar değişir.
  2. g(x)g(x) değişince de ff, onun f′(g(x))f'(g(x)) katı kadar değişir.

h(x)=(3x+1)2h(x) = (3x + 1)^2 ve x=2x = 2 için hesap şöyledir:

  1. İç fonksiyon: g(2)=7g(2) = 7.
  2. Dış türev: f′(7)=2⋅7=14f'(7) = 2 \cdot 7 = 14.
  3. İç türev: g′(2)=3g'(2) = 3.
  4. Çarpım: h′(2)=14⋅3=42h'(2) = 14 \cdot 3 = 42.

Parantezi açarak kontrol edebilirsin. h(x)=9x2+6x+1h(x) = 9x^2 + 6x + 1, h′(x)=18x+6h'(x) = 18x + 6 ve h′(2)=42h'(2) = 42.

Bir sinir ağı da iç içe geçmiş fonksiyonlardan oluşur. Her layer bir öncekinin çıktısını girdi olarak alır.

Geri yayılım (backpropagation), kaybın (loss) bir parametreye göre türevini hesaplar. Zinciri uçtan başa doğru izler ve her halkada bir çarpma ekler.

Daha fazlası için Geri yayılım dersine bak.

df iç fonksiyonun çıktısında, dg ise x’te çağrılır.

  1. İç fonksiyonu xx‘te çalıştır.
  2. Dış türevi bu çıktıda hesapla.
  3. İç türevle çarp.
def chain_rule(outer: tuple, inner: tuple, x: float) -> float:    _, df = outer    g, dg = inner    return float(df(g(x)) * dg(x))

Sık yapılan hata, dış türevi xx‘te hesaplamaktır:

  • df(x) * dg(x), 'kare' ve '3x+1' ile x=2x = 2 için 4⋅3=124 \cdot 3 = 12 verir.
  • Doğrusu 14⋅3=4214 \cdot 3 = 42‘dir.
  • Dış fonksiyonun girdisi xx değil, iç fonksiyonun çıktısıdır.

Bu problemde bir sorun mu var?

solution.py
def chain_rule(outer: tuple, inner: tuple, x: float) -> float:    """İç içe iki fonksiyonun türevini zincir kuralıyla hesaplar."""    # Kodunu buraya yaz.    return 0.0

İçindekiler

Geri bildirim

Tür