KERAS İLE OVERFITTING ÖNLEME

Eğittiğiniz Keras modeli train setinde %99 doğruluk üretiyor, ama test setine geçtiğinizde rakam birden %62'ye düşüyor. Bu klasik bir overfitting senaryosu: model eğitim verisini öğrenmek yerine ezberlemiş durumda. Sorun yalnızca metrikte değil, modelin canlı veride güvenilmez davranmasında. Bu yazıda dropout, L2 regularization ve early stopping üçlüsünü tek bir çözüm akışında nasıl birleştireceğinizi göreceksiniz.
1. Overfitting Neden Ortaya Çıkar?
Overfitting, modelin kapasitesi veri setinin taşıyabileceğinden büyük olduğunda ortaya çıkar. Ağ, sinyal yerine gürültüyü öğrenir: eğitim örneklerindeki rastgele dalgalanmalar, etiket hataları, dengesiz örneklem dağılımları model parametrelerine kazınır. Sonuçta train loss düşmeye devam ederken validation loss yükselmeye başlar — iki eğri arasındaki açılma, overfitting'in en net göstergesidir.
Pratikte birkaç tipik tetikleyici vardır:
- Veri seti çok küçük, ama ağ derin ve geniş.
- Çok fazla epoch boyunca, durdurma kriteri olmadan eğitim.
- Düzenleme (regularization) tekniği hiç kullanılmamış.
- Eğitim ve test dağılımı arasında sızıntı veya farklılık var.
2. Tanı: Train ve Validation Eğrilerini Okuyun
%99'a karşı %62 farkı tek başına bir şey söyler, ama nereye müdahale edeceğinizi history nesnesindeki eğriler söyler. Eğitim sırasında validation_split=0.2 ile bir doğrulama kümesi ayırın ve her epoch sonunda loss ve val_loss değerlerini çizdirin. Eğer val_loss belli bir epoch'tan sonra yükseliyorsa, modelin durması gereken nokta o eğrinin minimumudur.

3. Dropout Katmanı: Rastgele Sönümleme
Dropout, her ileri geçişte nöronların belirli bir oranını rastgele sıfırlayarak ağı tek bir yola bağımlı olmaktan korur. Bu, ensemble benzeri bir etki üretir ve ezberlemeyi zorlaştırır. Yoğun (Dense) katmanlardan sonra Dropout(0.3) ile Dropout(0.5) arasında bir oran tipik başlangıçtır.
Pratik bir kalıp:
- Dense(128) sonrası Dropout(0.4)
- Dense(64) sonrası Dropout(0.3)
- Çıkış katmanından hemen önce dropout KULLANMAYIN.
Dropout oranını arttırdıkça model daha az ezberler, ama çok yüksek değerler (0.7+) underfitting'e yol açabilir. Validation eğrisini izleyerek kademeli ayarlama yapın.
4. L2 Regularization: Ağırlıkları Cezalandırın
L2 (weight decay), büyük ağırlık değerlerini loss fonksiyonuna ek bir maliyet olarak yansıtır. Böylece model, az sayıda nöron üzerine aşırı yüklenmek yerine sinyali daha dağıtık öğrenir. Keras'ta katman bazında uygulanır:
Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.001))
Lambda değeri (0.001 gibi) küçük başlanmalı. Eğer train ve val loss birlikte yükseliyorsa lambda fazla, ikisi arası açıklık hâlâ büyükse lambda az demektir. L2'yi dropout ile birlikte kullanmak çoğu zaman tek başına kullanmaktan daha iyi sonuç verir; çünkü farklı mekanizmalar üzerinden düzenleme yaparlar. Katman seçenekleri ve parametre detayları için resmi API dokümantasyonuna başvurabilirsiniz.
5. Early Stopping: Doğru Anda Durun
Early stopping, val_loss artmaya başladığında eğitimi otomatik durduran bir callback'tir. En değerli özelliği restore_best_weights=True: model, validation kaybının minimum olduğu epoch'taki ağırlıklara geri döner.
Tipik konfigürasyon:
monitor='val_loss'— izlenecek metrik.patience=10— kaç epoch boyunca iyileşme beklenecek.restore_best_weights=True— en iyi ağırlıkları geri yükle.min_delta=0.001— anlamlı iyileşme eşiği.
Patience değeri çok düşük olursa model henüz öğrenmeden durur; çok yüksek olursa overfitting'e zaman tanırsınız. 5-15 arası başlangıç için makuldür.
6. Çözüm Akışı: Üçünü Birlikte Uygulamak
Tek bir tekniği denemek yerine kademeli bir akış izleyin. Önce baseline modeli kaydedin (regülarizasyon yok), train/val eğrilerini görün. Ardından sırayla:
- Dense katmanlarına L2(0.001) ekleyin, val_loss'u tekrar ölçün.
- Dropout(0.3-0.5) katmanları ekleyin, açılmanın daraldığını gözlemleyin.
- EarlyStopping callback'ini fit() çağrısına geçin.
- Hâlâ açılma varsa veri artırma (data augmentation) veya daha küçük model deneyin.
Her adımdan sonra yalnızca bir parametreyi değiştirin — aksi halde hangi müdahalenin işe yaradığını ayıramazsınız. Bu disiplinli yaklaşım için Keras model geliştirme sürecinin tamamını derli toplu görmek isterseniz deep learning Keras eğitimi içeriğinden yararlanabilirsiniz.
7. Sık Yapılan Hatalar

