Является ли обычной практикой минимизация средней потери по партиям вместо суммы?


16

В Tensorflow есть пример учебника по классификации CIFAR-10 . В учебном пособии средняя кросс-энтропийная потеря по партии сведена к минимуму.

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

См. Cifar10.py , строка 267.

Почему это не минимизирует сумму по партии? Есть ли разница? Я не понимаю, как это повлияет на расчет backprop.


Точно не связано с суммой / средним, но выбор потерь - выбор дизайна приложения. Например, если вы хорошо справляетесь со средней, оптимизируйте среднее. Если ваше приложение чувствительно к худшему сценарию (например, автокатастрофе), вам следует оптимизировать максимальное значение.
Алекс Креймер

Ответы:


16

Как уже упоминалось в pkubik, обычно есть параметр регуляризации для параметров, который не зависит от входных данных, например, в тензорном потоке это похоже на

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

В этом случае усреднение по мини-партии помогает поддерживать фиксированное соотношение между cross_entropyпотерями и regularizerпотерями, в то время как размер партии изменяется.

Более того, скорость обучения также чувствительна к величине потерь (градиент), поэтому для нормализации результата при разных размерах партии выбор среднего значения представляется лучшим вариантом.


Обновить

Эта статья Facebook (точная, большая мини-партия SGD: обучение ImageNet за 1 час) показывает, что на самом деле масштабирование скорости обучения в соответствии с размером партии работает довольно хорошо:

Правило линейного масштабирования: когда размер мини-пакета умножается на k, умножьте скорость обучения на k.

по сути, это то же самое, что умножить градиент на k и сохранить скорость обучения без изменений, так что я думаю, что брать среднее значение не нужно.


8

Я сосредоточусь на части:

Я не понимаю, как это повлияет на расчет 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

В SGD мы обновляли бы веса, используя их градиент, умноженный на скорость обучения и мы ясно видим, что мы можем выбрать этот параметр таким образом, чтобы конечные обновления весов были равны. Первое правило обновления: и второе правило обновления (представьте, что ): λ

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


Отличная находка dontloo может предположить, что использование суммы может быть немного более подходящим подходом. Чтобы оправдать среднее значение, которое кажется более популярным, я бы добавил, что использование суммы может вызвать некоторые проблемы с регуляризацией веса. Настройка коэффициента масштабирования для регуляризаторов для разных размеров пакетов может быть такой же раздражающей, как и настройка скорости обучения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.