É prática comum minimizar a perda média dos lotes em vez da soma?


14

O Tensorflow tem um tutorial de exemplo sobre a classificação do CIFAR-10 . No tutorial, a perda média de entropia cruzada no lote é minimizada.

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')

Veja cifar10.py , linha 267.

Por que não minimiza a soma do lote? Isso faz diferença? Não entendo como isso afetaria o cálculo do backprop.


Não está exatamente relacionado à soma / média, mas a opção de perda é uma opção de design de aplicativo. Por exemplo, se você é bom em ter razão, em média, otimize a média. Se sua aplicação é sensível a um cenário de pior caso (por exemplo, acidente automotivo), você deve otimizar o valor máximo.
precisa saber é o seguinte

Respostas:


15

Como mencionado por pkubik, geralmente há um termo de regularização para os parâmetros que não dependem da entrada, por exemplo, no tensorflow, é como

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

Nesse caso, a média do mini lote ajuda a manter uma proporção fixa entre a cross_entropyperda e a regularizerperda enquanto o tamanho do lote é alterado.

Além disso, a taxa de aprendizado também é sensível à magnitude da perda (gradiente); portanto, para normalizar o resultado de diferentes tamanhos de lote, tomar a média parece uma opção melhor.


Atualizar

Este artigo do Facebook (Minibatch grande e preciso SGD: treinando o ImageNet em 1 hora) mostra que, na verdade, escalar a taxa de aprendizado de acordo com o tamanho do lote funciona muito bem:

Regra de dimensionamento linear: quando o tamanho do minibatch for multiplicado por k, multiplique a taxa de aprendizado por k.

que é essencialmente o mesmo que multiplicar o gradiente por k e manter a taxa de aprendizado inalterada, então acho que não é necessário fazer a média.


8

Vou me concentrar na parte:

Não entendo como isso afetaria o cálculo do backprop.

Antes de tudo, você provavelmente já percebeu que a única diferença entre os valores de perda resultantes é que a perda média é reduzida em relação à soma pelo fator1BLSUM=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

No SGD, atualizaríamos os pesos usando seu gradiente multiplicado pela taxa de aprendizado e podemos ver claramente que podemos escolher esse parâmetro de forma que as atualizações finais dos pesos sejam iguais. A primeira regra de atualização: e a segunda regra de atualização (imagine que ): λ

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


A excelente descoberta de dontloo pode sugerir que o uso da soma pode ser uma abordagem um pouco mais apropriada. Para justificar a média que parece ser mais popular, eu acrescentaria que o uso da soma provavelmente pode causar alguns problemas com a regularização de peso. Ajustar o fator de escala dos regularizadores para diferentes tamanhos de lote pode ser tão irritante quanto ajustar a taxa de aprendizado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.