Как мини-пакетный градиентный спуск обновляет веса для каждого примера в пакете?

12

Если мы обрабатываем, скажем, 10 примеров в пакете, я понимаю, что мы можем суммировать потери для каждого примера, но как работает обратное распространение в отношении обновления весов для каждого примера?

Например:

  • Пример 1 -> потеря = 2
  • Пример 2 -> потеря = -2

Это приводит к средней потере 0 (E = 0), так как бы это обновляло каждый вес и сходилось? Является ли это просто благодаря рандомизации партий, которые мы, мы надеемся, рано или поздно сходятся? Кроме того, разве это не только вычисляет градиент для первого набора весов для последнего обработанного примера?

carboncomputed
источник

Ответы:

15

Градиентный спуск не совсем работает так, как вы предлагали, но может возникнуть аналогичная проблема.

Мы не рассчитываем средние потери из партии, мы вычисляем средние градиенты функции потерь. Градиенты являются производной потери по отношению к весу, а в нейронной сети градиент для одного веса зависит от входных данных этого конкретного примера, а также от многих других весов в модели.

Если ваша модель имеет 5 весов, а размер мини-партии 2, то вы можете получить это:

Пример 1. Потеря = 2,gradients=(1.5,2.0,1.1,0.4,0.9)

Пример 2. Потеря = 3,gradients=(1.2,2.3,1.1,0.8,0.7)

Среднее значение градиентов в этой мини-партии рассчитывается, они составляют(1.35,0.15,0,0.2,0.8)

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

редактировать в ответ на комментарии:

В моем примере выше вычисляется среднее значение градиентов. Для размера мини-партии где мы рассчитываем потери для каждого примера, мы стремимся получить средний градиент потерь по отношению к весу .kLiwj

Как я написал в своем примере, я усреднял каждый градиент, например:Lwj=1ki=1kLiwj

Код учебника, на который вы ссылаетесь в комментариях, использует Tensorflow, чтобы минимизировать среднюю потерю.

Tensorflow стремится минимизировать1ki=1kLi

Чтобы минимизировать это, он вычисляет градиенты средней потери по каждому весу и использует градиент-спуск для обновления весов:

Lwj=wj1ki=1kLi

Дифференцирование может быть внесено в сумму, поэтому оно совпадает с выражением из подхода в моем примере.

wj1ki=1kLi=1ki=1kLiwj

Хью
источник
Попался. Вы все еще хотите усреднить потери по batch_size правильно? Я не уверен, знакомы ли вы с тензорным потоком, но я пытался согласовать свое понимание с этим учебником: tenorflow.org/get_started/mnist/beginners Вы можете видеть, что потери усредняются по пакету (код Reduce_mean). Я полагаю, тензорный поток ведет внутренний подсчет / средние веса?
carboncomputed
1
@carboncomputed О, да, вы правы, они усредняют потери, поэтому, когда Tensorflow вычисляет градиенты средней потери, он эффективно вычисляет среднее значение градиентов для каждой потери. Я отредактирую свой ответ, чтобы показать математику для этого.
Хью
Интересный. Спасибо за разъяснения. Так что, чтобы немного глубже понять, рассчитываются ли весовые градиенты для каждого примера во время прямого прохода и сохраняются ли они или они вычисляются в процессе оптимизации в тензорном потоке? Я полагаю, что мне просто не хватает "где" эти градиенты в тензорном потоке? Я вижу прямой проход и потерю, так что тензорный поток выполняет для меня эти вычисления / усреднения градиента?
углерод вычислен
1
@carboncomputed Это привлекательность Tensorflow, он использует символическую математику и может провести различие под капотом
Хью
Спасибо за аккуратный ответ. Тем не менее, я не смог понять , как TF знает , как поддержать распространяющуюся со средней потерей , как показано в этом примере , code line 170?
грешник
-1

Причина использования мини-пакетов состоит в том, чтобы иметь хороший пример обучения, чтобы его возможный шум уменьшался путем усреднения их эффектов, но также это не полный пакет, который для многих наборов данных мог бы потребовать огромного количества памяти. Одним из важных фактов является то, что ошибка, которую вы оцениваете, всегда является расстояниеммежду вашим прогнозируемым выходом и реальным выходом: это означает, что он не может быть отрицательным, поэтому вы не можете иметь, как вы сказали, ошибку 2 и -2, которые отменяют, но вместо этого она станет ошибкой 4 Затем вы оцениваете градиент ошибки по отношению ко всем весам, чтобы вы могли вычислить, какое изменение весов уменьшит его больше всего. Как только вы это сделаете, вы сделаете «шаг» в этом направлении, основываясь на величине вашей альфа скорости обучения. (Это основные понятия, я не буду вдаваться в подробности о обратном распространении для глубокого NN). После того, как вы проведете это обучение для своего набора данных в течение определенного количества эпох, вы можете ожидать, что ваша сеть сходится, если ваш шаг обучения не слишком велик, чтобы заставить его расходиться. Вы все еще можете оказаться в местном минимумеЭтого можно избежать, по-разному инициализируя ваши веса, используя разные оптимизаторы и пытаясь упорядочить.

Dante
источник
Просто добавлю: мы используем мини-пакеты в основном для вычислительной эффективности. У нас есть компромисс между точностью снижения и частотой обновления весов. Данные должны быть очень большими, чтобы не помещаться в память.
Лукаш Град,
Я понимаю каждый, но как мы можем обновить наши веса для конкретной партии? Весовые градиенты также суммируются для каждого примера?
carboncomputed
Нет, в общей ошибке пакета есть только один градиент, который является вектором производных. Это означает, что мы обновляем один раз наши веса, основанные на градиенте, то есть направление обновления, которое делает ошибку в этом мини-пакете наибольшим уменьшением. Градиент состоит из частных производных, то есть производной от ошибки мини-партии по каждому весу: это говорит нам, должен ли каждый вес становиться меньше или больше, и сколько. Все веса получают одно обновление для партии, чтобы уменьшить количество ошибок в этой мини-партии, которое не зависит от других мини-партий.
Dante