Градиентный спуск не совсем работает так, как вы предлагали, но может возникнуть аналогичная проблема.
Мы не рассчитываем средние потери из партии, мы вычисляем средние градиенты функции потерь. Градиенты являются производной потери по отношению к весу, а в нейронной сети градиент для одного веса зависит от входных данных этого конкретного примера, а также от многих других весов в модели.
Если ваша модель имеет 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
Как я написал в своем примере, я усреднял каждый градиент, например:∂L∂wj=1k∑ki=1∂Li∂wj
Код учебника, на который вы ссылаетесь в комментариях, использует Tensorflow, чтобы минимизировать среднюю потерю.
Tensorflow стремится минимизировать1k∑ki=1Li
Чтобы минимизировать это, он вычисляет градиенты средней потери по каждому весу и использует градиент-спуск для обновления весов:
∂L∂wj=∂∂wj1k∑ki=1Li
Дифференцирование может быть внесено в сумму, поэтому оно совпадает с выражением из подхода в моем примере.
∂∂wj1k∑ki=1Li=1k∑ki=1∂Li∂wj
code line 170
?Причина использования мини-пакетов состоит в том, чтобы иметь хороший пример обучения, чтобы его возможный шум уменьшался путем усреднения их эффектов, но также это не полный пакет, который для многих наборов данных мог бы потребовать огромного количества памяти. Одним из важных фактов является то, что ошибка, которую вы оцениваете, всегда является расстояниеммежду вашим прогнозируемым выходом и реальным выходом: это означает, что он не может быть отрицательным, поэтому вы не можете иметь, как вы сказали, ошибку 2 и -2, которые отменяют, но вместо этого она станет ошибкой 4 Затем вы оцениваете градиент ошибки по отношению ко всем весам, чтобы вы могли вычислить, какое изменение весов уменьшит его больше всего. Как только вы это сделаете, вы сделаете «шаг» в этом направлении, основываясь на величине вашей альфа скорости обучения. (Это основные понятия, я не буду вдаваться в подробности о обратном распространении для глубокого NN). После того, как вы проведете это обучение для своего набора данных в течение определенного количества эпох, вы можете ожидать, что ваша сеть сходится, если ваш шаг обучения не слишком велик, чтобы заставить его расходиться. Вы все еще можете оказаться в местном минимумеЭтого можно избежать, по-разному инициализируя ваши веса, используя разные оптимизаторы и пытаясь упорядочить.
источник