Должен ли я изменять веса / смещения на каждом отдельном образце, прежде чем перейти к следующему образцу
Вы можете сделать это, это называется стохастическим градиентным спуском (SGD), и обычно вы будете перетасовывать набор данных, прежде чем проходить его каждый раз.
или я должен сначала рассчитать требуемые изменения для всей партии из 1000 образцов, и только потом начать применять их к сети?
Вы можете сделать это, это называется пакетным градиентным спуском или, в некоторых случаях (особенно в старых ресурсах), просто считается нормальным подходом и называется градиентным спуском.
Каждый подход имеет свои преимущества и недостатки. В основном:
SGD делает каждое обновление раньше с точки зрения количества данных, которые были обработаны. Таким образом, вам может понадобиться меньше эпох, чтобы сходиться к разумным значениям.
SGD выполняет больше обработки для каждого образца (потому что он обновляется чаще), поэтому также медленнее в том смысле, что обработка каждого образца займет больше времени.
SGD может меньше использовать преимущества распараллеливания, поскольку шаги обновления означают, что вы должны запускать каждый элемент данных последовательно (так как весовые коэффициенты изменились и результаты ошибок / градиентов рассчитываются для определенного набора весовых коэффициентов).
Отдельные шаги SGD обычно дают только очень грубые предположения при правильных градиентах для изменения весов. Это является как недостатком (производительность NN по сравнению с целью в тренировочном наборе может уменьшаться, так и увеличиваться), так и преимуществом (вероятность меньше) застревания в локальной стационарной точке из-за "дрожания", вызванного этими случайными различиями).
На практике происходит то, что большая часть программного обеспечения позволяет вам идти на компромисс между пакетной обработкой и обработкой одной выборки, пытаясь получить наилучшую производительность и характеристики обновления. Это называется мини-пакетной обработкой, которая включает в себя:
Перестановка набора данных в начале каждой эпохи.
Работая с перемешанными данными, N элементов за раз, где N может варьироваться от 10 до 1000, в зависимости от проблемы и любых ограничений оборудования. Распространенным решением является обработка пакета наибольшего размера, который ускорение графического процессора позволяет выполнять параллельно.
Рассчитайте обновление, необходимое для каждой небольшой партии, а затем примените его.
В настоящее время это наиболее распространенный метод обновления, который используется большинством библиотек нейронных сетей, и они почти всегда принимают параметр размера пакета в обучающем API. Большинство библиотек по-прежнему будут вызывать простые оптимизаторы, которые делают это SGD; технически это правда, что вычисленные градиенты все еще несколько рандомизированы из-за того, что не используется полная партия, но вы можете найти это как мини-пакетный градиентный спуск в некоторых старых статьях.
В идеале вам нужно обновить веса, пройдя все выборки в наборе данных. Это называется « Пакетный градиентный спуск» . Но, как нет. примеров обучения увеличивается, вычисления становятся огромными, и обучение будет очень медленным. С появлением глубокого обучения размер обучения исчисляется миллионами, а вычисления на всех примерах обучения очень непрактичны и очень медленны.
Здесь два метода оптимизации стали заметными.
В мини-градиентном спуске вы используете размер партии, который значительно меньше общего. обучающих примеров и обновите свои веса после прохождения этих примеров.
При стохастическом градиентном спуске вы обновляете веса после прохождения каждого примера обучения.
Подходя к преимуществам и недостаткам трех методов, которые мы обсуждали.
Пакетный градиентный спуск постепенно приближается к глобальному минимуму, но он медленный и требует огромных вычислительных мощностей.
Стохастический градиентный спуск быстро сходится, но не к глобальному минимуму, он сходится где-то близко к глобальному минимуму и колеблется вокруг этой точки, но никогда не сходится к глобальному минимуму. Но сходящаяся точка в стохастическом градиентном спуске достаточно хороша для всех практических целей.
Мини-пакетный градиент является компромиссом двух вышеуказанных методов. Но если у вас есть векторизованная реализация обновления весов, и вы
тренируетесь с многоядерной настройкой или отправляете обучение на
несколько машин, это лучший метод как с точки зрения времени на обучение, так и сходимости к глобальному минимуму.
Вы можете построить функцию стоимости, без учета. итераций, чтобы понять разницу между сходимостью во всех 3 типах градиентного спуска.
Участок градиентного спуска падает плавно и медленно, стабилизируется и достигает глобального минимума.
График стохастического градиентного спуска будет иметь колебания, будет быстро падать, но колеблется вокруг глобального минимума.
Это некоторые блоги, в которых есть подробное объяснение преимуществ, недостатков каждого метода, а также графики изменения функции стоимости для всех трех методов с итерациями.
https://adventuresinmachinelearning.com/stochastic-gradient-descent/
https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/
источник