Требования к памяти для обратного распространения - почему бы не использовать среднее значение активации?

Мне нужна помощь в понимании требований к памяти нейронной сети и их различий между процессами обучения и оценки. В частности, требования к памяти для учебного процесса (я использую Keras API, работающий поверх TensorFlow).

Для CNN, который содержит N весов, при использовании пакета размера x существует постоянный объем памяти, необходимый для самих весов и входных данных. Во время прямого прохода графическому процессору требуются дополнительные x*N единиц памяти (конкретный требуемый объем не имеет решающего значения для вопроса) для одновременной передачи всех образцов и расчета активации каждого нейрона.

Мой вопрос касается процесса обратного распространения, кажется, что этот процесс требует дополнительных x*N единиц памяти (*) для определенного градиента каждого веса для каждого образца. Насколько я понимаю, это означает, что алгоритм вычисляет конкретные градиенты для каждого образца, а затем суммирует их для обратного распространения на предыдущий уровень.

В. Поскольку для каждой партии используется только один шаг обновления, почему не выполняется расчет градиента для средней активации каждого нейрона? Таким образом, дополнительная необходимая память для обучения будет только (x+1)*N, а не 2 * x*N.

(*) Это согласно моему маленькому эксперименту о максимально допустимом размере партии во время оценки (~4200) и обучения (~1200). Очевидно, это очень упрощенный способ взглянуть на требования к памяти

0 ответов

Краткий ответ: именно так работает алгоритм обратного распространения SGD в мини-пакете. Оглядываясь назад на происхождение и разницу между использованием стандартной SGD и мини-партии SGD, становится понятнее почему.

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

Мини-пакет SGD использует тот же принцип, с одним отличием - градиенты накапливаются из нескольких выборок, и обновление выполняется только один раз каждые x выборок. Это помогает получить плавный градиент во время обучения и позволяет параллельно передавать несколько образцов через модель. Это алгоритм, который используется при обучении с керасом / тензорным потоком в мини-партиях (обычно называемых партиями, но этот термин фактически означает использование приличного градиента партии, что немного отличается от алгоритма).

Я не нашел никакой работы относительно использования среднего значения градиентов в каждом слое для обновления. Интересно проверить результаты такого алгоритма. Это было бы более эффективным с точки зрения памяти, однако, вероятно, что оно также будет менее способным достигать хороших минимальных баллов.

Другие вопросы по тегам