Обучение Keras с партиями: потери тренировок рассчитываются до или после каждого шага оптимизации?
Это, вероятно, очень простой вопрос, однако я не смог найти на него ответ: когда я тренирую сеть с Keras, используя пакеты, вывод консоли показывает и обновляет отображение текущего значения потерь обучающего набора во время каждая тренировочная эпоха. Насколько я понимаю, это значение потерь вычисляется по текущему пакету (как прокси-сервер для общих потерь) и, вероятно, усредняется со значениями потерь, которые были рассчитаны для предыдущих пакетов. Но есть две возможности получить значение потерь текущего пакета: либо до обновления параметров, либо после. Может кто-нибудь сказать мне, какой из двух является правильным? Из того, что я наблюдаю, я бы предпочел, чтобы это было после шага оптимизации.
Причина, по которой я задаю этот вопрос: я тренировался в сети и увидел поведение, при котором потери на обучение (MSE с двумя вложениями) уменьшались бы, как ожидалось (на несколько порядков), но потери при проверке остались прежними. Сначала я подумал, что это может быть связано с переоснащением. Вследствие этого, поскольку набор обучающих данных довольно большой (200 тыс. Изображений), я решил уменьшить размер эпохи, чтобы можно было чаще оценивать проверочный набор, что привело к тому, что эпохи были меньше, чем trainingSetSize/batchSize. Уже тогда я видел, как потери от тренировок снижались от эпохи к эпохе (потери на валидацию оставались неизменными), что я находил довольно интригующим, поскольку сеть все еще находилась на той стадии, когда она впервые увидела тренировочные данные. В моем понимании это означает, что либо в моей настройке есть какая-то неприятная ошибка, либо отображаемая потеря тренировки отображается после выполнения шага оптимизации. В противном случае потери в новой, никогда не замеченной партии и наборе проверки должны вести себя как минимум одинаково.
Даже если я предполагаю, что потери рассчитываются после каждого шага оптимизации: если предположить, что моя сеть не приносит никакого полезного прогресса, как это предусмотрено оценкой набора проверки, она также должна вести себя произвольно при просмотре новой, никогда не замеченной партии. Тогда полное снижение потерь при обучении будет связано только с шагом оптимизации (что было бы очень полезно для имеющейся партии, но не для других данных, очевидно, поэтому также является своего рода переоснащением). Это будет означать, что если потери при обучении продолжат уменьшаться, то шаг оптимизации для каждой партии станет более эффективным. Я использую оптимизатор Adam, который, как я знаю, является адаптивным, но действительно ли возможно увидеть непрерывное и существенное снижение потерь на тренировках, в то время как в действительности сеть не усваивает каких-либо полезных обобщений?
1 ответ
Потери рассчитываются до шага оптимизации. Причина этого заключается в эффективности и связано с тем, как работает обратное распространение.
В частности, предположим, что мы хотим минимизировать ||A(x, z) - y||^2
WRT z
, Затем, когда мы выполняем обратное распространение, нам нужно оценить этот вычислительный граф:
A(x, z) -> grad ||. - y||^2 -> backpropagate
Теперь, если мы добавим к этому "оценку потерь" и оценим потери до обновления параметров, вычислительный график будет выглядеть так
> grad ||. - y||^2 -> backpropagate
/
A(x, z)
\
> ||. - y||^2
С другой стороны, если мы оценим потери после их обновления, график будет выглядеть так
A(x, z) -> grad ||. - y||^2 -> backpropagate -> A(x, z) -> ||. - y||^2
Следовательно, если мы оцениваем потери после обновления, нам нужно вычислить A(x, z)
дважды, тогда как если мы вычисляем его перед обновлением, нам нужно вычислить его только один раз. Следовательно, вычисление до обновления становится в два раза быстрее.