Yapay Sinir Ağlarında Ağırlık Başlatma Yöntemleri: Eğitim Sürecinin Gizli Mimarı

   Yapay sinir ağlarında model mimarisi, aktivasyon fonksiyonları ve optimizasyon algoritmaları çoğunlukla gündeme gelir. Ancak, birçok derin öğrenme uygulamasında eğitim başarısını etkileyen, sıklıkla göz ardı edilen çok önemli bir unsur daha vardır: Ağırlıkların nasıl başlatıldığı.

   Sizi sinir ağlarında katman ağırlıklarını başlatmaya yönelik farklı yaklaşımlarla bir keşifte bana katılmaya davet etmek istiyorum. Kendi kodladığım grafikler ile bu keşife elimden geldiğince yardımcı olacağım. Birazcık da olsa yapay sinir ağları’nın (Neural Net) içine girmişseniz eğer, ağırlıkların ne kadar önemli olduğunu biliyorsunuzdur. Ağırlıklarla beraber biaslar yani ön yargılar da çok önemli olduğunu söyleyebilirim fakat bu yazının konularını pek bağlamıyor kendileri. Yazımızda bu ağırlıkların yıllar içinde nasıl başlatılmasını gerektiğini inceleyeceğiz.

                                                            

   Kısaca, bu GitHub reposu üzerinden gerçekleştirdiğim deneylere dayanarak, yıllar içinde yorumlanmış farklı başlatma yöntemlerinin eğitim sürecine etkisini inceliyoruz. Her yöntemi yalın bir dille açıklamaya ve uygulamalı bir bakışla yorumlamaya çalışacağım. Teknik olaylarda derinleşmeden birkaç önerim olacak değerli okuyuculara, Gradient Descent, Backpropagation, kavramlarına birazcık göz aşinalığınız olması yazıyı anlamanız için iyi olacaktır. Çokça aktivasyon fonksiyonlarından da bahsedeceğiz bir başka yazımızda buna da değinebiliriz fakat bu konuya da biraz bakmanızın iyi olacağını düşünüyorum

Neden Başlatma Önemlidir?

   Yapay sinir ağlarında eğitim, ağırlıkların uygun şekilde güncellenmesiyle gerçekleşir. Ancak bu güncellemelerin nasıl başlayacağı, yani ağırlıkların başlangıçta hangi değerlere sahip olacağı, modelin:

    • Ne kadar hızlı öğrendiğini,

    • Yerel minimumlara saplanıp saplanmadığını,

    • Gradyanların sıfırlanıp sıfırlanmadığını (vanishing gradient),

    • veya fırlayıp fırlamadığını (exploding gradient)

doğrudan etkiler.

   Eğer tüm ağırlıkları sıfırdan başlatırsanız, katmanlar simetrik olarak öğrenir. Bu durum, modelin öğrenmesini engeller. Bu yüzden, başlangıçta ağırlıkların rastgele ama kontrollü biçimde verilmesi gerekir.

