Garfield
YZF Admin
Erken durdurmayı, eğitim kaybını değil doğrulama kümesindeki seçtiğiniz metriği izleyerek tasarlayın. Metrik belirli sayıda epoch boyunca anlamlı biçimde iyileşmezse eğitimi sonlandırın ve model ağırlıklarını en iyi doğrulama sonucunun alındığı noktaya geri yükleyin. Böylece hem gereksiz epoch’ları çalıştırmaz hem de son epoch’ta oluşabilecek aşırı öğrenmiş modeli kullanmazsınız.
Erken durdurma için her epoch sonunda yalnızca eğitim sonucunu değil, modelin eğitim sırasında görmediği doğrulama kümesindeki sonucu ölçün. Sınıflandırmada genellikle doğrulama kaybı veya doğruluk; dengesiz sınıflarda ise F1, dengeli doğruluk ya da doğrudan uygulama hedefinize uygun başka bir ölçüt izlenebilir.
Doğrulama kaybını izliyorsanız düşük değer daha iyidir. Doğruluk veya F1 izleniyorsa yüksek değer daha iyidir. Bu yön bilgisi kodda açıkça belirtilmezse, model iyileşmesine rağmen eğitim yanlışlıkla durabilir.
Eğitim kaybını erken durdurma ölçütü yapmak çoğu durumda doğru değildir. Eğitim kaybı düşmeye devam ederken doğrulama kaybı yükseliyorsa model eğitim verisine fazla uyum sağlıyor olabilir.
İyi bir tasarım en az şu dört kararı açıkça verir:
Bu ayarlar sabit kurallar değildir. Doğrulama metriğiniz gürültülüyse patience değerini artırın. Küçük değişiklikler pratikte önemsizse min_delta değerini büyütün. Çok yüksek patience gereksiz hesaplama yaptırabilir; çok düşük patience ise geçici dalgalanma yüzünden eğitimi erken kesebilir.
Aşağıdaki sınıf, doğrulama kaybını izleyen, kayıp azaldığında en iyi ağırlıkları saklayan ve belirlenen sabır süresi dolduğunda eğitimi durduran varsayımsal bir uygulamadır.
Eğitim döngüsünde doğrulama aşamasını
Bu örnekte
Eğitim erken durduğunda bu, modelin kesin olarak en iyi mümkün noktaya ulaştığını kanıtlamaz. Yalnızca seçtiğiniz doğrulama metriğinin belirlediğiniz sabır süresi boyunca yeterince iyileşmediğini gösterir. Model hâlâ yetersiz öğreniyorsa patience değerini artırmak, öğrenme oranını gözden geçirmek veya model kapasitesini değiştirmek gerekebilir.
En iyi doğrulama kaybı epoch 18’de, erken durma ise epoch 24’te gerçekleşmişse kullanılacak ağırlıklar epoch 18’den geri yüklenmelidir. Son epoch’un ağırlıkları otomatik olarak daha iyi değildir.
Doğrulama kaybı düşerken test sonucu kötüleşiyorsa doğrulama kümesine de fazla uyum sağlanmış olabilir. Test kümesini eğitim ve ayar seçimi sırasında kullanmayın; onu yalnızca son model değerlendirmesi için ayırın. Erken durdurma kararını test sonucuna göre tekrar tekrar değiştirmek test ölçümünün güvenilirliğini azaltır.
Doğruluk yerine F1 veya başka bir metriği izlemek istiyorsanız aynı mantığı koruyup karşılaştırma yönünü değiştirin. Yüksek değer daha iyiyse başlangıç değerini
Modelinizde Dropout veya Batch Normalization varsa doğrulama sırasında
İzlenecek ölçütü doğru seçin
Erken durdurma için her epoch sonunda yalnızca eğitim sonucunu değil, modelin eğitim sırasında görmediği doğrulama kümesindeki sonucu ölçün. Sınıflandırmada genellikle doğrulama kaybı veya doğruluk; dengesiz sınıflarda ise F1, dengeli doğruluk ya da doğrudan uygulama hedefinize uygun başka bir ölçüt izlenebilir.
Doğrulama kaybını izliyorsanız düşük değer daha iyidir. Doğruluk veya F1 izleniyorsa yüksek değer daha iyidir. Bu yön bilgisi kodda açıkça belirtilmezse, model iyileşmesine rağmen eğitim yanlışlıkla durabilir.
Eğitim kaybını erken durdurma ölçütü yapmak çoğu durumda doğru değildir. Eğitim kaybı düşmeye devam ederken doğrulama kaybı yükseliyorsa model eğitim verisine fazla uyum sağlıyor olabilir.
Erken durdurma için temel ayarlar
İyi bir tasarım en az şu dört kararı açıkça verir:
| Ayar | Ne işe yarar? | Başlangıç yaklaşımı |
|---|---|---|
| İzlenen metrik | Modelin gerçekten iyileşip iyileşmediğini belirler. | Doğrulama kaybı veya görev metriği |
| Sabır (patience) | İyileşme olmadan kaç epoch daha bekleneceğini belirler. | 5-10 epoch ile başlayın |
| Anlamlı fark (min_delta) | Çok küçük dalgalanmaları iyileşme saymayı engeller. | Ölçüm ölçeğine göre küçük bir değer |
| En iyi ağırlıkları geri yükleme | Son modeli değil, en iyi doğrulama sonucundaki modeli korur. | Etkinleştirilmesi önerilir |
PyTorch için en küçük çalışır tasarım
Aşağıdaki sınıf, doğrulama kaybını izleyen, kayıp azaldığında en iyi ağırlıkları saklayan ve belirlenen sabır süresi dolduğunda eğitimi durduran varsayımsal bir uygulamadır.
min_delta, sabır sayacını sıfırlamak için kaybın son anlamlı iyileşme referansından ne kadar daha düşük olması gerektiğini belirler; fark bu eşiği aşmalıdır. Kod, geri yüklemek için gerçek en düşük kaybın ağırlıklarını ayrıca saklar; eşikten küçük bir düşüş de bu ağırlık kaydını günceller.
Python:
import copy
import torch
class EarlyStopping:
def __init__(self, patience=5, min_delta=0.0):
self.patience = patience
self.min_delta = min_delta
self.best_value = float("inf")
self.reference_value = float("inf")
self.bad_epochs = 0
self.best_state = None
def step(self, validation_loss, model):
# Geri yükleme için gerçek en düşük kaybı her zaman sakla.
if validation_loss < self.best_value:
self.best_value = validation_loss
self.best_state = copy.deepcopy(model.state_dict())
# Sabır sayacı ayrı bir anlamlı iyileşme referansı kullanır.
improved = validation_loss < self.reference_value - self.min_delta
if improved:
self.reference_value = validation_loss
self.bad_epochs = 0
return False
self.bad_epochs += 1
return self.bad_epochs >= self.patience
def restore_best(self, model):
if self.best_state is None:
raise RuntimeError("Geri yüklenecek bir en iyi model bulunamadı.")
model.load_state_dict(self.best_state)
Eğitim döngüsünde doğrulama aşamasını
torch.no_grad() ile çalıştırın. Her epoch sonunda elde edilen doğrulama kaybını sınıfa verin. step() değeri True döndürdüğünde döngüden çıkın; ardından en iyi ağırlıkları geri yükleyin.
Python:
model = MyModel()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = torch.nn.CrossEntropyLoss()
early_stopping = EarlyStopping(patience=5, min_delta=1e-4)
for epoch in range(100):
model.train()
for inputs, targets in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
model.eval()
validation_total = 0.0
validation_count = 0
with torch.no_grad():
for inputs, targets in validation_loader:
outputs = model(inputs)
loss = criterion(outputs, targets)
batch_size = inputs.size(0)
validation_total += loss.item() * batch_size
validation_count += batch_size
validation_loss = validation_total / validation_count
should_stop = early_stopping.step(validation_loss, model)
print(
f"epoch={epoch + 1}, "
f"validation_loss={validation_loss:.4f}, "
f"bad_epochs={early_stopping.bad_epochs}"
)
if should_stop:
print("Erken durdurma uygulandı.")
break
early_stopping.restore_best(model)
Bu örnekte
MyModel, train_loader ve validation_loader sizin model ve veri yükleyicilerinizdir. Doğrulama kümesinin eğitim döngüsünde ağırlık güncellememesi gerekir; aksi durumda izlediğiniz sonuç bağımsız bir doğrulama ölçümü olmaktan çıkar.Sonucun doğru yorumlanması
Eğitim erken durduğunda bu, modelin kesin olarak en iyi mümkün noktaya ulaştığını kanıtlamaz. Yalnızca seçtiğiniz doğrulama metriğinin belirlediğiniz sabır süresi boyunca yeterince iyileşmediğini gösterir. Model hâlâ yetersiz öğreniyorsa patience değerini artırmak, öğrenme oranını gözden geçirmek veya model kapasitesini değiştirmek gerekebilir.
En iyi doğrulama kaybı epoch 18’de, erken durma ise epoch 24’te gerçekleşmişse kullanılacak ağırlıklar epoch 18’den geri yüklenmelidir. Son epoch’un ağırlıkları otomatik olarak daha iyi değildir.
Doğrulama kaybı düşerken test sonucu kötüleşiyorsa doğrulama kümesine de fazla uyum sağlanmış olabilir. Test kümesini eğitim ve ayar seçimi sırasında kullanmayın; onu yalnızca son model değerlendirmesi için ayırın. Erken durdurma kararını test sonucuna göre tekrar tekrar değiştirmek test ölçümünün güvenilirliğini azaltır.
Sınıflandırma metriğini izlemek istediğinizde
Doğruluk yerine F1 veya başka bir metriği izlemek istiyorsanız aynı mantığı koruyup karşılaştırma yönünü değiştirin. Yüksek değer daha iyiyse başlangıç değerini
-inf yapmalı ve iyileşmeyi metric > best_value + min_delta biçiminde denetlemelisiniz. Kayıp ile metriği aynı karşılaştırma kuralında kullanmayın.Modelinizde Dropout veya Batch Normalization varsa doğrulama sırasında
model.eval(), ağırlık güncellemesi yapılan eğitim sırasında model.train() çağrısını kullanın. Aksi durumda doğrulama ölçümü eğitim davranışıyla karışabilir ve erken durdurma kararı istikrarsızlaşabilir.Kontrol listesi
- Kararı eğitim değil doğrulama metriğine bağlayın.
- Metrik yönünü açıkça belirleyin: kayıpta düşük, doğruluk ve F1’de yüksek değer iyidir.
- Geçici dalgalanmalar için yeterli patience bırakın.
- Önemsiz küçük değişimleri min_delta ile filtreleyin.
- En iyi model durumunu derin kopyalayarak saklayın.
- Eğitim bittiğinde veya erken durduğunda en iyi ağırlıkları geri yükleyin.
- Test kümesini erken durdurma ayarı için kullanmayın.
Son düzenleme: