Dobra dokładność pomimo wysokiej wartości strat

15

Podczas szkolenia prostego klasyfikatora binarnego sieci neuronowej uzyskuję wysoką wartość stratności, używając entropii krzyżowej. Mimo to wartość dokładności zestawu sprawdzania poprawności jest całkiem dobra. Czy to ma jakieś znaczenie? Nie ma ścisłej korelacji między stratą a dokładnością?

Mam na szkoleniu i walidacji następujące wartości: 0,4011 - acc: 0,8224 - val_loss: 0,4577 - val_acc: 0,7826 . To moja pierwsza próba zaimplementowania NN i właśnie zbliżyłem się do uczenia maszynowego, więc nie jestem w stanie właściwie ocenić tych wyników.

użytkownik146655
źródło
3
Czy widzisz wysoką wartość strat tylko na zestawie treningowym lub walidacji? Czy występuje duży spadek dokładności lub utraty przy porównywaniu zestawu treningowego i zestawu walidacyjnego? Przydałyby się pewne liczby
Hugh

Odpowiedzi:

20

Wystąpił podobny problem.

Trenowałem mój binarny klasyfikator sieci neuronowej z utratą entropii krzyżowej. Oto wynik entropii krzyża w funkcji epoki. Czerwony oznacza zestaw treningowy, a niebieski zestaw testowy.

Krzyżowanie entropii jako funkcja epoki.

Pokazując dokładność, z zaskoczeniem uzyskałem lepszą dokładność dla epoki 1000 w porównaniu do epoki 50, nawet dla zestawu testowego!

Dokładność jako funkcja epoki

Aby zrozumieć związki między entropią krzyżową a dokładnością, przekopałem się do prostszego modelu, regresji logistycznej (z jednym wejściem i jednym wyjściem). Poniżej zilustruję ten związek w 3 specjalnych przypadkach.

Zasadniczo parametr, w którym entropia krzyżowa jest minimalna, nie jest parametrem, w którym dokładność jest maksymalna. Możemy jednak oczekiwać pewnego związku między entropią krzyżową a dokładnością.

[Poniżej zakładam, że wiesz, co to jest entropia krzyżowa, dlaczego używamy jej zamiast dokładności do trenowania modelu itp. Jeśli nie, przeczytaj najpierw: Jak interpretować wynik entropii krzyżowej? ]

Ilustracja 1 Ten ma na celu pokazanie, że parametr, w którym entropia krzyżowa jest minimalna, nie jest parametrem, w którym dokładność jest maksymalna, i zrozumienie, dlaczego.

Oto moje przykładowe dane. Mam 5 punktów i na przykład wejście -1 prowadzi do wyjścia 0. Próbka 5 punktów

Krzyżowanie entropii. Po zminimalizowaniu entropii krzyżowej uzyskuję dokładność 0,6. Cięcia między 0 a 1 dokonuje się przy x = 0,52. Dla 5 wartości otrzymuję odpowiednio entropię krzyżową: 0,14, 0,30, 1,07, 0,97, 0,43.

Precyzja. Po zmaksymalizowaniu dokładności na siatce uzyskuję wiele różnych parametrów prowadzących do 0,8. Można to pokazać bezpośrednio, wybierając cięcie x = -0,1. Możesz także wybrać x = 0,95, aby wyciąć zestawy.

W pierwszym przypadku entropia krzyżowa jest duża. Rzeczywiście czwarty punkt jest daleko od cięcia, więc ma dużą entropię krzyża. Mianowicie, otrzymuję odpowiednio entropię krzyżową: 0,01, 0,31, 0,47, 5,01, 0,004.

W drugim przypadku entropia krzyżowa jest również duża. W takim przypadku trzeci punkt jest daleko od cięcia, więc ma dużą entropię krzyża. Otrzymuję odpowiednio krzyżową entropię: 5e-5, 2e-3, 4,81, 0,6, 0,6.

zazabPrzykład małych danych

n=100za=0,3b=0,5

bbzaZestaw średni

za

za=0,3

n=dziesięć tysięcyza=1b=0

Dość duże dane

Myślę, że jeśli model ma wystarczającą pojemność (wystarczającą, aby pomieścić prawdziwy model), a jeśli dane są duże (tzn. Wielkość próbki idzie w nieskończoność), wówczas entropia krzyżowa może być minimalna, gdy dokładność jest maksymalna, przynajmniej dla modelu logistycznego . Nie mam na to dowodu, jeśli ktoś ma referencję, proszę się nią podzielić.