Ağırlıkları Sıfırdan Başlatmak Neden Öğrenmeyi Engeller?

 1. Simetrik Gradyanlar:

    • Sıfır Başlangıç: Eğer bir sinir ağındaki tüm ağırlıklar başlangıçta sıfır olarak ayarlanırsa, aynı katmandaki tüm nöronlar aynı girdileri alır ve bu girdilere uyguladıkları ağırlıklar da aynı olur.

    • Aynı Çıktılar: Sonuç olarak, bu nöronlar her bir girdi için tamamen aynı çıktıları üretecektir.

    • Aynı Gradyanlar: Geriye yayılım (backpropagation) sırasında, kayıp fonksiyonunun bu nöronlara göre olan gradyanları da aynı olacaktır. Çünkü gradyan hesaplaması, çıktıların kayba olan etkisine ve yerel türevlere bağlıdır ve bu nöronlar özdeş davrandığı için bu etkiler de aynı olacaktır.

    • Yani biraz daha açıklayıcı olmam gerekirse ağımıza giren girdiyi normal şartlarda nöron ağırlıkları ile farklılaştırarak istediğimiz çıktıya yaklaştırmaya çalışırız. Bu ağırlıkları eğer 0’dan başlatırsak ağımıza giren girdiyi artı ya da eksi yöne doğru değiştiremeyiz. Böyle olduğu gibi backpropagation (Geri yayılım) kısmında da her birine aynı gradyanlar geleceği için kendilerini doğru tarafa doğru güncelleyemedikleri için bu simetri kırılmaz ve nörönlar öğrenmeyi sağlayamazlar.

 2. Nöronların Farklılaşamaması:

    • Özgün Özellik Öğrenimi Yok: Eğer tüm nöronlar aynı şeyi öğrenmeye çalışırsa, ağın farklı girdilerin farklı özelliklerini yakalama yeteneği tamamen kaybolur. Örneğin, bir görüntü sınıflandırma ağında, bir nöron sadece kenarları öğrenirken diğeri sadece renkleri öğrenemez. Hepsi aynı anda aynı “şeyi” öğrenmeye çalışır. Bu da düşüneceğiniz gibi istediğimiz bir sonuç değildir.

    • Redundant Hesaplama: Aynı katmandaki tüm nöronlar aynı hesaplamaları yaptığı için, ağ aslında gereksiz yere aynı işi yapan birden fazla birime sahip olur. Bu işlemde gereksiz yere ağı yormaktan başka bir şey değildir.

 3. Öğrenme Kapasitesinin Sınırlanması:

    • Tek Nöron Gibi Davranma: Etkili bir şekilde, aynı katmandaki tüm nöronlar tek bir nöron gibi davranır. Bu durum, ağın karmaşık fonksiyonları öğrenme kapasitesini ciddi şekilde sınırlar. Derin bir ağın potansiyelinden tam olarak yararlanılamaz.

    • Modelin Takılması: Ağ, çok basit bir model gibi davranmaya devam edeceği için, karmaşık veri setlerinde yüksek doğruluk elde etmesi mümkün olmaz ve öğrenme sürecinde takılabilir.

Başlıca Başlatma Yöntemleri

   Bu bölümde görüntülerini koyduğum her ifadenin ve daha bir çok detayın karşılaştırmalı grafikleri ve açıklamalı olarak Github reposundan görebilirsiniz.

 

1. Random Initialization (Standart Rastgele Başlatma)

   Bu yöntem, ağırlıkları küçük rastgele değerlerle başlatır. Ancak dağılım ve aralık düzgün ayarlanmazsa, ağ ya hiç öğrenemez ya da çok dengesiz öğrenir.

       

   Bu yöntemde yapılan en yaygın hata, dağılımın büyüklüğünü dikkate almamaktır. Burda görüldüğü gibi küçük bir aralığa sıkıştırıldığı için ve iyi bir yöntem olmayacağı için bu durum ‘bad’ olarak nitelendirdim.

        

   Bad + Tanh             Bad + ReLU


2. Xavier (Glorot) Initialization

   Yavaş yavaş derinleşen ağlarda gradyanların yok olması veya büyümesini önlemek için geliştirilmiştir. Xavier, giriş ve çıkış düğüm sayısına bağlı olarak ağırlıkların varyansını ayarlar:

                                                                  

              
                    

   ReLU gibi simetrik olmayan aktivasyonlar için çok uygun olmasa da, Tanh gibi fonksiyonlarla iyi çalışır. Bunu kendi repomdan şu şekilde de gösterebilirim.

       

   Xavier + ReLU     Xavier + Tanh

Peki neden ReLU’da kötü ama Tanh’da iyi?

   Bunun cevabı biraz daha matematiğe dayanıyor. Uzun matematik işlemleri ile okuyucuları boğmak istemiyorum. Belki ileride bununla alakalı bir yazı yazabilirim. Kısaca şöyle açıklayabilirim Xavier başlatma (diğer adıyla Glorot başlatma), özellikle sigmoid ve tanh gibi simetrik aktivasyon fonksiyonlarıyla iyi çalışacak şekilde tasarlanmıştır. Bunun temel nedeni, Xavier başlatmanın ileri geçişte (forward pass) çıktıların varyansını ve geriye yayılımda (backward pass) gradyanların varyansını yaklaşık olarak aynı tutmayı hedeflemesindendir.

 

