Yüksek kayıp değerine rağmen iyi doğruluk


15

Basit bir sinir ağı ikili sınıflandırıcısının eğitimi sırasında çapraz entropi kullanarak yüksek bir kayıp değeri elde ederim. Buna rağmen, doğrulama setindeki doğruluk değeri oldukça iyi. Bunun bir anlamı var mı? Kayıp ve doğruluk arasında katı bir ilişki yok mu?

Bu değerleri eğitim ve onaylama üzerine aldım: 0.4011 - acc: 0.8224 - val_loss: 0.4577 - val_acc: 0.7826 . Bu bir NN uygulamak için ilk denemem ve makine öğrenmeye yaklaştım, bu yüzden bu sonuçları doğru bir şekilde değerlendiremiyorum.


3
Sadece eğitim setinde veya validasyonda yüksek bir kayıp değeri gözlemliyor musunuz? Eğitim seti ile doğrulama setini karşılaştırırken doğruluk veya kayıpta büyük bir düşüş var mı? Bazı rakamlar yardımcı olacaktır
Hugh

Yanıtlar:


20

Benzer bir sorun yaşadım.

Sinir ağı ikili sınıflandırıcımı entropi kaybıyla eğittim. Burada çağın bir fonksiyonu olarak çapraz entropinin sonucu. Kırmızı eğitim seti için, mavi test seti için.

Çağın bir fonksiyonu olarak çapraz entropi.

Doğruluğu göstererek, epoch 1000 için, epoch 50'ye kıyasla, test seti için bile daha iyi bir doğruluk elde etme sürprizim oldu!

Çağın bir fonksiyonu olarak doğruluk

Çapraz entropi ve doğruluk arasındaki ilişkileri anlamak için, daha basit bir modele, lojistik regresyona girdim (bir giriş ve bir çıkış ile). Aşağıda, bu ilişkiyi 3 özel durumda açıklıyorum.

Genel olarak, çapraz entropinin minimum olduğu parametre, doğruluğun maksimum olduğu parametre değildir. Ancak, çapraz entropi ve doğruluk arasında bir ilişki bekleyebiliriz.

[Aşağıda, çapraz entropinin ne olduğunu bildiğinizi, modeli eğitmek için neden doğruluk yerine kullandığımızı bildiğinizi varsayarım. Değilse, lütfen önce bunu okuyun: Çapraz entropi puanı nasıl yorumlanır? ]

Çizim 1 Bu, çapraz entropinin minimum olduğu parametrenin doğruluğun maksimum olduğu parametre olmadığını göstermek ve nedenini anlamaktır.

İşte örnek verilerim. Ben 5 puan var ve örneğin -1 giriş 0 çıkış yol açar. 5 puanlık örnek

Çapraz entropi. Çapraz entropiyi en aza indirdikten sonra 0,6 doğruluk elde ederim. 0 ile 1 arasındaki kesim x = 0.52'de yapılır. 5 değer için sırasıyla bir çapraz entropi elde ederim: 0.14, 0.30, 1.07, 0.97, 0.43.

Doğruluk. Bir ızgaradaki doğruluğu en üst düzeye çıkardıktan sonra 0.8'e yol açan birçok farklı parametre elde ederim. Bu, x = -0.1 kesimini seçerek doğrudan gösterilebilir. Kümeleri kesmek için x = 0,95'i de seçebilirsiniz.

İlk durumda, çapraz entropi büyüktür. Gerçekten de, dördüncü nokta kesmeden uzaktır, bu yüzden büyük bir çapraz entropiye sahiptir. Yani, sırasıyla bir çapraz entropi elde ediyorum: 0.01, 0.31, 0.47, 5.01, 0.004.

İkinci durumda, çapraz entropi de büyüktür. Bu durumda, üçüncü nokta kesikten uzaktır, bu nedenle büyük bir çapraz entropiye sahiptir. Sırasıyla bir çapraz entropi elde ederim: 5e-5, 2e-3, 4.81, 0.6, 0.6.

birbirbKüçük veri örneği

n=100bir=0.3b=0.5

bbbirOrta set

bir

bir=0.3

n=10000bir=1b=0

Oldukça büyük veri

Model yeterli kapasiteye sahipse (gerçek modeli içerecek kadar) ve veriler büyükse (yani örnek boyutu sonsuza giderse), doğruluk maksimum olduğunda, en azından lojistik model için çapraz entropi minimum olabilir. . Bunun bir kanıtı yok, eğer bir referansı varsa, lütfen paylaşın.

Kaynakça: Çapraz entropi ve doğruluğu birbirine bağlayan konu ilginç ve karmaşıktır, ancak bununla ilgili makaleler bulamıyorum ... Doğruluğu incelemek ilginçtir çünkü uygunsuz bir puanlama kuralı olmasına rağmen herkes anlamını anlayabilir.

