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ć sigmoid
zamiast softmax
? Czym różnią się sparse
funkcje 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? .
tf.losses.log_loss
, właściwie to jest tylko dla binarnej crossentropy. Również github.com/tensorflow/tensorflow/issues/2462Odpowiedzi:
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
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
(WYCOFANE)Jak wspomniano wcześniej,
sigmoid
funkcja 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_logits
rozwiązujeN
klasyfikacje binarne na raz.Etykiety muszą być zakodowane na gorąco lub mogą zawierać prawdopodobieństwa klas miękkich.
tf.losses.sigmoid_cross_entropy
dodatkowo pozwala na ustawienie wagi partii , tj. uczynienie niektórych przykładów ważniejszymi od innych.tf.nn.weighted_cross_entropy_with_logits
pozwala 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
tf.nn.softmax_cross_entropy_with_logits
(WYCOFANE W 1.5)tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
tf.contrib.losses.softmax_cross_entropy
(WYCOFANE)Te funkcje strat powinny być używane do wielomianowej wzajemnie wykluczającej się klasyfikacji, tj. Wybrać jedną z
N
klas. Ma również zastosowanie, gdyN = 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
sigmoid
rodzinie,tf.losses.softmax_cross_entropy
pozwala 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 wprowadzono
v2
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
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy
(WYCOFANE)Podobnie jak
softmax
powyżej, te funkcje strat powinny być używane do wielomianowej wzajemnie wykluczającej się klasyfikacji, tj. Wybrać jedną zN
klas. 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ć, żelogits
argument musi nadal zawierać logi dla każdej klasy, dlatego zajmuje co najmniej[batch_size, classes]
pamięć.Podobnie jak powyżej,
tf.losses
wersja maweights
argument, który pozwala ustawić wagi w partii.Rodzina funkcji softmax próbkowanych
tf.nn.sampled_softmax_loss
tf.contrib.nn.rank_sampled_softmax_loss
tf.nn.nce_loss
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
weights
ibiases
okreś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,
labels
nie 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
softmax
straty (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.źródło
N
od razu rozwiązuje zadania klasyfikacji binarnej, toN = prod(output.shape)
np.shape = [batch, examples, channels]; N = (batch * examples * channels)
? Jeślitf.losses
spodziewasz 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/ ...Jednak dla wersji 1.5
softmax_cross_entropy_with_logits_v2
należy użyć zamiast tego, używając jej argumentu zargument key=...
npsoftmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y, logits=my_prediction, dim=-1, name=None)
źródło