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.
Odpowiedzi:
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
W takim przypadku uśrednianie dla mini-partii pomaga utrzymać stały stosunek między
cross_entropy
stratą aregularizer
stratą 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:
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.
źródło
Skoncentruję się na części:
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ę.
źródło