3. He Initialization (Kaiming Initialization)

   Özellikle ReLU veya onun türevleri (LeakyReLU, ParametricReLU) ile kullanılır. Xavier’ın bir adım ötesidir.

                                                                                  

   Bu yöntem, ReLU’nun negatif çıktıları sıfıra eşitleme eğilimini telafi etmek için daha büyük başlangıç varyansı kullanır.

               

        

       He + ReLU    He + Tanh       

   Akıllarda bir soru yazar yukarıda ReLU ve türevleri daha iyi sonuç verir dedin ama burada sanki bir sıkıntı var gibi. Evet bir sıkıntı var buna biz “Dying ReLU” problemi diyoruz. Bilerek koyduğum ve değinmek istediğim bir problemdir kendileri.

 

Dying ReLU nedir?

 

   Dying ReLU (Ölen ReLU), yapay sinir ağlarında kullanılan ReLU (Rectified Linear Unit) aktivasyon fonksiyonunun karşılaştığı bir sorundur. Bu durum, bir nöronun tüm girdileri için sürekli olarak negatif değerler alması ve bu nedenle her zaman sıfır çıktı vermesiyle karakterizedir. Böyle bir nöron, öğrenme sürecine katkıda bulunamaz hale gelir çünkü gradyanı da sıfır olur. Yukarıdaki grafiktede gördüğümüz üzere öğrenme kısmında sıkıntı çektiği aşikar. Yine aklınıza bir soru geldi gibi hissettim: 

“Neden böyle oluyor peki?”

 

Dying ReLU’nun Nedenleri:

    1. Büyük Negatif Biaslar: Eğer bir katmandaki nöronların biasları büyük ve negatifse, girdiler de çok büyük olmadıkça, nöronun girdisinin toplamı negatif olabilir. Bias kısmı weight kısımlarından büyük olursa bu nörön’u negatife iter. Bu da ReLU’nun sıfır çıktı vermesine neden olur.

    1. Büyük Negatif Ağırlık Güncellemeleri: Geriye yayılım (backpropagation) sırasında, büyük bir gradyan nedeniyle nöronun ağırlıkları öyle bir şekilde güncellenebilir ki, nöron artık hiçbir girdi için pozitif bir değer üretemez hale gelir.

    1. Öğrenme Oranı (Learning Rate): Çok yüksek bir öğrenme oranı, ağırlıkların çok hızlı ve büyük adımlarla güncellenmesine yol açabilir. Bu da nöronların “ölmesine” neden olabilecek istenmeyen ağırlık değerlerine ulaşılmasına katkıda bulunabilir.

    1. Veri Dağılımı: Eğer eğitim verisindeki girdilerin büyük bir kısmı, belirli nöronlar için sürekli olarak negatif girdilere yol açıyorsa, bu nöronlar “ölebilir”.

   Yine okurların aklına bir soru gelmiş olabileceğini düşünüyorum.

Dying ReLU Nasıl Önlenir?

    • Uygun Başlangıç Ağırlıkları: Ağırlıkların dikkatli bir şekilde başlatılması (örneğin, He başlatma gibi ReLU için özel olarak tasarlanmış yöntemlerle), başlangıçta çok sayıda nöronun ölmesini önlemeye yardımcı olabilir.

    • Küçük ve Uygun Öğrenme Oranı: Öğrenme oranının dikkatli bir şekilde ayarlanması, ağırlık güncellemelerinin çok büyük olmasını ve nöronların “ölmesine” neden olmasını engelleyebilir. Çok büyük öğrenme olanı çok ileri zıplayarak sınırlar dışına çıkarak “Dying ReLU” yapabilir.

    • Biasların Dikkatli Ayarlanması: Başlangıçta küçük pozitif biaslar kullanmak, ReLU nöronlarının başlangıçta aktif olma olasılığını artırabilir.

    • Leaky ReLU ve Parametrik ReLU (PReLU) gibi Alternatif Aktivasyon Fonksiyonları: Bu aktivasyon fonksiyonları, negatif girdiler için küçük bir eğim (sıfırdan farklı bir değer) sağlayarak “dying ReLU” sorununu çözmeyi hedefler. Bu sayede negatif girdilerde bile küçük bir gradyan akışı sağlanır ve nöronların tamamen “ölmesi” engellenir.

                    Leaky ReLU: Negatif girdiler için sabit, küçük bir eğim kullanır (örneğin, f(x)=max(0.01x,x)).

                    PReLU: Negatif bölgedeki eğim, bir öğrenilebilir parametredir.

    • Batch Normalization: Batch normalization, katmanların girdilerini normalize ederek içsel kovaryans kaymasını azaltmaya yardımcı olabilir ve bu da ağırlıkların dahaistikrarlı bir şekilde güncellenmesine ve “dying ReLU” olasılığının azalmasına katkıda bulunabilir.

