Dropout
Rastgele Düşürme
Eğitim sırasında her ileri geçişte nöronların belirli bir oranını rastgele 'kapatan' düzenlileştirme tekniği — sinir ağlarında aşırı öğrenmeyi azaltır.
Dropout, bir gizli katmandaki nöronların rastgele bir oranını eğitim sırasında her ileri geçişte sıfırlar. Tipik dropout oranı 0.2–0.5 arası seçilir. Bu, modelin belirli nöronlara fazla bel bağlamasını engeller; her bir nöron, bağlı olduğu diğer nöronların 'orada olmayabileceğini' düşünerek daha sağlam ve genel temsiller öğrenmek zorunda kalır.
Eğitim ve inference arasında davranış farklıdır. Eğitimde
nöronlar oran kadar düşürülür ve geri kalanlar ölçeklenir
(1/(1-p) ile çarpılır). Inference'da hiç düşürme yapılmaz,
tüm nöronlar aktif. Bu yüzden PyTorch'ta model.train() ve
model.eval() ayrımı kritiktir.
Dropout, 2012'deki AlexNet'le birlikte derin öğrenmenin yaygın bir aracı oldu. Bugün modern transformer'larda hâlâ kullanılır ama yerini büyük ölçüde batch normalization ve weight decay aldı. Yine de küçük veriyle eğitilen FCN ve LSTM'lerde yardımcıdır; ayrıca Monte Carlo Dropout denilen teknikle inference'da da bırakılarak modelin belirsizliğini ölçmek için kullanılır.
Bir takımda her maç farklı oyuncuları sahaya almak gibi. Her oyuncu, takım arkadaşının her zaman olmayabileceğini bildiği için kendi oynayışını çeşitlendirir, başkasına aşırı bağımlı olmaz. Sonuçta takım, herhangi bir kombinasyonla iyi oynamayı öğrenir. Dropout, sinir ağına bu disiplini öğretir — her nöron 'ben tek başıma da yararlı olabilmeliyim' demek zorunda kalır.
Bir küçük kelime gömme + iki gizli katman ağı, 50.000 örnekli
metin sınıflandırma görevine eğitiliyor. Dropout olmadan eğitim
doğruluğu %98, validation %72 — ciddi aşırı öğrenme. Her gizli
katmandan sonra Dropout(0.5) eklenince eğitim doğruluğu
%88'e iniyor ama validation %81'e çıkıyor. Aradaki makas
azaldı, model gerçekten genelleşti.
Modern bir transformer'da ise durum farklı. GPT'nin attention katmanları iç içe çok parametreli. Dropout=0.1 gibi düşük bir oran kullanılır; weight decay ve learning rate schedule daha büyük rol oynar. Modelin büyüklüğü ve veri çeşitliliği arttıkça dropout ihtiyacı azalır.
import torch
import torch.nn as nn
class Classifier(nn.Module):
def __init__(self, in_dim, hidden, out_dim, p=0.3):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_dim, hidden),
nn.ReLU(),
nn.Dropout(p), # gizli katman 1 sonrası
nn.Linear(hidden, hidden),
nn.ReLU(),
nn.Dropout(p), # gizli katman 2 sonrası
nn.Linear(hidden, out_dim),
)
def forward(self, x):
return self.net(x)
model = Classifier(100, 64, 10)
# Eğitimde dropout aktif
model.train()
out = model(torch.randn(32, 100))
# Inference'da kapalı, tüm nöronlar aktif
model.eval()
with torch.no_grad():
preds = model(torch.randn(32, 100))# Inference'da bile dropout açık tutarak çoklu tahmin al
model.train() # dropout aktif
n_samples = 50
with torch.no_grad():
preds = torch.stack([model(x) for _ in range(n_samples)])
mean_pred = preds.mean(dim=0) # ortalama tahmin
uncertainty = preds.std(dim=0) # belirsizlik- Küçük-orta veri ile FCN, LSTM, basit CNN eğitimleri
- Aşırı öğrenme görüldüğünde — eğitim/validation makası büyükse
- Belirsizlik tahmini için Monte Carlo Dropout
- Transformer'da küçük oranla (0.1) uygulanır, dengeleyici etki
- Çok büyük modeller + büyük veri — dropout yerine weight decay ve data augmentation öncelikli
- Batch norm zaten kullanılıyorsa — ikisi birden eğitim dinamiğini bozabilir
- Inference'da varsayılan olarak — sadece MC Dropout amacıyla kasıtlı bırak
Eval moduna geçmeyi unutmak
model.eval() çağırmazsan inference sırasında dropout açık kalır, tahminler her seferinde farklı olur. Klasik bug — canlıya sızar.
Çok yüksek dropout oranı
0.7-0.8 oranlar genellikle modeli yetersiz öğrenmeye iter. 0.2–0.5 standart, transformer'larda 0.1 yeterli.
Convolutional katmanlarda standart dropout
Conv katmanlardan sonra düz Dropout pek etkili değildir; SpatialDropout2D (kanal düzeyinde) ya da DropBlock daha iyi sonuç verir.