Burada ve burada bu konuda iki soru buldum ama henüz net bir cevap veya açıklama yok. Aynı problemi Convolution Sinir Ağımdaki eğitim hatasından daha az olduğu durumlarda da aynı sorunu uyguluyorum. Bu ne anlama geliyor?
Burada ve burada bu konuda iki soru buldum ama henüz net bir cevap veya açıklama yok. Aynı problemi Convolution Sinir Ağımdaki eğitim hatasından daha az olduğu durumlarda da aynı sorunu uyguluyorum. Bu ne anlama geliyor?
Yanıtlar:
Gerçek metodolojinizi bilmeden kesin olmak zordur (örn. Çapraz doğrulama metodu, performans ölçümü, veri bölme metodu, vb.).
Genel olarak konuşursak, eğitim hatası neredeyse her zaman doğrulama hatasını küçümseyecektir . Ancak, doğrulama hatasının eğitimden daha az olması mümkündür. Bunu iki şekilde düşünebilirsiniz:
Bu nedenle model eğitim metodolojinizi gerçekten değerlendirmeniz önemlidir. Verilerinizi doğru bir şekilde eğitmek için ayırmazsanız, sonuçlarınız kafa karıştırıcı sonuçlara yol açar, sadece yanlış değilse sonuçlara yol açar.
Dört farklı kategoride model değerlendirmesi düşünüyorum:
Underfitting - Doğrulama ve eğitim hatası yüksek
Overfitting - Doğrulama hatası yüksek, eğitim hatası düşük
İyi uyum - Doğrulama hatası düşük, eğitim hatasından biraz daha yüksek
Bilinmeyen uyum - Doğrulama hatası düşük, eğitim hatası 'yüksek'
'Bilinmeyen' uygun diyorum çünkü sonuç, makine öğrenmenin nasıl çalıştığıyla ilgili sezgisel. ML'nin özü bilinmeyeni tahmin etmektir. Eğer bilmediğiniz şeyi 'öğrendiklerinizden' daha iyi tahmin ediyorsanız, AFAIK eğitim ve onaylama arasındaki veriler bir şekilde farklı olmalıdır. Bu, veri bölme yönteminizi yeniden değerlendirmeniz, daha fazla veri eklemeniz veya muhtemelen performans ölçümünüzü değiştirmeniz gerektiği anlamına gelebilir (aslında istediğiniz performansı ölçüyor musunuz?).
DÜZENLE
OP'nin önceki bir piton lazanya sorusuna referansını ele almak .
Bu, çapraz doğrulama gerektirmeyen yeterli veriye sahip olduğunuzu ve eğitim, doğrulama ve test veri alt kümelerinize sahip olduğunuzu gösterir. Şimdi, lazanya eğitimine bakarsanız , aynı davranışın sayfanın en üstünde görüldüğünü görebilirsiniz. Yazarların garip olsa bu tür sonuçlar yayınlayacağına inanmakta zorlanırdım ama sadece doğru olduklarını varsaymak yerine, daha ileri bakalım. Burada bizi en çok ilgilendiren bölüm eğitim döngüsü bölümünde, en altta, kayıp parametrelerinin nasıl hesaplandığını göreceksiniz.
Eğitim kaybı üzerinden hesaplanan tüm eğitim veri kümesi . Aynı şekilde, doğrulama kaybı tüm doğrulama veri kümesi üzerinden hesaplanır . Eğitim seti tipik olarak validasyonun en az 4 katıdır (80-20). Hatanın tüm numuneler üzerinde hesaplandığı göz önüne alındığında, validasyon setinin zarar ölçüsünün yaklaşık 4 katına kadar bekleyebilirsiniz. Ancak, eğitim devam ederken eğitim kaybının ve doğrulama kaybının birbirine yaklaştığını fark edeceksiniz. Bu, eğitim hatalarınız doğrulama hatalarınızdan daha düşük olmaya başlıyorsa, modelinize uymaya başlamışsınız gibi kasıtlıdır !!!
Umarım bu hataları açıklığa kavuşturur.
Bir olasılık: Ağınızda bırakma düzenlileştirme katmanı kullanıyorsanız, doğrulama hatasının eğitim hatasından daha küçük olması makul olabilir. Çünkü genellikle bırakma antrenman sırasında aktifleştirilir, ancak validasyon seti değerlendirilirken devre dışı bırakılır. İkinci durumda daha yumuşak (genellikle daha iyi demektir) işlevi elde edersiniz.
@ DK'nin cevabı hakkında yorum yapmak için yeterli puanım yok, ancak bu şimdi Keras'ın dokümantasyonunda SSS olarak cevaplandı:
“Eğitim kaybı neden test kaybından daha yüksek?
Bir Keras modelinin iki modu vardır: eğitim ve test. Düşüş ve L1 / L2 ağırlık normalizasyonu gibi düzenlileştirme mekanizmaları test sırasında kapatılır.
Ayrıca, eğitim kaybı, her bir eğitim verisi grubundaki kayıpların ortalamasıdır. Modeliniz zaman içinde değiştiğinden, bir dönemin ilk partileri üzerindeki kayıplar genellikle son partilerden daha yüksektir. Öte yandan, bir çağın test kaybı, çağın sonunda olduğu gibi model kullanılarak hesaplanır ve daha düşük bir kayba neden olur. "
2 sentim: Bırakma katmanları olmadan da aynı sorunu yaşadım. Benim durumumda - parti-norm katmanlar suçlularıydı. Onları silerken - eğitim kaybı doğrulama kaybına benziyordu. Muhtemelen, bunun nedeni, antrenman sırasında parti normunun, verilen partiden ortalamaya ve varyansı kullanmasıdır; bu, partiden partiye farklı olabilir. Ancak, değerlendirme sırasında parti-normu, her ikisi de eğitim boyunca tek bir partinin ortalama ve varyansından çok daha iyi ayarlanmış olan tüm özellikleri özelliklerini yansıtan çalışan ortalama ve varyans kullanır. En azından, parti normunun pytorch'te nasıl uygulandığı
Cevabını hem birleştiren başka olasılık @cdeterman ve @DK biraz veri büyütme mekanizmasını kullanarak eğer bir şekilde olduğunu. Etki veri artırımı genellikle sadece eğitim setinde yapılır ve validasyon setinde (bırakma düzenlemesi için değil) yapılır ve bu, antrenman setinde olduğundan daha kolay tahmin edilmesi gereken "kolay" durumları içeren bir validasyon setine yol açabilir.
@cdeterman ve @DK'nın iyi bir açıklaması var. Bir sebep daha istiyorum data leakage
. Tren verilerinizin bir kısmı test verileriyle "yakından ilişkilidir".
Potansiyel örnek: evcil hayvan başına 500 benzer resme sahip 1000 köpeğinizin ve 1000 kedinizin olduğunu düşünün (bazı sahipler evcil hayvanların resimlerini çok benzer pozisyonlarda çekmeyi seviyor). Bu nedenle, rastgele 70/30 bölünme yaparsanız, tren verilerinin test verilerinde veri sızıntısı olur.
Basitçe söylemek gerekirse, eğer eğitim kaybı ve doğrulama kaybı doğru hesaplanırsa, eğitim kaybının doğrulama kaybından daha yüksek olması mümkün değildir. Bunun nedeni, geri yayılımın DIRECTLY eğitim setinde hesaplanan hatayı azaltması ve sadece INDIRECTLY (hatta garanti edilmez!) Doğrulama setinde hesaplanan hatayı azaltmasıdır.
Antrenman sırasında ve validasyon sırasında farklı olan bazı ek faktörler bulunmalıdır. Bırakma iyi bir şey, ancak başkaları da olabilir. Kullandığınız kitaplığın belgelerini kontrol ettiğinizden emin olun. Modeller ve katmanlar genellikle dikkat etmediğimiz varsayılan ayarlara sahip olabilir.
Antrenman hatasından daha düşük bir validasyon, okulu bırakma veya başka şeylerle ilgili dalgalanmalardan kaynaklanabilir, ancak uzun vadede devam ederse, antrenman ve doğrulama veri setlerinin aslında aynı istatistik gruplarından alınmadığını gösterebilir. Bu, örnekleriniz bir seriden geliyorsa ve eğitim ve doğrulama veri kümelerini düzgün bir şekilde randomize etmediyseniz olabilir.
Şu anda, stokastik gradyan tabanlı yöntemler hemen hemen her zaman derin öğrenme için tercih edilen bir algoritmadır. Bu, verilerin gruplar halinde geldiği, gradyanların hesaplandığı ve parametrelerin güncellendiği anlamına gelir. Bu, her parti seçiliyken veri üzerindeki kaybı da hesaplayabileceğiniz anlamına gelir. Bu çerçevede, iki yolu vardır nasıl kaybı ben antrenman hata doğrulama hatası büyükse bu fenomenin yol açabilir düsünebilirz hesaplanır. Aşağıda, Keras'ın aslında örnek içi hataları bu yollarla hesapladığını gösteriyor.
1.) Eğitim hatası, tüm dönemin ortalamasıdır, daha ziyade dönemin sonunda bir kerede, ancak doğrulama hatası yalnızca dönemin sonundadır. Doğrulama hatasının tamamen güncellenme avantajına sahip olduğuna dikkat edin, eğitim hatası daha az güncellemeyle hata hesaplamaları içerir. Elbette, asimptotik olarak bu etki genellikle ortadan kaybolmalıdır.
2.) Toplu güncelleme yapılmadan önce eğitim hatası hesaplanır . Stokastik degrade tabanlı bir yöntemde, degradede bir miktar gürültü var. Biri bir tepeye tırmanırken, tüm eğitim örneklerinden hesaplanan küresel zararı azaltma ihtimali yüksek. Bir modda çok yakın aldığında Ancak, güncelleme yönü numunelerine göre negatif olacaktır içinde senin toplu. Biz moda etrafında zıplayan çünkü Ama bunun anlamı , ortalama olarak biz numuneler açısından olumlu bir yönü seçerek gerekir dışarıToplu Şimdi, belirli bir partideki numunelere göre güncelleme yapmak üzereysek, bu, dahil edilmemiş potansiyel olarak pek çok toplu güncelleme tarafından itildikleri anlamına gelir, güncelleme öncesinde kayıplarını hesaplayarak bu, stokastik durumdur. Yöntemler, parametreleri veri kümenizdeki diğer örneklerden en çok lehine itti, bu nedenle bize beklenen zararla ilgili küçük bir artış eğilimi sağladı.
Asimptotik olarak (1) 'in etkisinin ortadan kalktığını, (2)' nin olmadığını unutmayın! Aşağıda Keras'ın hem (1) hem de (2) göründüğünü gösteriyorum.
(1) Sonunda bir kerede değil, her bir partide ortalamaların ortalama olduğunu göstermek. İlk dönemde, val_accuracy lehine val_accuracy lehine BÜYÜK farklılık farkına dikkat edin. Bunun nedeni, bazı örnek hataların çok az sayıda toplu güncellemeyle hesaplanmasıdır.
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample
- loss: 0.2320 - accuracy: 0.9216
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1487 - accuracy: 0.9662
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1471 - accuracy: 0.9687
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>
(2) Her parti için güncellemeden önce hata gösteriliyor . Çağ 1 için, kullandığımız zaman batch_size = nRows
(yani, bir partideki tüm veriler), örnek içi hatanın çağ 1 için yaklaşık 0.5 (rastgele tahmin) olduğunu, ancak doğrulama hatasının 0.82 olduğunu unutmayın. Bu nedenle, parti içi güncellemeden önce numune içi hata hesaplanırken , doğrulama hatası toplu güncellemeden sonra hesaplanır .
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample
- loss: 0.7126 - accuracy: 0.5088
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample
- loss: 0.5770 - accuracy: 0.8211
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample
- loss: 0.4921 - accuracy: 0.8268
- val_loss: 0.4502 - val_accuracy: 0.8249