Должен ли я изменять веса / смещения на каждом отдельном образце, прежде чем перейти к следующему образцу
Вы можете сделать это, это называется стохастическим градиентным спуском (SGD), и обычно вы будете перетасовывать набор данных, прежде чем проходить его каждый раз.
или я должен сначала рассчитать требуемые изменения для всей партии из 1000 образцов, и только потом начать применять их к сети?
Вы можете сделать это, это называется пакетным градиентным спуском или, в некоторых случаях (особенно в старых ресурсах), просто считается нормальным подходом и называется градиентным спуском.
Каждый подход имеет свои преимущества и недостатки. В основном:
SGD делает каждое обновление раньше с точки зрения количества данных, которые были обработаны. Таким образом, вам может понадобиться меньше эпох, чтобы сходиться к разумным значениям.
SGD выполняет больше обработки для каждого образца (потому что он обновляется чаще), поэтому также медленнее в том смысле, что обработка каждого образца займет больше времени.
SGD может меньше использовать преимущества распараллеливания, поскольку шаги обновления означают, что вы должны запускать каждый элемент данных последовательно (так как весовые коэффициенты изменились и результаты ошибок / градиентов рассчитываются для определенного набора весовых коэффициентов).
Отдельные шаги SGD обычно дают только очень грубые предположения при правильных градиентах для изменения весов. Это является как недостатком (производительность NN по сравнению с целью в тренировочном наборе может уменьшаться, так и увеличиваться), так и преимуществом (вероятность меньше) застревания в локальной стационарной точке из-за "дрожания", вызванного этими случайными различиями).
На практике происходит то, что большая часть программного обеспечения позволяет вам идти на компромисс между пакетной обработкой и обработкой одной выборки, пытаясь получить наилучшую производительность и характеристики обновления. Это называется мини-пакетной обработкой, которая включает в себя:
Перестановка набора данных в начале каждой эпохи.
Работая с перемешанными данными, N элементов за раз, где N может варьироваться от 10 до 1000, в зависимости от проблемы и любых ограничений оборудования. Распространенным решением является обработка пакета наибольшего размера, который ускорение графического процессора позволяет выполнять параллельно.
Рассчитайте обновление, необходимое для каждой небольшой партии, а затем примените его.
В настоящее время это наиболее распространенный метод обновления, который используется большинством библиотек нейронных сетей, и они почти всегда принимают параметр размера пакета в обучающем API. Большинство библиотек по-прежнему будут вызывать простые оптимизаторы, которые делают это SGD; технически это правда, что вычисленные градиенты все еще несколько рандомизированы из-за того, что не используется полная партия, но вы можете найти это как мини-пакетный градиентный спуск в некоторых старых статьях.