Tensorflow tiene un tutorial de ejemplo sobre la clasificación de CIFAR-10 . En el tutorial, la pérdida de entropía cruzada promedio en todo el lote se minimiza.
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')
Ver cifar10.py , línea 267.
¿Por qué no minimiza la suma en todo el lote? ¿Hace alguna diferencia? No entiendo cómo esto afectaría el cálculo de backprop.
Respuestas:
Como mencionó pkubik, generalmente hay un término de regularización para los parámetros que no depende de la entrada, por ejemplo, en tensorflow es como
En este caso, promediar el mini lote ayuda a mantener una relación fija entre la
cross_entropy
pérdida y laregularizer
pérdida mientras se cambia el tamaño del lote.Además, la tasa de aprendizaje también es sensible a la magnitud de la pérdida (gradiente), por lo que para normalizar el resultado de diferentes tamaños de lote, tomar el promedio parece una mejor opción.
Actualizar
Este documento de Facebook (Precisión, SGD de minibatch grande: capacitación de ImageNet en 1 hora) muestra que, en realidad, escalar la tasa de aprendizaje de acuerdo con el tamaño del lote funciona bastante bien:
que es esencialmente lo mismo que multiplicar el gradiente por k y mantener la tasa de aprendizaje sin cambios, por lo que supongo que no es necesario tomar el promedio.
fuente
Me enfocaré en la parte:
En primer lugar, probablemente ya haya notado que la única diferencia entre los valores de pérdida resultantes es que la pérdida promedio se reduce con respecto a la suma por el factor , es decir, que , donde es el tamaño del lote. Podemos demostrar fácilmente que la misma relación es verdadera para una derivada de cualquier variable wrt. las funciones de pérdida ( ) observando la definición de derivada: Ahora, nos gustaría multiplicar el valor de la función y ver cómo afecta a la derivada:1B LSUM=B⋅LAVG B dLSUMdx=BdLAVGdx dLdx=limΔ→0L(x+Δ)−L(x)Δ d(c⋅L)dx=limΔ→0c⋅L(x+Δ)−c⋅L(x)Δ
Cuando factorizamos la constante y la movemos antes del límite, deberíamos ver que tenemos la definición de derivada original multiplicada por una constante, que es exactamente lo que queríamos demostrar:
d(c⋅L)dx=c⋅limΔ→0L(x+Δ)−L(x)Δ=c⋅dLdx
En SGD actualizaríamos los pesos usando su gradiente multiplicado por la tasa de aprendizaje y podemos ver claramente que podemos elegir este parámetro de tal manera que las actualizaciones de pesos finales sean iguales. La primera regla de actualización: y la segunda regla de actualización (imagine que ):λ W:=W+λ1dLSUMdW λ1=λ2B W:=W+λ1dLAVGdW=W+λ2BdLSUMdW
El excelente hallazgo de dontloo puede sugerir que usar la suma podría ser un enfoque un poco más apropiado. Para justificar el promedio que parece ser más popular, agregaría que usar la suma probablemente pueda causar algunos problemas con la regularización del peso. Ajustar el factor de escala para los regularizadores para diferentes tamaños de lote puede ser tan molesto como ajustar la velocidad de aprendizaje.
fuente