Bibliografia: Temat łączący entropię krzyżową z dokładnością jest interesujący i złożony, ale nie mogę znaleźć artykułów na ten temat ... Badanie dokładności jest interesujące, ponieważ pomimo niewłaściwej reguły punktacji, każdy może zrozumieć jej znaczenie.

Uwaga: Po pierwsze, chciałbym znaleźć odpowiedź na tej stronie, posty dotyczące związku między dokładnością a entropią krzyżową są liczne, ale z kilkoma odpowiedziami, patrz: Porównywanie trajektorii i krzyżowanie entropii testowych prowadzi do bardzo różnych dokładności ; Spadek utraty walidacji, ale pogorszenie dokładności walidacji ; Wątpliwości co do kategorycznej funkcji utraty entropii krzyżowej ; Interpretacja utraty dziennika jako procent ...

ahstat
źródło
Bardzo dobre ilustracje. Zainspirowany tymi ilustracjami dochodzę do dwóch możliwych powodów. 1. Model jest zbyt prosty, aby wyodrębnić wymagane funkcje do prognozowania. Na ilustracji 1 jest to różnorodny problem i potrzeba jeszcze jednej warstwy, aby uzyskać 100% dokładności.
Diansheng
1

Należy również zauważyć, że entropia krzyżowa nie jest ograniczoną stratą. Co oznacza, że ​​jedna bardzo błędna prognoza może potencjalnie spowodować, że Twoja strata „wybuchnie”. W tym sensie możliwe jest, że istnieje jedna lub kilka wartości odstających, które są wyjątkowo źle sklasyfikowane i powodują eksplozję straty, ale jednocześnie twój model uczy się na pozostałej części zestawu danych.

W poniższym przykładzie używam bardzo prostego zestawu danych, w którym występuje wartość odstająca w danych testowych. Istnieją 2 klasy „zero” i „jeden”.

Oto jak wygląda zestaw danych:

wprowadź opis zdjęcia tutaj

Jak widać, dwie klasy są wyjątkowo łatwe do rozdzielenia: powyżej 0,5 jest to klasa „zero”. Istnieje również pojedyncza wartość odstająca klasy „jeden” pośrodku klasy „zero” tylko w zestawie testowym. Ta wartość odstająca jest ważna, ponieważ zakłóca działanie funkcji utraty.

Trenuję 1 ukrytą sieć neuronową na tym zestawie danych, możesz zobaczyć wyniki:

wprowadź opis zdjęcia tutaj

Strata zaczyna rosnąć, ale dokładność nadal rośnie.

Wykreślenie histogramu funkcji utraty dla próbek pokazuje wyraźnie problem: utrata jest w rzeczywistości bardzo mała dla większości próbek (duży słupek przy 0) i jest jedna wartość odstająca z ogromną stratą (mały słupek przy 17). Ponieważ całkowita strata jest średnią, otrzymujesz wysoką stratę na tym secie, mimo że radzi sobie bardzo dobrze na wszystkich punktach oprócz jednego.

wprowadź opis zdjęcia tutaj

Premia: Kod danych i modelu

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

Twoja utrata może zostać przejęta przez kilka wartości odstających, sprawdź rozkład funkcji straty na poszczególnych próbkach zestawu walidacyjnego. Jeśli wokół średniej znajduje się skupisko wartości, oznacza to, że nadmiernie się dopasowujesz. Jeśli jest tylko kilka wartości bardzo wysokich powyżej grupy o niskiej większości, na twoją stratę wpływ mają wartości odstające :)

Manu
źródło
-1

ahstat daje bardzo dobre ilustracje.

Zainspirowany tymi ilustracjami dochodzę do dwóch możliwych powodów. 1. Model jest zbyt prosty, aby wyodrębnić wymagane funkcje do prognozowania. Na ilustracji 1 jest to różnorodny problem i potrzeba jeszcze jednej warstwy, aby uzyskać 100% dokładności. 2. Dane mają zbyt wiele głośnych etykiet (porównaj ilustracje 1 i 3)

Jeśli chodzi o ilustrację 2, wyjaśnia, dlaczego nie możemy dodać zbyt dużej regularyzacji L1 / L2 w modelu.

Diansheng
źródło