13. Zincir Kuralı (Chain Rule)

    MatematikKalkülüs

    Bir fiyat önce vergiyle, sonra indirimle değiştiğinde, başlangıçtaki küçük bir değişiklik son fiyatı nasıl etkiler? Zincir Kuralı (Chain Rule), birbirine bağlı işlemlerde bu etkiyi hesaplamamızı sağlar. Aynı fikir, bir yapay sinir ağındaki hatanın milyonlarca ayara kadar geri taşınmasında da karşımıza çıkar. Bu makalede bileşke fonksiyonlardan başlayacağız. Etkilerin neden çarpıldığını, sonuca giden birden fazla yol varsa katkıların neden toplandığını adım adım göreceğiz. Ardından Zincir Kuralının yapay zekâdaki geri yayılımın temelini nasıl oluşturduğunu inceleyeceğiz.

    Bir Değişim Kaç Aşamadan Geçebilir?

    Bir ürünün etiket fiyatını düşünelim. Mağaza önce fiyata vergi eklesin, ardından oluşan tutara indirim uygulasın. Etiket fiyatındaki değişiklik kasadaki tutarı doğrudan değil, iki ayrı işlemden geçerek etkiler:

    $$ \text{Etiket fiyatı} \longrightarrow \text{Vergili fiyat} \longrightarrow \text{İndirimli fiyat} $$

    Etiket fiyatı biraz artarsa vergili fiyat da artar. Vergili fiyattaki bu artış, son aşamaya taşınarak indirimli fiyatı değiştirir. Sonucun ne kadar değişeceğini bulmak için iki aşamanın etkisini birlikte ele almamız gerekir.

    Matematikte de çok sayıda işlem böyle bir zincir oluşturur. Örneğin önce bir sayının karesini alabilir, sonra sonuca 1 ekleyebilir, en sonunda da oluşan ifadenin sinüsünü hesaplayabiliriz. Başlangıçtaki sayı değiştiğinde zincirdeki bütün ara sonuçlar değişir.

    Bir önceki Gradyan ve Kısmi Türevler makalesinde her girdinin etkisini, diğerlerini sabit tutarak ölçmüştük. Girdiler birbirine bağlıysa birindeki değişim diğerlerini de hareket ettirir. Bu etkileri izlemek için Zincir Kuralını kullanırız.

    Önce Bileşke Fonksiyonları Hatırlayalım

    Fonksiyonlar makalesinde bir fonksiyonun çıktısını başka bir fonksiyonun girdisi yapabildiğimizi görmüştük. Buna bileşke fonksiyon diyorduk.

    Örneğin ilk fonksiyonumuz bir sayıyı üçle çarpıp 2 eklesin:

    $$ g(x)=3x+2 $$

    İkinci fonksiyonumuz da kendisine verilen sayının karesini alsın:

    $$ f(u)=u^2 $$

    Önce \(g\), ardından \(f\) çalışırsa \(x\) sayısı şu yolu izler:

    $$ x \longrightarrow u=3x+2 \longrightarrow y=u^2 $$

    İki işlemi tek satırda yazdığımızda:

    $$ y=f(g(x))=(3x+2)^2 $$

    elde ederiz. \(f(g(x))\), “önce \(g\)'yi, sonra onun çıktısına \(f\)'yi uygula” diye okunur. Burada \(u\), iki işlem arasındaki ara sonucu adlandırmak için kullandığımız geçici bir değişkendir.

    Bu iki aşamalı işlemde \(x\)'teki küçük bir değişikliğin \(y\)'ye ne kadar yansıyacağını hesaplayalım.

    Değişim Oranları Neden Çarpılır?

    Önce sayılarla düşünelim. Bulunduğumuz noktanın çok yakınında, \(x\)'teki küçük bir değişikliğin \(u\)'ya yaklaşık 3 katı büyüklüğünde yansıdığını varsayalım. \(u\)'daki küçük bir değişiklik de \(y\)'ye yaklaşık 8 katı büyüklüğünde yansısın. \(x\)'teki değişimin büyüklüğünü karşılaştırma amacıyla 1 kabul edersek zincirin sonundaki ölçek çarpanı:

    $$ 1\times3\times8=24 $$

    Böylece aynı noktaya çok yakınken \(x\)'teki küçük değişim \(y\)'ye yaklaşık 24 katı büyüklüğünde yansır. İlk aşama 3, ikinci aşama 8 katına çıkardığı için etkileri çarparız.

    Aynı düşünceyi küçük değişimlerle yazalım. \(x\)'teki küçük değişime \(\Delta x\) diyelim. \(\Delta\), “değişim” anlamına gelen Yunan harfidir. İlk aşamada:

    $$ \Delta u\approx\frac{du}{dx}\Delta x $$

    \(\frac{du}{dx}\), “\(x\) değişirken \(u\) hangi hızla değişiyor?” sorusunun cevabıdır. İkinci aşamada ise:

    $$ \Delta y\approx\frac{dy}{du}\Delta u $$

    olur. İlk satırdaki \(\Delta u\) ifadesini ikinci satırda yerine koyarsak:

    $$ \Delta y \approx \frac{dy}{du} \frac{du}{dx} \Delta x $$

    elde ederiz. Değişimleri giderek küçültüp anlık değişim oranına geçtiğimizde Zincir Kuralının temel biçimine ulaşırız:

    $$ \frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx} $$

    Zincir Kuralının özü: Aynı yol üzerinde art arda gelen yerel etkiler çarpılır. Bir değişiklik her aşamada yeniden ölçeklendiği için sonuç bir çarpımdır.

    İlk Örneği Adım Adım Çözelim

    Şimdi biraz önce kurduğumuz fonksiyonun türevini bulalım:

    $$ y=(3x+2)^2 $$

    İçteki ifadeye \(u\) diyelim:

    $$ u=3x+2 $$

    Böylece dışarıda yalnızca \(y=u^2\) kalır. Önce dış fonksiyonun \(u\)'ya göre türevini alalım:

    $$ \frac{dy}{du}=2u $$

    Sonra iç fonksiyonun \(x\)'e göre türevini bulalım:

    $$ \frac{du}{dx}=3 $$

    Zincir Kuralı bu iki yerel etkiyi çarpmamızı söyler:

    $$ \begin{aligned} \frac{dy}{dx} &=\frac{dy}{du}\frac{du}{dx} \\ &=2u\cdot3 \\ &=2(3x+2)\cdot3 \\ &=6(3x+2) \\ &=18x+12 \end{aligned} $$

    Önce dıştaki karenin türevini aldık ve içerideki \(3x+2\) ifadesini olduğu gibi bıraktık. Ardından içteki ifadenin türevi olan 3 ile çarptık.

    Sonucu başka bir yoldan kontrol edebiliriz. Önce parantezin karesini açarsak:

    $$ (3x+2)^2=9x^2+12x+4 $$

    Bu polinomun türevi de \(18x+12\)'dir. Basit bir örnekte parantezi açarak sonucu kontrol edebildik; uzun zincirlerde aynı işlem çok zahmetli, kimi zaman da imkânsız olabilir.

    Pratik Yöntem: Dışarıdan İçeriye

    Tek değişkenli bir bileşke fonksiyonu türevlerken şu sırayı izleyebiliriz:

    1. En dıştaki işlemi belirle.
    2. Dış işlemin türevini al; içindeki ifadeyi şimdilik olduğu gibi bırak.
    3. İçteki ifadenin türeviyle çarp.
    4. Daha içeride başka bir fonksiyon varsa aynı işlemi sürdür.

    Örneğin:

    $$ f(x)=(x^2+1)^5 $$

    ifadesinde en dıştaki işlem beşinci kuvvettir. Beşinci kuvvetin türevi dışarıya 5 getirir ve kuvveti bir azaltır:

    $$ 5(x^2+1)^4 $$

    Fakat işlem henüz bitmedi. İçteki \(x^2+1\) ifadesinin türevi \(2x\)'tir. Bu nedenle:

    $$ f'(x)=5(x^2+1)^4\cdot2x $$

    ve sadeleştirince:

    $$ f'(x)=10x(x^2+1)^4 $$

    olur. Zincir Kuralında en sık unutulan parça, en sonda çarptığımız iç fonksiyonun türevidir.

    Zincir Üç Katmanlıysa Ne Olur?

    Fonksiyonların yalnızca iki katmanı olması gerekmez. Şu örneğe bakalım:

    $$ y=\sin\left((x^2+1)^3\right) $$

    Bu fonksiyon üç aşamada kurulmuştur:

    $$ x \longrightarrow u=x^2+1 \longrightarrow v=u^3 \longrightarrow y=\sin(v) $$

    Başlangıçtaki \(x\)'ten sondaki \(y\)'ye ulaşmak için yol üzerindeki üç türevi çarparız:

    $$ \frac{dy}{dx} = \frac{dy}{dv} \frac{dv}{du} \frac{du}{dx} $$

    Bu üç yerel türev sırasıyla şöyledir:

    $$ \frac{dy}{dv}=\cos(v), \qquad \frac{dv}{du}=3u^2, \qquad \frac{du}{dx}=2x $$

    Hepsini birleştirip \(u\) ve \(v\)'yi yeniden \(x\) cinsinden yazarsak:

    $$ \begin{aligned} \frac{dy}{dx} &=\cos(v)\cdot3u^2\cdot2x \\ &=6x(x^2+1)^2\cos\left((x^2+1)^3\right) \end{aligned} $$

    Üç katmanda da aynı hesabı yaptık: Dışarıdan içeriye ilerleyip her katmanın yerel türevini çarptık. Zincir uzadığında bu işlemi sürdürürüz.

    Üstel, Logaritmik ve Trigonometrik Fonksiyonlar

    Üstel ve Logaritmik Fonksiyonlar ile Trigonometri makalelerinde tanıdığımız fonksiyonların içine başka bir fonksiyon yerleştirdiğimizde de yerel türevleri çarparız.

    Örneğin \(e^x\)'in türevi yine \(e^x\)'tir. Fakat üstte yalnızca \(x\) değil, \(x^2\) varsa iç fonksiyonun türevini de hesaba katmalıyız:

    $$ \frac{d}{dx}e^{x^2} =e^{x^2}\cdot2x =2xe^{x^2} $$

    Doğal logaritmada genel yapı şöyledir:

    $$ \frac{d}{dx}\ln(g(x)) = \frac{g'(x)}{g(x)} $$

    Örneğin \(g(x)=3x+2\) seçersek:

    $$ \frac{d}{dx}\ln(3x+2) = \frac{3}{3x+2} $$

    Burada bir koşulu unutmamalıyız: Gerçek sayılarda \(\ln(3x+2)\) yalnızca \(3x+2>0\), yani \(x>-\frac{2}{3}\) olduğunda tanımlıdır. Türev kuralı, fonksiyonun tanımlı olmadığı noktaları kullanılabilir hâle getirmez.

    Sinüs için dış fonksiyonun türevi kosinüstür:

    $$ \frac{d}{dx}\sin(g(x)) = \cos(g(x))g'(x) $$

    Bu nedenle:

    $$ \frac{d}{dx}\sin(5x) =5\cos(5x) $$

    olur. Trigonometrik türev formüllerinin bu biçimde geçerli olması için açıların radyanla ölçüldüğünü de hatırlayalım.

    Bir Soruda Birden Fazla Türev Kuralı

    Bir fonksiyonun içinde hem bileşke hem de çarpım ya da bölüm bulunabilir. Bu durumda dış yapıya uygun türev kuralını uygular, içteki bileşkelerde Zincir Kuralını kullanırız.

    Örneğin:

    $$ f(x)=x^2e^{3x} $$

    ifadesinde \(x^2\) ile \(e^{3x}\) çarpıldığı için önce çarpım kuralını kullanırız:

    $$ f'(x) =2x e^{3x} +x^2\frac{d}{dx}e^{3x} $$

    \(e^{3x}\) ise bir bileşke fonksiyondur. Zincir Kuralıyla türevi \(3e^{3x}\) olur:

    $$ \begin{aligned} f'(x) &=2x e^{3x}+3x^2e^{3x} \\ &=e^{3x}(2x+3x^2) \end{aligned} $$

    Hangi kuralı önce kullanacağımıza fonksiyonun en dış yapısı karar verir. En dışta bir çarpım varsa çarpım kuralıyla, bir bölüm varsa bölüm kuralıyla başlarız; parçaların içinde bileşke gördüğümüzde Zincir Kuralına geçeriz.

    Leibniz Gösterimi Bize Yolu Gösterir

    Türevi Leibniz gösterimiyle yazdığımızda zincirdeki değişkenlerin sırasını kolayca izleyebiliriz:

    $$ \frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx} $$

    Ortadaki \(du\) ifadeleri sadeleşiyormuş gibi görünür ve geriye \(\frac{dy}{dx}\) kalır. Bu görünüm, hangi türevleri hangi sırayla yazacağımızı hatırlamak için yararlıdır.

    Ancak türevler sıradan kesirler değildir. \(du\)'ları gerçekten sayı gibi sadeleştirmiyoruz. Formülün matematiksel nedeni, küçük değişimlerin bir aşamadan diğerine taşınırken yerel değişim oranlarıyla art arda çarpılmasıdır.

    Gösterimi kurarken solda aradığımız değişim oranını, sağda ise başlangıçtan sonuca uzanan değişken zincirini yazarız.

    Bir Noktadaki Türev Ne Anlatır?

    Zincir Kuralıyla bulduğumuz türev, belirli bir noktada girdideki değişime çıktının nasıl tepki verdiğini de gösterir. İlk örneğe dönelim:

    $$ y=(3x+2)^2, \qquad y'=18x+12 $$

    \(x=1\) noktasında türev:

    $$ y'(1)=18(1)+12=30 $$

    çıkar. \(x=1\) yakınında \(x\)'teki çok küçük bir değişiklik, \(y\)'de yaklaşık 30 katı büyüklüğünde bir değişim oluşturur. Örneğin \(\Delta x=0{,}001\) için:

    $$ \Delta y\approx y'(1)\Delta x =30\cdot0{,}001 =0{,}03 $$

    Bu yaklaşık bir sonuçtur. Çünkü türev, fonksiyonun o noktaya çok yakın davranışını doğrusal bir çizgiyle tahmin eder. Değişiklik büyüdükçe yaklaşımın hatası da genellikle büyür.

    Bir girdideki küçük değişime çıktının verdiği tepkiyi duyarlılık olarak düşünebiliriz. Yapay zekâ modelindeki bir ağırlığın hataya etkisini ölçerken de aynı ilişkiyi inceleriz.

    Çok Değişkenli Zincir Kuralı

    Şimdi önceki makalede bıraktığımız probleme dönelim. Sonuç \(z\), hem \(x\)'e hem de \(y\)'ye bağlı olsun:

    $$ z=f(x,y) $$

    Fakat bu kez \(x\) ve \(y\) bağımsız değildir. İkisi de \(t\)'ye bağlı olarak değişsin:

    $$ x=x(t), \qquad y=y(t) $$

    \(t\), \(z\)'yi iki ayrı yoldan etkiler:

    $$ t\longrightarrow x\longrightarrow z \qquad\text{ve}\qquad t\longrightarrow y\longrightarrow z $$

    İlk yolun etkisi, \(t\)'nin \(x\)'i değiştirme hızıyla \(x\)'in \(z\)'yi değiştirme hızının çarpımıdır:

    $$ \frac{\partial z}{\partial x}\frac{dx}{dt} $$

    İkinci yolun etkisi de benzer biçimde:

    $$ \frac{\partial z}{\partial y}\frac{dy}{dt} $$

    olur. \(t\)'nin \(z\) üzerindeki toplam etkisini bulmak için iki yolun katkısını toplarız:

    $$ \frac{dz}{dt} = \frac{\partial z}{\partial x}\frac{dx}{dt} + \frac{\partial z}{\partial y}\frac{dy}{dt} $$

    İki temel kural: Aynı yol üzerindeki etkileri çarparız. Başlangıçtan sonuca giden farklı yolların katkılarını ise toplarız.

    Çok Değişkenli Bir Örneği İki Yoldan Çözelim

    Hesabı kolayca izleyebilmek için şu fonksiyonu seçelim:

    $$ z=x^2+y^2 $$

    Her iki girdi de \(t\)'ye bağlı olsun:

    $$ x=t, \qquad y=2t $$

    Önce ihtiyacımız olan yerel türevleri hesaplayalım:

    $$ \frac{\partial z}{\partial x}=2x, \qquad \frac{\partial z}{\partial y}=2y, \qquad \frac{dx}{dt}=1, \qquad \frac{dy}{dt}=2 $$

    Zincir Kuralına yerleştirelim:

    $$ \begin{aligned} \frac{dz}{dt} &=2x\cdot1+2y\cdot2 \\ &=2t+2(2t)\cdot2 \\ &=2t+8t \\ &=10t \end{aligned} $$

    Şimdi aynı sonucu doğrudan kontrol edelim. \(x=t\) ve \(y=2t\) ifadelerini en başta \(z\)'de yerine koyarsak:

    $$ z=t^2+(2t)^2=5t^2 $$

    olur. Bunun türevi de:

    $$ \frac{dz}{dt}=10t $$

    çıkar. Bu örnekte değişkenleri doğrudan yerine koyarak sonucu kolayca kontrol ettik. Binlerce ara değişken içeren bir sistemdeyse bütün ifadeyi açmak yerine yerel türevleri birleştirmek daha kullanışlıdır.

    Kısmi Türev ile Toplam Türev Arasındaki Fark

    \(\frac{\partial z}{\partial x}\) kısmi türevini hesaplarken yalnızca \(x\)'in değiştiğini, \(y\)'nin ise sabit kaldığını varsayarız. Sorduğumuz soru şudur: “Diğer her şey aynıyken \(x\) değişirse \(z\) ne olur?”

    \(\frac{dz}{dt}\) toplam türevi ise \(t\)'nin harekete geçirdiği bütün değişkenleri hesaba katar. Buradaki soru farklıdır: “\(t\) değiştiğinde ona bağlı olan \(x\) ve \(y\) birlikte hareket ederse \(z\) toplamda ne olur?”

    Daha fazla ara değişken olduğunda aynı düşünceyi kısa bir toplamla yazabiliriz:

    $$ \frac{dz}{dt} = \sum_{i=1}^{n} \frac{\partial z}{\partial x_i} \frac{dx_i}{dt} $$

    Buradaki \(\sum\) işareti “\(i=1\)'den \(n\)'ye kadar bütün katkıları topla” demektir. Her \(x_i\), \(t\)'nin etkileyebildiği ayrı bir ara değişkeni temsil eder.

    Bir önceki makalede öğrendiğimiz gradyan, kısmi türevleri bir vektörde topluyordu. Bütün \(x_i\)'lerin değişimlerini de bir vektörde toplarsak toplam türevi bu iki vektörün nokta çarpımıyla yazabiliriz:

    $$ \frac{dz}{dt} = \nabla z\cdot\frac{d\mathbf{x}}{dt} $$

    Böylece Vektörler makalesindeki nokta çarpım, değişim etkilerini bir araya getiren bir araç olarak yeniden karşımıza çıkar.

    Bağımlılıkları Hesaplama Grafiğinde Görmek

    Karmaşık bir formülü, içindeki küçük işlemlere ayırıp aralarındaki bağı oklarla gösterebiliriz. İşlemlerin ve bağlantılarının oluşturduğu bu yapıya hesaplama grafiği (computational graph) denir.

    Örneğin \(y=(3x+2)^2\) işlemini şu şekilde ayırabiliriz:

    $$ x \xrightarrow{\times3} 3x \xrightarrow{+2} u \xrightarrow{\text{karesini al}} y $$

    İleri yönde giderken her durakta yeni bir değer hesaplarız. Geri yönde giderken ise sonucun önceki değişkenlere karşı duyarlılığını hesaplarız. Her bağlantının yalnızca kendi küçük işleminin türevini bilmesi yeterlidir.

    Böylece büyük bir fonksiyonun türevini tek bir ifadeye açmak zorunda kalmayız. Yapay zekâ yazılımları da modelin türevlerini küçük işlemlerden oluşan bu grafik üzerinden hesaplar.

    Sonuca Giden Birden Fazla Yol Varsa

    Bir değişken aynı sonucu birden fazla yoldan etkileyebilir. Örneğin:

    $$ u=x^2, \qquad v=3x, \qquad y=u+v $$

    Burada \(x\), \(y\)'ye hem \(u\) hem de \(v\) üzerinden ulaşır:

    $$ x\longrightarrow u\longrightarrow y \qquad\text{ve}\qquad x\longrightarrow v\longrightarrow y $$

    Her yolun kendi etkisini hesaplayıp toplarız:

    $$ \begin{aligned} \frac{dy}{dx} &= \frac{\partial y}{\partial u}\frac{du}{dx} + \frac{\partial y}{\partial v}\frac{dv}{dx} \\ &=1\cdot2x+1\cdot3 \\ &=2x+3 \end{aligned} $$

    Doğrudan \(y=x^2+3x\) yazıp türev aldığımızda da \(2x+3\) buluruz. Bu küçük örnek, hesaplama grafiklerindeki genel kuralı açıkça gösterir:

    • Bir yolun üzerindeki yerel türevler çarpılır.
    • Aynı değişkenden aynı sonuca giden farklı yolların katkıları toplanır.

    Birden Fazla Çıktı Varsa: Jacobian Matrisi

    Gradyan, çok sayıda girdinin tek bir çıktıya etkisini toplar. Çıktı sayısı da birden fazlaysa her çıktının her girdiye karşı duyarlılığını düzenlememiz gerekir.

    İki girdiden iki çıktı üreten şu fonksiyonu düşünelim:

    $$ \mathbf{f}(x,y) = \begin{bmatrix} f_1(x,y)\\ f_2(x,y) \end{bmatrix} $$

    Her çıktının her girdiye karşı duyarlılığını bilmek isteriz. Dört kısmi türevi bir tabloda topladığımız yapıya Jacobian matrisi denir:

    $$ J_{\mathbf{f}}(x,y) = \begin{bmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y}\\ \frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} \end{bmatrix} $$

    Bu yazıda satırları çıktılara, sütunları girdilere ayıran gösterimi kullanıyoruz. Başka kaynaklarda vektörlerin satır veya sütun kabul edilmesine göre transpoz edilmiş, yani satır ve sütunları yer değiştirmiş bir gösterim görülebilir. Formülleri karşılaştırırken kullanılan düzeni kontrol etmek gerekir.

    Somut bir örnek seçelim:

    $$ \mathbf{f}(x,y) = \begin{bmatrix} x+y\\ xy \end{bmatrix} $$

    Birinci çıktı \(f_1=x+y\), ikinci çıktı \(f_2=xy\)'dir. Kısmi türevleri yerlerine yazarsak:

    $$ J_{\mathbf{f}}(x,y) = \begin{bmatrix} 1 & 1\\ y & x \end{bmatrix} $$

    \((x,y)=(2,3)\) noktasında:

    $$ J_{\mathbf{f}}(2,3) = \begin{bmatrix} 1 & 1\\ 3 & 2 \end{bmatrix} $$

    olur. İlk satır girdilerdeki küçük değişimlerin birinci çıktıya, ikinci satır ikinci çıktıya etkisini gösterir. Jacobian, fonksiyonun bu nokta yakınındaki değişimini bir matriste özetler.

    Çok Boyutlu Zincirde Matrisler Çarpılır

    Birden fazla giriş ve çıkışı olan iki fonksiyonu art arda bağladığımızı düşünelim:

    $$ \mathbf{u}=\mathbf{g}(\mathbf{x}), \qquad \mathbf{y}=\mathbf{f}(\mathbf{u}) $$

    Tek değişkenli zincirde sayılardan oluşan türevleri çarpıyorduk. Çok boyutlu zincirde ise aynı görevi Jacobian matrisleri üstlenir:

    $$ J_{\mathbf{f}\circ\mathbf{g}}(\mathbf{x}) = J_{\mathbf{f}}(\mathbf{g}(\mathbf{x})) J_{\mathbf{g}}(\mathbf{x}) $$

    Sağdaki \(J_{\mathbf{g}}\), girdideki küçük değişimi önce ara değişkenlere taşır. Soldaki \(J_{\mathbf{f}}\) de bu ara değişimi çıktıya taşır. Bu nedenle matrislerin sırası rastgele değildir. Matrisler makalesinde gördüğümüz gibi matris çarpımında sıra sonucu değiştirebilir.

    Tek sayıdan tek sayıya giden zincirde yerel türevleri sayı olarak çarparız. Birden fazla giriş ve çıkış olduğunda yerel değişimleri Jacobian matrisleri taşır ve zincir boyunca bu matrisleri çarparız.

    Yapay Sinir Ağı da Fonksiyonlar Zinciridir

    Bir yapay sinir ağında işlemler art arda bağlanır: Girdi sayılarla çarpılır, sabitler eklenir, sonuçlar aktivasyon fonksiyonlarından geçirilir ve bir tahmin üretilir. Bu işlemler de Zincir Kuralıyla izlenebilir.

    Tek bir nöronu basitleştirerek inceleyelim. Girdi \(x\), ayarlanabilir ağırlık \(w\), girdiden girdiye değişmeyen fakat eğitim sırasında ayarlanabilen ekleme değeri de \(b\) olsun. Önce:

    $$ z=wx+b $$

    hesaplanır. Ardından bu sayı sigmoid adlı fonksiyondan geçirilerek \(a\) çıktısı üretilsin:

    $$ a=\sigma(z)=\frac{1}{1+e^{-z}} $$

    Sigmoid, her gerçek sayıyı 0 ile 1 arasına sıkıştıran bir fonksiyondur. Son olarak modelin çıktısı \(a\) ile doğru cevap \(y\) arasındaki farkın karesini hata olarak kullanalım:

    $$ L=(a-y)^2 $$

    Buradaki \(L\), kayıp (loss) değeridir; modelin bu örnekte ne kadar hata yaptığını tek sayıyla ifade eder. Ağırlık \(w\), kaybı doğrudan değil şu zincir üzerinden etkiler:

    $$ w \longrightarrow z \longrightarrow a \longrightarrow L $$

    Modelin öğrenebilmesi için “\(w\)'yi biraz değiştirirsek hata ne olur?” sorusunu cevaplamalıyız. Yani \(\frac{\partial L}{\partial w}\) değerini ararız. Zincir Kuralı, yol üzerindeki üç yerel türevi çarpmamızı söyler:

    $$ \frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w} $$

    Her parçayı ayrı ayrı bulabiliriz:

    $$ \frac{\partial L}{\partial a}=2(a-y), \qquad \frac{\partial a}{\partial z}=a(1-a), \qquad \frac{\partial z}{\partial w}=x $$

    Ortadaki \(a(1-a)\) ifadesinin nereden geldiğini de görelim. Sigmoidi \(a=(1+e^{-z})^{-1}\) biçiminde yazıp dışarıdan içeriye doğru türevlediğimizde:

    $$ \begin{aligned} \frac{\partial a}{\partial z} &=-(1+e^{-z})^{-2}(-e^{-z}) \\ &=\frac{e^{-z}}{(1+e^{-z})^2} \\ &=\frac{1}{1+e^{-z}} \cdot \frac{e^{-z}}{1+e^{-z}} \\ &=a(1-a) \end{aligned} $$

    Son eşitlikte ilk kesir \(a\)'ya, ikinci kesir \(1-a\)'ya eşittir. Sigmoidin yerel türevini de Zincir Kuralıyla bulduk.

    Bunları çarptığımızda:

    $$ \frac{\partial L}{\partial w} = 2(a-y)a(1-a)x $$

    elde ederiz. Bu sayı, ağırlığın hata üzerindeki yerel etkisini gösterir. İşareti, ağırlığı artırmanın hatayı artırıp azaltacağını; büyüklüğü ise etkinin ne kadar güçlü olduğunu anlatır. Öğrenme yöntemi bu bilgiyi kullanarak ağırlığı hatayı azaltacak yöne doğru küçük bir adımla güncelleyebilir.

    Geri Yayılım Aslında Ne Yapar?

    Yapay sinir ağlarında Zincir Kuralının hesaplama grafiği üzerinde düzenli ve verimli biçimde uygulanmasına geri yayılım (backpropagation) denir.

    Önce ağ girişten çıkışa doğru çalışır. Buna ileri geçiş (forward pass) denir:

    $$ \text{Girdi} \longrightarrow \text{Ara hesaplamalar} \longrightarrow \text{Tahmin} \longrightarrow \text{Kayıp} $$

    Bu sırada ara değerler hesaplanır. Ardından kayıp değerinden başlanır ve etkiler ters yönde izlenir:

    $$ \text{Kayıp} \longrightarrow \text{Tahmin} \longrightarrow \text{Ara hesaplamalar} \longrightarrow \text{Parametreler} $$

    Her durak kendisine ulaşan duyarlılığı kendi yerel türeviyle çarpar ve bir önceki durağa aktarır. Bir değişkene farklı yollardan katkı geliyorsa bu katkılar toplanır. Böylece aynı ara hesaplamalar tekrar tekrar yapılmadan bütün parametrelerin kayba etkisi bulunabilir.

    Geri yayılım, Zincir Kuralını büyük bir hesaplama grafiği üzerinde verimli biçimde uygular. Yazılımlar bunun için çoğu zaman otomatik türev (automatic differentiation) kullanır; hesaplanan yerel etkiler yine Zincir Kuralıyla birleşir.

    Uzun Çarpımların Sorunu: Kaybolan ve Patlayan Gradyanlar

    Derin bir ağda kayıptan ilk katmanlara ulaşan yol çok uzun olabilir. Zincir Kuralı boyunca pek çok yerel türev çarpıldığı için bu çarpım bazen aşırı küçülür, bazen de aşırı büyür.

    Örneğin yol üzerindeki on yerel türevin her biri \(0{,}5\) olsaydı çarpım:

    $$ 0{,}5^{10}\approx0{,}00098 $$

    olurdu. İlk katmanlara neredeyse sıfır büyüklüğünde bir öğrenme sinyali ulaştığında kaybolan gradyan (vanishing gradient) sorunundan söz ederiz.

    Tersine, on yerel türevin her biri 2 olsaydı:

    $$ 2^{10}=1024 $$

    gibi büyük bir değer oluşurdu. Türevlerin denetimsiz biçimde büyüdüğü bu duruma patlayan gradyan (exploding gradient) denir.

    Gerçek ağlarda matrisler, farklı yollar ve değişen türevler de hesaba katılır. Uzun zincirlerde çok sayıda yerel etki art arda çarpıldığı için gradyan küçülebilir veya büyüyebilir. Başlangıç değerlerini dengeli seçmek, ara değerleri uygun ölçekte tutmak, aşırı büyük gradyanları sınırlamak ve bazı katmanlara daha kısa yollar açmak bu sorunları azaltabilir.

    Bu yöntemlerin teknik ayrıntılarını yapay sinir ağları bölümünde öğreneceğiz.

    Zincir Kuralı Her Noktada Kullanılabilir mi?

    Zincir Kuralını kullanabilmek için zincirdeki ilgili fonksiyonların baktığımız noktalarda türevlenebilir olması gerekir. İç fonksiyonun çıktısı, dış fonksiyonun türevli olmadığı bir noktaya denk gelirse alıştığımız formülü doğrudan uygulayamayız.

    Örneğin mutlak değer fonksiyonu \(f(u)=|u|\), \(u=0\) noktasında keskin bir köşeye sahiptir ve klasik anlamda türevli değildir. \(u=g(x)\) için \(g(x)=0\) olan bir noktada \(|g(x)|\)'in türevi ayrıca incelenmelidir.

    Yapay zekâda sık kullanılan ReLU fonksiyonu da 0 noktasında klasik anlamda türevli değildir. Yazılım kütüphaneleri bu noktada hesaplamanın devam etmesi için genellikle 0 gibi belirli bir eğim seçer. Bu değer bir uygulama tercihidir; ReLU'nun 0 noktasında klasik türevi yoktur.

    Zincir Kuralında Sık Yapılan Hatalar

    • İç fonksiyonun türevini unutmak: \((x^2+1)^5\)'in türevi yalnızca \(5(x^2+1)^4\) değildir; sonuç \(2x\) ile de çarpılmalıdır.
    • Katmanlardan birini atlamak: Üç veya daha fazla iç içe işlem varsa her katmanın yerel türevi çarpımda bulunmalıdır.
    • İç ve dış fonksiyonu yanlış ayırmak: Önce en dış işlemi belirlemek, hangi kuralın ilk uygulanacağını açık hâle getirir.
    • Farklı yolları çarpmak: Aynı yolun üzerindeki etkiler çarpılır; farklı yolların katkıları toplanır.
    • Leibniz gösterimini sıradan kesir sanmak: Gösterim sadeleşme izlenimi verse de türevin gerekçesi cebirsel kesir sadeleştirmesi değildir.
    • Fonksiyonun tanım koşullarını unutmak: Logaritmanın içi pozitif, paydanın değeri sıfırdan farklı olmalıdır. Zincir Kuralı bu koşulları ortadan kaldırmaz.
    • Bir noktadaki değerleri çok erken yerleştirmek: Önce genel türevi kurmak, sonra noktayı yerine koymak eksik katman bırakma riskini azaltır.
    • Jacobian matrislerinin sırasını değiştirmek: Matris çarpımı değişmeli değildir. Ayrıca kullanılan satır-sütun düzeni açıkça kontrol edilmelidir.
    • Türevlenebilirlik koşulunu görmezden gelmek: Zincirde keskin köşe gibi türevsiz bir nokta varsa standart formülü otomatik olarak kullanamayız.

    Bir Zincir Kuralı Sorusunda İzlenecek Yol

    1. Fonksiyonun hangi işlemlerden oluştuğunu belirle.
    2. Gerekirse her ara işleme \(u\), \(v\) gibi ayrı bir ad ver.
    3. Başlangıç değişkeninden sonuca giden yolları çiz veya zihninde sırala.
    4. Her bağlantının yerel türevini hesapla.
    5. Aynı yol üzerindeki türevleri çarp.
    6. Sonuca giden birden fazla yol varsa yol katkılarını topla.
    7. Ara değişkenleri yeniden asıl değişkenler cinsinden yaz.
    8. Tanım kümesini, türevlenebilirlik koşullarını ve istenen noktayı kontrol et.
    9. Mümkünse sonucu ifadeyi açarak, sayısal yaklaşım yaparak veya boyutları denetleyerek doğrula.

    Aynı adımlarla bir yapay zekâ modelinin hesaplama grafiğini de okuyabiliriz: Büyük ifadeyi küçük işlemlere ayırır, her bağlantıdaki yerel türevi hesaplarız.

    Sonuç: Yerel Etkilerden Bütün Sisteme

    Türev ile anlık değişimi ölçtük; kısmi türevler ve gradyanla birden fazla girdinin etkisini ayırdık. Zincir Kuralı, bu girdiler birbirine bağlı olduğunda etkilerin nasıl aktarıldığını hesaplamamızı sağladı.

    Aynı yol üzerindeki yerel etkileri çarptık; farklı yolların katkılarını topladık. Giriş ve çıkış sayısı arttığında türevleri Jacobian matrislerinde düzenledik. Geri yayılımda da bu hesap, sinir ağının büyük hesaplama grafiği üzerinde tekrarlanır.

    Değişim ve türev bölümünden belirsizliğe geçerken önce olası sonuçları doğru saymamız gerekiyor. Bir sonraki Sayma İlkeleri, Faktöriyel, Permütasyon ve Kombinasyon makalesinde seçenekleri tek tek yazmadan nasıl sayacağımızı, sıranın ve tekrarın sonucu nasıl değiştirdiğini inceleyeceğiz. Bu sayımlar, ardından gelecek Temel Olasılık Kavramlarının hesabına temel olacak.

    Yazar: Levent KARAGÖL

    Makaleyi Paylaş:

    İlgili Makaleler