Чи є загальною практикою мінімізація середньої втрати за партіями замість суми?


17

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.

Чому натомість це не мінімізує суму по всій партії? Це має значення? Я не розумію, як це вплине на обчислення заднього плану.


Не точно пов’язані з сумою / середньою сумою, але вибір втрат - це вибір дизайну програми. Наприклад, якщо вам добре в середньому правильно, оптимізуйте середнє значення. Якщо ваш додаток чутливий до найгіршого випадку (наприклад, автомобільної аварії), вам слід оптимізувати максимальне значення.
Алекс Креймер

Відповіді:


17

Як згадував pkubik, зазвичай існує термін регуляризації параметрів, які не залежать від введення, наприклад, в tensorflow це як

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

У цьому випадку усереднення по міні-партії допомагає зберігати фіксований коефіцієнт між cross_entropyвтратою та regularizerвтратою при зміні розміру партії.

Більше того, швидкість навчання також чутлива до величини втрат (градієнта), тому для нормалізації результатів різних розмірів партії прийняття середнього виглядає кращим варіантом.


Оновлення

Цей документ від Facebook (точно, великий міні-пакет SGD: Training ImageNet за 1 годину) показує, що фактично масштабування рівня навчання відповідно до розміру партії працює досить добре:

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

що по суті те саме, що помножити градієнт на k і зберегти рівень навчання незмінним, тому, мабуть, брати середній показник не потрібно.


8

Я зупинюсь на частині:

Я не розумію, як це вплине на обчислення заднього плану.

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.