Not: İlk olarak, bu web sitesinde bir cevap bulmak istiyorum, doğruluk ve çapraz entropi arasındaki ilişki ile ilgili mesajlar çok sayıda ancak birkaç cevapla, bkz: Karşılaştırılabilir izleme ve test çapraz entropileri çok farklı doğruluklarla sonuçlanır ; Doğrulama kaybı azalıyor, ancak doğrulama doğruluğu kötüleşiyor ; Kategorik çapraz entropi kaybı fonksiyonunda şüphe ; Günlük kaybını yüzde olarak yorumlama ...


Çok iyi çizimler. Bu resimlerden esinlenerek 2 olası nedene varıyorum. 1. Model tahmin için gerekli özellikleri çıkarmak için çok basit. Çizim 1'inizde bu bir manifold problemidir ve% 100 doğruluk elde etmek için bir katman daha gerekir.
Diansheng

1

Dikkat edilmesi gereken önemli bir nokta da çapraz entropinin sınırlı bir kayıp olmamasıdır . Bu, çok yanlış bir tahminin potansiyel olarak kaybınızı "patlatmasını" sağlayabileceği anlamına gelir. Bu anlamda, son derece kötü bir şekilde sınıflandırılan ve kaybın patlamasına neden olan bir veya birkaç aykırı değer olması mümkündür, ancak aynı zamanda modeliniz hala veri kümesinin geri kalanında öğrenmektedir.

Aşağıdaki örnekte, test verilerinde bir aykırı değer bulunan çok basit bir veri kümesi kullanıyorum. 2 sınıf "sıfır" ve "bir" vardır.

Veri kümesi şöyle görünür:

resim açıklamasını buraya girin

Gördüğünüz gibi 2 sınıfın ayrılması son derece kolaydır: 0,5'in üzerinde sınıf "sıfır" dır. Ayrıca "sıfır" sınıfının ortasında sadece test setinde "bir" sınıfının tek bir aykırı değeri de vardır. Bu aykırı değer, kayıp fonksiyonu ile uğraşacağından önemlidir.

Bu veri kümesinde 1 gizli bir sinir ağı eğitiyorum, sonuçları görebilirsiniz:

resim açıklamasını buraya girin

Kayıp artmaya başlar, ancak doğruluk artmaya devam eder.

Örnekler başına kayıp fonksiyonunun bir histogramının çizilmesi sorunu açıkça göstermektedir: kayıp çoğu örnek için aslında çok düşüktür (0'da büyük çubuk) ve büyük bir kayıpla (17'de küçük çubuk) bir aykırı değer vardır. Toplam kayıp ortalama olduğundan, bir sette tüm puanlarda çok iyi performans göstermesine rağmen bu sette yüksek bir kayıp elde edersiniz.

resim açıklamasını buraya girin

Bonus: Veri ve model kodu

import tensorflow.keras as keras
import numpy as np

np.random.seed(0)
x_train_2 = np.hstack([1/2+1/2*np.random.uniform(size=10), 1/2-1.5*np.random.uniform(size=10)])
y_train_2 = np.array([0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1])
x_test_2 = np.hstack([1/2+1/2*np.random.uniform(size=10), 1/2-1.5*np.random.uniform(size=10)])
y_test_2 = np.array([0,0,0,1,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1])

keras.backend.clear_session()
m = keras.models.Sequential([
    keras.layers.Input((1,)),
    keras.layers.Dense(3, activation="relu"),
    keras.layers.Dense(1, activation="sigmoid")
])
m.compile(
    optimizer=keras.optimizers.Adam(lr=0.05), loss="binary_crossentropy", metrics=["accuracy"])
history = m.fit(x_train_2, y_train_2, validation_data=(x_test_2, y_test_2), batch_size=20, epochs=300, verbose=0)

TL; DR

Kaybınız birkaç aykırı tarafından ele geçirilmiş olabilir, kayıp fonksiyonunuzun doğrulama setinizin bireysel örnekleri üzerindeki dağılımını kontrol edin. Ortalamanın etrafında bir değer kümesi varsa, o zaman aşırı uyuyorsunuz. Düşük çoğunluk grubunun üzerinde çok yüksek birkaç değer varsa, kaybınız aykırı değerlerden etkilenir :)


-1

ahstat çok güzel çizimler verir.

Bu resimlerden esinlenerek 2 olası nedene varıyorum. 1. Model tahmin için gerekli özellikleri çıkarmak için çok basit. Çizim 1'inizde bu bir manifold problemidir ve% 100 doğruluk elde etmek için bir katman daha gerekir. 2. Verilerin çok fazla gürültülü etiketi var (Şekil 1 ve 3'ü karşılaştırın)

Çizim 2'ye gelince, modelde neden çok fazla L1 / L2 düzenlenmesi ekleyemeyeceğimizi açıklıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.