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.
Odpowiedzi:
Jeśli używasz keras, po prostu umieść sigmoidy na warstwie wyjściowej, a binary_crossentropy na funkcji kosztów.
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.
źródło
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.
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).
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ę
Improwizacja Keras
źródło
adam
był znacznie lepszy niżrmsprop
Nie korzystałem jeszcze z Keras. Biorąc na przykład caffe, możesz używać w
SigmoidCrossEntropyLossLayer
przypadku problemów z wieloma etykietami.źródło
Właściwie w tensorsflow nadal możesz używać
sigmoid_cross_entropy_mean
funkcji obliczania strat w wielu etykietach, bardzo to potwierdzamźródło
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 .
źródło