Jak wybrać stratę krzyżową entropii w TensorFlow?

84

Problemy klasyfikacyjne, takie jak regresja logistyczna lub wielomianowa regresja logistyczna, optymalizują utratę krzyżowej entropii . Zwykle warstwa cross-entropii podąża za warstwą softmax , co daje rozkład prawdopodobieństwa.

W tensorflow istnieje co najmniej kilkanaście różnych funkcji straty krzyżowej entropii :

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

Który z nich działa tylko w przypadku klasyfikacji binarnej, a który jest odpowiedni dla problemów wieloklasowych? Kiedy należy używać sigmoidzamiast softmax? Czym różnią się sparsefunkcje od innych i dlaczego tylko softmax?

Powiązana (bardziej zorientowana na matematykę) dyskusja: Jakie są różnice między wszystkimi tymi stratami krzyżowymi entropii w Keras i TensorFlow? .

Maksyma
źródło
1
Mamy też tf.losses.log_loss, właściwie to jest tylko dla binarnej crossentropy. Również github.com/tensorflow/tensorflow/issues/2462
mrgloom

Odpowiedzi:

140

Fakty wstępne

  • W sensie funkcjonalnym sigmoida jest częściowym przypadkiem funkcji softmax , gdy liczba klas jest równa 2. Obie wykonują tę samą operację: przekształcają logity (patrz poniżej) na prawdopodobieństwa.

    W prostej klasyfikacji binarnej nie ma dużej różnicy między tymi dwoma, jednak w przypadku klasyfikacji wielomianowej sigmoid pozwala radzić sobie z niewyłącznymi etykietami ( zwanymi też wieloma etykietami ), podczas gdy softmax zajmuje się ekskluzywnymi klasami (patrz poniżej).

  • Logarytmicznej (zwany również wynik) jest surowy wartość nieskalowany związany z klasą przed obliczania prawdopodobieństwa. Z punktu widzenia architektury sieci neuronowej oznacza to, że logit jest wynikiem gęstej (w pełni połączonej) warstwy.

    Nazewnictwo Tensorflow jest trochę dziwne: wszystkie poniższe funkcje akceptują logity, a nie prawdopodobieństwa , i same stosują transformację (co jest po prostu bardziej wydajne).

Rodzina funkcji sygmoidalnych

Jak wspomniano wcześniej, sigmoidfunkcja straty służy do klasyfikacji binarnej. Ale funkcje tensorflow są bardziej ogólne i pozwalają na klasyfikację z wieloma etykietami, gdy klasy są niezależne. Innymi słowy, tf.nn.sigmoid_cross_entropy_with_logitsrozwiązuje N klasyfikacje binarne na raz.

Etykiety muszą być zakodowane na gorąco lub mogą zawierać prawdopodobieństwa klas miękkich.

tf.losses.sigmoid_cross_entropydodatkowo pozwala na ustawienie wagi partii , tj. uczynienie niektórych przykładów ważniejszymi od innych. tf.nn.weighted_cross_entropy_with_logitspozwala na ustawienie wag klas (pamiętaj, że klasyfikacja jest binarna), czyli popełnienie błędów dodatnich większych niż błędów ujemnych. Jest to przydatne, gdy dane uczące są niezrównoważone.

Rodzina funkcji Softmax

Te funkcje strat powinny być używane do wielomianowej wzajemnie wykluczającej się klasyfikacji, tj. Wybrać jedną z Nklas. Ma również zastosowanie, gdy N = 2.

Etykiety muszą być zakodowane na gorąco lub mogą zawierać prawdopodobieństwa klasy miękkiej: konkretny przykład może należeć do klasy A z prawdopodobieństwem 50% i klasy B z prawdopodobieństwem 50%. Zauważ, że mówiąc ściśle, nie oznacza to, że należy do obu klas, ale w ten sposób można interpretować prawdopodobieństwa.

Podobnie jak w sigmoidrodzinie, tf.losses.softmax_cross_entropypozwala na ustawienie wagi wsadowej , czyli uczynić niektóre przykłady ważniejszymi od innych. O ile wiem, od tensorflow 1.3 nie ma wbudowanego sposobu ustawiania wag klas .

[UPD] W tensorflow 1.5 wprowadzonov2 wersję, a pierwotna strata została wycofana. Jedyna różnica między nimi polega na tym, że w nowszej wersji wsteczna propagacja zachodzi zarówno w logitach, jak i etykietach ( tutaj jest dyskusja, dlaczego może to być przydatne).softmax_cross_entropy_with_logits

Rodzina funkcji rzadkich

Podobnie jak softmaxpowyżej, te funkcje strat powinny być używane do wielomianowej wzajemnie wykluczającej się klasyfikacji, tj. Wybrać jedną z Nklas. Różnica polega na kodowaniu etykiet: klasy są określane jako liczby całkowite (indeks klasy), a nie wektory o jeden-gorący. Oczywiście nie zezwala to na zajęcia miękkie, ale może zaoszczędzić trochę pamięci, gdy są tysiące lub miliony klas. Należy jednak pamiętać, że logitsargument musi nadal zawierać logi dla każdej klasy, dlatego zajmuje co najmniej [batch_size, classes]pamięć.

Podobnie jak powyżej, tf.losseswersja ma weightsargument, który pozwala ustawić wagi w partii.

Rodzina funkcji softmax próbkowanych

Funkcje te stanowią kolejną alternatywę dla obsługi dużej liczby klas. Zamiast obliczać i porównywać dokładny rozkład prawdopodobieństwa, obliczają oszacowanie strat na podstawie losowej próby.

Argumenty weightsi biasesokreśl oddzielną, w pełni połączoną warstwę, która jest używana do obliczania logitów dla wybranej próbki.

Podobnie jak powyżej, labelsnie są zakodowane na gorąco, ale mają kształt [batch_size, num_true].

Funkcje próbkowane nadają się tylko do treningu. W czasie testu zaleca się użycie standardowej softmaxstraty (rzadkiej lub jednej gorącej), aby uzyskać rzeczywistą dystrybucję.

Inną alternatywą jest strata tf.nn.nce_loss, która wykonuje hałasu kontrastowe oszacowanie (jeśli jesteś zainteresowany, zobacz ten bardzo szczegółowe omówienie ). Dodałem tę funkcję do rodziny softmax, ponieważ NCE gwarantuje przybliżenie do softmax w limicie.

Maksyma
źródło
Czy mogę prosić o wyjaśnienie dotyczące entropii krzyża sigmoidalnego (sigCE)? Jeśli Nod razu rozwiązuje zadania klasyfikacji binarnej, to N = prod(output.shape)np. shape = [batch, examples, channels]; N = (batch * examples * channels)? Jeśli tf.lossesspodziewasz się "logitów" (danych wyjściowych sieci), czy powinienem również zwrócić prawdopodobieństwa, aby ułatwić użycie? czy mógłbyś spojrzeć na stackoverflow.com/questions/53612973/ ...
SumNeuron
5

Jednak dla wersji 1.5 softmax_cross_entropy_with_logits_v2należy użyć zamiast tego, używając jej argumentu z argument key=...np

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
Żywe
źródło