Градиентный спуск не совсем работает так, как вы предлагали, но может возникнуть аналогичная проблема.
Мы не рассчитываем средние потери из партии, мы вычисляем средние градиенты функции потерь. Градиенты являются производной потери по отношению к весу, а в нейронной сети градиент для одного веса зависит от входных данных этого конкретного примера, а также от многих других весов в модели.
Если ваша модель имеет 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