Pek çok ekip dropout oranını çok yüksek tutarak modeli underfit hale getirir, sonra "regularization işe yaramıyor" sonucuna varır. Bir başka yaygın hata, dropout'u test sırasında manuel devre dışı bırakmaya çalışmaktır — Keras bunu zaten model.predict() sırasında otomatik yapar. L2 lambda değerini de büyük seçenlerin train loss'u bir türlü düşmez; bu da regülarizasyonun değil, kapasitenin eksik kullanıldığının işaretidir.
Son olarak validation seti sızıntısına dikkat edin: eğitim verisindeki normalizasyon istatistiklerini (mean/std) tüm veriden değil, sadece train kısmından hesaplayın. Aksi takdirde val_loss yapay olarak düşük çıkar ve overfitting'i fark etmezsiniz.
Üç tekniği birlikte uygulayan ve eğrileri her adımda izleyen bir akışla, %99/%62 farkını genellikle %92/%87 gibi sağlıklı bir aralığa indirebilirsiniz. Hedef mükemmel train doğruluğu değil, görmediği veride güvenilir tahmin yapan bir modeldir. Daha kapsamlı uygulama örnekleri için Keras eğitim materyallerini inceleyebilirsiniz.
Sıkça Sorulan Sorular
Train accuracy %99 ama test accuracy %62 ise hangi tekniği önce uygulamalıyım?
İlk müdahale early stopping olmalı, çünkü hiçbir kod değişikliği yapmadan modelin durması gereken noktayı bulur. Ardından L2 regularization ekleyin, son olarak dropout katmanları yerleştirin. Bu sıra, her adımın etkisini ayrı ayrı ölçmenize izin verir ve hangi tekniğin asıl katkıyı sağladığını net görürsünüz.
Dropout oranını 0.5'ten yüksek tutmak güvenli mi?
0.5 üzerindeki oranlar derin ağlarda bile çoğu zaman underfitting'e yol açar. Model yeterince sinyal taşıyamaz hale gelir ve train loss bile düşmemeye başlar. 0.3 ile 0.5 arası standart aralıktır; ancak çok küçük veri setlerinde 0.6'ya çıkmak deneysel olarak denenebilir. Önce val_loss eğrisini izleyin.
L2 regularization lambda değerini nasıl seçmeliyim?
0.001 ile başlayın. Train ve validation loss birlikte yüksek kalıyorsa lambda fazla demektir, 0.0001'e indirin. İki eğri arası açıklık hâlâ büyükse lambda az; 0.01'e çıkarın. Bu değer öğrenme oranı kadar hassas değildir, ama logaritmik adımlarla denemek doğrusal denemekten çok daha verimlidir.
EarlyStopping patience değeri için iyi başlangıç nedir?
Çoğu sınıflandırma probleminde 10 epoch makul bir başlangıçtır. Eğer val_loss çok dalgalı seyrediyorsa 15-20'ye çıkarın; çok stabil bir eğri varsa 5'e indirebilirsiniz. restore_best_weights parametresini mutlaka True yapın; aksi halde model son epoch'taki ağırlıklarla kalır ve en iyi noktayı kaybedersiniz.
Dropout ve L2 aynı anda kullanılabilir mi?
Evet, hatta çoğu zaman birlikte kullanmak tek başına kullanmaktan daha iyi sonuç verir. Farklı mekanizmalardan düzenleme yaparlar: dropout nöron seviyesinde stokastik, L2 ağırlık seviyesinde determinist çalışır. Birlikte kullanırken her ikisinin de değerlerini biraz daha düşük tutmak (örn. dropout 0.3, L2 0.0005) dengeli bir başlangıçtır.
Data augmentation overfitting'i tek başına çözebilir mi?
Görüntü ve ses gibi alanlarda data augmentation çok güçlüdür ve bazen tek başına yeterli olur. Ancak tabular verilerde sınırlıdır. Dropout, L2 ve early stopping ile birlikte kullanıldığında en iyi sonucu verir. Augmentation veri çeşitliliğini, regularization ise modelin kapasitesini hedefler — birbirini tamamlayan iki farklı saldırı yüzeyidir.
Validation loss neden bazen train loss'tan düşük çıkıyor?
Bunun en yaygın nedeni dropout'un train sırasında aktif, validation sırasında pasif olmasıdır. Keras eğitimde nöronları sıfırladığı için train loss yapay olarak yüksek görünür. Bu normal bir davranıştır ve overfitting belirtisi değildir. Asıl izlenmesi gereken val_loss'un epoch'lar boyunca yükselmeye başlayıp başlamadığıdır.
Model küçültmek mi yoksa regularization eklemek mi daha iyi?
Veri seti çok küçükse model küçültmek daha temiz bir çözümdür: daha az parametre, daha az ezberleme kapasitesi demektir. Ancak veri yeterli ama dağılım karmaşıksa, büyük modeli regularization ile dizginlemek daha iyi genelleme sağlar. Önce baseline ile karşılaştırarak hangi yolun val_loss'u daha düşürdüğünü ölçün.