4. Zero Initialization (Tüm Ağırlıklar Sıfır)

   Aslında bu konuyu yazının başında değinmiştik ama yine de başlık olarak durmasını istedim. Unutulduysa başta bahsettiğimiz kısma bakabilirsiniz. Basit ve sezgisel gibi görünse de, pratikte işe yaramaz. Çünkü tüm nöronlar aynı çıktıyı üretir ve simetri bozulmaz. Eğitim gerçekleşmez.

 

5. Lecun Initialization

   Özellikle sigmoid gibi fonksiyonlar için uygundur. Reponun içindeki “Init Methods and Activation Func” isimli dosyada “Lecun Initialization” ın diğer aktivasyon fonksiyonları ile karşılaştırılmasını da görebilirsiniz.

 Varyans:

                                                                         

                                                               Lecun + Sigmoid

Uygulamalı Deney: Eğitim Sürecine Etkileri

   Bu GitHub deposunda da göreceğiniz gibi, farklı ağırlık başlatma yöntemlerini aldım, hepsini aynı veri üzerinde ve aynı model yapısıyla denedim. Amacım da bu farklı başlangıçların eğitim sürecini nasıl bambaşka yollara soktuğunu gözler önüne sermekti.

Gözlemler:

    • Kötü (Küçük Rastgele) Initialization, hem Tanh hem de ReLU ile derin ağlarda sinyal kaybına ve öğrenmenin durmasına yol açtı.

    • He Initialization, ReLU kullanan modellerde en hızlı ve stabil öğrenmeyi sağladı.

    • Xavier Initialization, Tanh aktivasyon fonksiyonuyla çalışan sinir ağlarının daha sarsıntısız ve kararlı bir şekilde öğrenmesini sağlar.

    • Zero Initialization, hiçbir öğrenme gerçekleştiremedi.

    • Lecun Initialization, özellikle sigmoid aktivasyon fonksiyonu kullanılan ağlarda daha dengeli bir başlangıç sundu ve öğrenme sürecinde sabırlı bir hızla ilerledi.

   Bu deney, başlatma yönteminin sadece bir “ayrıntı” değil, tüm eğitim sürecini etkileyen stratejik bir karar olduğunu açıkça gösteriyor.

 

Sonuç: Eğitim Başarısı Başlangıçta Gizli

   Demem o ki, derin öğrenme modellerini eğitirken ağırlıkları nasıl başlattığımız aslında sandığımızdan çok daha önemli bir mesele. Tıpkı bir binanın temeli gibi düşünün; sağlam atarsanız üzerine ne inşa etseniz daha hızlı, daha doğru ve daha güvenli olur. Ağırlıkları doğru seçmek de modelimizin öğrenme sürecini işte böyle sağlamlaştırıyor.

   Yani yapay zeka sistemleri sadece neyi öğrendiğiyle değil, o öğrenmeye nasıl başladığıyla da yakından alakalı. Sonuç ne kadar etkileyici olursa olsun, o sonuca giden yolun en kritik adımlarından biri de başlangıçtaki bu ‘gizli mimari’ diyebileceğimiz ağırlık seçimi. 

   Eğer bu konu ilginizi çektiyse ve ‘acaba bu farklı başlatma yöntemleri pratikte nasıl çalışıyor?’ diye merak ediyorsanız, GitHub’daki kendi ufak çaplı deneylerime göz atabilirsiniz. Orada farklı yöntemleri aynı şartlarda test ettim ve sonuçlarını grafiklerle de göstermeye çalıştım. Belki siz de indirip kurcalayarak bu dünyanın içine biraz daha dalmak istersiniz:
🔗 Initialization-Method-Experiment-with-Neural-Net

Kaynakça:

 –https://datascience.stackexchange.com/questions/56808/does-neuron-have-weight

 –https://arxiv.org/abs/2109.00125

 –https://arxiv.org/abs/2311.03733

 –https://proceedings.mlr.press/v28/sutskever13.pdf

 –https://arxiv.org/abs/1511.07289

Berkay Bayramoğlu

Yorum Gönderin

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir