Jaka funkcja strat dla zadań klasyfikacyjnych wielu klas i wielu etykiet w sieciach neuronowych?

64

Uczę sieci neuronowej, aby klasyfikować zestaw obiektów do n-klas. Każdy obiekt może należeć do wielu klas jednocześnie (wiele klas, wiele etykiet).

Czytałem, że w przypadku problemów wieloklasowych ogólnie zaleca się stosowanie softmax i kategorycznej entropii krzyżowej jako funkcji straty zamiast mse i mniej więcej rozumiem dlaczego.

W przypadku mojego problemu wielu etykiet nie ma sensu stosowanie softmax, ponieważ prawdopodobieństwo każdej klasy powinno być niezależne od drugiej. Tak więc moją ostatnią warstwą są tylko jednostki sigmoidalne, które wyciskają swoje dane wejściowe w zakresie prawdopodobieństwa 0..1 dla każdej klasy.

Teraz nie jestem pewien, jakiej funkcji utraty powinienem użyć do tego. Patrząc na definicję kategorycznej crosssentropy, uważam, że nie przydałaby się ona dobrze do tego problemu, ponieważ uwzględni jedynie wyjście neuronów, które powinny wynosić 1, i ignoruje pozostałe.

Binarna entropia krzyżowa brzmi tak, jakby lepiej pasowała, ale widzę ją tylko wspomnianą w przypadku problemów z klasyfikacją binarną z jednym neuronem wyjściowym.

Używam Pythona i Keras do szkolenia na wypadek, gdyby miało to znaczenie.

aKzenT
źródło
1
Uważam, że softmax to „jednostki sigmoidalne, które wyciskają swoje dane wejściowe w zakresie prawdopodobieństwa 0..1 dla każdej klasy”.
Hong Ooi,
Możesz użyć softmax jako funkcji utraty, a następnie użyć prawdopodobieństw do wielopoznania danych.
balboa

Odpowiedzi:

30

Jeśli używasz keras, po prostu umieść sigmoidy na warstwie wyjściowej, a binary_crossentropy na funkcji kosztów.

(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

nclasses

Jeśli średnio do dowolnego wiersza jest przypisanych mniej etykiet, można użyć softmax_cross_entropy_with_logits, ponieważ przy tej stracie, podczas gdy klasy wzajemnie się wykluczają, ich prawdopodobieństwa nie muszą być. Wymagane jest jedynie, aby każdy wiersz etykiet był prawidłowym rozkładem prawdopodobieństwa. Jeśli nie, obliczenie gradientu będzie nieprawidłowe.

Alok Nayak
źródło
Drogi Aloku, czy możesz wyjaśnić PO, jak oni skorzystaliby z tej funkcji i dlaczego ma to sens? Jak zobaczysz na tej wycieczce , na stronie nie zachęca się tylko odpowiedzi na link.
Antoine Vernet,
Ładne krótkie wyjaśnienie można znaleźć w keras github: github.com/fchollet/keras/issues/741
Dror Hilman
1
Podczas korzystania z entropii krzyżowej nie zaleca się pisania własnych funkcji kosztów - może to być przyczyną problemów ze stabilnością liczbową. Zobacz github.com/tensorflow/tensorflow/issues/2462 do dyskusji.
kbrose
Jedna rzecz to multilabel, inna rzecz to multilabel multlass. Sigmoid zgniata twój wynik między 0 a 1, ale OP ma wiele klas, więc wyniki powinny wynosić np. 0 - 10. Więc wyniki powinny wyglądać: [0,5,2,3,1] <--- to nie to, co sigmoid robi.
mimoralea
powinienem tf.round (logity) przed użyciem w funkcji kosztów lub czy mogę bezpośrednio używać logów z ukrytej warstwy do tf.nn.sigmoid ....?
Monk
9

AKTUALIZACJA (18/04/18): Stara odpowiedź wciąż okazała się przydatna w moim modelu. Sztuka polega na tym, aby osobno modelować funkcję podziału i rozkład, wykorzystując w ten sposób moc softmax.

ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym) aby osiągnąć dwie właściwości:

  1. mP(ym)=1
  2. Z

max(0.01,output)

W praktyce wybór optymalizatora również robi ogromną różnicę. Moje doświadczenie z podejściem do faktoryzacji polega na tym, że działa najlepiej pod Adadeltą (Adagrad nie działa dla mnie, nie próbowałem jeszcze RMSprop, wydajność SGD jest zależna od parametru).

Z

AKTUALIZACJA : (losowo) Wydaje się, że zastosowanie procesu Dirichleta pozwoliłoby na włączenie niektórych wcześniejszych liczb etykiet?

AKTUALIZACJA : W eksperymencie zmodyfikowana dywergencja KL jest nadal skłonna do generowania wyników wielu klas, a nie wyników wielu etykiet.


(Stara odpowiedź)

Moje doświadczenie z sigmoidalną entropią krzyżową nie było zbyt przyjemne. W tej chwili używam zmodyfikowanej dywergencji KL. Przybiera formę

Loss(P,Q)=x|P(x)Q(x)||logP(x)Q(x)|=x|(P(x)Q(x))logP(x)Q(x)|
P(x)Q(x)

xP(x)=2

Improwizacja Keras

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)
powinieneś zobaczyć
źródło
w moim konkretnym zbiorze danych adambył znacznie lepszy niżrmsprop
shadi,
Jeśli wykorzystasz taką stratę do treningu, jak to zrobić w fazie testowej? Użyj też softmax do przewidywania, ale jak wybrać próg, aby określić klasy z wieloma etykietami?
karl_TUM
1

Nie korzystałem jeszcze z Keras. Biorąc na przykład caffe, możesz używać w SigmoidCrossEntropyLossLayerprzypadku problemów z wieloma etykietami.

mintaka
źródło
1
Chcesz wyjaśnić, dlaczego to jest dobre podejście?
Firebug
0

Właściwie w tensorsflow nadal możesz używać sigmoid_cross_entropy_meanfunkcji obliczania strat w wielu etykietach, bardzo to potwierdzam

wyjątkowa małpa
źródło
Daj nam link do dokumentacji
Ivelin
0

Jestem tu nowicjuszem, ale spróbuję spróbować z tym pytaniem. Szukałem tego samego, co Ty, i wreszcie znalazłem bardzo dobry samouczek klasyfikacji wieloklasowej Keras @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

Autor tego samouczka używa kategorycznej funkcji utraty entropii krzyżowej, a jest inny wątek, który może pomóc ci znaleźć rozwiązanie @ tutaj .

Willy satrio nugroho
źródło
3
To nie tylko wiele klas, to także wiele etykiet.
Monk