Czy powszechną praktyką jest minimalizowanie średniej straty w partiach zamiast sumy?


17

Tensorflow ma przykładowy samouczek na temat klasyfikowania CIFAR-10 . W samouczku średnia utrata entropii krzyżowej w partii jest zminimalizowana.

def loss(logits, labels):
  """Add L2Loss to all the trainable variables.
  Add summary for for "Loss" and "Loss/avg".
  Args:
    logits: Logits from inference().
    labels: Labels from distorted_inputs or inputs(). 1-D tensor
            of shape [batch_size]
  Returns:
    Loss tensor of type float.
  """
  # Calculate the average cross entropy loss across the batch.
  labels = tf.cast(labels, tf.int64)
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits, labels, name='cross_entropy_per_example')
  cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
  tf.add_to_collection('losses', cross_entropy_mean)

  # The total loss is defined as the cross entropy loss plus all of the weight
  # decay terms (L2 loss).
  return tf.add_n(tf.get_collection('losses'), name='total_loss')

Patrz cifar10.py , linia 267.

Dlaczego zamiast tego nie minimalizuje sumy w partii? Czy to robi różnicę? Nie rozumiem, w jaki sposób wpłynęłoby to na obliczenia backprop.


Nie ma dokładnie związku z sumą / średnią, ale wybór straty jest wyborem projektu aplikacji. Na przykład, jeśli jesteś dobry w przeciętnej racji, zoptymalizuj średnią. Jeśli aplikacja jest wrażliwa na najgorszy scenariusz (np. Wypadek samochodowy), należy zoptymalizować wartość maksymalną.
Alex Kreimer,

Odpowiedzi:


17

Jak wspomniał pkubik, zwykle istnieje termin regularyzacji dla parametrów, które nie zależą od danych wejściowych, na przykład w tensorflow jest to jak

# Loss function using L2 Regularization
regularizer = tf.nn.l2_loss(weights)
loss = tf.reduce_mean(loss + beta * regularizer)

W takim przypadku uśrednianie dla mini-partii pomaga utrzymać stały stosunek między cross_entropystratą a regularizerstratą podczas zmiany wielkości partii.

Ponadto szybkość uczenia się jest również wrażliwa na wielkość straty (gradientu), dlatego w celu znormalizowania wyniku o różnych rozmiarach partii lepszym rozwiązaniem jest przyjęcie średniej.


Aktualizacja

Ten artykuł opublikowany przez Facebooka (dokładne, duże SGD: Szkolenie ImageNet w 1 godzinę) pokazuje, że skalowanie szybkości uczenia się według wielkości partii działa całkiem dobrze:

Liniowa reguła skalowania: Gdy rozmiar mini-partii jest pomnożony przez k, pomnóż szybkość uczenia się przez k.

co jest w zasadzie takie samo jak pomnożenie gradientu przez k i utrzymanie niezmienionej szybkości uczenia się, więc myślę, że przyjęcie średniej nie jest konieczne.


8

Skoncentruję się na części:

Nie rozumiem, w jaki sposób wpłynęłoby to na obliczenia backprop.

1BLSUM=BLAVGBdLSUMdx=BdLAVGdx

dLdx=limΔ0L(x+Δ)L(x)Δ
d(cL)dx=limΔ0cL(x+Δ)cL(x)Δ
d(cL)dx=climΔ0L(x+Δ)L(x)Δ=cdLdx

W SGD aktualizowalibyśmy wagi za pomocą ich gradientu pomnożonego przez współczynnik uczenia i możemy wyraźnie zobaczyć, że możemy wybrać ten parametr w taki sposób, aby końcowe aktualizacje wag były równe. Pierwsza reguła aktualizacji: i druga reguła aktualizacji (wyobraź sobie, że ): λ

W:=W+λ1dLSUMdW
λ1=λ2B
W:=W+λ1dLAVGdW=W+λ2BdLSUMdW


Doskonałe odkrycie dontloo może sugerować, że użycie sumy może być nieco bardziej odpowiednim podejściem. Aby uzasadnić średnią, która wydaje się być bardziej popularna, dodam, że użycie sumy może prawdopodobnie powodować pewne problemy z regulacją wagi. Strojenie współczynnika skalowania dla regulizatorów dla różnych wielkości partii może być równie irytujące, jak dostrojenie szybkości uczenia się.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.